Next.jsReact作品集

portfolio-template (Nuu-maan) — Next.js 作品集模板

作者 Nuu-maan

一个 Y2K 风格的个人作品集模板,基于 Next.js App Router、React、Tailwind CSS 与 motion 构建,通过单一配置文件 portfolio.config.ts 集中管理文案与数据。

看看你的网站会是什么样

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

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

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

全部页面与视图 2

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

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

值得关注的模板亮点

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

01

五个全视口区块:Hero、Stack、Principles、Featured Work、Contact

02

所有可编辑文案与数据集中在 portfolio.config.ts 一个文件

03

原创 SVG 吉祥物与贴纸组件,可替换路径或颜色属性

04

使用 motion 实现滚动视差与 whileInView 揭示动画

05

品牌颜色通过 globals.css 中的 CSS 自定义属性统一控制

06

README 列出十项已知 UI 缺陷,包括 FOUT 布局偏移与无 JS 空白

模板详细介绍

该模板提供五个全视口区块:Hero、Stack、Principles、Featured Work 与 Contact,并包含原创 SVG 吉祥物、滚动视差与揭示动画、条纹阴影文字、半调与棋盘格图案、贴纸投影以及复古浏览器窗口样式的项目卡片。所有可编辑的文案与数据集中在根目录的 portfolio.config.ts 中,修改后开发服务器会热重载。品牌颜色通过 src/app/globals.css 中的 CSS 自定义属性控制,吉祥物为 src/app/_components/ 下的普通 SVG 组件,可替换路径或颜色属性。README 同时列出十项已知 UI 缺陷,包括英雄标题的 FOUT 布局偏移、480–639px 窗口下地板角色重叠、无 JavaScript 时区块空白、极窄手机上项目卡片文字换行、矮屏下粉色地板带占比过大、跑马灯首帧接缝、低功耗设备滚动卡顿、条纹阴影文字超出基线、减少动态效果仅覆盖 CSS 关键帧以及旧版 Safari 中 bg-checker 颜色渗漏。README 未提供性能基准、生产环境部署步骤或浏览器兼容性测试的详细说明。

Next.jsReact作品集

适合你的项目吗?

适用场景

  • 为个人开发者或设计师搭建 Y2K 视觉风格的作品集页面
  • 需要集中管理文案与数据、避免分散修改多个文件的场景
  • 希望以原创 SVG 组件替换吉祥物与贴纸的项目
  • 在 Next.js App Router 项目中集成 motion 滚动动画的参考

适合人群

  • 熟悉 Next.js、React、Tailwind CSS 与 TypeScript 的前端开发者
  • 接受 Y2K 高饱和色彩与贴纸风格视觉的个人作品集需求
  • 愿意根据 README 已知缺陷自行调整或修复的使用者

上手与定制指南

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

  1. 1

    克隆仓库后执行 npm install,再运行 npm run dev 启动开发服务器

  2. 2

    编辑根目录 portfolio.config.ts 修改身份、社交链接、技术栈、原则、服务、项目与文案

  3. 3

    在 src/app/globals.css 中修改 CSS 自定义属性以更换品牌颜色

  4. 4

    在 src/app/_components/ 下替换 Mascot.tsx 与 Stickers.tsx 中的 SVG 路径以更换吉祥物

  5. 5

    README 列出十项已知 UI 缺陷,使用前建议逐项确认是否影响目标场景

查看仓库使用说明

授权与来源资料

使用条件与限制

免费使用 · 保留许可声明

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

使用时需要遵守

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

额外费用与待核对事项

  • 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
  • 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
查看原文依据

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

项目核对记录与介绍依据

模板资料

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

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

这个项目需要核对什么

记录的仓库更新时间
2026-05-24
截图检查日期
2026-10-14

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

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

查看具体选型方法 →

介绍的制作与核对状态

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

审核声明: codex-user-requested-batch-review-20261015 · 2026-10-15

查看当时使用的来源资料

SHA-256: d0ecd6c01362289c292f026ac8ba8075c841409cf296c366affc6e695206823e

2026-10-14T17:10:48.737Z

来源文件 / 仓库
<div align="center">

<img src="assets/banner.svg" alt="Portfolio Template — y2k cute animated banner" width="100%"/>

# ⌘ portfolio-template

**A loud, cute, Y2K-flavored personal-portfolio template.**
Five full-viewport sections, original SVG mascots, scroll-linked parallax — and one config file you edit to make it yours.

