)
}
diff --git a/apps/landing/src/components/landing/CTASection.tsx b/apps/landing/src/components/landing/CTASection.tsx
index 02955783..abbcf069 100644
--- a/apps/landing/src/components/landing/CTASection.tsx
+++ b/apps/landing/src/components/landing/CTASection.tsx
@@ -3,7 +3,7 @@
import Link from 'next/link'
import { Button } from '~/components/ui/button/Button'
-import { radius, shadows } from '~/lib/design-tokens'
+import { radius } from '~/lib/design-tokens'
import { clsxm } from '~/lib/helper'
export const CTASection = () => (
@@ -12,21 +12,19 @@ export const CTASection = () => (
className={clsxm(
'relative overflow-hidden border border-white/10 bg-gradient-to-br from-accent/40 via-purple-600/40 to-slate-900/70 p-10 text-white',
radius['3xl'],
- shadows.heavy,
)}
>
- Ready?
+ 开始使用
- 构建属于你的 Afilmory,
- 今日即可上线。
+ 5 分钟搭建你的
+ 专属摄影展示空间
- 结合 builder、apps/web、apps/ssr 与
- be/apps/core,五分钟完成部署,随时扩展自定义 UI、数据源或地图风格。
+ 完全免费开源,无需编程基础。跟随文档指引,快速部署属于你的摄影作品集网站。
(
rel="noreferrer"
className="inline-flex items-center gap-2 text-sm font-medium text-white/80 hover:text-white"
>
- 查看线上示例
+ 浏览在线示例
diff --git a/apps/landing/src/components/landing/FeatureSection.tsx b/apps/landing/src/components/landing/FeatureSection.tsx
index 7147bdf3..c05fb57d 100644
--- a/apps/landing/src/components/landing/FeatureSection.tsx
+++ b/apps/landing/src/components/landing/FeatureSection.tsx
@@ -7,43 +7,43 @@ import { FeatureCard } from './Card'
const featureGroups = [
{
- icon: 'i-lucide-cpu',
- title: '性能与体验',
- description: 'WebGL viewer、Masonry 布局与全屏手势带来原生级互动。',
+ icon: 'i-lucide-sparkles',
+ title: '精美展示',
+ description: '瀑布流布局自动适配,让每张照片都以最佳方式呈现',
bullets: [
- 'GPU 管线渲染 · Free transform · Tone mapping',
- 'Blurhash 占位、响应式断点与浮动操作面板',
- 'Glassmorphic Depth 系统 + Motion spring 动画',
+ '智能排版算法,完美利用屏幕空间',
+ '流畅的加载动画,媲美专业杂志',
+ '支持高清大图,不损失画质细节',
],
},
{
- icon: 'i-lucide-database',
- title: '数据与同步',
- description: 'builder 多进程处理 + manifest 驱动数据流,自动增量同步。',
+ icon: 'i-lucide-image',
+ title: '照片管理',
+ description: '自动识别相机信息,保留每张照片背后的故事',
bullets: [
- 'S3 / GitHub / Eagle / 本地多源存储抽象',
- 'EXIF、Live Photo、Fujifilm Recipe 与缩略图生成',
- 'window.__MANIFEST__ 注入,前端无感刷新',
+ '自动读取相机型号、镜头和拍摄参数',
+ '支持 Apple Live Photo 动态照片',
+ '记录拍摄地点,在地图上回顾旅程',
],
},
{
- icon: 'i-lucide-plug',
- title: '接入模式',
- description: 'SPA、Next.js SSR、be/apps/core 后端三种模式自由切换。',
+ icon: 'i-lucide-share-2',
+ title: '便捷分享',
+ description: '一键生成分享链接,让更多人看到你的作品',
bullets: [
- '静态/SSR 共享 UI:apps/web + apps/ssr',
- 'be/apps/core 以 Hono + Drizzle 提供实时能力',
- 'OG 渲染 / SEO 元数据 / OpenGraph API',
+ '精美的社交媒体预览卡片',
+ '支持单张照片快速分享',
+ '自动生成作品集展示页面',
],
},
{
- icon: 'i-lucide-globe',
- title: '全球化 & 分享',
- description: '多语言、OG、分享嵌入,天然适合出海作品集。',
+ icon: 'i-lucide-zap',
+ title: '快速搭建',
+ description: '无需编程知识,5分钟即可拥有专业摄影网站',
bullets: [
- 'i18next 平台化,11+ 语言文件',
- '动态 OG 图 + /og/[photoId] API',
- '分享/嵌入组件、一键复制链接或 iframe',
+ '提供详细的使用文档和教程',
+ '支持多种部署方式,完全免费',
+ '持续更新优化,长期维护支持',
],
},
]
@@ -52,14 +52,13 @@ export const FeatureSection = () => (
diff --git a/apps/landing/src/components/landing/HeroSection.tsx b/apps/landing/src/components/landing/HeroSection.tsx
index 69bdcb27..e9e87249 100644
--- a/apps/landing/src/components/landing/HeroSection.tsx
+++ b/apps/landing/src/components/landing/HeroSection.tsx
@@ -8,44 +8,44 @@ import { blur } from '~/lib/design-tokens'
import { clsxm } from '~/lib/helper'
const heroHighlights = [
- { title: 'WebGL Viewer', description: '60fps 缩放 / 漫游 / HDR' },
- { title: 'Manifest 驱动', description: 'window.__MANIFEST__ 即时注入' },
- { title: '地图探索', description: 'MapLibre GPS / Cluster / Heatmap' },
+ { title: '丝滑流畅', description: '像翻阅实体相册般顺滑' },
+ { title: '地图旅程', description: '在世界地图上回顾足迹' },
+ { title: '完整记忆', description: '保留每张照片的故事' },
]
const heroTiles = [
{
id: 'tile-masonry',
- title: 'Masonry Flow',
- subtitle: '自适应列 · Blurhash 过渡',
- badge: 'GPU',
+ title: '智能布局',
+ subtitle: '自动排列,完美呈现',
+ badge: '瀑布流',
className: 'col-span-2 row-span-2',
gradient:
'linear-gradient(135deg, rgba(100,160,220,0.35), rgba(140,200,255,0.2))',
},
{
id: 'tile-exif',
- title: 'EXIF',
- subtitle: 'Fujifilm Recipe · HDR',
- badge: 'metadata',
+ title: '拍摄信息',
+ subtitle: '相机 · 镜头 · 参数',
+ badge: '详细',
className: 'col-span-1 row-span-1',
gradient:
'linear-gradient(135deg, rgba(160,140,200,0.35), rgba(200,180,255,0.2))',
},
{
id: 'tile-map',
- title: 'Map Explorer',
- subtitle: 'GPS Cluster / Heatmap',
- badge: 'MapLibre',
+ title: '世界地图',
+ subtitle: '旅行轨迹可视化',
+ badge: '探索',
className: 'col-span-1 row-span-2',
gradient:
'linear-gradient(135deg, rgba(100,200,180,0.35), rgba(140,240,220,0.2))',
},
{
id: 'tile-viewer',
- title: 'Fullscreen Viewer',
- subtitle: 'Live Photo / 分享',
- badge: 'viewer',
+ title: '沉浸查看',
+ subtitle: '全屏 · 动态照片',
+ badge: '体验',
className: 'col-span-2 row-span-1',
gradient:
'linear-gradient(135deg, rgba(255,180,120,0.35), rgba(255,210,160,0.2))',
@@ -57,20 +57,19 @@ export const HeroSection = () => (
- Glassmorphic Depth Design System
+ 为摄影师打造的展示平台
Afilmory
- 让照片叙事具备科幻感
+ 让每一张照片都值得被看见
- 以 WebGL、Motion 与 manifest 驱动的全栈照片站框架。支持增量同步、EXIF
- 深度解析、MapLibre 地理探索,以及 Next.js 提供的 SEO / OG
- 能力,帮你轻松打造沉浸式影像叙事。
+ 优雅展示你的摄影作品,自动记录拍摄信息,在地图上标注旅行足迹。
+ 无论是专业摄影师还是摄影爱好者,都能快速搭建属于自己的影像世界。
@@ -84,7 +83,7 @@ export const HeroSection = () => (
target="_blank"
rel="noreferrer"
>
- 立即体验
+ 在线预览
(
rel="noreferrer"
className="group text-text-secondary hover:text-text inline-flex items-center gap-1.5 text-sm transition"
>
-
Star on GitHub
+
免费使用
@@ -137,7 +136,7 @@ const HeroPreview = () => (
(
(
transition={{ delay: 0.35, duration: 0.6, ease: 'easeOut' }}
>
- window.__MANIFEST__
+ 照片集合
- hydrated
+ 已加载
-
-
{'{ data: 2048 photos }'}
-
{'cameras: 12 · lenses: 18'}
-
{'blurhash: true · livePhoto: 86'}
+
+
2,048 张照片
+
12 台相机 · 18 支镜头
+
86 张 Live Photo
(
>
- Map Explorer
+ 旅行地图
-
- 242 geotagged stories online.
-
+ 242 个地点的影像记录
- Cluster · Heatmap
- ↗︎ fully interactive
+ 聚类显示 · 热力图
+ ↗︎ 可交互探索
diff --git a/apps/landing/src/components/landing/MetricStrip.tsx b/apps/landing/src/components/landing/MetricStrip.tsx
index 2a52f686..41140df4 100644
--- a/apps/landing/src/components/landing/MetricStrip.tsx
+++ b/apps/landing/src/components/landing/MetricStrip.tsx
@@ -8,10 +8,10 @@ import { clsxm } from '~/lib/helper'
import { MetricCard } from './Card'
const metrics = [
- { label: 'WebGL 渲染', value: '60fps', detail: '平移 · 缩放 · HDR' },
- { label: '增量同步', value: 'S3 · GitHub', detail: '多存储后端' },
- { label: '照片节点', value: '2k+', detail: 'EXIF · Live Photo · Blurhash' },
- { label: '多语言', value: '11', detail: 'i18n · 动态 OG' },
+ { label: '流畅体验', value: '丝滑', detail: '杂志般的浏览感受' },
+ { label: '多端适配', value: '响应式', detail: '手机 · 平板 · 电脑' },
+ { label: '照片容量', value: '不限', detail: '支持大量照片展示' },
+ { label: '完全免费', value: '开源', detail: '永久免费使用' },
]
export const MetricStrip = () => (
diff --git a/apps/landing/src/components/landing/PreviewSection.tsx b/apps/landing/src/components/landing/PreviewSection.tsx
index 12667230..830c8bb5 100644
--- a/apps/landing/src/components/landing/PreviewSection.tsx
+++ b/apps/landing/src/components/landing/PreviewSection.tsx
@@ -7,22 +7,22 @@ import { IconCard } from './Card'
const previewHighlights = [
{
- icon: 'i-lucide-aperture',
- title: 'EXIF HUD',
- description: '完整记录光圈、快门、ISO、镜头、配方、HDR 信息。',
+ icon: 'i-lucide-camera',
+ title: '拍摄参数',
+ description: '自动记录每张照片的相机、镜头、光圈、快门等信息',
meta: 'f/1.4 · 1/125s · ISO 200',
},
{
- icon: 'i-lucide-map',
- title: '地图探索',
- description: 'MapLibre 地图、GPS 聚合、热力探索每一次旅程。',
- meta: '84% 带 GPS · Cluster & Pin',
+ icon: 'i-lucide-map-pin',
+ title: '地点标记',
+ description: '在世界地图上查看你的摄影足迹,重温每次旅行',
+ meta: '支持 GPS 定位',
},
{
- icon: 'i-lucide-maximize',
- title: 'Fullscreen Viewer',
- description: 'WebGL 全屏查看器支持手势、Live Photo 与分享。',
- meta: '手势 · 分享 · Live',
+ icon: 'i-lucide-expand',
+ title: '全屏欣赏',
+ description: '沉浸式大图查看,支持动态照片和一键分享',
+ meta: '手势操作 · 快速分享',
},
]
@@ -30,15 +30,14 @@ export const PreviewSection = () => (
- 即刻预览
+ 核心功能
- 沉浸式图库体验的每个细节
+ 专为摄影作品设计的展示方式
- Masonry 布局、MapLibre 地图、WebGL Viewer、EXIF HUD 等模块相互呼应,通过
- motion 的 spring 动画与 glassmorphic
- 深度层级,构建出一个既具未来感又保持性能稳定的浏览体验。
+ 智能瀑布流布局让每张照片都有最佳呈现,流畅的动画过渡带来杂志般的阅读体验。
+ 无论是在电脑还是手机上,都能完美展示你的作品。
@@ -87,11 +86,11 @@ const PreviewMockup = () => (
- EXIF · X-T5 · XF16mmF1.4
- Map locked
+ 富士 X-T5 · 16mm f/1.4
+ 📍 东京
- GPS 35.6895 / 139.6917 · Fujifilm Classic Chrome · Blurhash ready.
+ 经典负片模拟 · 拍摄于 2024 年 3 月
diff --git a/apps/landing/src/components/landing/TechSection.tsx b/apps/landing/src/components/landing/TechSection.tsx
deleted file mode 100644
index f16be880..00000000
--- a/apps/landing/src/components/landing/TechSection.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-'use client'
-
-import { m } from 'motion/react'
-
-import { blur, radius, shadows, spacing, typography } from '~/lib/design-tokens'
-import { clsxm } from '~/lib/helper'
-
-const techStacks = [
- 'React 19',
- 'Next.js 15',
- 'Vite',
- 'Tailwind CSS v4',
- 'Radix UI',
- 'Framer Motion 12',
- 'Jotai',
- 'TanStack Query',
- 'MapLibre',
- 'Sharp',
- 'Drizzle ORM',
- 'Hono',
-]
-
-const integrationModes = [
- {
- title: 'Standalone SPA',
- description: '预构建 photos-manifest.json,纯静态部署即可运行。',
- points: [
- 'Vite + Cloudflare Pages / Vercel / 静态空间',
- 'CI 中运行 builder,增量更新 manifest',
- '无需服务器即可获得完整体验',
- ],
- },
- {
- title: 'Next.js SSR Host',
- description: 'apps/ssr 作为 SPA 外壳,负责注入 manifest、OG、SEO。',
- points: [
- 'route.ts 捕获所有路径,返回注入后的 index.html',
- '动态 /og/[photoId] 渲染社交卡片',
- '保留 SPA 的交互,同时具备 SSR 首屏',
- ],
- },
- {
- title: 'Full Backend Flow',
- description: 'be/apps/core + be/apps/dashboard 驱动实时数据与管理。',
- points: [
- 'Hono + Drizzle + PostgreSQL 全栈能力',
- 'Manifest 在内存构建后注入页面',
- 'Dashboard 管理、权限与指标监控',
- ],
- },
-]
-
-export const TechSection = () => (
-
-
-
- 技术栈 & 接入
-
-
现代化前后端编排
-
- React 19 + Next.js 15 + Vite + motion + Tailwind v4 + Pastel Palette
- token 系统,实现 UI / 动画 / 数据的一致性。
-
-
-
-
-
- {techStacks.map((stack, index) => (
-
- {stack}
-
- ))}
-
-
-
- {integrationModes.map((mode) => (
-
-
{mode.title}
-
- {mode.description}
-
-
- {mode.points.map((point) => (
- -
-
- {point}
-
- ))}
-
-
- ))}
-
-
-
-)
diff --git a/apps/landing/src/components/landing/WorkflowSection.tsx b/apps/landing/src/components/landing/WorkflowSection.tsx
deleted file mode 100644
index 189a189d..00000000
--- a/apps/landing/src/components/landing/WorkflowSection.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-'use client'
-
-import { blur, radius, shadows, spacing, typography } from '~/lib/design-tokens'
-import { clsxm } from '~/lib/helper'
-
-const workflowSteps = [
- {
- icon: 'i-lucide-rocket',
- title: 'Builder Pipeline',
- description: 'packages/builder 负责拉取、处理、分析与生成 manifest。',
- points: [
- 'Storage Sync:S3 / GitHub / Eagle 增量拉取',
- 'Format & Thumbnail:HEIC/TIFF 转码 + Blurhash',
- 'EXIF / GPS / Fujifilm Recipe / HDR 元数据提取',
- ],
- },
- {
- icon: 'i-lucide-plug-zap',
- title: 'Manifest 注入',
- description:
- 'apps/ssr 在 Next.js 层注入 window.__MANIFEST__,开启 SEO/OG。',
- points: [
- 'index.html 模板内联 manifest',
- 'OG 动态渲染 + Metadata 替换',
- 'MapLibre、PhotoLoader、Viewer 共享数据源',
- ],
- },
- {
- icon: 'i-lucide-monitor-play',
- title: 'SPA 消费',
- description:
- 'apps/web 作为 Vite SPA,自主渲染 Masonry、Viewer、地图与浮动 UI。',
- points: [
- 'PhotoLoader 单例在客户端初始化',
- 'Jotai + TanStack Query 状态与数据层',
- 'Glassmorphic Depth 组件交付最终体验',
- ],
- },
-]
-
-export const WorkflowSection = () => (
-
-
-
- 数据流
-
-
- Builder → Manifest → SPA
-
-
- README 中的流水线拆解为三个关键阶段,帮助你明确扩展点与监控点。
-
-
-
-
-
- {workflowSteps.map((step, index) => (
- -
-
-
-
-
-
- {index + 1}. {step.title}
-
-
- {step.description}
-
-
- {step.points.map((point) => (
- -
-
- {point}
-
- ))}
-
-
-
- ))}
-
-
-
-)
diff --git a/apps/landing/src/components/landing/index.ts b/apps/landing/src/components/landing/index.ts
index 52686ef5..28d2e597 100644
--- a/apps/landing/src/components/landing/index.ts
+++ b/apps/landing/src/components/landing/index.ts
@@ -10,5 +10,3 @@ export { FeatureSection } from './FeatureSection'
export { HeroSection } from './HeroSection'
export { MetricStrip } from './MetricStrip'
export { PreviewSection } from './PreviewSection'
-export { TechSection } from './TechSection'
-export { WorkflowSection } from './WorkflowSection'
diff --git a/apps/landing/src/components/layout/Footer.tsx b/apps/landing/src/components/layout/Footer.tsx
new file mode 100644
index 00000000..a07b52b3
--- /dev/null
+++ b/apps/landing/src/components/layout/Footer.tsx
@@ -0,0 +1,174 @@
+'use client'
+
+import Link from 'next/link'
+
+import { blur } from '~/lib/design-tokens'
+import { clsxm } from '~/lib/helper'
+
+const footerLinks = {
+ product: [
+ { label: '在线示例', href: 'https://afilmory.innei.in' },
+ {
+ label: '使用文档',
+ href: 'https://github.com/Afilmory/photo-gallery-site#readme',
+ },
+ { label: 'GitHub', href: 'https://github.com/Afilmory/photo-gallery-site' },
+ ],
+ community: [
+ {
+ label: '讨论区',
+ href: 'https://github.com/Afilmory/photo-gallery-site/discussions',
+ },
+ {
+ label: '问题反馈',
+ href: 'https://github.com/Afilmory/photo-gallery-site/issues',
+ },
+ {
+ label: '贡献指南',
+ href: 'https://github.com/Afilmory/photo-gallery-site/blob/main/CONTRIBUTING.md',
+ },
+ ],
+ resources: [
+ {
+ label: '快速开始',
+ href: 'https://github.com/Afilmory/photo-gallery-site#-quick-start',
+ },
+ {
+ label: '配置说明',
+ href: 'https://github.com/Afilmory/photo-gallery-site#-configuration',
+ },
+ {
+ label: '部署教程',
+ href: 'https://github.com/Afilmory/photo-gallery-site#-deployment',
+ },
+ ],
+}
+
+const socialLinks = [
+ {
+ icon: 'i-lucide-github',
+ label: 'GitHub',
+ href: 'https://github.com/Afilmory/photo-gallery-site',
+ },
+ { icon: 'i-lucide-twitter', label: 'Twitter', href: 'https://twitter.com' },
+ { icon: 'i-lucide-message-circle', label: 'Discord', href: '#' },
+]
+
+export const Footer = () => {
+ return (
+
+ )
+}
diff --git a/apps/landing/src/components/layout/Header.tsx b/apps/landing/src/components/layout/Header.tsx
new file mode 100644
index 00000000..d15d9911
--- /dev/null
+++ b/apps/landing/src/components/layout/Header.tsx
@@ -0,0 +1,75 @@
+'use client'
+
+import { m } from 'motion/react'
+import Link from 'next/link'
+
+import { Button } from '~/components/ui/button/Button'
+import { blur } from '~/lib/design-tokens'
+import { clsxm } from '~/lib/helper'
+
+export const Header = () => {
+ return (
+
+
+ {/* Logo */}
+
+
+
+
+ Afilmory
+
+
+ {/* Navigation */}
+
+
+ {/* CTA Button */}
+
+
+
+ )
+}
diff --git a/apps/landing/src/components/layout/index.ts b/apps/landing/src/components/layout/index.ts
new file mode 100644
index 00000000..da15e75b
--- /dev/null
+++ b/apps/landing/src/components/layout/index.ts
@@ -0,0 +1,7 @@
+/**
+ * Layout Components
+ * Header 和 Footer 等布局组件
+ */
+
+export { Footer } from './Footer'
+export { Header } from './Header'
diff --git a/apps/landing/src/lib/design-tokens.ts b/apps/landing/src/lib/design-tokens.ts
index 4f369eda..89af3950 100644
--- a/apps/landing/src/lib/design-tokens.ts
+++ b/apps/landing/src/lib/design-tokens.ts
@@ -5,15 +5,14 @@
/**
* 阴影层级系统
- * 从 subtle(轻微)到 heavy(强烈)
- * 针对浅色背景优化,使用更柔和的阴影
+ * 针对浅色背景优化,使用极简阴影
*/
export const shadows = {
- subtle: 'shadow-[0_2px_8px_rgba(0,0,0,0.02)]',
- light: 'shadow-[0_4px_16px_rgba(0,0,0,0.04)]',
- medium: 'shadow-[0_8px_24px_rgba(0,0,0,0.06)]',
- strong: 'shadow-[0_12px_32px_rgba(0,0,0,0.08)]',
- heavy: 'shadow-[0_16px_48px_rgba(0,0,0,0.10)]',
+ subtle: 'shadow-none',
+ light: 'shadow-none',
+ medium: 'shadow-none',
+ strong: 'shadow-none',
+ heavy: 'shadow-none',
} as const
/**