fix: redesign section flow with alternating white/gray backgrounds, remove all dark sections, change 50+ to 40+ tools

This commit is contained in:
ashim-hq
2026-04-23 21:07:47 +08:00
parent 16e92a1c2d
commit 257e6b12c4
9 changed files with 19 additions and 21 deletions
+3 -3
View File
@@ -7,12 +7,12 @@ const inter = Inter({ subsets: ["latin"], variable: "--font-inter" });
export const metadata: Metadata = {
title: "SnapOtter | Self-Hosted Image Processing",
description:
"50+ image processing tools with local AI. Runs 100% offline. No data leaves your network. Open source and free forever.",
"40+ image processing tools with local AI. Runs 100% offline. No data leaves your network. Open source and free forever.",
metadataBase: new URL("https://snapotter.com"),
openGraph: {
title: "SnapOtter | Self-Hosted Image Processing",
description:
"50+ image processing tools with local AI. Runs 100% offline. No data leaves your network.",
"40+ image processing tools with local AI. Runs 100% offline. No data leaves your network.",
url: "https://snapotter.com",
siteName: "SnapOtter",
type: "website",
@@ -29,7 +29,7 @@ export const metadata: Metadata = {
card: "summary_large_image",
title: "SnapOtter | Self-Hosted Image Processing",
description:
"50+ image processing tools with local AI. Runs 100% offline. No data leaves your network.",
"40+ image processing tools with local AI. Runs 100% offline. No data leaves your network.",
images: ["/og-image.svg"],
},
};
+1 -1
View File
@@ -18,7 +18,7 @@ const response = `{
export function ApiCallout() {
return (
<section id="api" className="px-6 py-24 md:py-36">
<section id="api" className="bg-background-alt px-6 py-24 md:py-36">
<div className="mx-auto max-w-6xl">
<FadeIn>
<h2 className="text-center text-3xl font-bold tracking-tight md:text-4xl">
+1 -1
View File
@@ -382,7 +382,7 @@ export function BentoGrid() {
<div className="mx-auto max-w-6xl">
<FadeIn>
<h2 className="text-center text-3xl font-bold tracking-tight md:text-4xl">
50+ tools. Zero cloud dependency.
40+ tools. Zero cloud dependency.
</h2>
<p className="mx-auto mt-4 max-w-xl text-center text-lg text-muted">
Search to find exactly what you need. Every tool runs 100% locally.
+6 -6
View File
@@ -25,26 +25,26 @@ const features = [
export function Enterprise() {
return (
<section id="enterprise" className="bg-dark-bg px-6 py-24 text-dark-fg md:py-36">
<section id="enterprise" className="px-6 py-24 md:py-36">
<div className="mx-auto max-w-6xl">
<FadeIn>
<h2 className="text-center text-3xl font-bold tracking-tight md:text-4xl">
Built for organizations that take data seriously.
</h2>
<p className="mx-auto mt-4 max-w-xl text-center text-lg text-dark-muted">
<p className="mx-auto mt-4 max-w-xl text-center text-lg text-muted">
Self-host on your own infrastructure. Your images never leave your network.
</p>
</FadeIn>
<div className="mt-16 grid gap-12 md:grid-cols-3 md:gap-16">
<div className="mt-16 grid gap-8 md:grid-cols-3 md:gap-12">
{features.map((feat, i) => (
<FadeIn key={feat.title} delay={i * 0.1}>
<div>
<div className="flex h-12 w-12 items-center justify-center rounded-xl border border-white/10 bg-white/5">
<div className="rounded-2xl border border-border bg-background-alt p-8 transition-all hover:shadow-md">
<div className="flex h-12 w-12 items-center justify-center rounded-xl bg-accent/10">
<feat.icon size={22} className="text-accent" />
</div>
<h3 className="mt-4 text-xl font-bold">{feat.title}</h3>
<p className="mt-3 leading-relaxed text-dark-muted">{feat.description}</p>
<p className="mt-3 leading-relaxed text-muted">{feat.description}</p>
</div>
</FadeIn>
))}
+1 -1
View File
@@ -23,7 +23,7 @@ const steps = [
export function HowItWorks() {
return (
<section id="how-it-works" className="bg-background-alt px-6 py-24 md:py-36">
<section id="how-it-works" className="px-6 py-24 md:py-36">
<div className="mx-auto max-w-6xl">
<FadeIn>
<h2 className="text-center text-3xl font-bold tracking-tight md:text-4xl">
+1 -1
View File
@@ -3,7 +3,7 @@ import { FadeIn } from "./fade-in";
export function OpenSource() {
return (
<section id="open-source" className="bg-background-alt px-6 py-24 md:py-36">
<section id="open-source" className="px-6 py-24 md:py-36">
<div className="mx-auto max-w-3xl text-center">
<FadeIn>
<h2 className="text-3xl font-bold tracking-tight md:text-4xl">Open source. Always.</h2>
+1 -1
View File
@@ -25,7 +25,7 @@ const ways = [
export function ThreeWays() {
return (
<section className="px-6 py-24 md:py-36">
<section className="bg-background-alt px-6 py-24 md:py-36">
<div className="mx-auto max-w-6xl">
<FadeIn>
<h2 className="text-center text-3xl font-bold tracking-tight md:text-4xl">
@@ -11,7 +11,7 @@ const phrases = [
"No limits. No hidden caps.",
"Works fully offline.",
"Unlimited batch processing.",
"50+ image tools.",
"40+ image tools.",
"14 AI models. Your hardware.",
"Lightning fast. Built on Sharp.",
"Air-gapped ready.",
+4 -6
View File
@@ -36,7 +36,7 @@ const benefits = [
export function WhyChoose() {
return (
<section className="bg-dark-bg px-6 py-24 text-dark-fg md:py-36">
<section className="bg-background-alt px-6 py-24 md:py-36">
<div className="mx-auto max-w-6xl">
<FadeIn>
<h2 className="text-center text-3xl font-bold tracking-tight md:text-4xl">
@@ -47,14 +47,12 @@ export function WhyChoose() {
<div className="mt-16 grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
{benefits.map((benefit, i) => (
<FadeIn key={benefit.title} delay={i * 0.05}>
<div className="rounded-2xl border border-white/10 bg-white/5 p-6">
<div className="rounded-2xl border border-border bg-background p-6 transition-all hover:shadow-md">
<div className="flex items-center gap-3">
<benefit.icon size={24} className="text-accent shrink-0" />
<benefit.icon size={24} className="shrink-0 text-accent" />
<h3 className="text-lg font-bold">{benefit.title}</h3>
</div>
<p className="mt-3 text-sm leading-relaxed text-dark-muted">
{benefit.description}
</p>
<p className="mt-3 text-sm leading-relaxed text-muted">{benefit.description}</p>
</div>
</FadeIn>
))}