diff --git a/apps/landing/src/app/page.tsx b/apps/landing/src/app/page.tsx index 12481baa..e4d1913b 100644 --- a/apps/landing/src/app/page.tsx +++ b/apps/landing/src/app/page.tsx @@ -6,23 +6,24 @@ import { FeatureSection } from '~/components/landing/FeatureSection' import { HeroSection } from '~/components/landing/HeroSection' import { MetricStrip } from '~/components/landing/MetricStrip' import { PreviewSection } from '~/components/landing/PreviewSection' -import { TechSection } from '~/components/landing/TechSection' -import { WorkflowSection } from '~/components/landing/WorkflowSection' +import { Footer } from '~/components/layout/Footer' +import { Header } from '~/components/layout/Header' export default function Home() { return ( -
+
+
-
+
- -
+ +
) } 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 = () => (

- 核心能力 + 为什么选择 Afilmory

- 从性能到叙事的全链路方案 + 让你的作品得到应有的关注

- 项目按照 Performance / Data / Integrations / Global Experience - 四个维度拆分,便于独立扩展与部署。 + 专为摄影师设计,无论你是专业摄影师还是摄影爱好者,都能轻松打造属于自己的作品展示空间。

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) => ( -
  1. -
    - -
    -
    -

    - {index + 1}. {step.title} -

    -

    - {step.description} -

    -
      - {step.points.map((point) => ( -
    • - - {point} -
    • - ))} -
    -
    -
  2. - ))} -
-
-
-) 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 ( +
+
+ {/* Main Footer */} +
+ {/* Brand */} +
+
+ + + + Afilmory +
+

+ 为摄影师打造的专业作品展示平台,让每一张照片都值得被看见。 +

+ {/* Social Links */} +
+ {socialLinks.map((social) => ( + + + + ))} +
+
+ + {/* Links */} +
+
+

产品

+
    + {footerLinks.product.map((link) => ( +
  • + + {link.label} + +
  • + ))} +
+
+ +
+

社区

+
    + {footerLinks.community.map((link) => ( +
  • + + {link.label} + +
  • + ))} +
+
+ +
+

资源

+
    + {footerLinks.resources.map((link) => ( +
  • + + {link.label} + +
  • + ))} +
+
+
+
+ + {/* Bottom Bar */} +
+

© 2025 Afilmory. 完全开源,永久免费。

+
+ + MIT License + + + 版本 v1.0 + +
+
+
+
+ ) +} 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 /**