devskill 2.0.3 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +4 -1
  4. package/landing/AGENTS.md +5 -0
  5. package/landing/CLAUDE.md +1 -0
  6. package/landing/README.md +36 -0
  7. package/landing/app/[locale]/layout.tsx +58 -0
  8. package/landing/app/[locale]/page.tsx +291 -0
  9. package/landing/app/globals.css +129 -0
  10. package/landing/app/icon.tsx +41 -0
  11. package/landing/app/opengraph-image.tsx +69 -0
  12. package/landing/components/ui/accordion.tsx +74 -0
  13. package/landing/components/ui/badge.tsx +52 -0
  14. package/landing/components/ui/button.tsx +60 -0
  15. package/landing/components/ui/card.tsx +103 -0
  16. package/landing/components/ui/copy-button.tsx +60 -0
  17. package/landing/components/ui/navigation-menu.tsx +168 -0
  18. package/landing/components.json +25 -0
  19. package/landing/eslint.config.mjs +18 -0
  20. package/landing/i18n/request.ts +17 -0
  21. package/landing/i18n/routing.ts +17 -0
  22. package/landing/lib/utils.ts +6 -0
  23. package/landing/messages/en.json +32 -0
  24. package/landing/messages/vi.json +32 -0
  25. package/landing/middleware.ts +9 -0
  26. package/landing/next.config.ts +10 -0
  27. package/landing/package-lock.json +10540 -0
  28. package/landing/package.json +35 -0
  29. package/landing/postcss.config.mjs +7 -0
  30. package/landing/public/file.svg +1 -0
  31. package/landing/public/globe.svg +1 -0
  32. package/landing/public/next.svg +1 -0
  33. package/landing/public/vercel.svg +1 -0
  34. package/landing/public/window.svg +1 -0
  35. package/landing/tsconfig.json +34 -0
  36. package/meta.ts +5 -1
  37. package/package.json +7 -1
  38. package/skills/builderx_api-kafka/SKILL.md +175 -0
  39. package/skills/builderx_api-mongodb/SKILL.md +93 -0
  40. package/skills/builderx_api-rabbitmq/SKILL.md +169 -0
  41. package/skills/builderx_api-redis/SKILL.md +93 -0
@@ -0,0 +1,11 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(git config:*)",
5
+ "Bash(pkill -f 'next build')",
6
+ "Bash(kill 48297 48295 48488)",
7
+ "Bash(rm -rf .next)",
8
+ "Bash(npm run:*)"
9
+ ]
10
+ }
11
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 vuluu2k
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  <div align="center">
2
2
  <h1>🚀 devskill: Supercharge Your AI Agents</h1>
3
- <p><strong>Curated Coding Expertise for Cursor, GitHub Copilot, & AgentSkills</strong></p>
3
+ <p><strong>Curated Coding Expertise for Cursor, Windsurf, Cline, Antigravity, Claude Code, Codex, & GitHub Copilot</strong></p>
4
+ <p>
5
+ 🌍 <strong><a href="https://vskill.vercel.app">Visit the official devskill Homepage</a></strong>
6
+ </p>
4
7
  <p>
5
8
  <a href="README.vn.md">🇻🇳 Read in Vietnamese (Đọc Tiếng Việt)</a> •
6
9
  <a href="https://agentskills.io/home" target="_blank">About AgentSkills</a>
