|
1 | 1 | import { getTranslations } from 'next-intl/server' |
2 | 2 | import Footer from '@/components/Footer' |
3 | 3 | import Header from '@/components/Header' |
4 | | -import StackSidebar from '@/components/sidebar/StackSidebar' |
5 | 4 | import { Link } from '@/i18n/navigation' |
6 | | -import { getManifestoComponent } from '@/lib/manifesto' |
7 | 5 | import { buildCanonicalUrl, buildOpenGraph, buildTitle, buildTwitterCard } from '@/lib/metadata' |
8 | 6 |
|
9 | 7 | export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }) { |
@@ -47,76 +45,52 @@ type Props = { |
47 | 45 | export default async function AICodingStackPage({ params }: Props) { |
48 | 46 | const { locale } = await params |
49 | 47 | const t = await getTranslations({ locale, namespace: 'stacksPages.overview' }) |
50 | | - const ManifestoContent = await getManifestoComponent(locale) |
51 | 48 |
|
52 | 49 | return ( |
53 | 50 | <> |
54 | 51 | <Header /> |
55 | 52 |
|
56 | | - <div className="max-w-[1400px] mx-auto px-[var(--spacing-md)] py-[var(--spacing-lg)]"> |
57 | | - <div className="flex gap-[var(--spacing-lg)]"> |
58 | | - <StackSidebar activeStack="overview" locale={locale} /> |
| 53 | + <div className="max-w-8xl mx-auto px-[var(--spacing-md)] py-[var(--spacing-lg)]"> |
| 54 | + <main> |
| 55 | + {/* Hero Section */} |
| 56 | + <section className="mb-[var(--spacing-xl)]"> |
| 57 | + <h1 className="text-[3rem] font-bold tracking-[-0.04em] leading-[1.1] mb-[var(--spacing-md)]"> |
| 58 | + {t('title')} |
| 59 | + </h1> |
| 60 | + </section> |
59 | 61 |
|
60 | | - <main className="flex-1"> |
61 | | - {/* Hero Section */} |
62 | | - <section className="mb-[var(--spacing-2xl)]"> |
63 | | - <div className="space-y-[var(--spacing-md)]"> |
64 | | - <h1 className="text-[2.5rem] md:text-[2rem] font-bold tracking-[-0.03em] leading-[1.15]"> |
65 | | - {t('title')} |
66 | | - </h1> |
67 | | - <div className="bg-[var(--color-hover)] p-[var(--spacing-md)]"> |
68 | | - <div className="text-[1.5rem] md:text-[1.25rem] tracking-[-0.01em] font-semibold text-[var(--color-text-secondary)]"> |
69 | | - {t('slogan')} |
| 62 | + {/* Stacks Grid Section */} |
| 63 | + <section className="mb-[var(--spacing-xl)]"> |
| 64 | + <div className="grid grid-cols-1 md:grid-cols-3 gap-[var(--spacing-md)]"> |
| 65 | + {[ |
| 66 | + { key: 'ides', path: 'ides' }, |
| 67 | + { key: 'clis', path: 'clis' }, |
| 68 | + { key: 'extensions', path: 'extensions' }, |
| 69 | + { key: 'models', path: 'models' }, |
| 70 | + { key: 'modelProviders', path: 'model-providers' }, |
| 71 | + { key: 'vendors', path: 'vendors' }, |
| 72 | + ].map(stack => ( |
| 73 | + <Link |
| 74 | + key={stack.key} |
| 75 | + href={`/${stack.path}`} |
| 76 | + className="block border border-[var(--color-border)] p-[var(--spacing-md)] hover:border-[var(--color-border-strong)] transition-all hover:-translate-y-0.5 group" |
| 77 | + > |
| 78 | + <div className="flex justify-between items-start mb-[var(--spacing-md)]"> |
| 79 | + <h3 className="text-[1.5rem] font-semibold tracking-tight"> |
| 80 | + {t(`${stack.key}.title`)} |
| 81 | + </h3> |
| 82 | + <span className="text-2xl text-[var(--color-text-muted)] group-hover:text-[var(--color-text)] group-hover:translate-x-1 transition-all"> |
| 83 | + → |
| 84 | + </span> |
70 | 85 | </div> |
71 | | - </div> |
72 | | - </div> |
73 | | - </section> |
74 | | - |
75 | | - {/* Stacks Grid Section */} |
76 | | - <section className="mb-[var(--spacing-xl)]"> |
77 | | - <h2 className="text-[1.5rem] font-semibold tracking-[-0.02em] my-[var(--spacing-md)]"> |
78 | | - <span className="text-[var(--color-text-muted)] font-light mr-[var(--spacing-xs)]"> |
79 | | - {'//'} |
80 | | - </span> |
81 | | - {t('exploreStack')} |
82 | | - </h2> |
83 | | - |
84 | | - <div className="grid grid-cols-1 md:grid-cols-2 gap-[var(--spacing-md)]"> |
85 | | - {[ |
86 | | - { key: 'ides', path: 'ides' }, |
87 | | - { key: 'clis', path: 'clis' }, |
88 | | - { key: 'extensions', path: 'extensions' }, |
89 | | - { key: 'models', path: 'models' }, |
90 | | - { key: 'modelProviders', path: 'model-providers' }, |
91 | | - { key: 'vendors', path: 'vendors' }, |
92 | | - ].map(stack => ( |
93 | | - <Link |
94 | | - key={stack.key} |
95 | | - href={`/${stack.path}`} |
96 | | - className="block border border-[var(--color-border)] p-[var(--spacing-md)] hover:border-[var(--color-border-strong)] transition-all hover:-translate-y-0.5 group" |
97 | | - > |
98 | | - <div className="flex justify-between items-start mb-[var(--spacing-md)]"> |
99 | | - <h3 className="text-[1.5rem] font-semibold tracking-tight"> |
100 | | - {t(`${stack.key}.title`)} |
101 | | - </h3> |
102 | | - <span className="text-2xl text-[var(--color-text-muted)] group-hover:text-[var(--color-text)] group-hover:translate-x-1 transition-all"> |
103 | | - → |
104 | | - </span> |
105 | | - </div> |
106 | | - <p className="text-sm leading-relaxed text-[var(--color-text-secondary)] font-light"> |
107 | | - {t(`${stack.key}.description`)} |
108 | | - </p> |
109 | | - </Link> |
110 | | - ))} |
111 | | - </div> |
112 | | - </section> |
113 | | - |
114 | | - {/* Manifesto Section */} |
115 | | - <section className="prose prose-neutral dark:prose-invert max-w-none"> |
116 | | - <ManifestoContent /> |
117 | | - </section> |
118 | | - </main> |
119 | | - </div> |
| 86 | + <p className="text-sm leading-relaxed text-[var(--color-text-secondary)] font-light"> |
| 87 | + {t(`${stack.key}.description`)} |
| 88 | + </p> |
| 89 | + </Link> |
| 90 | + ))} |
| 91 | + </div> |
| 92 | + </section> |
| 93 | + </main> |
120 | 94 | </div> |
121 | 95 |
|
122 | 96 | <Footer /> |
|
0 commit comments