[![License: MIT](https://img.shields.io/badge/license-MIT-ffd24c?style=flat-square&labelColor=1a1a2e)](LICENSE)
[![Next.js](https://img.shields.io/badge/next.js-16-1a1a2e?style=flat-square&labelColor=ff6f9c)](https://nextjs.org)
[![React](https://img.shields.io/badge/react-19-1a1a2e?style=flat-square&labelColor=b9d8ff)](https://react.dev)
[![Tailwind](https://img.shields.io/badge/tailwind-v4-1a1a2e?style=flat-square&labelColor=cdb6ff)](https://tailwindcss.com)
[![Motion](https://img.shields.io/badge/motion-11-1a1a2e?style=flat-square&labelColor=fff6e3)](https://motion.dev)

</div>

---

## ✨ what's inside

- 🎨 **5 dense, full-viewport sections** — Hero, Stack, Principles, Featured Work, Contact
- 🐣 **Original SVG mascots** drawn from scratch — no clipart, no Lottie payloads
- 🌊 **Scroll-linked parallax** + reveal animations powered by [`motion`](https://motion.dev)
- 🌈 **Stripe-shadow chunky text**, halftone & checker patterns, sticker drop-shadows
- 🪟 **Retro browser-window chrome** for project tiles
- 📱 **Responsive** — `clamp()` titles, mobile-first character counts, `prefers-reduced-motion` honored
- 📦 **One config file** holds every piece of editable copy & data (`portfolio.config.ts`)
- 🚀 Built on **Next.js 16 App Router**, **React 19**, **Tailwind v4**, **TypeScript strict**

---

## 🚀 getting started

```bash
git clone https://github.com/Nuu-maan/portfolio-template.git my-portfolio
cd my-portfolio
npm install
npm run dev
```

Open [http://localhost:3000](http://localhost:3000) — refresh on save, no rebuild needed.

```bash
npm run build   # production build
npm run start   # serve the build
npm run lint    # lint with eslint
```

---

## 🎀 make it yours

**Open [`portfolio.config.ts`](portfolio.config.ts) at the repo root.** Everything the site shows lives there:

```ts
export const config: PortfolioConfig = {
  identity: {
    name: "NUMAN",              // huge hero wordmark
    fullName: "Numan Khan",     // metadata + footer
    role: "Full Stack Developer",
    tagline: "FULL STACK × SHIPS FAST",
    bio: "Self-taught full-stack developer...",
    location: "New Delhi, India",
    timezone: "IST · UTC+5:30",
    availability: "OPEN TO WORK",
  },

  social: {
    email: "[email protected]",
    githubHandle: "yourhandle",
    githubUrl: "https://github.com/yourhandle",
    // ...
  },

  stack: {
    languages: ["Python", "TypeScript", "Rust", "C++", "SQL · Bash"],
    chips: {
      Frontend: ["React", "Next.js", "Tailwind"],
      Backend:  ["Node", "FastAPI"],
      // ...
    },
  },

  principles: [ /* sticker cards on "How I Work" */ ],
  services:   [ /* what you build */ ],
  projects:   [ /* the 6 tiles on Featured Work */ ],
  marquees:   { stack: [...], work: [...], contact: [...] },
  copy:       { /* every section heading + blurb */ },
};
```

Save the file → the dev server hot-reloads → the whole site re-skins.

### swap colors

Brand colors are CSS custom properties in [`src/app/globals.css`](src/app/globals.css):

```css
:root {
  --pink-hero: #ff6f9c;
  --blue-sky:  #b9d8ff;
  --lavender:  #cdb6ff;
  --yellow-sun:#ffd24c;
  --ink:       #1a1a2e;
  --cream:     #fff6e3;
  /* ... */
}
```

Change a value, every section that uses that token shifts together.

### swap mascots

The mascots are plain SVG components in [`src/app/_components/`](src/app/_components/):

| File | What it draws |
| --- | --- |
| `Mascot.tsx`   | Round bean creature + `Star` / `Sparkle` / `Flower` |
| `Stickers.tsx` | `Cloud`, `Daisy`, `GlobeBuddy`, `HandSticker`, `SpeechBubble`, `BadgeCorner`, `BrowserWindow` |

Each accepts color props — replace the SVG paths to drop in your own art.

---

## 🏗 tech stack

| Layer | Choice | Why |
| --- | --- | --- |
| Framework | **Next.js 16** (App Router, Turbopack) | RSC by default, fast HMR |
| UI runtime | **React 19** + react-compiler | Auto-memoization, less manual `useMemo` |
| Styling | **Tailwind CSS v4** | `@theme inline` design tokens, zero config files |
| Type display | **Lilita One** via `next/font` | Chunky rounded display |
| Body | **Sora** via `next/font` | Clean modern UI text |
| Motion | **`motion`** (Framer Motion v11+) | `whileInView`, `useScroll` parallax |
| Type safety | **TypeScript strict** | Config + props are fully typed |

No external icon libraries. No clipart. No tracking.

---

## 📁 project structure

```
.
├─ assets/
│  └─ banner.svg                 ← animated README banner (SMIL)
├─ portfolio.config.ts           ← ✦ edit me ✦
├─ src/
│  └─ app/
│     ├─ layout.tsx              ← fonts + metadata (reads config)
│     ├─ page.tsx                ← stacks the 5 sections
│     ├─ globals.css             ← tokens, patterns, keyframes
│     └─ _components/
│        ├─ Mascot.tsx           ← base SVG primitives
│        ├─ Stickers.tsx         ← cloud, daisy, hand, browser-window, ...
│        ├─ Reveal.tsx           ← scroll-in reveal wrapper
│        ├─ Parallax.tsx         ← scroll-linked drift wrapper
│        ├─ Marquee.tsx          ← looping ticker
│        └─ sections/
│           ├─ Hero.tsx          ← NUMAN
│           ├─ Stack.tsx         ← MY STACK
│           ├─ Principles.tsx    ← HOW I WORK
│           ├─ Work.tsx          ← FEATURED WORK
│           └─ Contact.tsx       ← SAY HELLO
├─ LICENSE                       ← MIT
└─ tsconfig.json                 ← @config alias → portfolio.config.ts
```

---

## 🐞 known UI bugs

Honest list — these are real, you may hit them. PRs welcome.

| # | Bug | Where | Notes |
| - | --- | ----- | ----- |
| 1 | **FOUT layout shift on hero title** — `text-stripe`'s shadow ladder is sized to the rendered text height, so when `Lilita One` swaps in, the title height jumps a few px and pulls the rest of the hero with it | `Hero.tsx`, `globals.css` `.text-stripe` | `next/font` reserves layout, but the stripe-shadow ladder still shifts. Acceptable but visible on slow connections. |
| 2 | **Floor characters can overlap in the 480–639px window** | `Hero.tsx`, `Contact.tsx` floor mascots | Absolute `left-[%]` positions are tuned for mobile and sm+, the in-between viewport sometimes packs two characters too close. |
| 3 | **No-JS users see blank sections** | every section (`Reveal.tsx`) | `motion`'s `initial: { opacity: 0 }` never resolves without JS. Fix: ship a `<noscript>` style override or fall back to CSS-only reveals. |
| 4 | **Project tile text wraps awkwardly on very narrow phones** | `Work.tsx` `<BrowserWindow>` tiles | The fixed `h-36`/`h-44` tile clips a 2-line `sub` line on widths < 360px. |
| 5 | **Pink floor band can eat >30% of viewport on very short screens** | `Hero.tsx`, `Contact.tsx` | Floor is `h-[22-26%]`. On <600px-tall screens (landscape phones) it crowds the title. |
| 6 | **Marquee shows a 1-frame seam on first paint** | `Marquee.tsx` | The looped track is duplicated `[items, ...items]`, but the animation starts after first commit — you may see the join briefly. |
| 7 | **Heavy drop-shadow filters can cause scroll jank on low-power devices** | `globals.css` `.sticker` | Every sticker has a `drop-shadow(...)` filter; on Hero/Contact there are 6–8 stacked. Consider `will-change: filter` selectively, or downgrade to `box-shadow` for static stickers. |
| 8 | **Stripe-shadow text extends ~38px below baseline** | `globals.css` `.text-stripe` | If you remove the `pb-12` / `pb-6` next to a `text-stripe` title, the shadow ladder clips the following element. |
| 9 | **Reduced-motion only kills CSS keyframes, not `motion` tweens** | `motion` components | `Reveal` checks `useReducedMotion()` and skips, but `whileInView` opacity reveals on motion.div elsewhere still run. Tighten in those components if you need full a11y. |
| 10 | **`bg-checker` uses `currentColor` + opacity** — color leakage between stacked overlays in Safari < 16 | every section | Modern Safari renders fine; old Safari can show a faint tint where overlays meet. |

If you fix one, open a PR with a 1-line repro. Issues with screenshots especially welcome.

---

## 💛 credits

- Type display: [**Lilita One**](https://fonts.google.com/specimen/Lilita+One) (OFL)
- Body type: [**Sora**](https://fonts.google.com/specimen/Sora) (OFL)
- Motion: [**Framer Motion / `motion`**](https://motion.dev) (MIT)
- All illustrations / SVGs in this repo are **original** to this project — feel free to redraw, remix, or replace.

Built by [**Numan Khan**](https://nuu-maan.com) · [@nuu-maan](https://github.com/nuu-maan) · [@Numankhannnnn](https://x.com/Numankhannnnn)

---

## 📦 license

[MIT](LICENSE) — do whatever, just keep the notice.

If you ship something with it, a star ★ on the repo makes my day.

<div align="center">

`★ NK-FS/DEV — NO.001  ·  built with attention, shipped with chaos  ·  ★`

</div>
反馈内容错误

看看同类模板

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