可筛选的瀑布流画廊,使用 CSS columns 实现,不引入布局库
lumen-nextjs-photography-template — Next.js 作品集模板
作者 haider484991
Lumen 是一个基于 Next.js 与 TypeScript 的免费摄影作品集模板,包含可筛选的瀑布流画廊、键盘可访问的灯箱、定价与客户选片页面,所有内容集中在单个配置文件。
看看你的网站会是什么样
浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。
全部页面与视图 2
截图用于了解视觉与布局,交互效果请以实际项目为准。
值得关注的模板亮点
从已有项目资料中,快速了解它的特点。
键盘可访问的灯箱,支持方向键、Escape、焦点管理与滚动锁定,使用 role="dialog" 与 aria-modal
客户选片页面,通过图库代码进入,并设置 noindex、nofollow 避免私密画廊被搜索引擎收录
定价、流程与 FAQ 页面,FAQ 带 FAQPage 结构化数据
零图片依赖,仓库不含图片文件,占位画面由 CSS 渐变生成
画廊、套餐、FAQ 与文案集中在 config/site.ts 中配置
模板详细介绍
Lumen 是一个面向摄影师的免费作品集网站模板,使用 Next.js 与 TypeScript 构建,样式基于 Tailwind CSS。模板提供可筛选的瀑布流画廊、带键盘支持的灯箱、定价与流程展示、FAQ 以及客户选片页面,站点内容(画廊、套餐、FAQ、文案)集中在 config/site.ts 中配置。模板不附带任何图片文件,占位画面由 CSS 渐变生成,替换为真实照片需要修改 components/Frame.tsx 并接入 next/image。客户选片表单是前端外壳,静态站点无法验证密码,需要自行对接外部图库托管服务或自有 API。模板采用静态导出,构建产物可部署到任意静态托管平台。
适合你的项目吗?
适用场景
- 摄影师搭建个人作品集网站,展示婚礼、人像等分类作品
- 需要向客户提供私密选片入口的摄影业务
- 希望以静态站点形式部署作品集,托管在任意静态托管平台
- 需要展示套餐价格、服务流程与常见问题的摄影服务页面
适合人群
- 独立摄影师或小型摄影工作室
- 熟悉 Next.js 与 TypeScript、愿意自行替换图片与对接外部服务的开发者
- 需要静态导出并部署到静态托管平台的用户
- 希望以单文件配置管理站点内容的用户
上手与定制指南
结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。
- 1
克隆仓库后执行 npm install 与 npm run dev,默认在 http://localhost:3000 启动
- 2
站点内容在 config/site.ts 中修改,ratios 字段接受 portrait(4:5)、landscape(3:2)与 square
- 3
替换真实照片需修改 components/Frame.tsx 使用 next/image,并保留外层容器与宽高比类名
- 4
模板使用 output: "export",next.config.ts 中 images.unoptimized 为 true;如需自动缩放需部署到运行 Next.js 图片优化器的托管平台或预先压缩图片
- 5
客户选片表单为前端外壳,需将 handleSubmit 指向 Pic-Time、Pixieset、ShootProof、CloudSpot 等图库托管服务或自有 API
授权与来源资料
使用条件与限制
免费使用 · 保留许可声明本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。
使用时需要遵守
- 允许免费使用、修改、商用和分发该版本代码。
- 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
- 代码按现状提供;担保与责任限制以原许可证及适用法律为准。
额外费用与待核对事项
- 客户选片表单仅为前端外壳,静态站点无法验证密码;需自行对接 Pic-Time、Pixieset、ShootProof、CloudSpot 等外部图库托管服务或自有 API 才能实现真正的选片功能。
- 模板使用 output: "export" 且 images.unoptimized 为 true,next/image 不会自动缩放图片;如需自动图片优化,必须部署到运行 Next.js 图片优化器的托管平台,或自行预先压缩图片。
- 模板不含任何图片文件,占位画面由 CSS 渐变生成;使用真实照片需自行修改 components/Frame.tsx 接入 next/image,并保留外层容器与宽高比类名以维持瀑布流布局。
- 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
- 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
查看原文依据
Permission is hereby granted, free of charge
许可证原文
Point `handleSubmit` at your real gallery host (Pic-Time, Pixieset, ShootProof, CloudSpot) or your own API and redirect on success.
README 原文
either deploy on a host that runs the Next.js image optimizer, or pre-resize your exports
README 原文
https://github.com/haider484991/lumen-nextjs-photography-template/blob/main/LICENSEhttps://github.com/haider484991/lumen-nextjs-photography-template/blob/main/README.mdReplace the placeholder in **`components/Frame.tsx`** with `next/image`
README 原文
DeepSeek 根据仓库许可证和 README 整理 ·2026-10-01。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。
项目核对记录与介绍依据
模板资料
- 来源平台
- GitHub
- 资料与维护参考分
- 资料较完整 · 85 / 100
- 技术栈
- Next.js · React
- 网站类型
- 作品集
这个分数如何计算
本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。
这个项目需要核对什么
- 记录的仓库更新时间
- 2026-08-21
- 截图检查日期
- 2026-10-01
已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。
目录记录的主要技术栈是 Next.js。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。
查看具体选型方法 →介绍的制作与核对状态
介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。
已完成服务器许可规则与 AI 来源核对;未经过人工编辑审核。
查看当时使用的来源资料
SHA-256: 7cfeef6d2aa01feb572be3c0b65962578a03e87ff0bc21e5379fb4e2139e8365
2026-10-01T15:34:35.234Z
来源文件 / 仓库# 📷 Lumen — Free Photography Portfolio Website Template
**A production-ready photography portfolio template built with Next.js 15, TypeScript, and Tailwind CSS v4.** Filterable masonry galleries, a keyboard-accessible lightbox, pricing, and a client-proofing page. Clone it, edit one config file, deploy for free.
**[Live demo →](https://pixelandoak-lumen.pages.dev)**
**[Template page →](https://pixelandoak.com/templates/photography-portfolio-website-template/)**

## Why this one
Photography portfolios have a specific problem: they are the heaviest sites on the web, built by people whose work deserves to load instantly. Most portfolio templates ship 40MB of demo photographs and a carousel library.
Lumen ships **zero image files**. Every frame is a deterministic CSS gradient, so the repo is tiny and the demo is instant. When you add your own photographs, you are adding the *only* images on the site.
- 🖼️ **Filterable masonry gallery** — CSS columns, no layout library, no reflow jank
- 🔍 **Lightbox with real keyboard support** — arrow keys, Escape, focus-safe, scroll-locked, `role="dialog"` + `aria-modal`. About 100 lines of React, no dependency
- 🔒 **Client proofing page** — gallery-code entry, correctly `noindex, nofollow` so private galleries never reach Google
- 💶 **Pricing + process + FAQ** — the three things that stop the "how much?" email, with `FAQPage` structured data for rich results
- 📍 **Local SEO** — `ProfessionalService` schema so you can rank for "*city* wedding photographer"
- 🌙 **Real dark mode** — class strategy, localStorage, OS detection, no flash
- 🎞️ **Zero image dependencies** — nothing to license, nothing to optimise, nothing slow
- ⚙️ **One-file customization** — galleries, packages, FAQs, and copy all in `config/site.ts`
- 📦 **Fully static export** — `/out` deploys to any static host, free
- 📱 **Responsive** — tested from 375px, mobile nav panel, no horizontal scroll
## Quick start
```bash
git clone https://github.com/haider484991/lumen-nextjs-photography-template.git my-portfolio
```
```bash
cd my-portfolio && npm install && npm run dev
```
Open [http://localhost:3000](http://localhost:3000).
## Make it yours
Everything lives in **`config/site.ts`**:
```ts
export const siteConfig = {
name: "Lumen",
photographer: "Ada Okonkwo",
title: "Lumen — Wedding & Portrait Photography in Lisbon",
galleries: [
{
slug: "weddings",
name: "Weddings",
blurb: "Full-day coverage, documentary-leaning, always unhurried.",
shots: 9,
ratios: ["portrait", "landscape", "square" /* … one per shot */],
},
],
packages: [
{ name: "Wedding — full day", price: "€2,400", duration: "10 hours",
features: ["600+ edited photographs", /* … */], featured: true },
],
};
```
`ratios` accepts `"portrait"` (4:5), `"landscape"` (3:2), and `"square"` — mix them and the masonry grid does the rest.
## Using real photos
Replace the placeholder in **`components/Frame.tsx`** with `next/image`:
```tsx
import Image from "next/image";
<div className={`relative overflow-hidden rounded-sm ${RATIO_CLASS[ratio]}`}>
<Image
src={src} // e.g. `/galleries/${seed}/${index}.jpg`
alt={alt} // describe the photograph — this is real SEO
fill
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
className="object-cover"
/>
</div>
```
Keep the wrapper and its aspect-ratio class — the masonry layout depends on them. `next/image` lazy-loads by default, which matters once a gallery has 60 photographs in it.
Because this template uses `output: "export"`, `next.config.ts` sets `images.unoptimized = true`. If you want automatic resizing, either deploy on a host that runs the Next.js image optimizer, or pre-resize your exports (which most photographers are already doing on the way out of Lightroom).
## Connecting the client gallery
`components/ProofingForm.tsx` is a front-end shell on purpose — a static site cannot verify a password, and pretending otherwise would be insecure theatre. Point `handleSubmit` at your real gallery host (Pic-Time, Pixieset, ShootProof, CloudSpot) or your own API and redirect on success.
## Deploy
```bash
npm run build
```
Emits `/out`. Deploy anywhere:
```bash
npx wrangler pages deploy out
```
Netlify, Vercel, GitHub Pages, and any static host work identically. Preview the production build with `npm run preview`.
## Tech
Next.js 15 (App Router, static export) · React 19 · TypeScript · Tailwind CSS v4 · zero runtime dependencies beyond React.
## License
MIT — free for personal and commercial use. Attribution appreciated but not required.
---
Built by [Pixel & Oak](https://pixelandoak.com/templates/photography-portfolio-website-template/) — web design and AI development studio.
More free templates: [Nova (blog)](https://github.com/haider484991/nova-nextjs-blog-template) · [LaunchPad (SaaS)](https://github.com/haider484991/launchpad-nextjs-saas-template) · [Table & Fork (restaurant)](https://github.com/haider484991/tablefork-nextjs-restaurant-template)
看看同类模板
对比同技术栈与用途的模板,找到更适合的视觉与内容结构。

react-resume-template
A personal resume website template built with React.js, Typescript, Next.js, and styled with Tailwind css
Next.js · 作品集

nxt-lnk
Custom bio links for creatives who love coding. A perfect custom alternative for linktree, bio and other short…
Next.js · 作品集

sylph
A minimal portfolio template.
Next.js · 作品集

sleek-portfolio
sleek-portfolio 是一个面向开发者个人品牌展示的现代作品集模板,基于 Next.js 15、TypeScript、Tailwind CSS 和 Shadcn UI 构建。
Next.js · 作品集

research-website-template
React + Next.js template for research websites (for PhD students, researchers, etc)
Next.js · 作品集

shadcn-portfolio
shadcn-portfolio 是一个面向开发者的作品集模板,技术栈为 Next.js 15、shadcn/ui、Tailwind CSS 和 Framer Motion。
Next.js · 作品集
