Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
0829e77
fix(stats): use tw for max image size
DavideBruner Mar 18, 2024
b7a7899
Merge branch 'staging'
yeboster Mar 18, 2024
986e209
Merge branch 'staging'
yeboster Mar 18, 2024
21bdac7
Merge branch 'staging'
yeboster Mar 18, 2024
31e735b
Merge branch 'staging'
yeboster Mar 18, 2024
563dbdd
Merge branch 'staging'
yeboster Mar 18, 2024
a496775
Merge branch 'staging'
yeboster Mar 18, 2024
502aefb
Merge branch 'staging'
yeboster Mar 18, 2024
247a3d6
Merge branch 'staging'
yeboster Mar 19, 2024
6db20a9
Merge branch 'staging'
yeboster Mar 19, 2024
3ca5570
Fix: resolve dependency issues and enable build
Mar 12, 2026
3ab47a4
feat(seo): add sitemap, robots.txt, and enhanced metadata
Mar 14, 2026
8ab2912
feat: modernize landing page - animations, accessibility, mobile resp…
Mar 14, 2026
7148f9e
docs: Update session tracker - PR #2 open for modernized landing
Mar 14, 2026
dae9dcc
Session 5: Verify build passes
Mar 14, 2026
8026204
Update STATUS.md - Session #6 complete
Mar 14, 2026
dd70589
Session 7: Build passes, PR #2 awaiting merge
Mar 14, 2026
9f37d2e
Update STATUS.md - session 9 complete
Mar 14, 2026
d86fe02
Update STATUS.md: Session #10 - build passes
Mar 14, 2026
5380fb5
Update STATUS.md - session 11
Mar 14, 2026
d2bbfdf
Hourly session 12: Build passes, PR #2 awaiting merge
Mar 14, 2026
65ffd03
Hourly session 13: Build passes, committed STATUS.md update
Mar 14, 2026
f623157
fix: bump deploy-to-vercel-action to v2
Mar 14, 2026
7d06d69
fix: use latest vercel action
Mar 14, 2026
fefc127
fix: add build step to CI workflow and update checkout to v4
Mar 15, 2026
acb7f1e
Status: CI deploy fix in progress (Vercel config issue)
Mar 15, 2026
5580359
ci: update deploy-to-vercel-action to v2
Mar 15, 2026
f2b57e3
ci: use deploy-to-vercel-action@latest
Mar 15, 2026
e8b13c1
style: add hover glow effect to buttons
Mar 15, 2026
a667ec8
Status: Session #19 - button hover glow added
Mar 15, 2026
c9070a7
fix: remove PR preview deployments to resolve Vercel action error
Mar 15, 2026
d48f4f2
ci: remove deploy step, keep build only
Mar 15, 2026
a8b0246
fix: stabilize record type cycling in hero headline
Mar 15, 2026
40f3f08
fix: add min-width to prevent layout shift in record type
Mar 15, 2026
d9479c6
fix: replace scroll icon with down arrow
Mar 15, 2026
777b0c8
style: update font to Plus Jakarta Sans for modern look
Mar 15, 2026
b29af16
style: modernize recent domains carousel with better accessibility
Mar 15, 2026
0ce19ad
style: add animated stats counters, button hover scale effects, moder…
Mar 15, 2026
de492d1
feat: add name generator with category selection and word count options
Mar 15, 2026
d3858cf
style: make section titles uppercase and shorter
Mar 15, 2026
9de9706
copy: modernize landing page copy for better engagement
Mar 15, 2026
cd496e7
fix: handle word count exceeding dictionary length in generator
Mar 15, 2026
9dea3e3
fix: properly pass multiple dictionaries for word count in generator
Mar 15, 2026
64b8cde
copy: remove Telegram call-to-action
Mar 15, 2026
cb09653
fix: auto-regenerate name on category/word count change
Mar 15, 2026
b8c3b6f
style: add text outline to navbar for better readability
Mar 15, 2026
8bfc9a6
fix: change hover badge from .meta to .mpc
Mar 15, 2026
ba95f5a
fix: clean Star Wars names to keep only first word
Mar 15, 2026
9387c90
docs: update STATUS.md with all session changes
Mar 15, 2026
9116838
fix: update .meta to .mpc in copy
Mar 15, 2026
47cd20b
style: modernize footer, enhance hero visuals, add mobile touch support
Mar 15, 2026
eeb8c3c
refactor: production-ready improvements - error boundary, loading ske…
Mar 15, 2026
f25accd
refactor: production-ready v2 - lazy loading, error pages, loading st…
Mar 15, 2026
8fd8824
remove: STATUS.md (moved to workspace)
Mar 15, 2026
abc2366
style: increase record type size in hero for better visibility
Mar 15, 2026
50e0170
Merge pull request #2 from MetaNames/modernize-landing-v2
yeboster Mar 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,2 +1,9 @@
NEXT_PUBLIC_APP_URL="https://app.metanames.app"
NEXT_PUBLIC_ENV="test"
# MetaNames Landing Page Environment Variables

