feat: 服务器迁移后的全量演进(依赖升级/安全审计/设计统一/截图/SEO 底座化)
在原仓库历史之上同步本服务器上的全部演进: - 迁移至新服务器并重建 PG 数据库 + ddnc 开发域名绑定 - 全部依赖升级至最新(Next 16.3.5 / React 19.3 / better-auth 1.7.5 / Drizzle 0.45 / TS 7), overrides 消除已知 CVE,安全审计 19 项发现全部修复闭环 - 设计统一:各站宽度 token(--container + site-container)、classic hero 重设计、 头部换行修复、页面过渡与 View Transitions - 截图功能:api.adx9.com 截图服务接入(ow=800 本地化 webp、cf=1、去重/限流/占位图) - SEO 底座化:canonical/hreflang/sitemap/JSON-LD/robots 全部收进 core,新站自动继承 - 加载体验:五站五形态路由骨架(data-theme 切换、shimmer 微光、延迟淡入)+ 过滤 useTransition 交叉淡入淡出(card-enter 错峰入场) - 构建:experimental.cpus 限流防 PG 连接打满;清理死组件链
This commit is contained in:
@@ -110,7 +110,7 @@
|
||||
"items": [
|
||||
{
|
||||
"name": "Sarah Chen",
|
||||
"quote": "Toolso.AI helped me find the perfect AI writing assistant. The categorization makes discovery so easy!",
|
||||
"quote": "AI Stack helped me find the perfect AI writing assistant. The categorization makes discovery so easy!",
|
||||
"designation": "Content Creator"
|
||||
},
|
||||
{
|
||||
@@ -120,7 +120,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Emily Rodriguez",
|
||||
"quote": "I discover new AI tools every week on Toolso.AI. It's become my go-to resource for AI exploration.",
|
||||
"quote": "I discover new AI tools every week on AI Stack. It's become my go-to resource for AI exploration.",
|
||||
"designation": "Startup Founder"
|
||||
},
|
||||
{
|
||||
@@ -669,48 +669,49 @@
|
||||
},
|
||||
"clearFilters": "Clear search & filters",
|
||||
"useCasesTitle": "Use cases",
|
||||
"goodForTitle": "Good for"
|
||||
"goodForTitle": "Good for",
|
||||
"preview": "Website preview"
|
||||
},
|
||||
"seo": {
|
||||
"home": {
|
||||
"title": "AI Stack — Find the Best AI Tools, Ranked by Real Users",
|
||||
"description": "The professional AI tools directory. 1,000+ AI tools across 14 categories ranked by community votes, reviews and engagement.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"blog": {
|
||||
"title": "Blog - Toolso.AI",
|
||||
"title": "Blog - AI Stack",
|
||||
"description": "Latest insights, tutorials and updates about AI tools. Stay informed about the best AI tools and industry trends.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"contact": {
|
||||
"title": "Contact Us - Toolso.AI",
|
||||
"title": "Contact Us - AI Stack",
|
||||
"description": "Get in touch with us. We'd love to hear your feedback and tool suggestions.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"login": {
|
||||
"title": "Login - Toolso.AI",
|
||||
"title": "Login - AI Stack",
|
||||
"description": "Sign in to your account to submit tools, save favorites, and contribute to our AI tools directory.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"signup": {
|
||||
"title": "Sign Up - Toolso.AI",
|
||||
"title": "Sign Up - AI Stack",
|
||||
"description": "Create your account and start contributing to our AI tools directory. Submit tools and join our community.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"terms": {
|
||||
"title": "Terms of Service - Toolso.AI",
|
||||
"description": "Read our terms of service to understand the rules and guidelines for using Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Terms of Service - AI Stack",
|
||||
"description": "Read our terms of service to understand the rules and guidelines for using AI Stack.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "Privacy Policy - Toolso.AI",
|
||||
"description": "Learn how we collect, use, and protect your personal information and data on Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Privacy Policy - AI Stack",
|
||||
"description": "Learn how we collect, use, and protect your personal information and data on AI Stack.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookie Policy - Toolso.AI",
|
||||
"description": "Understand how we use cookies and similar tracking technologies on Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Cookie Policy - AI Stack",
|
||||
"description": "Understand how we use cookies and similar tracking technologies on AI Stack.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"tools": {
|
||||
"title": "AI Tools Directory - Discover the Best AI Tools",
|
||||
@@ -1096,4 +1097,4 @@
|
||||
"siteHeader": {
|
||||
"searchPlaceholder": "Search AI tools..."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -105,11 +105,11 @@
|
||||
},
|
||||
"testimonials": {
|
||||
"title": "用户评价",
|
||||
"subtitle": "来自使用 Toolso.AI 发现优质 AI 工具的真实用户反馈。",
|
||||
"subtitle": "来自使用 AI Stack 发现优质 AI 工具的真实用户反馈。",
|
||||
"items": [
|
||||
{
|
||||
"name": "张伟",
|
||||
"quote": "Toolso.AI 帮我找到了完美的 AI 写作助手,分类清晰让发现变得非常简单!",
|
||||
"quote": "AI Stack 帮我找到了完美的 AI 写作助手,分类清晰让发现变得非常简单!",
|
||||
"designation": "内容创作者"
|
||||
},
|
||||
{
|
||||
@@ -119,7 +119,7 @@
|
||||
},
|
||||
{
|
||||
"name": "李娜",
|
||||
"quote": "每周都能在 Toolso.AI 上发现新的 AI 工具,已经成为我探索 AI 的首选资源。",
|
||||
"quote": "每周都能在 AI Stack 上发现新的 AI 工具,已经成为我探索 AI 的首选资源。",
|
||||
"designation": "创业者"
|
||||
},
|
||||
{
|
||||
@@ -523,7 +523,7 @@
|
||||
"description": "请联系我们,我们会尽快回复。",
|
||||
"testimonial": {
|
||||
"title": "帮助用户发现最佳 AI 工具",
|
||||
"description": "Toolso.AI 致力于为用户提供精选的 AI 工具目录,帮助大家找到最适合的 AI 助手。"
|
||||
"description": "AI Stack 致力于为用户提供精选的 AI 工具目录,帮助大家找到最适合的 AI 助手。"
|
||||
},
|
||||
"form": {
|
||||
"nameLabel": "姓名",
|
||||
@@ -676,48 +676,49 @@
|
||||
},
|
||||
"clearFilters": "清除搜索与筛选",
|
||||
"useCasesTitle": "使用场景",
|
||||
"goodForTitle": "适合人群"
|
||||
"goodForTitle": "适合人群",
|
||||
"preview": "网站预览"
|
||||
},
|
||||
"seo": {
|
||||
"home": {
|
||||
"title": "AI Stack — 由真实用户排名的 AI 工具目录",
|
||||
"description": "专业 AI 工具导航:14 个分类、1000+ 工具,由社区投票、评论与互动数据实时排名。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"blog": {
|
||||
"title": "博客 - Toolso.AI",
|
||||
"title": "博客 - AI Stack",
|
||||
"description": "关于 AI 工具的最新资讯、教程和更新。了解最佳 AI 工具和行业趋势。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"contact": {
|
||||
"title": "联系我们 - Toolso.AI",
|
||||
"title": "联系我们 - AI Stack",
|
||||
"description": "与我们取得联系。我们期待听到您的反馈和工具推荐建议。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"login": {
|
||||
"title": "登录 - Toolso.AI",
|
||||
"title": "登录 - AI Stack",
|
||||
"description": "登录您的账户,提交工具、收藏喜爱的工具,为 AI 工具目录做贡献。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"signup": {
|
||||
"title": "注册 - Toolso.AI",
|
||||
"title": "注册 - AI Stack",
|
||||
"description": "创建您的账户,开始为 AI 工具目录做贡献。提交工具、加入我们的社区。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"terms": {
|
||||
"title": "服务条款 - Toolso.AI",
|
||||
"description": "阅读我们的服务条款,了解使用 Toolso.AI 的规则和指南。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "服务条款 - AI Stack",
|
||||
"description": "阅读我们的服务条款,了解使用 AI Stack 的规则和指南。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "隐私政策 - Toolso.AI",
|
||||
"description": "了解我们如何在 Toolso.AI 上收集、使用和保护您的个人信息和数据。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "隐私政策 - AI Stack",
|
||||
"description": "了解我们如何在 AI Stack 上收集、使用和保护您的个人信息和数据。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookie 政策 - Toolso.AI",
|
||||
"description": "了解我们如何在 Toolso.AI 上使用 cookies 和类似的跟踪技术。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Cookie 政策 - AI Stack",
|
||||
"description": "了解我们如何在 AI Stack 上使用 cookies 和类似的跟踪技术。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"tools": {
|
||||
"title": "AI 工具库 - 发现最好的 AI 工具",
|
||||
@@ -1103,4 +1104,4 @@
|
||||
"siteHeader": {
|
||||
"searchPlaceholder": "搜索 1000+ AI 工具..."
|
||||
}
|
||||
}
|
||||
}
|
||||
+16
-16
@@ -11,24 +11,24 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@aidir/core": "workspace:*",
|
||||
"next": "16.1.1",
|
||||
"react": "^19.2.3",
|
||||
"react-dom": "^19.2.3",
|
||||
"next-intl": "^4.7.0",
|
||||
"next": "^16.3.5",
|
||||
"react": "^19.3.0",
|
||||
"react-dom": "^19.3.0",
|
||||
"next-intl": "^4.14.5",
|
||||
"next-themes": "^0.4.6",
|
||||
"next-view-transitions": "^0.3.5",
|
||||
"sonner": "^2.0.7",
|
||||
"geist": "^1.3.0",
|
||||
"lucide-react": "^0.562.0",
|
||||
"framer-motion": "^12.43.0"
|
||||
"sonner": "^2.0.8",
|
||||
"geist": "^1.7.2",
|
||||
"lucide-react": "^1.46.0",
|
||||
"framer-motion": "^13.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19.2.7",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"typescript": "^5",
|
||||
"tailwindcss": "^3.4.1",
|
||||
"postcss": "^8"
|
||||
"@types/node": "^26.5.1",
|
||||
"@types/react": "^19.3.0",
|
||||
"@types/react-dom": "^19.3.0",
|
||||
"@types/mdx": "^2.0.14",
|
||||
"typescript": "^7.0.2",
|
||||
"tailwindcss": "^3.4.19",
|
||||
"postcss": "^8.5.28"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
# robots.txt for Toolso.AI - AI Tools Directory
|
||||
# https://toolso.ai
|
||||
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# Disallow admin and API pages
|
||||
Disallow: /admin/
|
||||
Disallow: /api/
|
||||
|
||||
# Disallow authentication pages
|
||||
Disallow: /*/signup
|
||||
Disallow: /*/login
|
||||
Disallow: /*/check-email
|
||||
Disallow: /*/verify-email
|
||||
Disallow: /*/forgot-password
|
||||
Disallow: /*/reset-password
|
||||
|
||||
# Disallow protected user pages
|
||||
Disallow: /*/dashboard
|
||||
Disallow: /*/profile
|
||||
|
||||
# Sitemap location
|
||||
Sitemap: https://toolso.ai/sitemap.xml
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(admin)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(admin)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(admin)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(auth)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(auth)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(auth)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(protected)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(protected)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(protected)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/layout.tsx 的薄路由
|
||||
export { default, generateStaticParams } from "@aidir/core/pages/[locale]/layout";
|
||||
export { default, generateMetadata, generateStaticParams } from "@aidir/core/pages/[locale]/layout";
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
// 自动生成:api/screenshots/[slug]/route.ts 的薄路由
|
||||
export { GET } from "@aidir/core/pages/api/screenshots/[slug]/route";
|
||||
@@ -0,0 +1,2 @@
|
||||
// 自动生成:robots.ts 的薄路由
|
||||
export { default } from "@aidir/core/pages/robots";
|
||||
@@ -1,6 +1,6 @@
|
||||
// 自动生成:站点首页组件(源自底座 classic 形态,品牌来自 @/site/brand)
|
||||
import { siteConfig } from "@/site/brand";
|
||||
import { Search, TrendingUp, Sparkles, Clock, Award, LayoutGrid, MessageSquareQuote } from "lucide-react";
|
||||
import { Search, ArrowRight } from "lucide-react";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
import { ToolCard, ToolCardGrid } from "@/components/tool-card";
|
||||
import { LocaleLink } from "@/components/locale-link";
|
||||
@@ -57,13 +57,13 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
|
||||
return (
|
||||
<div className="bg-background">
|
||||
{/* Hero */}
|
||||
<section className="hero-dark border-b border-border">
|
||||
<div className="mx-auto max-w-7xl px-4 py-16 text-center sm:px-6 md:py-24">
|
||||
<h1 className="mx-auto max-w-3xl text-3xl font-bold tracking-tight text-foreground sm:text-4xl md:text-5xl">
|
||||
{/* Hero:亮色排版优先,搜索框是唯一焦点 */}
|
||||
<section className="border-b border-border">
|
||||
<div className="site-container px-4 pb-14 pt-16 text-center sm:px-6 md:pb-16 md:pt-24">
|
||||
<h1 className="mx-auto max-w-3xl text-balance text-3xl font-bold tracking-tight text-foreground sm:text-4xl md:text-5xl">
|
||||
{th("title")}
|
||||
</h1>
|
||||
<p className="mx-auto mt-4 max-w-2xl text-sm text-muted-foreground sm:text-base">
|
||||
<p className="mx-auto mt-4 max-w-2xl text-sm leading-relaxed text-muted-foreground sm:text-base">
|
||||
{th("description")}
|
||||
</p>
|
||||
<form action={`/${locale}/tools`} className="mx-auto mt-8 max-w-xl">
|
||||
@@ -72,39 +72,39 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
<input
|
||||
name="search"
|
||||
placeholder={t("searchPlaceholder")}
|
||||
className="h-12 w-full rounded-full border border-border bg-background pl-11 pr-28 text-sm text-foreground shadow-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary/30"
|
||||
className="h-12 w-full rounded-lg border border-border bg-background pl-11 pr-28 text-sm text-foreground shadow-sm placeholder:text-muted-foreground focus:border-primary/50 focus:outline-none focus:ring-4 focus:ring-primary/10"
|
||||
aria-label="Search AI tools"
|
||||
/>
|
||||
<button
|
||||
type="submit"
|
||||
className="absolute right-1.5 top-1.5 h-9 rounded-full bg-primary px-5 text-xs font-semibold text-primary-foreground transition-opacity hover:opacity-90"
|
||||
className="absolute right-1.5 top-1.5 h-9 rounded-md bg-primary px-5 text-xs font-semibold text-primary-foreground transition-opacity hover:opacity-90"
|
||||
>
|
||||
{t("searchButton")}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{/* 统计条(深色 Hero 内的白色数字) */}
|
||||
<div className="mx-auto mt-10 flex max-w-lg items-center justify-center gap-10 border-t border-white/15 pt-6">
|
||||
{/* 统计条:同行文字,数字用衬线级对比,不做卡片 */}
|
||||
<dl className="mx-auto mt-10 flex max-w-lg items-start justify-center gap-12">
|
||||
{[
|
||||
{ v: "1,000+", l: "AI tools" },
|
||||
{ v: "14", l: "Categories" },
|
||||
{ v: "7", l: "Rankings" },
|
||||
].map((s) => (
|
||||
<div key={s.l} className="text-center">
|
||||
<div className="text-2xl font-bold text-white">{s.v}</div>
|
||||
<div className="text-xs text-white/60">{s.l}</div>
|
||||
<dd className="text-xl font-semibold text-foreground tabular-nums">{s.v}</dd>
|
||||
<dt className="mt-0.5 text-xs text-muted-foreground">{s.l}</dt>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</dl>
|
||||
|
||||
<div className="mt-8 flex flex-wrap items-center justify-center gap-2 text-xs">
|
||||
<span className="text-white/60">{t("popularLabel")}</span>
|
||||
<div className="mt-7 flex flex-wrap items-center justify-center gap-x-4 gap-y-2 text-xs">
|
||||
<span className="text-muted-foreground">{t("popularLabel")}</span>
|
||||
{t.raw("popularSearches").map((q: string) => (
|
||||
<LocaleLink
|
||||
key={q}
|
||||
href={`/tools?search=${q}`}
|
||||
className="rounded-full bg-white/10 px-2.5 py-1 text-white/80 transition-colors hover:bg-white/20"
|
||||
className="text-muted-foreground underline-offset-4 transition-colors hover:text-foreground hover:underline"
|
||||
>
|
||||
{q}
|
||||
</LocaleLink>
|
||||
@@ -113,7 +113,7 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div className="mx-auto max-w-7xl space-y-12 px-4 py-12 sm:px-6">
|
||||
<div className="site-container space-y-12 px-4 py-12 sm:px-6">
|
||||
{/* Trending */}
|
||||
{data.trending.length > 0 && (
|
||||
<section>
|
||||
@@ -140,10 +140,9 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
<LocaleLink
|
||||
key={category.id}
|
||||
href={`/category/${category.slug}`}
|
||||
className="group rounded-xl border border-border p-4 transition-all hover:border-primary/30 hover:shadow-sm"
|
||||
className="group border-b border-border py-3 transition-colors hover:border-primary/40"
|
||||
>
|
||||
<LayoutGrid className="h-4 w-4 text-primary" />
|
||||
<h3 className="mt-2 truncate text-sm font-medium text-foreground group-hover:text-primary">
|
||||
<h3 className="text-sm font-medium text-foreground group-hover:text-primary">
|
||||
{locale === "zh" && category.nameZh
|
||||
? category.nameZh
|
||||
: category.nameEn}
|
||||
@@ -193,7 +192,7 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
<LocaleLink
|
||||
key={uc.id}
|
||||
href={`/ai-tools-for/${uc.slug}`}
|
||||
className="rounded-full border border-border px-3.5 py-1.5 text-xs text-foreground transition-colors hover:border-primary/40 hover:bg-primary/5"
|
||||
className="border-b border-border pb-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary"
|
||||
>
|
||||
{locale === "zh" && uc.nameZh ? uc.nameZh : uc.nameEn}
|
||||
<span className="ml-1.5 text-muted-foreground tabular-nums">
|
||||
@@ -219,13 +218,12 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
<LocaleLink
|
||||
key={col.id}
|
||||
href={`/best/${col.slug}`}
|
||||
className="group rounded-xl border border-border p-5 transition-all hover:border-primary/30 hover:shadow-sm"
|
||||
className="group border-t border-border pt-4"
|
||||
>
|
||||
<Award className="h-4 w-4 text-primary" />
|
||||
<h3 className="mt-2 text-sm font-semibold text-foreground group-hover:text-primary">
|
||||
<h3 className="text-sm font-semibold text-foreground group-hover:text-primary">
|
||||
{locale === "zh" && col.nameZh ? col.nameZh : col.nameEn}
|
||||
</h3>
|
||||
<p className="mt-1 line-clamp-2 text-xs text-muted-foreground">
|
||||
<p className="mt-1 line-clamp-2 text-xs leading-relaxed text-muted-foreground">
|
||||
{locale === "zh" && col.introZh ? col.introZh : col.introEn}
|
||||
</p>
|
||||
<p className="mt-2 text-xs text-muted-foreground tabular-nums">
|
||||
@@ -241,26 +239,25 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
{data.latestReviews.length > 0 && (
|
||||
<section>
|
||||
<SectionHeader title={t("reviewsTitle")} />
|
||||
<div className="grid gap-3 md:grid-cols-2">
|
||||
<div className="divide-y divide-border border-y border-border">
|
||||
{data.latestReviews.map((review, i) => (
|
||||
<LocaleLink
|
||||
key={i}
|
||||
href={`/tools/${review.toolSlug}#reviews`}
|
||||
className="rounded-xl border border-border p-4 transition-colors hover:border-primary/30"
|
||||
className="group block py-3.5"
|
||||
>
|
||||
<div className="flex items-center gap-2">
|
||||
<MessageSquareQuote className="h-3.5 w-3.5 text-primary" />
|
||||
<span className="text-xs font-medium text-foreground">
|
||||
<div className="flex items-baseline gap-2 text-xs">
|
||||
<span className="font-medium text-foreground">
|
||||
{review.authorName}
|
||||
</span>
|
||||
<span className="text-xs text-muted-foreground">
|
||||
<span className="text-muted-foreground">
|
||||
on {review.toolName}
|
||||
</span>
|
||||
<span className="ml-auto text-xs font-semibold text-amber-500 tabular-nums">
|
||||
<span className="ml-auto font-semibold text-foreground tabular-nums">
|
||||
{review.rating}/5
|
||||
</span>
|
||||
</div>
|
||||
<p className="mt-2 line-clamp-2 text-xs leading-relaxed text-muted-foreground">
|
||||
<p className="mt-1.5 line-clamp-2 text-xs leading-relaxed text-muted-foreground group-hover:text-foreground">
|
||||
{review.content}
|
||||
</p>
|
||||
</LocaleLink>
|
||||
@@ -269,27 +266,25 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
</section>
|
||||
)}
|
||||
|
||||
{/* Submit CTA */}
|
||||
<section className="rounded-2xl border border-border bg-secondary/30 p-8 text-center">
|
||||
<Sparkles className="mx-auto h-5 w-5 text-primary" />
|
||||
<h2 className="mt-3 text-lg font-semibold text-foreground">
|
||||
{/* Submit CTA:排版式收尾,不做卡片 */}
|
||||
<section className="border-t border-border pt-10 text-center">
|
||||
<h2 className="text-lg font-semibold text-foreground">
|
||||
Built an AI tool?
|
||||
</h2>
|
||||
<p className="mx-auto mt-1 max-w-md text-sm text-muted-foreground">
|
||||
<p className="mx-auto mt-1.5 max-w-md text-sm leading-relaxed text-muted-foreground">
|
||||
Submit it to {siteConfig.brand.name} and get discovered by thousands of users
|
||||
looking for tools like yours.
|
||||
</p>
|
||||
<LocaleLink
|
||||
href="/submit"
|
||||
className="mt-4 inline-flex items-center gap-1.5 rounded-full bg-primary px-5 py-2 text-sm font-semibold text-primary-foreground transition-opacity hover:opacity-90"
|
||||
className="mt-5 inline-flex items-center gap-1.5 rounded-md bg-primary px-5 py-2 text-sm font-semibold text-primary-foreground transition-opacity hover:opacity-90"
|
||||
>
|
||||
<TrendingUp className="h-4 w-4" />
|
||||
Submit your tool
|
||||
<ArrowRight className="h-3.5 w-3.5" />
|
||||
</LocaleLink>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export { SiteHome };
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
"items": [
|
||||
{
|
||||
"name": "Sarah Chen",
|
||||
"quote": "Toolso.AI helped me find the perfect AI writing assistant. The categorization makes discovery so easy!",
|
||||
"quote": "DevAI.tools helped me find the perfect AI writing assistant. The categorization makes discovery so easy!",
|
||||
"designation": "Content Creator"
|
||||
},
|
||||
{
|
||||
@@ -118,7 +118,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Emily Rodriguez",
|
||||
"quote": "I discover new AI tools every week on Toolso.AI. It's become my go-to resource for AI exploration.",
|
||||
"quote": "I discover new AI tools every week on DevAI.tools. It's become my go-to resource for AI exploration.",
|
||||
"designation": "Startup Founder"
|
||||
},
|
||||
{
|
||||
@@ -667,48 +667,49 @@
|
||||
},
|
||||
"clearFilters": "Clear search & filters",
|
||||
"useCasesTitle": "Use cases",
|
||||
"goodForTitle": "Good for"
|
||||
"goodForTitle": "Good for",
|
||||
"preview": "Website preview"
|
||||
},
|
||||
"seo": {
|
||||
"home": {
|
||||
"title": "DevAI.tools — AI Tools for Developers",
|
||||
"description": "Code assistants, DevOps automation and testing copilots — the AI tools developers actually upvote, ranked daily.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"blog": {
|
||||
"title": "Blog - Toolso.AI",
|
||||
"title": "Blog - DevAI.tools",
|
||||
"description": "Latest insights, tutorials and updates about AI tools. Stay informed about the best AI tools and industry trends.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"contact": {
|
||||
"title": "Contact Us - Toolso.AI",
|
||||
"title": "Contact Us - DevAI.tools",
|
||||
"description": "Get in touch with us. We'd love to hear your feedback and tool suggestions.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"login": {
|
||||
"title": "Login - Toolso.AI",
|
||||
"title": "Login - DevAI.tools",
|
||||
"description": "Sign in to your account to submit tools, save favorites, and contribute to our AI tools directory.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"signup": {
|
||||
"title": "Sign Up - Toolso.AI",
|
||||
"title": "Sign Up - DevAI.tools",
|
||||
"description": "Create your account and start contributing to our AI tools directory. Submit tools and join our community.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"terms": {
|
||||
"title": "Terms of Service - Toolso.AI",
|
||||
"description": "Read our terms of service to understand the rules and guidelines for using Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Terms of Service - DevAI.tools",
|
||||
"description": "Read our terms of service to understand the rules and guidelines for using DevAI.tools.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "Privacy Policy - Toolso.AI",
|
||||
"description": "Learn how we collect, use, and protect your personal information and data on Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Privacy Policy - DevAI.tools",
|
||||
"description": "Learn how we collect, use, and protect your personal information and data on DevAI.tools.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookie Policy - Toolso.AI",
|
||||
"description": "Understand how we use cookies and similar tracking technologies on Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Cookie Policy - DevAI.tools",
|
||||
"description": "Understand how we use cookies and similar tracking technologies on DevAI.tools.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"tools": {
|
||||
"title": "AI Tools Directory - Discover the Best AI Tools",
|
||||
@@ -1086,4 +1087,4 @@
|
||||
"siteHeader": {
|
||||
"searchPlaceholder": "Search dev tools..."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,11 +103,11 @@
|
||||
},
|
||||
"testimonials": {
|
||||
"title": "用户评价",
|
||||
"subtitle": "来自使用 Toolso.AI 发现优质 AI 工具的真实用户反馈。",
|
||||
"subtitle": "来自使用 DevAI.tools 发现优质 AI 工具的真实用户反馈。",
|
||||
"items": [
|
||||
{
|
||||
"name": "张伟",
|
||||
"quote": "Toolso.AI 帮我找到了完美的 AI 写作助手,分类清晰让发现变得非常简单!",
|
||||
"quote": "DevAI.tools 帮我找到了完美的 AI 写作助手,分类清晰让发现变得非常简单!",
|
||||
"designation": "内容创作者"
|
||||
},
|
||||
{
|
||||
@@ -117,7 +117,7 @@
|
||||
},
|
||||
{
|
||||
"name": "李娜",
|
||||
"quote": "每周都能在 Toolso.AI 上发现新的 AI 工具,已经成为我探索 AI 的首选资源。",
|
||||
"quote": "每周都能在 DevAI.tools 上发现新的 AI 工具,已经成为我探索 AI 的首选资源。",
|
||||
"designation": "创业者"
|
||||
},
|
||||
{
|
||||
@@ -521,7 +521,7 @@
|
||||
"description": "请联系我们,我们会尽快回复。",
|
||||
"testimonial": {
|
||||
"title": "帮助用户发现最佳 AI 工具",
|
||||
"description": "Toolso.AI 致力于为用户提供精选的 AI 工具目录,帮助大家找到最适合的 AI 助手。"
|
||||
"description": "DevAI.tools 致力于为用户提供精选的 AI 工具目录,帮助大家找到最适合的 AI 助手。"
|
||||
},
|
||||
"form": {
|
||||
"nameLabel": "姓名",
|
||||
@@ -674,48 +674,49 @@
|
||||
},
|
||||
"clearFilters": "清除搜索与筛选",
|
||||
"useCasesTitle": "使用场景",
|
||||
"goodForTitle": "适合人群"
|
||||
"goodForTitle": "适合人群",
|
||||
"preview": "网站预览"
|
||||
},
|
||||
"seo": {
|
||||
"home": {
|
||||
"title": "DevAI.tools — 开发者 AI 工具",
|
||||
"description": "面向开发者的 AI 工具目录:代码助手、运维自动化、测试副驾驶,由社区每日排名。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"blog": {
|
||||
"title": "博客 - Toolso.AI",
|
||||
"title": "博客 - DevAI.tools",
|
||||
"description": "关于 AI 工具的最新资讯、教程和更新。了解最佳 AI 工具和行业趋势。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"contact": {
|
||||
"title": "联系我们 - Toolso.AI",
|
||||
"title": "联系我们 - DevAI.tools",
|
||||
"description": "与我们取得联系。我们期待听到您的反馈和工具推荐建议。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"login": {
|
||||
"title": "登录 - Toolso.AI",
|
||||
"title": "登录 - DevAI.tools",
|
||||
"description": "登录您的账户,提交工具、收藏喜爱的工具,为 AI 工具目录做贡献。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"signup": {
|
||||
"title": "注册 - Toolso.AI",
|
||||
"title": "注册 - DevAI.tools",
|
||||
"description": "创建您的账户,开始为 AI 工具目录做贡献。提交工具、加入我们的社区。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"terms": {
|
||||
"title": "服务条款 - Toolso.AI",
|
||||
"description": "阅读我们的服务条款,了解使用 Toolso.AI 的规则和指南。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "服务条款 - DevAI.tools",
|
||||
"description": "阅读我们的服务条款,了解使用 DevAI.tools 的规则和指南。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "隐私政策 - Toolso.AI",
|
||||
"description": "了解我们如何在 Toolso.AI 上收集、使用和保护您的个人信息和数据。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "隐私政策 - DevAI.tools",
|
||||
"description": "了解我们如何在 DevAI.tools 上收集、使用和保护您的个人信息和数据。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookie 政策 - Toolso.AI",
|
||||
"description": "了解我们如何在 Toolso.AI 上使用 cookies 和类似的跟踪技术。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Cookie 政策 - DevAI.tools",
|
||||
"description": "了解我们如何在 DevAI.tools 上使用 cookies 和类似的跟踪技术。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"tools": {
|
||||
"title": "AI 工具库 - 发现最好的 AI 工具",
|
||||
@@ -1093,4 +1094,4 @@
|
||||
"siteHeader": {
|
||||
"searchPlaceholder": "搜索开发者工具..."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,24 +11,24 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@aidir/core": "workspace:*",
|
||||
"next": "16.1.1",
|
||||
"react": "^19.2.3",
|
||||
"react-dom": "^19.2.3",
|
||||
"next-intl": "^4.7.0",
|
||||
"next": "^16.3.5",
|
||||
"react": "^19.3.0",
|
||||
"react-dom": "^19.3.0",
|
||||
"next-intl": "^4.14.5",
|
||||
"next-themes": "^0.4.6",
|
||||
"next-view-transitions": "^0.3.5",
|
||||
"sonner": "^2.0.7",
|
||||
"geist": "^1.3.0",
|
||||
"lucide-react": "^0.562.0",
|
||||
"framer-motion": "^12.43.0"
|
||||
"sonner": "^2.0.8",
|
||||
"geist": "^1.7.2",
|
||||
"lucide-react": "^1.46.0",
|
||||
"framer-motion": "^13.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19.2.7",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"typescript": "^5",
|
||||
"tailwindcss": "^3.4.1",
|
||||
"postcss": "^8"
|
||||
"@types/node": "^26.5.1",
|
||||
"@types/react": "^19.3.0",
|
||||
"@types/react-dom": "^19.3.0",
|
||||
"@types/mdx": "^2.0.14",
|
||||
"typescript": "^7.0.2",
|
||||
"tailwindcss": "^3.4.19",
|
||||
"postcss": "^8.5.28"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
# robots.txt for Toolso.AI - AI Tools Directory
|
||||
# https://toolso.ai
|
||||
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# Disallow admin and API pages
|
||||
Disallow: /admin/
|
||||
Disallow: /api/
|
||||
|
||||
# Disallow authentication pages
|
||||
Disallow: /*/signup
|
||||
Disallow: /*/login
|
||||
Disallow: /*/check-email
|
||||
Disallow: /*/verify-email
|
||||
Disallow: /*/forgot-password
|
||||
Disallow: /*/reset-password
|
||||
|
||||
# Disallow protected user pages
|
||||
Disallow: /*/dashboard
|
||||
Disallow: /*/profile
|
||||
|
||||
# Sitemap location
|
||||
Sitemap: https://toolso.ai/sitemap.xml
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(admin)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(admin)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(admin)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(auth)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(auth)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(auth)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(protected)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(protected)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(protected)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/layout.tsx 的薄路由
|
||||
export { default, generateStaticParams } from "@aidir/core/pages/[locale]/layout";
|
||||
export { default, generateMetadata, generateStaticParams } from "@aidir/core/pages/[locale]/layout";
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
// 自动生成:api/screenshots/[slug]/route.ts 的薄路由
|
||||
export { GET } from "@aidir/core/pages/api/screenshots/[slug]/route";
|
||||
@@ -0,0 +1,2 @@
|
||||
// 自动生成:robots.ts 的薄路由
|
||||
export { default } from "@aidir/core/pages/robots";
|
||||
@@ -53,13 +53,13 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
<div className="min-h-screen bg-background">
|
||||
{/* Terminal 风格 Hero + 绿色系统状态条 */}
|
||||
<div className="border-b border-border bg-background">
|
||||
<div className="mx-auto flex max-w-5xl items-center gap-2 px-4 py-2 font-mono text-[11px] text-muted-foreground sm:px-6">
|
||||
<span className="inline-block h-2 w-2 animate-pulse rounded-full bg-emerald-500" />
|
||||
<div className="site-container flex items-center gap-2 px-4 py-2 font-mono text-[11px] text-muted-foreground sm:px-6">
|
||||
<span className="inline-block h-2 w-2 rounded-full bg-emerald-500" />
|
||||
system: online · 1,000+ tools indexed · updated hourly
|
||||
</div>
|
||||
</div>
|
||||
<section className="border-b border-border bg-[hsl(var(--secondary))]/40">
|
||||
<div className="mx-auto max-w-5xl px-4 py-14 sm:px-6 md:py-20">
|
||||
<div className="site-container px-4 py-14 sm:px-6 md:py-20">
|
||||
<div className="mx-auto max-w-2xl overflow-hidden rounded-xl border border-border bg-background shadow-sm">
|
||||
<div className="flex items-center gap-1.5 border-b border-border bg-secondary/50 px-4 py-2.5">
|
||||
<span className="h-2.5 w-2.5 rounded-full bg-red-400" />
|
||||
@@ -92,7 +92,7 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div className="mx-auto max-w-5xl space-y-12 px-4 py-12 sm:px-6">
|
||||
<div className="site-container space-y-12 px-4 py-12 sm:px-6">
|
||||
{/* Use Cases as workflows */}
|
||||
{data.useCases.length > 0 && (
|
||||
<section>
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"items": [
|
||||
{
|
||||
"name": "Sarah Chen",
|
||||
"quote": "Toolso.AI helped me find the perfect AI writing assistant. The categorization makes discovery so easy!",
|
||||
"quote": "findai helped me find the perfect AI writing assistant. The categorization makes discovery so easy!",
|
||||
"designation": "Content Creator"
|
||||
},
|
||||
{
|
||||
@@ -116,7 +116,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Emily Rodriguez",
|
||||
"quote": "I discover new AI tools every week on Toolso.AI. It's become my go-to resource for AI exploration.",
|
||||
"quote": "I discover new AI tools every week on findai. It's become my go-to resource for AI exploration.",
|
||||
"designation": "Startup Founder"
|
||||
},
|
||||
{
|
||||
@@ -665,48 +665,49 @@
|
||||
},
|
||||
"clearFilters": "Clear search & filters",
|
||||
"useCasesTitle": "Use cases",
|
||||
"goodForTitle": "Good for"
|
||||
"goodForTitle": "Good for",
|
||||
"preview": "Website preview"
|
||||
},
|
||||
"seo": {
|
||||
"home": {
|
||||
"title": "findai — The Minimal AI Tool Search Engine",
|
||||
"description": "One search box, every AI tool. Describe what you're trying to do and find the right AI tool, ranked by the community.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"blog": {
|
||||
"title": "Blog - Toolso.AI",
|
||||
"title": "Blog - findai",
|
||||
"description": "Latest insights, tutorials and updates about AI tools. Stay informed about the best AI tools and industry trends.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"contact": {
|
||||
"title": "Contact Us - Toolso.AI",
|
||||
"title": "Contact Us - findai",
|
||||
"description": "Get in touch with us. We'd love to hear your feedback and tool suggestions.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"login": {
|
||||
"title": "Login - Toolso.AI",
|
||||
"title": "Login - findai",
|
||||
"description": "Sign in to your account to submit tools, save favorites, and contribute to our AI tools directory.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"signup": {
|
||||
"title": "Sign Up - Toolso.AI",
|
||||
"title": "Sign Up - findai",
|
||||
"description": "Create your account and start contributing to our AI tools directory. Submit tools and join our community.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"terms": {
|
||||
"title": "Terms of Service - Toolso.AI",
|
||||
"description": "Read our terms of service to understand the rules and guidelines for using Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Terms of Service - findai",
|
||||
"description": "Read our terms of service to understand the rules and guidelines for using findai.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "Privacy Policy - Toolso.AI",
|
||||
"description": "Learn how we collect, use, and protect your personal information and data on Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Privacy Policy - findai",
|
||||
"description": "Learn how we collect, use, and protect your personal information and data on findai.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookie Policy - Toolso.AI",
|
||||
"description": "Understand how we use cookies and similar tracking technologies on Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Cookie Policy - findai",
|
||||
"description": "Understand how we use cookies and similar tracking technologies on findai.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"tools": {
|
||||
"title": "AI Tools Directory - Discover the Best AI Tools",
|
||||
@@ -1071,4 +1072,4 @@
|
||||
"siteHeader": {
|
||||
"searchPlaceholder": "What do you need?"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -101,11 +101,11 @@
|
||||
},
|
||||
"testimonials": {
|
||||
"title": "用户评价",
|
||||
"subtitle": "来自使用 Toolso.AI 发现优质 AI 工具的真实用户反馈。",
|
||||
"subtitle": "来自使用 findai 发现优质 AI 工具的真实用户反馈。",
|
||||
"items": [
|
||||
{
|
||||
"name": "张伟",
|
||||
"quote": "Toolso.AI 帮我找到了完美的 AI 写作助手,分类清晰让发现变得非常简单!",
|
||||
"quote": "findai 帮我找到了完美的 AI 写作助手,分类清晰让发现变得非常简单!",
|
||||
"designation": "内容创作者"
|
||||
},
|
||||
{
|
||||
@@ -115,7 +115,7 @@
|
||||
},
|
||||
{
|
||||
"name": "李娜",
|
||||
"quote": "每周都能在 Toolso.AI 上发现新的 AI 工具,已经成为我探索 AI 的首选资源。",
|
||||
"quote": "每周都能在 findai 上发现新的 AI 工具,已经成为我探索 AI 的首选资源。",
|
||||
"designation": "创业者"
|
||||
},
|
||||
{
|
||||
@@ -519,7 +519,7 @@
|
||||
"description": "请联系我们,我们会尽快回复。",
|
||||
"testimonial": {
|
||||
"title": "帮助用户发现最佳 AI 工具",
|
||||
"description": "Toolso.AI 致力于为用户提供精选的 AI 工具目录,帮助大家找到最适合的 AI 助手。"
|
||||
"description": "findai 致力于为用户提供精选的 AI 工具目录,帮助大家找到最适合的 AI 助手。"
|
||||
},
|
||||
"form": {
|
||||
"nameLabel": "姓名",
|
||||
@@ -672,48 +672,49 @@
|
||||
},
|
||||
"clearFilters": "清除搜索与筛选",
|
||||
"useCasesTitle": "使用场景",
|
||||
"goodForTitle": "适合人群"
|
||||
"goodForTitle": "适合人群",
|
||||
"preview": "网站预览"
|
||||
},
|
||||
"seo": {
|
||||
"home": {
|
||||
"title": "findai — 极简 AI 工具搜索引擎",
|
||||
"description": "一个搜索框,找遍全部 AI 工具。说出你想做的事,社区排名替你选。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"blog": {
|
||||
"title": "博客 - Toolso.AI",
|
||||
"title": "博客 - findai",
|
||||
"description": "关于 AI 工具的最新资讯、教程和更新。了解最佳 AI 工具和行业趋势。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"contact": {
|
||||
"title": "联系我们 - Toolso.AI",
|
||||
"title": "联系我们 - findai",
|
||||
"description": "与我们取得联系。我们期待听到您的反馈和工具推荐建议。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"login": {
|
||||
"title": "登录 - Toolso.AI",
|
||||
"title": "登录 - findai",
|
||||
"description": "登录您的账户,提交工具、收藏喜爱的工具,为 AI 工具目录做贡献。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"signup": {
|
||||
"title": "注册 - Toolso.AI",
|
||||
"title": "注册 - findai",
|
||||
"description": "创建您的账户,开始为 AI 工具目录做贡献。提交工具、加入我们的社区。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"terms": {
|
||||
"title": "服务条款 - Toolso.AI",
|
||||
"description": "阅读我们的服务条款,了解使用 Toolso.AI 的规则和指南。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "服务条款 - findai",
|
||||
"description": "阅读我们的服务条款,了解使用 findai 的规则和指南。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "隐私政策 - Toolso.AI",
|
||||
"description": "了解我们如何在 Toolso.AI 上收集、使用和保护您的个人信息和数据。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "隐私政策 - findai",
|
||||
"description": "了解我们如何在 findai 上收集、使用和保护您的个人信息和数据。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookie 政策 - Toolso.AI",
|
||||
"description": "了解我们如何在 Toolso.AI 上使用 cookies 和类似的跟踪技术。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Cookie 政策 - findai",
|
||||
"description": "了解我们如何在 findai 上使用 cookies 和类似的跟踪技术。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"tools": {
|
||||
"title": "AI 工具库 - 发现最好的 AI 工具",
|
||||
@@ -1078,4 +1079,4 @@
|
||||
"siteHeader": {
|
||||
"searchPlaceholder": "你需要什么?"
|
||||
}
|
||||
}
|
||||
}
|
||||
+16
-16
@@ -11,24 +11,24 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@aidir/core": "workspace:*",
|
||||
"next": "16.1.1",
|
||||
"react": "^19.2.3",
|
||||
"react-dom": "^19.2.3",
|
||||
"next-intl": "^4.7.0",
|
||||
"next": "^16.3.5",
|
||||
"react": "^19.3.0",
|
||||
"react-dom": "^19.3.0",
|
||||
"next-intl": "^4.14.5",
|
||||
"next-themes": "^0.4.6",
|
||||
"next-view-transitions": "^0.3.5",
|
||||
"sonner": "^2.0.7",
|
||||
"geist": "^1.3.0",
|
||||
"lucide-react": "^0.562.0",
|
||||
"framer-motion": "^12.43.0"
|
||||
"sonner": "^2.0.8",
|
||||
"geist": "^1.7.2",
|
||||
"lucide-react": "^1.46.0",
|
||||
"framer-motion": "^13.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19.2.7",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"typescript": "^5",
|
||||
"tailwindcss": "^3.4.1",
|
||||
"postcss": "^8"
|
||||
"@types/node": "^26.5.1",
|
||||
"@types/react": "^19.3.0",
|
||||
"@types/react-dom": "^19.3.0",
|
||||
"@types/mdx": "^2.0.14",
|
||||
"typescript": "^7.0.2",
|
||||
"tailwindcss": "^3.4.19",
|
||||
"postcss": "^8.5.28"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
# robots.txt for Toolso.AI - AI Tools Directory
|
||||
# https://toolso.ai
|
||||
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# Disallow admin and API pages
|
||||
Disallow: /admin/
|
||||
Disallow: /api/
|
||||
|
||||
# Disallow authentication pages
|
||||
Disallow: /*/signup
|
||||
Disallow: /*/login
|
||||
Disallow: /*/check-email
|
||||
Disallow: /*/verify-email
|
||||
Disallow: /*/forgot-password
|
||||
Disallow: /*/reset-password
|
||||
|
||||
# Disallow protected user pages
|
||||
Disallow: /*/dashboard
|
||||
Disallow: /*/profile
|
||||
|
||||
# Sitemap location
|
||||
Sitemap: https://toolso.ai/sitemap.xml
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(admin)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(admin)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(admin)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(auth)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(auth)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(auth)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(protected)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(protected)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(protected)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/layout.tsx 的薄路由
|
||||
export { default, generateStaticParams } from "@aidir/core/pages/[locale]/layout";
|
||||
export { default, generateMetadata, generateStaticParams } from "@aidir/core/pages/[locale]/layout";
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
// 自动生成:api/screenshots/[slug]/route.ts 的薄路由
|
||||
export { GET } from "@aidir/core/pages/api/screenshots/[slug]/route";
|
||||
@@ -0,0 +1,2 @@
|
||||
// 自动生成:robots.ts 的薄路由
|
||||
export { default } from "@aidir/core/pages/robots";
|
||||
@@ -6,49 +6,20 @@ import { ToolCardGrid } from "@/components/tool-card";
|
||||
import { LocaleLink } from "@/components/locale-link";
|
||||
import { getHomeDataSafe } from "@/kit/home-data";
|
||||
|
||||
/** Minimal:极简 AI 搜索引擎(一个框,一个任务) */
|
||||
|
||||
|
||||
const navItems = [
|
||||
{ label: "Search", href: "/tools" },
|
||||
{ label: "Use Cases", href: "/ai-tools-for" },
|
||||
{ label: "Rankings", href: "/rankings" },
|
||||
{ label: "Submit", href: "/submit" },
|
||||
];
|
||||
|
||||
const footerGroups = [
|
||||
{
|
||||
title: "Search",
|
||||
links: [
|
||||
{ label: "All Tools", href: "/tools" },
|
||||
{ label: "Use Cases", href: "/ai-tools-for" },
|
||||
{ label: "Rankings", href: "/rankings" },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "About",
|
||||
links: [
|
||||
{ label: "Submit a Tool", href: "/submit" },
|
||||
{ label: "Privacy", href: "/privacy" },
|
||||
{ label: "Terms", href: "/terms" },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
const popularSearches = [
|
||||
"write a blog post",
|
||||
"generate video",
|
||||
"code assistant",
|
||||
"make a logo",
|
||||
"edit photos",
|
||||
"transcribe meetings",
|
||||
];
|
||||
|
||||
async function SiteHome({ locale }: { locale: string }) {
|
||||
const t = await getTranslations("siteHome");
|
||||
const th = await getTranslations("hero");
|
||||
const data = await getHomeDataSafe(6);
|
||||
|
||||
const popularSearches = [
|
||||
"write a blog post",
|
||||
"generate video",
|
||||
"code assistant",
|
||||
"make a logo",
|
||||
"edit photos",
|
||||
"transcribe meetings",
|
||||
];
|
||||
|
||||
return (
|
||||
<div className="flex min-h-screen flex-col bg-background">
|
||||
{/* 极简搜索首屏 */}
|
||||
@@ -56,8 +27,8 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
<LocaleLink href="/" className="text-3xl font-bold tracking-tight text-foreground">
|
||||
{siteConfig.brand.name}
|
||||
</LocaleLink>
|
||||
<p className="mt-1 text-xs uppercase tracking-[0.35em] text-muted-foreground">
|
||||
AI tool search
|
||||
<p className="mt-1.5 text-sm text-muted-foreground">
|
||||
{siteConfig.brand.tagline.replace(/\.$/, "")}
|
||||
</p>
|
||||
|
||||
<form action={`/${locale}/tools`} className="mt-10 w-full max-w-xl">
|
||||
@@ -67,19 +38,18 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
name="search"
|
||||
autoFocus
|
||||
placeholder={t("minimalPlaceholder")}
|
||||
className="h-14 w-full rounded-full border border-border bg-background pl-14 pr-6 text-base text-foreground shadow-lg shadow-black/[0.03] placeholder:text-muted-foreground focus:border-primary/50 focus:outline-none focus:ring-4 focus:ring-primary/10"
|
||||
className="h-14 w-full rounded-xl border border-border bg-background pl-14 pr-6 text-base text-foreground shadow-sm placeholder:text-muted-foreground focus:border-primary/50 focus:outline-none focus:ring-4 focus:ring-primary/10"
|
||||
aria-label="Search AI tools"
|
||||
/>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div className="mx-auto mt-10 max-w-md border-t border-border/60 pt-5" />
|
||||
<div className="mt-6 flex flex-wrap items-center justify-center gap-2">
|
||||
<div className="mt-8 flex flex-wrap items-center justify-center gap-x-5 gap-y-2">
|
||||
{popularSearches.map((q) => (
|
||||
<LocaleLink
|
||||
key={q}
|
||||
href={`/tools?search=${encodeURIComponent(q)}`}
|
||||
className="rounded-full px-3 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground"
|
||||
className="text-xs text-muted-foreground underline-offset-4 transition-colors hover:text-foreground hover:underline"
|
||||
>
|
||||
{q}
|
||||
</LocaleLink>
|
||||
@@ -89,23 +59,20 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
|
||||
{/* 搜索之下:Trending */}
|
||||
{data.trending.length > 0 && (
|
||||
<section className="mx-auto w-full max-w-3xl px-4 pb-20 sm:px-6">
|
||||
<h2 className="mb-4 text-center text-xs font-medium uppercase tracking-[0.25em] text-muted-foreground">
|
||||
Trending now
|
||||
</h2>
|
||||
<ToolCardGrid tools={data.trending.slice(0, 4)} locale={locale} />
|
||||
<div className="mt-6 text-center">
|
||||
<section className="site-container px-4 pb-20 sm:px-6">
|
||||
<div className="mb-4 flex items-baseline justify-between border-b border-border pb-3">
|
||||
<h2 className="text-sm font-semibold text-foreground">Trending now</h2>
|
||||
<LocaleLink
|
||||
href="/rankings"
|
||||
className="text-xs font-medium text-muted-foreground hover:text-primary"
|
||||
className="text-xs text-muted-foreground underline-offset-4 hover:text-foreground hover:underline"
|
||||
>
|
||||
{t("seeRankings")}
|
||||
</LocaleLink>
|
||||
</div>
|
||||
<ToolCardGrid tools={data.trending.slice(0, 4)} locale={locale} />
|
||||
</section>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export { SiteHome };
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
"items": [
|
||||
{
|
||||
"name": "Sarah Chen",
|
||||
"quote": "Toolso.AI helped me find the perfect AI writing assistant. The categorization makes discovery so easy!",
|
||||
"quote": "LaunchAI helped me find the perfect AI writing assistant. The categorization makes discovery so easy!",
|
||||
"designation": "Content Creator"
|
||||
},
|
||||
{
|
||||
@@ -120,7 +120,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Emily Rodriguez",
|
||||
"quote": "I discover new AI tools every week on Toolso.AI. It's become my go-to resource for AI exploration.",
|
||||
"quote": "I discover new AI tools every week on LaunchAI. It's become my go-to resource for AI exploration.",
|
||||
"designation": "Startup Founder"
|
||||
},
|
||||
{
|
||||
@@ -669,48 +669,49 @@
|
||||
},
|
||||
"clearFilters": "Clear search & filters",
|
||||
"useCasesTitle": "Use cases",
|
||||
"goodForTitle": "Good for"
|
||||
"goodForTitle": "Good for",
|
||||
"preview": "Website preview"
|
||||
},
|
||||
"seo": {
|
||||
"home": {
|
||||
"title": "LaunchAI — Discover and Upvote Today's AI Products",
|
||||
"description": "A daily launch feed for AI products. Upvote the best AI tools, follow makers and climb the leaderboard.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"blog": {
|
||||
"title": "Blog - Toolso.AI",
|
||||
"title": "Blog - LaunchAI",
|
||||
"description": "Latest insights, tutorials and updates about AI tools. Stay informed about the best AI tools and industry trends.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"contact": {
|
||||
"title": "Contact Us - Toolso.AI",
|
||||
"title": "Contact Us - LaunchAI",
|
||||
"description": "Get in touch with us. We'd love to hear your feedback and tool suggestions.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"login": {
|
||||
"title": "Login - Toolso.AI",
|
||||
"title": "Login - LaunchAI",
|
||||
"description": "Sign in to your account to submit tools, save favorites, and contribute to our AI tools directory.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"signup": {
|
||||
"title": "Sign Up - Toolso.AI",
|
||||
"title": "Sign Up - LaunchAI",
|
||||
"description": "Create your account and start contributing to our AI tools directory. Submit tools and join our community.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"terms": {
|
||||
"title": "Terms of Service - Toolso.AI",
|
||||
"description": "Read our terms of service to understand the rules and guidelines for using Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Terms of Service - LaunchAI",
|
||||
"description": "Read our terms of service to understand the rules and guidelines for using LaunchAI.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "Privacy Policy - Toolso.AI",
|
||||
"description": "Learn how we collect, use, and protect your personal information and data on Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Privacy Policy - LaunchAI",
|
||||
"description": "Learn how we collect, use, and protect your personal information and data on LaunchAI.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookie Policy - Toolso.AI",
|
||||
"description": "Understand how we use cookies and similar tracking technologies on Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Cookie Policy - LaunchAI",
|
||||
"description": "Understand how we use cookies and similar tracking technologies on LaunchAI.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"tools": {
|
||||
"title": "AI Tools Directory - Discover the Best AI Tools",
|
||||
@@ -949,7 +950,7 @@
|
||||
"launchButton": "Launch your product",
|
||||
"featuredLabel": "Featured story",
|
||||
"featuredRead": "Read the story",
|
||||
"picksEditorialLabel": "EDITOR'S PICKS",
|
||||
"picksEditorialLabel": "Editor's picks",
|
||||
"guidesTitle": "Buying guides",
|
||||
"guidesSubtitle": "Deep dives that help you choose",
|
||||
"guidesViewAll": "All guides",
|
||||
@@ -1092,4 +1093,4 @@
|
||||
"siteHeader": {
|
||||
"searchPlaceholder": "Search AI products..."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -105,11 +105,11 @@
|
||||
},
|
||||
"testimonials": {
|
||||
"title": "用户评价",
|
||||
"subtitle": "来自使用 Toolso.AI 发现优质 AI 工具的真实用户反馈。",
|
||||
"subtitle": "来自使用 LaunchAI 发现优质 AI 工具的真实用户反馈。",
|
||||
"items": [
|
||||
{
|
||||
"name": "张伟",
|
||||
"quote": "Toolso.AI 帮我找到了完美的 AI 写作助手,分类清晰让发现变得非常简单!",
|
||||
"quote": "LaunchAI 帮我找到了完美的 AI 写作助手,分类清晰让发现变得非常简单!",
|
||||
"designation": "内容创作者"
|
||||
},
|
||||
{
|
||||
@@ -119,7 +119,7 @@
|
||||
},
|
||||
{
|
||||
"name": "李娜",
|
||||
"quote": "每周都能在 Toolso.AI 上发现新的 AI 工具,已经成为我探索 AI 的首选资源。",
|
||||
"quote": "每周都能在 LaunchAI 上发现新的 AI 工具,已经成为我探索 AI 的首选资源。",
|
||||
"designation": "创业者"
|
||||
},
|
||||
{
|
||||
@@ -523,7 +523,7 @@
|
||||
"description": "请联系我们,我们会尽快回复。",
|
||||
"testimonial": {
|
||||
"title": "帮助用户发现最佳 AI 工具",
|
||||
"description": "Toolso.AI 致力于为用户提供精选的 AI 工具目录,帮助大家找到最适合的 AI 助手。"
|
||||
"description": "LaunchAI 致力于为用户提供精选的 AI 工具目录,帮助大家找到最适合的 AI 助手。"
|
||||
},
|
||||
"form": {
|
||||
"nameLabel": "姓名",
|
||||
@@ -676,48 +676,49 @@
|
||||
},
|
||||
"clearFilters": "清除搜索与筛选",
|
||||
"useCasesTitle": "使用场景",
|
||||
"goodForTitle": "适合人群"
|
||||
"goodForTitle": "适合人群",
|
||||
"preview": "网站预览"
|
||||
},
|
||||
"seo": {
|
||||
"home": {
|
||||
"title": "LaunchAI — 发现并投票今日 AI 新品",
|
||||
"description": "AI 产品每日发布社区:为最好的 AI 工具投票,登上社区排行榜。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"blog": {
|
||||
"title": "博客 - Toolso.AI",
|
||||
"title": "博客 - LaunchAI",
|
||||
"description": "关于 AI 工具的最新资讯、教程和更新。了解最佳 AI 工具和行业趋势。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"contact": {
|
||||
"title": "联系我们 - Toolso.AI",
|
||||
"title": "联系我们 - LaunchAI",
|
||||
"description": "与我们取得联系。我们期待听到您的反馈和工具推荐建议。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"login": {
|
||||
"title": "登录 - Toolso.AI",
|
||||
"title": "登录 - LaunchAI",
|
||||
"description": "登录您的账户,提交工具、收藏喜爱的工具,为 AI 工具目录做贡献。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"signup": {
|
||||
"title": "注册 - Toolso.AI",
|
||||
"title": "注册 - LaunchAI",
|
||||
"description": "创建您的账户,开始为 AI 工具目录做贡献。提交工具、加入我们的社区。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"terms": {
|
||||
"title": "服务条款 - Toolso.AI",
|
||||
"description": "阅读我们的服务条款,了解使用 Toolso.AI 的规则和指南。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "服务条款 - LaunchAI",
|
||||
"description": "阅读我们的服务条款,了解使用 LaunchAI 的规则和指南。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "隐私政策 - Toolso.AI",
|
||||
"description": "了解我们如何在 Toolso.AI 上收集、使用和保护您的个人信息和数据。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "隐私政策 - LaunchAI",
|
||||
"description": "了解我们如何在 LaunchAI 上收集、使用和保护您的个人信息和数据。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookie 政策 - Toolso.AI",
|
||||
"description": "了解我们如何在 Toolso.AI 上使用 cookies 和类似的跟踪技术。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Cookie 政策 - LaunchAI",
|
||||
"description": "了解我们如何在 LaunchAI 上使用 cookies 和类似的跟踪技术。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"tools": {
|
||||
"title": "AI 工具库 - 发现最好的 AI 工具",
|
||||
@@ -1099,4 +1100,4 @@
|
||||
"siteHeader": {
|
||||
"searchPlaceholder": "搜索 AI 产品..."
|
||||
}
|
||||
}
|
||||
}
|
||||
+16
-16
@@ -11,24 +11,24 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@aidir/core": "workspace:*",
|
||||
"next": "16.1.1",
|
||||
"react": "^19.2.3",
|
||||
"react-dom": "^19.2.3",
|
||||
"next-intl": "^4.7.0",
|
||||
"next": "^16.3.5",
|
||||
"react": "^19.3.0",
|
||||
"react-dom": "^19.3.0",
|
||||
"next-intl": "^4.14.5",
|
||||
"next-themes": "^0.4.6",
|
||||
"next-view-transitions": "^0.3.5",
|
||||
"sonner": "^2.0.7",
|
||||
"geist": "^1.3.0",
|
||||
"lucide-react": "^0.562.0",
|
||||
"framer-motion": "^12.43.0"
|
||||
"sonner": "^2.0.8",
|
||||
"geist": "^1.7.2",
|
||||
"lucide-react": "^1.46.0",
|
||||
"framer-motion": "^13.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19.2.7",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"typescript": "^5",
|
||||
"tailwindcss": "^3.4.1",
|
||||
"postcss": "^8"
|
||||
"@types/node": "^26.5.1",
|
||||
"@types/react": "^19.3.0",
|
||||
"@types/react-dom": "^19.3.0",
|
||||
"@types/mdx": "^2.0.14",
|
||||
"typescript": "^7.0.2",
|
||||
"tailwindcss": "^3.4.19",
|
||||
"postcss": "^8.5.28"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
# robots.txt for Toolso.AI - AI Tools Directory
|
||||
# https://toolso.ai
|
||||
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# Disallow admin and API pages
|
||||
Disallow: /admin/
|
||||
Disallow: /api/
|
||||
|
||||
# Disallow authentication pages
|
||||
Disallow: /*/signup
|
||||
Disallow: /*/login
|
||||
Disallow: /*/check-email
|
||||
Disallow: /*/verify-email
|
||||
Disallow: /*/forgot-password
|
||||
Disallow: /*/reset-password
|
||||
|
||||
# Disallow protected user pages
|
||||
Disallow: /*/dashboard
|
||||
Disallow: /*/profile
|
||||
|
||||
# Sitemap location
|
||||
Sitemap: https://toolso.ai/sitemap.xml
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(admin)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(admin)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(admin)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(auth)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(auth)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(auth)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(protected)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(protected)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(protected)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/layout.tsx 的薄路由
|
||||
export { default, generateStaticParams } from "@aidir/core/pages/[locale]/layout";
|
||||
export { default, generateMetadata, generateStaticParams } from "@aidir/core/pages/[locale]/layout";
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
// 自动生成:api/screenshots/[slug]/route.ts 的薄路由
|
||||
export { GET } from "@aidir/core/pages/api/screenshots/[slug]/route";
|
||||
@@ -0,0 +1,2 @@
|
||||
// 自动生成:robots.ts 的薄路由
|
||||
export { default } from "@aidir/core/pages/robots";
|
||||
@@ -1,6 +1,6 @@
|
||||
// 自动生成:站点首页组件(源自底座 product 形态,品牌来自 @/site/brand)
|
||||
import { siteConfig } from "@/site/brand";
|
||||
import { Flame, Trophy, Rocket, ChevronRight, MessageSquare } from "lucide-react";
|
||||
import { Rocket, ChevronRight, MessageSquare } from "lucide-react";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
import { VoteButton } from "@/features/voting/components/vote-button";
|
||||
import { LocaleLink } from "@/components/locale-link";
|
||||
@@ -8,45 +8,6 @@ import { ToolLogo } from "@/components/tool-logo";
|
||||
import { SectionHeader } from "@/kit/section";
|
||||
import { getHomeDataSafe } from "@/kit/home-data";
|
||||
|
||||
/** Product:AI 产品社区(Daily Launch / Upvote / Maker) */
|
||||
|
||||
|
||||
const navItems = [
|
||||
{ label: "Today", href: "/" },
|
||||
{ label: "Leaderboard", href: "/rankings" },
|
||||
{ label: "Categories", href: "/tools" },
|
||||
{ label: "Collections", href: "/best" },
|
||||
{ label: "Blog", href: "/blog" },
|
||||
{ label: "Submit", href: "/submit" },
|
||||
];
|
||||
|
||||
const footerGroups = [
|
||||
{
|
||||
title: "Community",
|
||||
links: [
|
||||
{ label: "Submit a Product", href: "/submit" },
|
||||
{ label: "Leaderboard", href: "/rankings" },
|
||||
{ label: "Dashboard", href: "/dashboard" },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Explore",
|
||||
links: [
|
||||
{ label: "All Products", href: "/tools" },
|
||||
{ label: "Use Cases", href: "/ai-tools-for" },
|
||||
{ label: "Collections", href: "/best" },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "About",
|
||||
links: [
|
||||
{ label: "Blog", href: "/blog" },
|
||||
{ label: "Terms", href: "/terms" },
|
||||
{ label: "Privacy", href: "/privacy" },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
/** 单条 Launch 卡片:PH 风格(大投票块 + 产品信息 + 互动) */
|
||||
function LaunchRow({
|
||||
tool,
|
||||
@@ -110,18 +71,18 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-background">
|
||||
{/* Hero:今日发布 */}
|
||||
<section className="hero-launch border-b border-border bg-gradient-to-b from-primary/5 to-background">
|
||||
<div className="mx-auto max-w-5xl px-4 py-12 text-center sm:px-6 md:py-16">
|
||||
<h1 className="text-2xl font-extrabold tracking-tight text-foreground sm:text-4xl">
|
||||
{/* Hero:亮底排版,橙色只留给主按钮 */}
|
||||
<section className="border-b border-border">
|
||||
<div className="site-container px-4 py-12 text-center sm:px-6 md:py-16">
|
||||
<h1 className="text-balance text-2xl font-extrabold tracking-tight text-foreground sm:text-4xl">
|
||||
{th("title")}
|
||||
</h1>
|
||||
<p className="mt-3 text-sm text-muted-foreground sm:text-base">
|
||||
<p className="mx-auto mt-3 max-w-xl text-sm leading-relaxed text-muted-foreground sm:text-base">
|
||||
{th("description")}
|
||||
</p>
|
||||
<LocaleLink
|
||||
href="/submit"
|
||||
className="mt-6 inline-flex items-center gap-1.5 rounded-full bg-primary px-6 py-2.5 text-sm font-semibold text-primary-foreground shadow transition-all hover:opacity-90"
|
||||
className="mt-6 inline-flex items-center gap-1.5 rounded-lg bg-primary px-6 py-2.5 text-sm font-semibold text-primary-foreground transition-opacity hover:opacity-90"
|
||||
>
|
||||
<Rocket className="h-4 w-4" />
|
||||
{t("launchButton")}
|
||||
@@ -129,14 +90,13 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div className="mx-auto grid max-w-5xl gap-8 px-4 py-10 sm:px-6 lg:grid-cols-[1fr_280px]">
|
||||
<div className="site-container grid gap-8 px-4 py-10 sm:px-6 lg:grid-cols-[1fr_280px]">
|
||||
{/* 产品 Feed */}
|
||||
<div>
|
||||
<div className="overflow-hidden rounded-2xl border border-border bg-background">
|
||||
<div className="flex items-center gap-2 border-b border-border bg-secondary/30 px-4 py-3 sm:px-6">
|
||||
<Flame className="h-4 w-4 text-primary" />
|
||||
<h2 className="text-sm font-bold text-foreground">Today's feed</h2>
|
||||
</div>
|
||||
<div className="flex items-center justify-between border-b border-border px-4 py-3 sm:px-6">
|
||||
<h2 className="text-sm font-bold text-foreground">Today's feed</h2>
|
||||
</div>
|
||||
{data.trending.length > 0 ? (
|
||||
data.trending.map((tool, i) => (
|
||||
<LaunchRow key={tool.id} tool={tool} locale={locale} rank={i + 1} />
|
||||
@@ -172,8 +132,7 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
<aside className="space-y-6">
|
||||
{data.popular.length > 0 && (
|
||||
<div className="rounded-2xl border border-border bg-background p-5">
|
||||
<div className="flex items-center gap-2">
|
||||
<Trophy className="h-4 w-4 text-primary" />
|
||||
<div className="flex items-center justify-between">
|
||||
<h3 className="text-sm font-bold text-foreground">Leaderboard</h3>
|
||||
</div>
|
||||
<ol className="mt-4 space-y-3">
|
||||
@@ -255,5 +214,4 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export { SiteHome };
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
"items": [
|
||||
{
|
||||
"name": "Sarah Chen",
|
||||
"quote": "Toolso.AI helped me find the perfect AI writing assistant. The categorization makes discovery so easy!",
|
||||
"quote": "The AI Ledger helped me find the perfect AI writing assistant. The categorization makes discovery so easy!",
|
||||
"designation": "Content Creator"
|
||||
},
|
||||
{
|
||||
@@ -120,7 +120,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Emily Rodriguez",
|
||||
"quote": "I discover new AI tools every week on Toolso.AI. It's become my go-to resource for AI exploration.",
|
||||
"quote": "I discover new AI tools every week on The AI Ledger. It's become my go-to resource for AI exploration.",
|
||||
"designation": "Startup Founder"
|
||||
},
|
||||
{
|
||||
@@ -669,48 +669,49 @@
|
||||
},
|
||||
"clearFilters": "Clear search & filters",
|
||||
"useCasesTitle": "Use cases",
|
||||
"goodForTitle": "Good for"
|
||||
"goodForTitle": "Good for",
|
||||
"preview": "Website preview"
|
||||
},
|
||||
"seo": {
|
||||
"home": {
|
||||
"title": "The AI Ledger — AI Tools, Reviewed and Ranked",
|
||||
"description": "Independent journalism on AI: buying guides, comparisons and a community-ranked directory of the best AI tools.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"blog": {
|
||||
"title": "Blog - Toolso.AI",
|
||||
"title": "Blog - The AI Ledger",
|
||||
"description": "Latest insights, tutorials and updates about AI tools. Stay informed about the best AI tools and industry trends.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"contact": {
|
||||
"title": "Contact Us - Toolso.AI",
|
||||
"title": "Contact Us - The AI Ledger",
|
||||
"description": "Get in touch with us. We'd love to hear your feedback and tool suggestions.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"login": {
|
||||
"title": "Login - Toolso.AI",
|
||||
"title": "Login - The AI Ledger",
|
||||
"description": "Sign in to your account to submit tools, save favorites, and contribute to our AI tools directory.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"signup": {
|
||||
"title": "Sign Up - Toolso.AI",
|
||||
"title": "Sign Up - The AI Ledger",
|
||||
"description": "Create your account and start contributing to our AI tools directory. Submit tools and join our community.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"terms": {
|
||||
"title": "Terms of Service - Toolso.AI",
|
||||
"description": "Read our terms of service to understand the rules and guidelines for using Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Terms of Service - The AI Ledger",
|
||||
"description": "Read our terms of service to understand the rules and guidelines for using The AI Ledger.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "Privacy Policy - Toolso.AI",
|
||||
"description": "Learn how we collect, use, and protect your personal information and data on Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Privacy Policy - The AI Ledger",
|
||||
"description": "Learn how we collect, use, and protect your personal information and data on The AI Ledger.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookie Policy - Toolso.AI",
|
||||
"description": "Understand how we use cookies and similar tracking technologies on Toolso.AI.",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Cookie Policy - The AI Ledger",
|
||||
"description": "Understand how we use cookies and similar tracking technologies on The AI Ledger.",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"tools": {
|
||||
"title": "AI Tools Directory - Discover the Best AI Tools",
|
||||
@@ -916,7 +917,7 @@
|
||||
"noLaunches": "No launches yet — be the first to submit.",
|
||||
"searchPlaceholder": "Search AI tools...",
|
||||
"reviewsCount": "{count} reviews",
|
||||
"mastheadLabel": "INDEPENDENT AI COVERAGE",
|
||||
"mastheadLabel": "Independent AI coverage",
|
||||
"minimalTagline": "AI TOOL SEARCH",
|
||||
"minimalPlaceholder": "I need to create marketing videos...",
|
||||
"useCasesBlockTitle": "Use cases",
|
||||
@@ -949,7 +950,7 @@
|
||||
"launchButton": "Launch your product",
|
||||
"featuredLabel": "Featured story",
|
||||
"featuredRead": "Read the story",
|
||||
"picksEditorialLabel": "EDITOR'S PICKS",
|
||||
"picksEditorialLabel": "Editor's picks",
|
||||
"guidesTitle": "Buying guides",
|
||||
"guidesSubtitle": "Deep dives that help you choose",
|
||||
"guidesViewAll": "All guides",
|
||||
@@ -1092,4 +1093,4 @@
|
||||
"siteHeader": {
|
||||
"searchPlaceholder": "Search the directory..."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -105,11 +105,11 @@
|
||||
},
|
||||
"testimonials": {
|
||||
"title": "用户评价",
|
||||
"subtitle": "来自使用 Toolso.AI 发现优质 AI 工具的真实用户反馈。",
|
||||
"subtitle": "来自使用 The AI Ledger 发现优质 AI 工具的真实用户反馈。",
|
||||
"items": [
|
||||
{
|
||||
"name": "张伟",
|
||||
"quote": "Toolso.AI 帮我找到了完美的 AI 写作助手,分类清晰让发现变得非常简单!",
|
||||
"quote": "The AI Ledger 帮我找到了完美的 AI 写作助手,分类清晰让发现变得非常简单!",
|
||||
"designation": "内容创作者"
|
||||
},
|
||||
{
|
||||
@@ -119,7 +119,7 @@
|
||||
},
|
||||
{
|
||||
"name": "李娜",
|
||||
"quote": "每周都能在 Toolso.AI 上发现新的 AI 工具,已经成为我探索 AI 的首选资源。",
|
||||
"quote": "每周都能在 The AI Ledger 上发现新的 AI 工具,已经成为我探索 AI 的首选资源。",
|
||||
"designation": "创业者"
|
||||
},
|
||||
{
|
||||
@@ -523,7 +523,7 @@
|
||||
"description": "请联系我们,我们会尽快回复。",
|
||||
"testimonial": {
|
||||
"title": "帮助用户发现最佳 AI 工具",
|
||||
"description": "Toolso.AI 致力于为用户提供精选的 AI 工具目录,帮助大家找到最适合的 AI 助手。"
|
||||
"description": "The AI Ledger 致力于为用户提供精选的 AI 工具目录,帮助大家找到最适合的 AI 助手。"
|
||||
},
|
||||
"form": {
|
||||
"nameLabel": "姓名",
|
||||
@@ -676,48 +676,49 @@
|
||||
},
|
||||
"clearFilters": "清除搜索与筛选",
|
||||
"useCasesTitle": "使用场景",
|
||||
"goodForTitle": "适合人群"
|
||||
"goodForTitle": "适合人群",
|
||||
"preview": "网站预览"
|
||||
},
|
||||
"seo": {
|
||||
"home": {
|
||||
"title": "The AI Ledger — AI 工具评测与排名",
|
||||
"description": "独立 AI 媒体:深度指南、横向对比,以及由社区排名的 AI 工具目录。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"blog": {
|
||||
"title": "博客 - Toolso.AI",
|
||||
"title": "博客 - The AI Ledger",
|
||||
"description": "关于 AI 工具的最新资讯、教程和更新。了解最佳 AI 工具和行业趋势。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"contact": {
|
||||
"title": "联系我们 - Toolso.AI",
|
||||
"title": "联系我们 - The AI Ledger",
|
||||
"description": "与我们取得联系。我们期待听到您的反馈和工具推荐建议。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"login": {
|
||||
"title": "登录 - Toolso.AI",
|
||||
"title": "登录 - The AI Ledger",
|
||||
"description": "登录您的账户,提交工具、收藏喜爱的工具,为 AI 工具目录做贡献。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"signup": {
|
||||
"title": "注册 - Toolso.AI",
|
||||
"title": "注册 - The AI Ledger",
|
||||
"description": "创建您的账户,开始为 AI 工具目录做贡献。提交工具、加入我们的社区。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"terms": {
|
||||
"title": "服务条款 - Toolso.AI",
|
||||
"description": "阅读我们的服务条款,了解使用 Toolso.AI 的规则和指南。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "服务条款 - The AI Ledger",
|
||||
"description": "阅读我们的服务条款,了解使用 The AI Ledger 的规则和指南。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "隐私政策 - Toolso.AI",
|
||||
"description": "了解我们如何在 Toolso.AI 上收集、使用和保护您的个人信息和数据。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "隐私政策 - The AI Ledger",
|
||||
"description": "了解我们如何在 The AI Ledger 上收集、使用和保护您的个人信息和数据。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"cookies": {
|
||||
"title": "Cookie 政策 - Toolso.AI",
|
||||
"description": "了解我们如何在 Toolso.AI 上使用 cookies 和类似的跟踪技术。",
|
||||
"ogImage": "https://toolso.ai/banner.png"
|
||||
"title": "Cookie 政策 - The AI Ledger",
|
||||
"description": "了解我们如何在 The AI Ledger 上使用 cookies 和类似的跟踪技术。",
|
||||
"ogImage": "/banner.png"
|
||||
},
|
||||
"tools": {
|
||||
"title": "AI 工具库 - 发现最好的 AI 工具",
|
||||
@@ -1099,4 +1100,4 @@
|
||||
"siteHeader": {
|
||||
"searchPlaceholder": "搜索目录..."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,24 +11,24 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@aidir/core": "workspace:*",
|
||||
"next": "16.1.1",
|
||||
"react": "^19.2.3",
|
||||
"react-dom": "^19.2.3",
|
||||
"next-intl": "^4.7.0",
|
||||
"next": "^16.3.5",
|
||||
"react": "^19.3.0",
|
||||
"react-dom": "^19.3.0",
|
||||
"next-intl": "^4.14.5",
|
||||
"next-themes": "^0.4.6",
|
||||
"next-view-transitions": "^0.3.5",
|
||||
"sonner": "^2.0.7",
|
||||
"geist": "^1.3.0",
|
||||
"lucide-react": "^0.562.0",
|
||||
"framer-motion": "^12.43.0"
|
||||
"sonner": "^2.0.8",
|
||||
"geist": "^1.7.2",
|
||||
"lucide-react": "^1.46.0",
|
||||
"framer-motion": "^13.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19.2.7",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"typescript": "^5",
|
||||
"tailwindcss": "^3.4.1",
|
||||
"postcss": "^8"
|
||||
"@types/node": "^26.5.1",
|
||||
"@types/react": "^19.3.0",
|
||||
"@types/react-dom": "^19.3.0",
|
||||
"@types/mdx": "^2.0.14",
|
||||
"typescript": "^7.0.2",
|
||||
"tailwindcss": "^3.4.19",
|
||||
"postcss": "^8.5.28"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
# robots.txt for Toolso.AI - AI Tools Directory
|
||||
# https://toolso.ai
|
||||
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# Disallow admin and API pages
|
||||
Disallow: /admin/
|
||||
Disallow: /api/
|
||||
|
||||
# Disallow authentication pages
|
||||
Disallow: /*/signup
|
||||
Disallow: /*/login
|
||||
Disallow: /*/check-email
|
||||
Disallow: /*/verify-email
|
||||
Disallow: /*/forgot-password
|
||||
Disallow: /*/reset-password
|
||||
|
||||
# Disallow protected user pages
|
||||
Disallow: /*/dashboard
|
||||
Disallow: /*/profile
|
||||
|
||||
# Sitemap location
|
||||
Sitemap: https://toolso.ai/sitemap.xml
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(admin)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(admin)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(admin)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(auth)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(auth)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(auth)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/(protected)/layout.tsx 的薄路由
|
||||
export { default } from "@aidir/core/pages/[locale]/(protected)/layout";
|
||||
export { default, metadata } from "@aidir/core/pages/[locale]/(protected)/layout";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// 自动生成:[locale]/layout.tsx 的薄路由
|
||||
export { default, generateStaticParams } from "@aidir/core/pages/[locale]/layout";
|
||||
export { default, generateMetadata, generateStaticParams } from "@aidir/core/pages/[locale]/layout";
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
// 自动生成:api/screenshots/[slug]/route.ts 的薄路由
|
||||
export { GET } from "@aidir/core/pages/api/screenshots/[slug]/route";
|
||||
@@ -0,0 +1,2 @@
|
||||
// 自动生成:robots.ts 的薄路由
|
||||
export { default } from "@aidir/core/pages/robots";
|
||||
@@ -1,50 +1,11 @@
|
||||
// 自动生成:站点首页组件(源自底座 editorial 形态,品牌来自 @/site/brand)
|
||||
import { siteConfig } from "@/site/brand";
|
||||
import { BookOpen, PenTool, ArrowRight, Star } from "lucide-react";
|
||||
import { ArrowRight, Star } from "lucide-react";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
import { LocaleLink } from "@/components/locale-link";
|
||||
import { SectionHeader } from "@/kit/section";
|
||||
import { getHomeDataSafe } from "@/kit/home-data";
|
||||
|
||||
/** Editorial:AI 媒体 + 工具目录(Serif / 内容优先) */
|
||||
|
||||
|
||||
const navItems = [
|
||||
{ label: "Stories", href: "/blog" },
|
||||
{ label: "Guides", href: "/ai-tools-for" },
|
||||
{ label: "Best Picks", href: "/best" },
|
||||
{ label: "Directory", href: "/tools" },
|
||||
{ label: "Rankings", href: "/rankings" },
|
||||
{ label: "Submit", href: "/submit" },
|
||||
];
|
||||
|
||||
const footerGroups = [
|
||||
{
|
||||
title: "Read",
|
||||
links: [
|
||||
{ label: "Latest Stories", href: "/blog" },
|
||||
{ label: "Buying Guides", href: "/best" },
|
||||
{ label: "Use Case Guides", href: "/ai-tools-for" },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Directory",
|
||||
links: [
|
||||
{ label: "All Tools", href: "/tools" },
|
||||
{ label: "Community Rankings", href: "/rankings" },
|
||||
{ label: "Submit a Tool", href: "/submit" },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Company",
|
||||
links: [
|
||||
{ label: "Contact", href: "/contact" },
|
||||
{ label: "Terms", href: "/terms" },
|
||||
{ label: "Privacy", href: "/privacy" },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
async function SiteHome({ locale }: { locale: string }) {
|
||||
const t = await getTranslations("siteHome");
|
||||
const th = await getTranslations("hero");
|
||||
@@ -56,7 +17,7 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
<div className="min-h-screen bg-background">
|
||||
{/* Masthead:黑色报头条(当日日期 + 期号),报纸头版签名 */}
|
||||
<div className="bg-foreground text-background">
|
||||
<div className="mx-auto flex max-w-4xl items-center justify-between px-4 py-2 text-[11px] uppercase tracking-[0.25em] sm:px-6">
|
||||
<div className="site-container flex items-center justify-between px-4 py-2 text-[11px] uppercase tracking-[0.25em] sm:px-6">
|
||||
<span>{new Date().toLocaleDateString("en-US", { weekday: "long", year: "numeric", month: "long", day: "numeric" })}</span>
|
||||
<span className="hidden sm:inline">Est. 2026</span>
|
||||
<span>Daily</span>
|
||||
@@ -65,8 +26,8 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
|
||||
{/* Masthead */}
|
||||
<section className="hero-mast border-b border-border">
|
||||
<div className="mx-auto max-w-4xl px-4 py-16 text-center sm:px-6 md:py-20">
|
||||
<p className="text-xs font-medium uppercase tracking-[0.3em] text-muted-foreground">
|
||||
<div className="site-container px-4 py-16 text-center sm:px-6 md:py-20">
|
||||
<p className="text-sm italic text-muted-foreground">
|
||||
{t("mastheadLabel")}
|
||||
</p>
|
||||
<h1 className="mt-4 text-4xl font-bold tracking-tight text-foreground md:text-5xl">
|
||||
@@ -78,14 +39,11 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div className="mx-auto max-w-4xl space-y-14 px-4 py-12 sm:px-6">
|
||||
<div className="site-container space-y-14 px-4 py-12 sm:px-6">
|
||||
{/* Featured Story */}
|
||||
{featured && (
|
||||
<section>
|
||||
<div className="mb-4 flex items-center gap-2 text-xs font-semibold uppercase tracking-widest text-primary">
|
||||
<BookOpen className="h-3.5 w-3.5" />
|
||||
{t("featuredLabel")}
|
||||
</div>
|
||||
<h2 className="mb-4 text-lg font-bold text-foreground">{t("featuredLabel")}</h2>
|
||||
<LocaleLink href={`/blog/${featured.slug}`} className="group block">
|
||||
<h2 className="text-2xl font-bold leading-snug text-foreground group-hover:underline md:text-3xl">
|
||||
{featured.title}
|
||||
@@ -106,10 +64,7 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
{/* Editor's Picks */}
|
||||
{editorPicks.length > 0 && (
|
||||
<section>
|
||||
<div className="mb-4 flex items-center gap-2 text-xs font-semibold uppercase tracking-widest text-primary">
|
||||
<PenTool className="h-3.5 w-3.5" />
|
||||
{t("picksEditorialLabel")}
|
||||
</div>
|
||||
<h2 className="mb-4 border-t-2 border-foreground/80 pt-4 text-lg font-bold text-foreground">{t("picksEditorialLabel")}</h2>
|
||||
<div className="divide-y divide-border border-y border-border">
|
||||
{editorPicks.map((tool, i) => (
|
||||
<LocaleLink
|
||||
@@ -130,7 +85,7 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
</div>
|
||||
{(tool.ratingAvg ?? 0) > 0 && (
|
||||
<span className="inline-flex shrink-0 items-center gap-1 text-sm font-semibold text-foreground">
|
||||
<Star className="h-3.5 w-3.5 fill-amber-400 text-amber-400" />
|
||||
<Star className="h-3.5 w-3.5 fill-foreground text-foreground" />
|
||||
{(tool.ratingAvg ?? 0).toFixed(1)}
|
||||
</span>
|
||||
)}
|
||||
@@ -230,5 +185,4 @@ async function SiteHome({ locale }: { locale: string }) {
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export { SiteHome };
|
||||
|
||||
Reference in New Issue
Block a user