landing Animations

This commit is contained in:
2026-02-13 20:46:07 +01:00
parent 6f7017e712
commit 3a045ccd0a
4 changed files with 74 additions and 36 deletions
+18 -2
View File
@@ -15,7 +15,9 @@
"radix-ui": "^1.4.3", "radix-ui": "^1.4.3",
"react": "19.2.3", "react": "19.2.3",
"react-dom": "19.2.3", "react-dom": "19.2.3",
"tailwind-merge": "^3.4.0" "tailwind-animations": "^1.0.1",
"tailwind-merge": "^3.4.0",
"tailwind-motlib": "^1.0.4"
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/postcss": "^4", "@tailwindcss/postcss": "^4",
@@ -7371,6 +7373,15 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/tailwind-animations": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tailwind-animations/-/tailwind-animations-1.0.1.tgz",
"integrity": "sha512-5ouCdgfGS4kcyuzRSb/1O3o9f5Akssi7ue46PHfKjvPLMWjtnzmqM8i6ElES3tKVTyhjSaTPfLti7aB7WSxhZg==",
"license": "MIT",
"peerDependencies": {
"tailwindcss": "^4.0.0"
}
},
"node_modules/tailwind-merge": { "node_modules/tailwind-merge": {
"version": "3.4.0", "version": "3.4.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz",
@@ -7381,11 +7392,16 @@
"url": "https://github.com/sponsors/dcastil" "url": "https://github.com/sponsors/dcastil"
} }
}, },
"node_modules/tailwind-motlib": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/tailwind-motlib/-/tailwind-motlib-1.0.4.tgz",
"integrity": "sha512-4M80sHBTmXQn/fWo8xZYRDlr8yqLv4ZC2MzpHw8MsGPTbXV75Y3NW518ec3CWSiO3WSEZlhXfOHBKpxEvCuoRw==",
"license": "ISC"
},
"node_modules/tailwindcss": { "node_modules/tailwindcss": {
"version": "4.1.18", "version": "4.1.18",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz",
"integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/tapable": { "node_modules/tapable": {
+3 -1
View File
@@ -15,7 +15,9 @@
"radix-ui": "^1.4.3", "radix-ui": "^1.4.3",
"react": "19.2.3", "react": "19.2.3",
"react-dom": "19.2.3", "react-dom": "19.2.3",
"tailwind-merge": "^3.4.0" "tailwind-animations": "^1.0.1",
"tailwind-merge": "^3.4.0",
"tailwind-motlib": "^1.0.4"
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/postcss": "^4", "@tailwindcss/postcss": "^4",
+3
View File
@@ -1,6 +1,9 @@
@import "tailwindcss"; @import "tailwindcss";
@import "tw-animate-css"; @import "tw-animate-css";
@import "shadcn/tailwind.css"; @import "shadcn/tailwind.css";
@import 'tailwind-animations';
@tailwind utilities;
@custom-variant dark (&:is(.dark *)); @custom-variant dark (&:is(.dark *));
+50 -33
View File
@@ -1,4 +1,6 @@
"use client";
import Link from "next/link"; import Link from "next/link";
import { Motion, Staggered } from "tailwind-motlib";
export default function Landing() { export default function Landing() {
return ( return (
@@ -55,45 +57,60 @@ export default function Landing() {
{/* Why Nexa */} {/* Why Nexa */}
<section className="relative z-10 px-6 py-24 max-w-7xl mx-auto"> <section className="relative z-10 px-6 py-24 max-w-7xl mx-auto">
<div className="grid md:grid-cols-3 gap-10"> <div className="grid md:grid-cols-3 gap-10">
<div> <Staggered stagger={100}>
<h3 className="text-xl font-medium mb-2">Risk-aware by default</h3> <Motion className="visible animate-fade-in-up">
<p className="text-muted-foreground"> <div className="invisible">
Every trade is evaluated against holder concentration, bundlers, <h3 className="text-xl font-medium mb-2">
deployer behavior, and liquidity signals, before execution. Risk-aware by default
</p> </h3>
</div> <p className="text-muted-foreground">
Every trade is evaluated against holder concentration,
bundlers, deployer behavior, and liquidity signals, before
execution.
</p>
</div>
</Motion>
<div> <Motion className="visible animate-fade-in-up">
<h3 className="text-xl font-medium mb-2">AI where it matters</h3> <div className="invisible">
<p className="text-muted-foreground"> <h3 className="text-xl font-medium mb-2">
No magic predictions. Just automated checks that experienced AI where it matters
traders already do, instantly and consistently. </h3>
</p> <p className="text-muted-foreground">
</div> No magic predictions. Just automated checks that experienced
traders already do, instantly and consistently.
</p>
</div>
</Motion>
<div> <Motion className="visible animate-fade-in-up">
<h3 className="text-xl font-medium mb-2">Built for speed</h3> <div className="invisible">
<p className="text-muted-foreground"> <h3 className="text-xl font-medium mb-2">Built for speed</h3>
Optimized request batching, Solana-native execution, and Jupiter <p className="text-muted-foreground">
routing keep latency low even during peak volume. Optimized request batching, Solana-native execution, and
</p> Jupiter routing keep latency low even during peak volume.
</div> </p>
</div>
</Motion>
</Staggered>
</div> </div>
</section> </section>
{/* Risk interception highlight */} {/* Risk interception highlight */}
<section className="relative z-10 px-6 py-24 max-w-7xl mx-auto"> <Motion className="animate-fade-in-left">
<div className="rounded-2xl border border-border bg-card/60 backdrop-blur p-10"> <section className="relative z-10 px-6 py-24 max-w-7xl mx-auto opacity-0">
<h2 className="text-3xl font-semibold mb-4"> <div className="rounded-2xl border border-border bg-card/60 backdrop-blur p-10">
Nexa can stop you before you buy a rug <h2 className="text-3xl font-semibold mb-4">
</h2> Nexa can stop you before you buy a rug
<p className="text-muted-foreground max-w-2xl"> </h2>
When high-risk patterns are detected, Nexa blocks execution by <p className="text-muted-foreground max-w-2xl">
default and tells you exactly why. If you still want in, that's your When high-risk patterns are detected, Nexa blocks execution by
call. But it won't be blind. default and tells you exactly why. If you still want in, that's
</p> your call. But it won't be blind.
</div> </p>
</section> </div>
</section>
</Motion>
{/* How it works */} {/* How it works */}
<section className="relative z-10 px-6 py-24 max-w-7xl mx-auto"> <section className="relative z-10 px-6 py-24 max-w-7xl mx-auto">