@@ -0,0 +1,5 @@
1
+ <!-- BEGIN:nextjs-agent-rules -->
2
+ # This is NOT the Next.js you know
3
+
4
+ This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
5
+ <!-- END:nextjs-agent-rules -->
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -0,0 +1,36 @@
1
+ This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
2
+
3
+ ## Getting Started
4
+
5
+ First, run the development server:
6
+
7
+ ```bash
8
+ npm run dev
9
+ # or
10
+ yarn dev
11
+ # or
12
+ pnpm dev
13
+ # or
14
+ bun dev
15
+ ```
16
+
17
+ Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18
+
19
+ You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20
+
21
+ This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22
+
23
+ ## Learn More
24
+
25
+ To learn more about Next.js, take a look at the following resources:
26
+
27
+ - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28
+ - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29
+
30
+ You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31
+
32
+ ## Deploy on Vercel
33
+
34
+ The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35
+
36
+ Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
@@ -0,0 +1,58 @@
1
+ import {NextIntlClientProvider} from 'next-intl';
2
+ import {getMessages} from 'next-intl/server';
3
+ import { Inter, Fira_Code } from "next/font/google";
4
+ import "../globals.css";
5
+ import {routing} from '../../i18n/routing';
6
+ import {notFound} from 'next/navigation';
7
+ import { Metadata } from 'next';
8
+
9
+ export const metadata: Metadata = {
10
+ title: 'devskill | Upgrade your AI\'s Brain',
11
+ description: 'Equip Cursor, Windsurf, Cline, Antigravity, Claude Code, Codex, GitHub Copilot and other AI Agents with expert programming superpowers via a single interactive prompt.',
12
+ openGraph: {
13
+ title: 'devskill | Upgrade your AI\'s Brain',
14
+ description: 'Equip Cursor, Windsurf, Cline, Antigravity, Claude Code, Codex, GitHub Copilot and other AI Agents with expert programming superpowers via a single interactive prompt.',
15
+ type: 'website',
16
+ }
17
+ };
18
+
19
+ const inter = Inter({
20
+ variable: "--font-sans",
21
+ subsets: ["latin", "vietnamese"],
22
+ });
23
+
24
+ const firaCode = Fira_Code({
25
+ variable: "--font-mono",
26
+ subsets: ["latin"],
27
+ });
28
+
29
+ export function generateStaticParams() {
30
+ return routing.locales.map((locale) => ({locale}));
31
+ }
32
+
33
+ export default async function LocaleLayout({
34
+ children,
35
+ params
36
+ }: {
37
+ children: React.ReactNode;
38
+ params: Promise<{locale: string}>;
39
+ }) {
40
+ const { locale } = await params;
41
+ // Ensure that the incoming `locale` is valid
42
+ if (!routing.locales.includes(locale as "en" | "vi")) {
43
+ notFound();
44
+ }
45
+
46
+ // Obtaining messages for the client components
47
+ const messages = await getMessages();
48
+
49
+ return (
50
+ <html lang={locale} className={`${inter.variable} ${firaCode.variable} h-full antialiased`}>
51
+ <body className="min-h-full flex flex-col">
52
+ <NextIntlClientProvider messages={messages}>
53
+ {children}
54
+ </NextIntlClientProvider>
55
+ </body>
56
+ </html>
57
+ );
58
+ }
@@ -0,0 +1,291 @@
1
+ import {useTranslations} from 'next-intl';
2
+ import {Link} from '../../i18n/routing';
3
+ import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
4
+ import { Badge } from "@/components/ui/badge";
5
+ import { Terminal, Zap, Target, Boxes, Code2, Sparkles, CheckCircle2, Database } from "lucide-react";
6
+ import { CopyButton } from "@/components/ui/copy-button";
7
+ import * as motion from "framer-motion/client";
8
+
9
+ const GithubIcon = ({ className }: { className?: string }) => (
10
+ <svg
11
+ role="img"
12
+ viewBox="0 0 24 24"
13
+ xmlns="http://www.w3.org/2000/svg"
14
+ className={className}
15
+ fill="currentColor"
16
+ >
17
+ <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" />
18
+ </svg>
19
+ );
20
+
21
+ export default function LandingPage() {
22
+ const t = useTranslations('Index');
23
+ const h = useTranslations('Hero');
24
+ const f = useTranslations('Features');
25
+
26
+ return (
27
+ <div className="flex flex-col min-h-screen bg-zinc-950 text-zinc-50 selection:bg-rose-500/30 overflow-x-hidden">
28
+ {/* Dynamic Background */}
29
+ <div className="fixed inset-0 bg-grid-white/[0.02] bg-[size:40px_40px] pointer-events-none -z-10" />
30
+ <div className="fixed top-0 right-0 -translate-y-1/4 translate-x-1/4 w-[800px] h-[800px] bg-rose-500/5 rounded-full blur-[150px] -z-10 pointer-events-none" />
31
+ <div className="fixed bottom-0 left-0 translate-y-1/4 -translate-x-1/4 w-[600px] h-[600px] bg-cyan-400/5 rounded-full blur-[150px] -z-10 pointer-events-none" />
32
+
33
+ {/* Navigation */}
34
+ <header className="fixed top-0 w-full z-50 border-b border-white/5 bg-zinc-950/60 backdrop-blur-2xl">
35
+ <div className="container mx-auto px-4 h-16 flex items-center justify-between">
36
+ <div className="flex items-center gap-3 font-bold text-xl group cursor-pointer">
37
+ <div className="w-9 h-9 rounded-xl bg-gradient-to-tr from-cyan-400 to-rose-500 flex items-center justify-center shadow-lg shadow-rose-500/25 group-hover:shadow-cyan-400/40 transition-all duration-300">
38
+ <Zap className="w-5 h-5 text-white" />
39
+ </div>
40
+ <span className="bg-clip-text text-transparent bg-gradient-to-b from-white to-zinc-200">devskill</span>
41
+ </div>
42
+ <nav className="hidden md:flex items-center gap-8 text-sm font-medium text-zinc-300">
43
+ <a href="#features" className="hover:text-rose-400 transition-colors">{t('why_devskill')}</a>
44
+ <a href="#installation" className="hover:text-cyan-400 transition-colors">{t('installation')}</a>
45
+ <a href="#collections" className="hover:text-rose-400 transition-colors">{t('collections')}</a>
46
+ </nav>
47
+ <div className="flex items-center gap-4">
48
+ <div className="flex bg-zinc-900/80 rounded-full p-1 border border-white/10 backdrop-blur-md">
49
+ <Link href="/" locale="en" className="px-3 py-1 text-xs rounded-full hover:bg-white/10 transition-colors font-medium">EN</Link>
50
+ <Link href="/" locale="vi" className="px-3 py-1 text-xs rounded-full hover:bg-white/10 transition-colors font-medium">VN</Link>
51
+ </div>
52
+ <a
53
+ href="https://github.com/vuluu2k/skills"
54
+ target="_blank"
55
+ className="inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent size-8 hover:bg-white/10 text-zinc-400 hover:text-white transition-all"
56
+ >
57
+ <GithubIcon className="w-5 h-5" />
58
+ </a>
59
+ </div>
60
+ </div>
61
+ </header>
62
+
63
+ <main className="flex-grow pt-32 lg:pt-40">
64
+ {/* Hero Section */}
65
+ <section className="container mx-auto px-4 text-center mb-40 relative">
66
+ <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] bg-gradient-to-r from-rose-500/5 to-cyan-400/5 rounded-full blur-[120px] -z-10" />
67
+ <motion.div
68
+ initial={{ opacity: 0, y: 30 }}
69
+ animate={{ opacity: 1, y: 0 }}
70
+ transition={{ duration: 0.7, ease: "easeOut" }}
71
+ className="flex flex-col items-center"
72
+ >
73
+ <Badge variant="outline" className="mb-8 border-rose-500/30 bg-rose-500/10 text-rose-300 px-5 py-2 font-medium tracking-wide">
74
+ {h('badge')}
75
+ </Badge>
76
+ <h1 className="text-6xl md:text-8xl font-extrabold mb-8 tracking-tight bg-clip-text text-transparent bg-gradient-to-br from-white via-zinc-200 to-zinc-500 pb-2">
77
+ {t('title')}
78
+ </h1>
79
+ <p className="text-xl md:text-2xl text-zinc-300 max-w-3xl mx-auto mb-12 leading-relaxed text-balance font-light">
80
+ {t('subtitle')}
81
+ </p>
82
+ <p className="text-lg text-zinc-400 max-w-2xl mx-auto mb-12 leading-relaxed text-balance">
83
+ {h('description')}
84
+ </p>
85
+ <div className="flex flex-col sm:flex-row items-center justify-center gap-4 w-full max-w-md mx-auto sm:max-w-none">
86
+ <a
87
+ href="https://github.com/vuluu2k/skills"
88
+ target="_blank"
89
+ className="w-full sm:w-auto inline-flex items-center justify-center px-8 h-14 rounded-2xl group shadow-lg shadow-rose-500/25 transition-all text-base font-bold bg-white text-zinc-950 hover:bg-zinc-200"
90
+ >
91
+ {h('cta')}
92
+ <GithubIcon className="ml-3 w-5 h-5 group-hover:scale-110 transition-transform" />
93
+ </a>
94
+ <div className="w-full sm:w-auto flex items-center justify-between gap-3 bg-zinc-900/80 border border-white/10 px-5 h-14 rounded-2xl text-sm font-mono text-zinc-200 backdrop-blur-md shadow-inner">
95
+ <div className="flex items-center gap-3">
96
+ <Terminal className="w-5 h-5 text-cyan-400" />
97
+ <span className="tracking-tight font-bold text-transparent bg-clip-text bg-gradient-to-r from-cyan-400 to-rose-400">{h('install_cmd')}</span>
98
+ </div>
99
+ <CopyButton value="npx devskill" variant="ghost" className="h-8 w-8 hover:bg-white/10 text-zinc-400 hover:text-white -mr-2" />
100
+ </div>
101
+ </div>
102
+ </motion.div>
103
+ </section>
104
+
105
+ {/* Features Section */}
106
+ <section id="features" className="container mx-auto px-4 mb-40 relative z-10">
107
+ <div className="text-center mb-20">
108
+ <h2 className="text-4xl md:text-5xl font-extrabold mb-6 tracking-tight text-white">{t('why_devskill')}</h2>
109
+ <div className="w-24 h-1.5 bg-gradient-to-r from-cyan-400 to-rose-500 mx-auto rounded-full" />
110
+ </div>
111
+ <div className="grid md:grid-cols-3 gap-6 lg:gap-8">
112
+ <Card className="bg-zinc-900/70 border-white/10 shadow-xl shadow-black/50 backdrop-blur-xl hover:bg-zinc-900/90 hover:border-cyan-400/50 hover:shadow-2xl hover:shadow-cyan-400/20 hover:-translate-y-1 transition-all duration-300 group overflow-hidden relative">
113
+ <div className="absolute top-0 right-0 p-32 bg-cyan-400/5 rounded-full blur-[80px] -mr-16 -mt-16 transition-opacity opacity-0 group-hover:opacity-100" />
114
+ <CardHeader className="relative z-10">
115
+ <div className="w-14 h-14 rounded-2xl bg-gradient-to-br from-cyan-400/20 to-cyan-400/5 flex items-center justify-center mb-6 group-hover:scale-110 transition-transform duration-500 border border-cyan-400/20">
116
+ <Zap className="w-7 h-7 text-cyan-400" />
117
+ </div>
118
+ <CardTitle className="text-2xl text-white font-bold tracking-tight">{f('onboarding.title')}</CardTitle>
119
+ </CardHeader>
120
+ <CardContent className="relative z-10">
121
+ <p className="text-zinc-300 leading-relaxed text-base">{f('onboarding.desc')}</p>
122
+ </CardContent>
123
+ </Card>
124
+
125
+ <Card className="bg-zinc-900/70 border-white/10 shadow-xl shadow-black/50 backdrop-blur-xl hover:bg-zinc-900/90 hover:border-rose-500/50 hover:shadow-2xl hover:shadow-rose-500/20 hover:-translate-y-1 transition-all duration-300 group overflow-hidden relative">
126
+ <div className="absolute top-0 right-0 p-32 bg-rose-500/5 rounded-full blur-[80px] -mr-16 -mt-16 transition-opacity opacity-0 group-hover:opacity-100" />
127
+ <CardHeader className="relative z-10">
128
+ <div className="w-14 h-14 rounded-2xl bg-gradient-to-br from-rose-500/20 to-rose-500/5 flex items-center justify-center mb-6 group-hover:scale-110 transition-transform duration-500 border border-rose-500/20">
129
+ <Target className="w-7 h-7 text-rose-400" />
130
+ </div>
131
+ <CardTitle className="text-2xl text-white font-bold tracking-tight">{f('accuracy.title')}</CardTitle>
132
+ </CardHeader>
133
+ <CardContent className="relative z-10">
134
+ <p className="text-zinc-300 leading-relaxed text-base">{f('accuracy.desc')}</p>
135
+ </CardContent>
136
+ </Card>
137
+
138
+ <Card className="bg-zinc-900/70 border-white/10 shadow-xl shadow-black/50 backdrop-blur-xl hover:bg-zinc-900/90 hover:border-purple-500/50 hover:shadow-2xl hover:shadow-purple-500/20 hover:-translate-y-1 transition-all duration-300 group overflow-hidden relative">
139
+ <div className="absolute top-0 right-0 p-32 bg-purple-500/5 rounded-full blur-[80px] -mr-16 -mt-16 transition-opacity opacity-0 group-hover:opacity-100" />
140
+ <CardHeader className="relative z-10">
141
+ <div className="w-14 h-14 rounded-2xl bg-gradient-to-br from-purple-500/20 to-purple-500/5 flex items-center justify-center mb-6 group-hover:scale-110 transition-transform duration-500 border border-purple-500/20">
142
+ <Sparkles className="w-7 h-7 text-purple-400" />
143
+ </div>
144
+ <CardTitle className="text-2xl text-white font-bold tracking-tight">{f('frictionless.title')}</CardTitle>
145
+ </CardHeader>
146
+ <CardContent className="relative z-10">
147
+ <p className="text-zinc-300 leading-relaxed text-base">{f('frictionless.desc')}</p>
148
+ </CardContent>
149
+ </Card>
150
+ </div>
151
+ </section>
152
+
153
+ {/* Big Terminal Installation Section */}
154
+ <section id="installation" className="container mx-auto px-4 mb-40">
155
+ <div className="max-w-4xl mx-auto">
156
+ <div className="text-center mb-16">
157
+ <h2 className="text-4xl md:text-5xl font-extrabold mb-6 tracking-tight text-transparent bg-clip-text bg-gradient-to-r from-rose-100 to-white">{t('installation')}</h2>
158
+ <p className="text-xl text-zinc-400">Launch the interactive CLI to select your skills.</p>
159
+ </div>
160
+
161
+ {/* Window frame */}
162
+ <div className="rounded-2xl overflow-hidden bg-black/80 border border-white/10 shadow-2xl shadow-rose-500/10 backdrop-blur-xl">
163
+ {/* Window header */}
164
+ <div className="flex items-center px-4 py-3 bg-white/5 border-b border-white/5">
165
+ <div className="flex gap-2">
166
+ <div className="w-3 h-3 rounded-full bg-[#ff5f56]" />
167
+ <div className="w-3 h-3 rounded-full bg-[#ffbd2e]" />
168
+ <div className="w-3 h-3 rounded-full bg-[#27c93f]" />
169
+ </div>
170
+ <div className="mx-auto flex items-center gap-2 text-xs text-zinc-400 font-mono">
171
+ <Terminal className="w-3 h-3" />
172
+ bash - devskill CLI
173
+ </div>
174
+ </div>
175
+
176
+ {/* Terminal body */}
177
+ <div className="p-6 md:p-8 font-mono text-sm md:text-base leading-loose overflow-x-auto relative group">
178
+ <div className="flex items-center justify-between">
179
+ <p className="text-zinc-400 italic mb-2"># Khởi chạy CLI thiết lập tương tác (Interactive Mode)</p>
180
+ <CopyButton value="npx devskill" className="opacity-0 group-hover:opacity-100 transition-opacity bg-white/5" />
181
+ </div>
182
+ <div className="flex items-center gap-4">
183
+ <span className="text-rose-500">➜</span>
184
+ <span className="text-cyan-400">~</span>
185
+ <span className="text-white font-bold tracking-wider">npx devskill</span>
186
+ </div>
187
+ <div className="mt-6 border-l-2 border-white/10 pl-4 py-2 space-y-2 text-zinc-300">
188
+ <p className="text-cyan-400 font-bold">? Select the skills you want to install:</p>
189
+ <p className="text-zinc-400">❯ ◉ builderx_api</p>
190
+ <p className="text-zinc-400"> ◉ builderx_spa</p>
191
+ <p className="text-zinc-400"> ◯ basic_react</p>
192
+ </div>
193
+ </div>
194
+ </div>
195
+
196
+ <div className="mt-12 flex flex-wrap items-center justify-center gap-8 text-zinc-300 text-sm font-medium">
197
+ <div className="flex items-center gap-2 bg-white/5 px-4 py-2 rounded-full border border-white/5">
198
+ <CheckCircle2 className="w-4 h-4 text-rose-500" />
199
+ No Globals Needed
200
+ </div>
201
+ <div className="flex items-center gap-2 bg-white/5 px-4 py-2 rounded-full border border-white/5">
202
+ <CheckCircle2 className="w-4 h-4 text-cyan-400" />
203
+ One-Click Interactive
204
+ </div>
205
+ <div className="flex items-center gap-2 bg-white/5 px-4 py-2 rounded-full border border-white/5">
206
+ <CheckCircle2 className="w-4 h-4 text-rose-500" />
207
+ Instant Setup
208
+ </div>
209
+ </div>
210
+ </div>
211
+ </section>
212
+
213
+ {/* Collections Cards Grid Section */}
214
+ <section id="collections" className="container mx-auto px-4 mb-40">
215
+ <div className="text-center mb-16">
216
+ <h2 className="text-4xl md:text-5xl font-extrabold mb-6 tracking-tight">{t('collections')}</h2>
217
+ <div className="w-24 h-1.5 bg-gradient-to-r from-cyan-400 to-rose-500 mx-auto rounded-full mb-6" />
218
+ <p className="text-xl text-zinc-400 max-w-2xl mx-auto">Discover our highly curated skill collections designed for specific tech stacks.</p>
219
+ </div>
220
+
221
+ <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6 max-w-5xl mx-auto">
222
+ {/* Card 1 */}
223
+ <Card className="bg-zinc-900/80 border-white/20 shadow-xl shadow-black/50 backdrop-blur-md hover:bg-zinc-800 hover:border-cyan-400/40 hover:-translate-y-2 hover:shadow-2xl hover:shadow-cyan-400/20 transition-all duration-300 flex flex-col h-full group">
224
+ <CardHeader>
225
+ <div className="w-12 h-12 bg-cyan-400/10 text-cyan-400 rounded-xl flex items-center justify-center mb-4 border border-cyan-400/20 group-hover:scale-110 transition-transform">
226
+ <Boxes className="w-6 h-6" />
227
+ </div>
228
+ <CardTitle className="text-xl text-white">🏗️ builderx_spa</CardTitle>
229
+ <CardDescription className="text-zinc-400 mt-2">Specialized architecture rules for building modern Single Page Applications.</CardDescription>
230
+ </CardHeader>
231
+ <CardContent className="flex-grow">
232
+ <div className="flex flex-wrap gap-2">
233
+ <Badge variant="secondary" className="bg-zinc-800/80 text-cyan-300 hover:bg-zinc-800 border border-cyan-400/20">vue-options</Badge>
234
+ <Badge variant="secondary" className="bg-zinc-800/80 text-cyan-300 hover:bg-zinc-800 border border-cyan-400/20">pinia-options</Badge>
235
+ </div>
236
+ </CardContent>
237
+ </Card>
238
+
239
+ {/* Card 2 */}
240
+ <Card className="bg-zinc-900/80 border-white/20 shadow-xl shadow-black/50 backdrop-blur-md hover:bg-zinc-800 hover:border-rose-500/40 hover:-translate-y-2 hover:shadow-2xl hover:shadow-rose-500/20 transition-all duration-300 flex flex-col h-full group">
241
+ <CardHeader>
242
+ <div className="w-12 h-12 bg-rose-500/10 text-rose-500 rounded-xl flex items-center justify-center mb-4 border border-rose-500/20 group-hover:scale-110 transition-transform">
243
+ <Database className="w-6 h-6" />
244
+ </div>
245
+ <CardTitle className="text-xl text-white">⚙️ builderx_api</CardTitle>
246
+ <CardDescription className="text-zinc-400 mt-2">Strict guidelines for robust Phoenix Elixir backend development and Ecto rules.</CardDescription>
247
+ </CardHeader>
248
+ <CardContent className="flex-grow">
249
+ <div className="flex flex-wrap gap-2">
250
+ <Badge variant="secondary" className="bg-zinc-800/80 text-rose-300 hover:bg-zinc-800 border border-rose-500/20">api-schemas</Badge>
251
+ </div>
252
+ </CardContent>
253
+ </Card>
254
+
255
+ {/* Card 3 */}
256
+ <Card className="bg-zinc-900/80 border-white/20 shadow-xl shadow-black/50 backdrop-blur-md hover:bg-zinc-800 hover:border-purple-500/40 hover:-translate-y-2 hover:shadow-2xl hover:shadow-purple-500/20 transition-all duration-300 flex flex-col h-full group">
257
+ <CardHeader>
258
+ <div className="w-12 h-12 bg-purple-500/10 text-purple-400 rounded-xl flex items-center justify-center mb-4 border border-purple-500/20 group-hover:scale-110 transition-transform">
259
+ <Code2 className="w-6 h-6" />
260
+ </div>
261
+ <CardTitle className="text-xl text-white">🌟 vue3-standard</CardTitle>
262
+ <CardDescription className="text-zinc-400 mt-2">Pure Vue 3 Mastery. Learn the best practices for standard modern applications.</CardDescription>
263
+ </CardHeader>
264
+ <CardContent className="flex-grow">
265
+ <div className="flex flex-wrap gap-2">
266
+ <Badge variant="secondary" className="bg-zinc-800/80 text-purple-300 hover:bg-zinc-800 border border-purple-500/20">vue</Badge>
267
+ <Badge variant="secondary" className="bg-zinc-800/80 text-purple-300 hover:bg-zinc-800 border border-purple-500/20">pinia</Badge>
268
+ </div>
269
+ </CardContent>
270
+ </Card>
271
+ </div>
272
+ </section>
273
+ </main>
274
+
275
+ <footer className="border-t border-white/10 py-12 bg-zinc-950/80 backdrop-blur-sm">
276
+ <div className="container mx-auto px-4 flex flex-col md:flex-row items-center justify-between gap-6">
277
+ <div className="flex items-center gap-2 font-bold opacity-70">
278
+ <Zap className="w-5 h-5 text-rose-500" />
279
+ <span className="text-white tracking-wide">devskill</span>
280
+ </div>
281
+ <p className="text-zinc-300 text-sm">{t('footer')}</p>
282
+ <div className="flex items-center gap-6 text-sm font-medium text-zinc-400">
283
+ <a href="#" className="hover:text-rose-400 transition-colors">Documentation</a>
284
+ <a href="#" className="hover:text-cyan-400 transition-colors">Privacy</a>
285
+ <a href="#" className="hover:text-rose-400 transition-colors">Terms</a>
286
+ </div>
287
+ </div>
288
+ </footer>
289
+ </div>
290
+ );
291
+ }
@@ -0,0 +1,129 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+
4
+ @custom-variant dark (&:is(.dark *));
5
+
6
+ @theme inline {
7
+ --color-background: var(--background);
8
+ --color-foreground: var(--foreground);
9
+ --font-sans: var(--font-sans);
10
+ --font-mono: var(--font-mono);
11
+ --font-heading: var(--font-sans);
12
+ --color-sidebar-ring: var(--sidebar-ring);
13
+ --color-sidebar-border: var(--sidebar-border);
14
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
15
+ --color-sidebar-accent: var(--sidebar-accent);
16
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
17
+ --color-sidebar-primary: var(--sidebar-primary);
18
+ --color-sidebar-foreground: var(--sidebar-foreground);
19
+ --color-sidebar: var(--sidebar);
20
+ --color-chart-5: var(--chart-5);
21
+ --color-chart-4: var(--chart-4);
22
+ --color-chart-3: var(--chart-3);
23
+ --color-chart-2: var(--chart-2);
24
+ --color-chart-1: var(--chart-1);
25
+ --color-ring: var(--ring);
26
+ --color-input: var(--input);
27
+ --color-border: var(--border);
28
+ --color-destructive: var(--destructive);
29
+ --color-accent-foreground: var(--accent-foreground);
30
+ --color-accent: var(--accent);
31
+ --color-muted-foreground: var(--muted-foreground);
32
+ --color-muted: var(--muted);
33
+ --color-secondary-foreground: var(--secondary-foreground);
34
+ --color-secondary: var(--secondary);
35
+ --color-primary-foreground: var(--primary-foreground);
36
+ --color-primary: var(--primary);
37
+ --color-popover-foreground: var(--popover-foreground);
38
+ --color-popover: var(--popover);
39
+ --color-card-foreground: var(--card-foreground);
40
+ --color-card: var(--card);
41
+ --radius-sm: calc(var(--radius) * 0.6);
42
+ --radius-md: calc(var(--radius) * 0.8);
43
+ --radius-lg: var(--radius);
44
+ --radius-xl: calc(var(--radius) * 1.4);
45
+ --radius-2xl: calc(var(--radius) * 1.8);
46
+ --radius-3xl: calc(var(--radius) * 2.2);
47
+ --radius-4xl: calc(var(--radius) * 2.6);
48
+ }
49
+
50
+ :root {
51
+ --background: oklch(1 0 0);
52
+ --foreground: oklch(0.145 0 0);
53
+ --card: oklch(1 0 0);
54
+ --card-foreground: oklch(0.145 0 0);
55
+ --popover: oklch(1 0 0);
56
+ --popover-foreground: oklch(0.145 0 0);
57
+ --primary: oklch(0.205 0 0);
58
+ --primary-foreground: oklch(0.985 0 0);
59
+ --secondary: oklch(0.97 0 0);
60
+ --secondary-foreground: oklch(0.205 0 0);
61
+ --muted: oklch(0.97 0 0);
62
+ --muted-foreground: oklch(0.556 0 0);
63
+ --accent: oklch(0.97 0 0);
64
+ --accent-foreground: oklch(0.205 0 0);
65
+ --destructive: oklch(0.577 0.245 27.325);
66
+ --border: oklch(0.922 0 0);
67
+ --input: oklch(0.922 0 0);
68
+ --ring: oklch(0.708 0 0);
69
+ --chart-1: oklch(0.87 0 0);
70
+ --chart-2: oklch(0.556 0 0);
71
+ --chart-3: oklch(0.439 0 0);
72
+ --chart-4: oklch(0.371 0 0);
73
+ --chart-5: oklch(0.269 0 0);
74
+ --radius: 0.625rem;
75
+ --sidebar: oklch(0.985 0 0);
76
+ --sidebar-foreground: oklch(0.145 0 0);
77
+ --sidebar-primary: oklch(0.205 0 0);
78
+ --sidebar-primary-foreground: oklch(0.985 0 0);
79
+ --sidebar-accent: oklch(0.97 0 0);
80
+ --sidebar-accent-foreground: oklch(0.205 0 0);
81
+ --sidebar-border: oklch(0.922 0 0);
82
+ --sidebar-ring: oklch(0.708 0 0);
83
+ }
84
+
85
+ .dark {
86
+ --background: oklch(0.145 0 0);
87
+ --foreground: oklch(0.985 0 0);
88
+ --card: oklch(0.205 0 0);
89
+ --card-foreground: oklch(0.985 0 0);
90
+ --popover: oklch(0.205 0 0);
91
+ --popover-foreground: oklch(0.985 0 0);
92
+ --primary: oklch(0.922 0 0);
93
+ --primary-foreground: oklch(0.205 0 0);
94
+ --secondary: oklch(0.269 0 0);
95
+ --secondary-foreground: oklch(0.985 0 0);
96
+ --muted: oklch(0.269 0 0);
97
+ --muted-foreground: oklch(0.708 0 0);
98
+ --accent: oklch(0.269 0 0);
99
+ --accent-foreground: oklch(0.985 0 0);
100
+ --destructive: oklch(0.704 0.191 22.216);
101
+ --border: oklch(1 0 0 / 10%);
102
+ --input: oklch(1 0 0 / 15%);
103
+ --ring: oklch(0.556 0 0);
104
+ --chart-1: oklch(0.87 0 0);
105
+ --chart-2: oklch(0.556 0 0);
106
+ --chart-3: oklch(0.439 0 0);
107
+ --chart-4: oklch(0.371 0 0);
108
+ --chart-5: oklch(0.269 0 0);
109
+ --sidebar: oklch(0.205 0 0);
110
+ --sidebar-foreground: oklch(0.985 0 0);
111
+ --sidebar-primary: oklch(0.488 0.243 264.376);
112
+ --sidebar-primary-foreground: oklch(0.985 0 0);
113
+ --sidebar-accent: oklch(0.269 0 0);
114
+ --sidebar-accent-foreground: oklch(0.985 0 0);
115
+ --sidebar-border: oklch(1 0 0 / 10%);
116
+ --sidebar-ring: oklch(0.556 0 0);
117
+ }
118
+
119
+ @layer base {
120
+ * {
121
+ @apply border-border outline-ring/50;
122
+ }
123
+ body {
124
+ @apply bg-background text-foreground;
125
+ }
126
+ html {
127
+ @apply font-sans;
128
+ }
129
+ }
@@ -0,0 +1,41 @@
1
+ import { ImageResponse } from 'next/og';
2
+
3
+ export const size = {
4
+ width: 32,
5
+ height: 32,
6
+ };
7
+ export const contentType = 'image/png';
8
+
9
+ export default function Icon() {
10
+ return new ImageResponse(
11
+ (
12
+ <div
13
+ style={{
14
+ width: '100%',
15
+ height: '100%',
16
+ display: 'flex',
17
+ alignItems: 'center',
18
+ justifyContent: 'center',
19
+ background: 'linear-gradient(to top right, #22d3ee, #f43f5e)',
20
+ borderRadius: '8px',
21
+ }}
22
+ >
23
+ <svg
24
+ width="20"
25
+ height="20"
26
+ viewBox="0 0 24 24"
27
+ fill="none"
28
+ stroke="white"
29
+ strokeWidth="2"
30
+ strokeLinecap="round"
31
+ strokeLinejoin="round"
32
+ >
33
+ <polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"></polygon>
34
+ </svg>
35
+ </div>
36
+ ),
37
+ {
38
+ ...size,
39
+ }
40
+ );
41
+ }