# Public variables (exposed to client)
NEXT_PUBLIC_API_URL=
NEXT_PUBLIC_SITE_URL=https://metanames.app
NEXT_PUBLIC_ANALYTICS_ID=

# Private variables (server-side only)
# API Keys, secrets, etc.
23 changes: 11 additions & 12 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
name: Deploy
name: Build
on:
push:
branches: [main, staging]
pull_request:
types: [opened, synchronize, reopened]
workflow_dispatch:
jobs:
deploy:
build:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Deploy to Vercel Action
uses: BetaHuhn/deploy-to-vercel-action@v1
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
VERCEL_SCOPE: ${{ secrets.VERCEL_SCOPE }}
PRODUCTION: ${{ github.ref == 'refs/heads/main' && 'true' || 'false' }}
ALIAS_DOMAINS: ${{ github.ref == 'refs/heads/staging' && 'test.metanames.app' || '' }}
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
23 changes: 21 additions & 2 deletions app/api/stats/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
import { getMetaNamesStats } from "@/lib/metanames";

export const dynamic = "force-dynamic";
export const revalidate = 60; // Revalidate every 60 seconds

export async function GET() {
const stats = await getMetaNamesStats();
return Response.json(stats);
try {
const stats = await getMetaNamesStats();

return Response.json(stats, {
status: 200,
headers: {
"Cache-Control": "public, s-maxage=60, stale-while-revalidate=300",
"CDN-Cache-Control": "public, max-age=60",
},
});
} catch (error) {
console.error("Failed to fetch stats:", error);

return Response.json(
{ error: "Failed to fetch stats", message: error instanceof Error ? error.message : "Unknown error" },
{ status: 500 }
);
}
}
47 changes: 47 additions & 0 deletions app/error.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"use client";

import Link from "next/link";
import { Button } from "@/components/Button";
import { FaHome, FaArrowLeft } from "react-icons/fa";

export default function Error({
error,
reset,
}: {
error: Error & { digest?: string };
reset: () => void;
}) {
return (
<div className="min-h-screen bg-primary flex items-center justify-center px-4">
<div className="text-center max-w-md">
<h1 className="text-6xl font-bold text-white mb-4">Oops!</h1>
<p className="text-white/70 text-lg mb-8">
Something went wrong. We're working on fixing it.
</p>

{error?.digest && (
<p className="text-white/40 text-sm mb-8">
Error ID: {error.digest}
</p>
)}

<div className="flex gap-4 justify-center">
<Button
onClick={reset}
variant="primary"
>
Try Again
</Button>
<Link href="/">
<Button
variant="secondary"
icon={<FaHome />}
>
Home
</Button>
</Link>
</div>
</div>
</div>
);
}
54 changes: 54 additions & 0 deletions app/global-error.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
"use client";

import { useEffect } from "react";
import { Button } from "@/components/Button";
import { FaHome, FaRedo } from "react-icons/fa";

export default function GlobalError({
error,
reset,
}: {
error: Error & { digest?: string };
reset: () => void;
}) {
useEffect(() => {
// Log the error to an error reporting service
console.error("Global error:", error);
}, [error]);

return (
<html>
<body className="min-h-screen bg-primary flex items-center justify-center">
<div className="text-center max-w-md px-4">
<h1 className="text-5xl md:text-7xl font-bold text-white mb-6">
💥
</h1>
<h2 className="text-2xl font-semibold text-white mb-4">
Something went wrong
</h2>
<p className="text-white/60 mb-8">
We encountered an unexpected error. Please try again or return home.
</p>

<div className="flex flex-col sm:flex-row gap-4 justify-center">
<Button
onClick={reset}
variant="primary"
icon={<FaRedo />}
>
Try Again
</Button>
<a href="/">
<Button
variant="secondary"
icon={<FaHome />}
>
Go Home
</Button>
</a>
</div>
</div>
</body>
</html>
);
}
92 changes: 91 additions & 1 deletion app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
--background: 222.2 84% 4.9%;
--foreground: 210 40% 98%;

