11import Link from 'next/link' ;
22import { showcasesSource } from '@/lib/source' ;
3- import { ProviderBadge } from '@/components/provider' ;
4-
5- const iconMap : Record < string , { emoji : string ; color : string } > = {
6- nodedotjs : { emoji : '🟢' , color : '#339933' } ,
7- py : { emoji : '🐍' , color : '#3776AB' } ,
8- go : { emoji : '🔷' , color : '#00ADD8' } ,
9- rust : { emoji : '🦀' , color : '#CE422B' } ,
10- deno : { emoji : '🦕' , color : '#000000' } ,
11- docker : { emoji : '🐳' , color : '#2496ED' } ,
12- ruby : { emoji : '💎' , color : '#CC342D' } ,
13- lua : { emoji : '🌙' , color : '#2C2D72' } ,
14- luau : { emoji : '🌙' , color : '#00A2FF' } ,
15- zig : { emoji : '⚡' , color : '#F7A41D' } ,
16- laravel : { emoji : '🎯' , color : '#FF2D20' } ,
17- } ;
18-
19- function ShowcaseIcon ( { name } : { name : string } ) {
20- const mapped = iconMap [ name ] ;
21- if ( mapped ) {
22- return (
23- < span
24- className = "inline-flex items-center justify-center w-10 h-10 rounded-lg text-xl"
25- style = { { backgroundColor : mapped . color + '18' } }
26- >
27- { mapped . emoji }
28- </ span >
29- ) ;
30- }
31- return (
32- < span className = "inline-flex items-center justify-center w-10 h-10 rounded-lg text-xl bg-fd-secondary" >
33- 📦
34- </ span >
35- ) ;
36- }
3+ import { ShowcaseCard } from '@/components/showcase-card' ;
374
385export default async function ShowcasesPage ( ) {
396 const pages = showcasesSource
407 . getPages ( )
41- . filter ( ( p ) => p . slugs . length > 0 && ! ( p . data as any ) . full ) ;
8+ . filter ( ( p ) => p . slugs . length > 0 && ! p . data . full ) ;
429
4310 return (
4411 < div className = "container mx-auto px-4 py-12 max-w-fd-container" >
@@ -47,71 +14,17 @@ export default async function ShowcasesPage() {
4714 Проекты, использующие Razd. Клонируйте и запускайте одной командой.
4815 </ p >
4916 < div className = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6" >
50- { pages . map ( ( page ) => {
51- const data = page . data as any ;
52- const tags : string [ ] = data . tags || [ ] ;
53- const source = data . source ;
54- const icon = data . icon || '' ;
55- const provider = data . provider as 'mise' | 'devbox' | undefined ;
56-
57- return (
58- < div
59- key = { page . url }
60- className = "group rounded-xl border border-fd-border bg-fd-card p-6 transition-all duration-300 hover:border-fd-primary/40 hover:shadow-lg flex flex-col"
61- >
62- < Link href = { page . url } className = "no-underline" >
63- < div className = "flex items-center gap-3 mb-4" >
64- < ShowcaseIcon name = { icon } />
65- < h2 className = "text-lg font-semibold group-hover:text-fd-primary transition-colors" >
66- { data . title }
67- </ h2 >
68- </ div >
69- < p className = "text-fd-muted-foreground text-sm mb-4 line-clamp-3" >
70- { data . description }
71- </ p >
72- { tags . length > 0 && (
73- < div className = "flex flex-wrap gap-2 mb-4" >
74- { provider && < ProviderBadge provider = { provider } /> }
75- { tags . map ( ( tag ) => (
76- < span
77- key = { tag }
78- className = "text-xs font-medium px-2.5 py-1 rounded-md bg-fd-secondary text-fd-muted-foreground"
79- >
80- { tag }
81- </ span >
82- ) ) }
83- </ div >
84- ) }
85- </ Link >
86- < div className = "flex items-center gap-3 mt-auto pt-4 border-t border-fd-border" >
87- < Link
88- href = { page . url }
89- className = "text-sm font-medium text-fd-primary hover:underline"
90- >
91- Подробнее →
92- </ Link >
93- { source && (
94- < a
95- href = { source }
96- target = "_blank"
97- rel = "noopener noreferrer"
98- className = "text-sm font-medium text-fd-muted-foreground hover:underline"
99- >
100- Репозиторий →
101- </ a >
102- ) }
103- </ div >
104- </ div >
105- ) ;
106- } ) }
17+ { pages . map ( ( page ) => (
18+ < ShowcaseCard key = { page . url } page = { page } />
19+ ) ) }
10720 </ div >
10821 < p className = "text-center text-fd-muted-foreground text-sm mt-12" >
10922 Смотрите{ ' ' }
110- < Link href = "/docs/stack " className = "text-fd-foreground underline" >
111- документацию по стекам технологий
23+ < Link href = "/docs" className = "text-fd-primary hover: underline" >
24+ документацию
11225 </ Link > { ' ' }
113- для подробных руководств .
26+ для подробностей .
11427 </ p >
11528 </ div >
11629 ) ;
117- }
30+ }
0 commit comments