--primary: 210 40% 98%;
--primary: 263 70% 50%;
--primary-foreground: 222.2 47.4% 11.2%;

--secondary: 217.2 32.6% 17.5%;
Expand All @@ -46,7 +46,97 @@
* {
@apply border-border;
}
html {
scroll-behavior: smooth;
}
body {
@apply bg-background text-foreground;
font-feature-settings: "rlig" 1, "calt" 1;
}

/* Focus styles for accessibility */
:focus-visible {
@apply outline-none ring-2 ring-primary ring-offset-2 ring-offset-background;
}

/* Skip link for accessibility */
.skip-link {
@apply absolute -top-10 left-4 z-50 bg-primary text-white px-4 py-2 rounded transition-all;
}
.skip-link:focus {
@apply top-4;
}
}

/* Animation utilities */
@layer utilities {
.animate-fade-in {
animation: fadeIn 0.6s ease-out forwards;
}

.animate-slide-up {
animation: slideUp 0.6s ease-out forwards;
}

.animate-float {
animation: float 6s ease-in-out infinite;
}

.animate-gradient {
background-size: 200% 200%;
animation: gradient 8s ease infinite;
}
}

@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}

@keyframes slideUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}

@keyframes float {
0%, 100% {
transform: translateY(0);
}
50% {
transform: translateY(-20px);
}
}

@keyframes gradient {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}

/* Reduced motion support */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
72 changes: 67 additions & 5 deletions app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Analytics } from "@vercel/analytics/react";
import type { Metadata, Viewport } from "next";
import { Inter } from "next/font/google";
import { Plus_Jakarta_Sans } from "next/font/google";
import "./globals.css";

import { Footer } from "@/components/Footer";
Expand All @@ -9,15 +9,73 @@ import { cn } from "@/lib/utils";

import Providers from "./providers";

const font = Inter({
const font = Plus_Jakarta_Sans({
subsets: ["latin"],
variable: "--font-sans",
});

export const metadata: Metadata = {
title: "Meta Names",
title: {
default: "MetaNames | DNS for Partisia Blockchain",
template: "%s | MetaNames",
},
description:
"Meta Names offers a cutting-edge DNS solution on the Partisia blockchain, specifically designed for the Web3 environment. It simplifies the process of blockchain integration for developers through a user-friendly SDK, enabling easy access and management of decentralized domain names. This service streamlines the development of Web3 applications by providing seamless domain management and enhanced user experience, making blockchain technology more accessible and efficient for developers.",
"Meta Names offers a cutting-edge DNS solution on the Partisia blockchain. Simplify blockchain integration for Web3 developers with our user-friendly SDK. Manage decentralized domain names seamlessly.",
keywords: [
"DNS",
"Partisia Blockchain",
"Web3",
"Blockchain域名",
"Decentralized DNS",
"Web3 domains",
"Crypto domain",
".mpc",
"Partisia",
],
authors: [{ name: "MetaNames Team" }],
creator: "MetaNames",
metadataBase: new URL("https://metanames.app"),
appleWebApp: {
capable: true,
statusBarStyle: "black-translucent",
title: "MetaNames",
},
openGraph: {
type: "website",
locale: "en_US",
url: "https://metanames.app",
siteName: "MetaNames",
title: "MetaNames | DNS for Partisia Blockchain",
description:
"Cutting-edge DNS solution on Partisia Blockchain. Simplify Web3 domain management with our developer-friendly SDK.",
images: [
{
url: "/og-image.png",
width: 1200,
height: 630,
alt: "MetaNames - DNS for Partisia Blockchain",
},
],
},
twitter: {
card: "summary_large_image",
title: "MetaNames | DNS for Partisia Blockchain",
description:
"Cutting-edge DNS solution on Partisia Blockchain. Simplify Web3 domain management.",
images: ["/og-image.png"],
creator: "@metanames",
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
"max-video-preview": -1,
"max-image-preview": "large",
"max-snippet": -1,
},
},
};

export const viewport: Viewport = {
Expand All @@ -32,7 +90,11 @@ export default function RootLayout({
}>) {
return (
<html lang="en" suppressHydrationWarning>
<head />
<head>
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
</head>
<body
className={cn(
"min-h-screen bg-background font-sans antialiased",
Expand Down
Loading
Loading