@emberkit/cli 0.6.1-alpha.0 → 0.6.1-alpha.10
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.
|
@@ -85,7 +85,7 @@ const Layout: RouteComponent = ({ children }) => {
|
|
|
85
85
|
</header>
|
|
86
86
|
<main className="flex-1">{children}</main>
|
|
87
87
|
<footer className="border-t border-gray-200 py-8 text-center text-sm text-gray-500">
|
|
88
|
-
<p>Built with <a href="https://emberkit.
|
|
88
|
+
<p>Built with <a href="https://emberkit.orangeember.com" className="text-gray-700 hover:underline">EmberKit</a></p>
|
|
89
89
|
</footer>
|
|
90
90
|
</div>
|
|
91
91
|
</>
|
|
@@ -137,7 +137,7 @@ const HomePage: RouteComponent = () => {
|
|
|
137
137
|
<div className="space-y-10">
|
|
138
138
|
{posts.map((post) => (
|
|
139
139
|
<article key={post.slug} className="group">
|
|
140
|
-
<a href={
|
|
140
|
+
<a href={post.slug} className="block">
|
|
141
141
|
<h2 className="text-xl font-semibold font-serif mb-2 group-hover:text-blue-600 transition-colors">
|
|
142
142
|
{post.title}
|
|
143
143
|
</h2>
|
|
@@ -156,7 +156,7 @@ const HomePage: RouteComponent = () => {
|
|
|
156
156
|
};
|
|
157
157
|
|
|
158
158
|
export default HomePage;`,
|
|
159
|
-
"src/routes/[slug].tsx": `import type {
|
|
159
|
+
"src/routes/[slug].tsx": `import type { RouteParams } from '@emberkit/core';
|
|
160
160
|
import { Head } from '@emberkit/core';
|
|
161
161
|
|
|
162
162
|
interface PostData {
|
|
@@ -190,11 +190,11 @@ const posts: Record<string, PostData> = {
|
|
|
190
190
|
content: \`
|
|
191
191
|
<p>Signals are the reactive primitive at the core of EmberKit.</p>
|
|
192
192
|
<h2>Creating Signals</h2>
|
|
193
|
-
<pre><code>const count =
|
|
193
|
+
<pre><code>const [count, setCount] = createSignal(0);</code></pre>
|
|
194
194
|
<h2>Computed Values</h2>
|
|
195
|
-
<pre><code>const doubled =
|
|
195
|
+
<pre><code>const doubled = createMemo(() => count() * 2);</code></pre>
|
|
196
196
|
<h2>Side Effects</h2>
|
|
197
|
-
<pre><code>
|
|
197
|
+
<pre><code>createEffect(() => console.log(count()));</code></pre>
|
|
198
198
|
\`,
|
|
199
199
|
},
|
|
200
200
|
'file-based-routing': {
|
|
@@ -212,11 +212,7 @@ const posts: Record<string, PostData> = {
|
|
|
212
212
|
},
|
|
213
213
|
};
|
|
214
214
|
|
|
215
|
-
|
|
216
|
-
slug: string;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
const PostPage: RouteComponent<Params> = ({ params }: RouteParams<Params>) => {
|
|
215
|
+
export default function PostPage({ params }: RouteParams<{ slug: string }>) {
|
|
220
216
|
const post = posts[params.slug];
|
|
221
217
|
|
|
222
218
|
if (!post) {
|
|
@@ -250,9 +246,7 @@ const PostPage: RouteComponent<Params> = ({ params }: RouteParams<Params>) => {
|
|
|
250
246
|
</article>
|
|
251
247
|
</>
|
|
252
248
|
);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
export default PostPage;`,
|
|
249
|
+
}`,
|
|
256
250
|
"src/routes/about.tsx": `import type { RouteComponent } from '@emberkit/core';
|
|
257
251
|
import { Head } from '@emberkit/core';
|
|
258
252
|
|
|
@@ -266,7 +260,7 @@ const AboutPage: RouteComponent = () => {
|
|
|
266
260
|
<h1 className="text-4xl font-bold font-serif mb-6">About</h1>
|
|
267
261
|
<div className="prose">
|
|
268
262
|
<p>Hi, I'm the author of this blog. I write about web development, frameworks, and building fast user interfaces.</p>
|
|
269
|
-
<p>This blog is built with <a href="https://emberkit.
|
|
263
|
+
<p>This blog is built with <a href="https://emberkit.orangeember.com">EmberKit</a>, a minimalist TypeScript-first JSX framework.</p>
|
|
270
264
|
<h2>Tech Stack</h2>
|
|
271
265
|
<ul>
|
|
272
266
|
<li>EmberKit for routing and rendering</li>
|
|
@@ -77,7 +77,7 @@ const Layout: RouteComponent = ({ children }) => {
|
|
|
77
77
|
<nav className="flex items-center gap-6">
|
|
78
78
|
<a href="/" className="text-slate-400 hover:text-ember-500 font-medium transition-colors">Home</a>
|
|
79
79
|
<a href="/about" className="text-slate-400 hover:text-ember-500 font-medium transition-colors">About</a>
|
|
80
|
-
<a href="https://emberkit.
|
|
80
|
+
<a href="https://emberkit.orangeember.com" target="_blank" className="text-slate-400 hover:text-ember-500 font-medium transition-colors">
|
|
81
81
|
Docs <span className="text-xs">↗</span>
|
|
82
82
|
</a>
|
|
83
83
|
</nav>
|
|
@@ -85,7 +85,7 @@ const Layout: RouteComponent = ({ children }) => {
|
|
|
85
85
|
</header>
|
|
86
86
|
<main className="relative z-10 flex-1">{children}</main>
|
|
87
87
|
<footer className="relative z-10 border-t border-slate-800/50 py-8 text-center text-sm text-slate-500">
|
|
88
|
-
<p>Built with <a href="https://emberkit.
|
|
88
|
+
<p>Built with <a href="https://emberkit.orangeember.com" className="text-ember-500 hover:underline">EmberKit</a></p>
|
|
89
89
|
</footer>
|
|
90
90
|
</div>
|
|
91
91
|
</>
|
|
@@ -94,10 +94,10 @@ const Layout: RouteComponent = ({ children }) => {
|
|
|
94
94
|
|
|
95
95
|
export default Layout;`,
|
|
96
96
|
"src/routes/index.tsx": `import type { RouteComponent } from '@emberkit/core';
|
|
97
|
-
import {
|
|
97
|
+
import { createSignal } from '@emberkit/core';
|
|
98
98
|
|
|
99
99
|
const HomePage: RouteComponent = () => {
|
|
100
|
-
const count =
|
|
100
|
+
const [count, setCount] = createSignal(0);
|
|
101
101
|
|
|
102
102
|
return (
|
|
103
103
|
<div className="relative max-w-6xl mx-auto px-6 py-16 space-y-24">
|
|
@@ -115,7 +115,7 @@ const HomePage: RouteComponent = () => {
|
|
|
115
115
|
<a href="/about" className="px-6 py-3 bg-ember-500 hover:bg-ember-600 text-white font-semibold rounded-lg transition-all hover:scale-105 shadow-lg shadow-ember-500/20">
|
|
116
116
|
Learn More
|
|
117
117
|
</a>
|
|
118
|
-
<a href="https://emberkit.
|
|
118
|
+
<a href="https://emberkit.orangeember.com" target="_blank" className="px-6 py-3 border border-slate-700 hover:border-ember-500 text-slate-300 hover:text-ember-500 font-semibold rounded-lg transition-all">
|
|
119
119
|
Read Docs →
|
|
120
120
|
</a>
|
|
121
121
|
</div>
|
|
@@ -142,14 +142,14 @@ const HomePage: RouteComponent = () => {
|
|
|
142
142
|
<div className="flex items-center justify-center gap-6">
|
|
143
143
|
<button
|
|
144
144
|
className="w-12 h-12 rounded-lg bg-slate-800 border border-slate-700 hover:bg-ember-500 hover:border-ember-500 text-ember-500 hover:text-white text-xl transition-all hover:scale-110"
|
|
145
|
-
onClick={() =>
|
|
145
|
+
onClick={() => setCount(c => c - 1)}
|
|
146
146
|
>
|
|
147
147
|
−
|
|
148
148
|
</button>
|
|
149
|
-
<span className="text-5xl font-bold tabular-nums min-w-[80px]
|
|
149
|
+
<span className="text-5xl font-bold tabular-nums min-w-[80px] text-amber-400" data-ek-bind={count}>{count()}</span>
|
|
150
150
|
<button
|
|
151
151
|
className="w-12 h-12 rounded-lg bg-slate-800 border border-slate-700 hover:bg-ember-500 hover:border-ember-500 text-ember-500 hover:text-white text-xl transition-all hover:scale-110"
|
|
152
|
-
onClick={() =>
|
|
152
|
+
onClick={() => setCount(c => c + 1)}
|
|
153
153
|
>
|
|
154
154
|
+
|
|
155
155
|
</button>
|
|
@@ -20,7 +20,7 @@ export const withUiTemplate = {
|
|
|
20
20
|
--color-ember-700: #c2410c;
|
|
21
21
|
--color-ember-800: #9a3412;
|
|
22
22
|
--color-ember-900: #7c2d12;
|
|
23
|
-
--font-
|
|
23
|
+
--font-sans: 'Inter', system-ui, sans-serif;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
@keyframes float {
|
|
@@ -44,11 +44,11 @@ export const withUiTemplate = {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
body {
|
|
47
|
-
@apply bg-[#0b0f19] text-slate-200 font-sans;
|
|
47
|
+
@apply bg-[#0b0f19] text-slate-200 font-sans min-h-screen;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
a {
|
|
51
|
-
@apply text-inherit no-underline;
|
|
51
|
+
@apply text-inherit no-underline transition-colors;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
.animate-float { animation: float 6s ease-in-out infinite; }
|
|
@@ -57,7 +57,6 @@ a {
|
|
|
57
57
|
.animate-pulse-glow { animation: pulse-glow 4s ease-in-out infinite; }`,
|
|
58
58
|
"src/routes/_layout.tsx": `import type { RouteComponent } from '@emberkit/core';
|
|
59
59
|
import { Head } from '@emberkit/core';
|
|
60
|
-
import { DefaultLayout } from '@emberkit/ui';
|
|
61
60
|
|
|
62
61
|
const Layout: RouteComponent = ({ children }) => {
|
|
63
62
|
return (
|
|
@@ -66,26 +65,37 @@ const Layout: RouteComponent = ({ children }) => {
|
|
|
66
65
|
<title>{{name}}</title>
|
|
67
66
|
<meta name="description" content="Built with EmberKit UI" />
|
|
68
67
|
</Head>
|
|
69
|
-
<div className="relative min-h-screen">
|
|
68
|
+
<div className="relative min-h-screen flex flex-col">
|
|
70
69
|
<div className="pointer-events-none fixed inset-0 overflow-hidden">
|
|
71
70
|
<div className="absolute -top-40 -right-40 w-96 h-96 rounded-full bg-ember-500/10 blur-[120px] animate-pulse-glow" />
|
|
72
71
|
<div className="absolute -bottom-40 -left-40 w-96 h-96 rounded-full bg-amber-500/5 blur-[120px] animate-pulse-glow" style={{ animationDelay: '2s' }} />
|
|
73
72
|
</div>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
|
|
74
|
+
<header className="relative z-50 border-b border-slate-800/50 bg-[#0b0f19]/80 backdrop-blur-xl sticky top-0">
|
|
75
|
+
<div className="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
|
|
76
|
+
<a href="/" className="flex items-center gap-2 group">
|
|
77
77
|
<span className="text-2xl animate-float">🔥</span>
|
|
78
|
-
<span className="font-bold
|
|
79
|
-
</
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
</
|
|
78
|
+
<span className="text-xl font-bold bg-gradient-to-r from-ember-400 to-ember-500 bg-clip-text text-transparent">{{name}}</span>
|
|
79
|
+
</a>
|
|
80
|
+
<nav className="flex items-center gap-8">
|
|
81
|
+
<a href="/" className="text-slate-400 hover:text-ember-500 font-medium transition-colors">Home</a>
|
|
82
|
+
<a href="/about" className="text-slate-400 hover:text-ember-500 font-medium transition-colors">About</a>
|
|
83
|
+
<a href="https://emberkit.orangeember.com" target="_blank" rel="noopener noreferrer" className="text-slate-400 hover:text-ember-500 font-medium transition-colors">
|
|
84
|
+
Docs <span className="text-xs">↗</span>
|
|
85
|
+
</a>
|
|
86
|
+
</nav>
|
|
87
|
+
</div>
|
|
88
|
+
</header>
|
|
89
|
+
|
|
90
|
+
<main className="relative z-10 flex-1">
|
|
91
|
+
<div className="max-w-6xl mx-auto px-6 py-12">
|
|
92
|
+
{children}
|
|
93
|
+
</div>
|
|
94
|
+
</main>
|
|
95
|
+
|
|
96
|
+
<footer className="relative z-10 border-t border-slate-800/50 py-8 text-center text-sm text-slate-500">
|
|
97
|
+
<p>Built with <a href="https://emberkit.orangeember.com" className="text-ember-500 hover:underline">EmberKit</a></p>
|
|
98
|
+
</footer>
|
|
89
99
|
</div>
|
|
90
100
|
</>
|
|
91
101
|
);
|
|
@@ -93,196 +103,179 @@ const Layout: RouteComponent = ({ children }) => {
|
|
|
93
103
|
|
|
94
104
|
export default Layout;`,
|
|
95
105
|
"src/routes/index.tsx": `import type { RouteComponent } from '@emberkit/core';
|
|
96
|
-
import { Button, Card, Heading, Text, Badge, Input } from '@emberkit/ui';
|
|
97
106
|
import { signal } from '@emberkit/core';
|
|
107
|
+
import {
|
|
108
|
+
Button,
|
|
109
|
+
Card,
|
|
110
|
+
Heading,
|
|
111
|
+
Text,
|
|
112
|
+
Badge,
|
|
113
|
+
Tabs,
|
|
114
|
+
Alert,
|
|
115
|
+
Icon,
|
|
116
|
+
} from '@emberkit/ui';
|
|
98
117
|
|
|
99
118
|
const HomePage: RouteComponent = () => {
|
|
100
|
-
const
|
|
101
|
-
|
|
119
|
+
const activeTab = signal('features');
|
|
120
|
+
|
|
121
|
+
const features = [
|
|
122
|
+
{ icon: '⚡', title: 'Lightning Fast', desc: 'Sub-10KB runtime with tree-shakeable architecture' },
|
|
123
|
+
{ icon: '📘', title: 'TypeScript First', desc: 'Full type safety with intelligent autocomplete' },
|
|
124
|
+
{ icon: '📁', title: 'File-Based Routing', desc: 'Routes automatically created from your file structure' },
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
const components = [
|
|
128
|
+
{ name: 'Button', desc: 'Multiple variants and sizes for all use cases' },
|
|
129
|
+
{ name: 'Card', desc: 'Flexible container component with padding options' },
|
|
130
|
+
{ name: 'Badge', desc: 'Status indicators with different variants' },
|
|
131
|
+
{ name: 'Alert', desc: 'Notification component for important messages' },
|
|
132
|
+
{ name: 'Tabs', desc: 'Organized content switching interface' },
|
|
133
|
+
{ name: 'Input', desc: 'Styled form input with validation support' },
|
|
134
|
+
];
|
|
102
135
|
|
|
103
136
|
return (
|
|
104
137
|
<div className="relative space-y-24">
|
|
105
|
-
{/* Hero */}
|
|
138
|
+
{/* Hero Section */}
|
|
106
139
|
<section className="relative text-center py-20">
|
|
107
140
|
<div className="pointer-events-none absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 h-[400px] w-[400px] rounded-full bg-ember-500/15 blur-[150px] animate-pulse-glow" />
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
✨ Built with EmberKit UI
|
|
141
|
+
<div className="relative z-10 space-y-6 animate-fade-in-down">
|
|
142
|
+
<Badge variant="primary" className="inline-block">
|
|
143
|
+
✨ Welcome to {{name}}
|
|
112
144
|
</Badge>
|
|
113
|
-
<Heading level="h1" size="4xl" weight="bold"
|
|
114
|
-
|
|
115
|
-
<span className="bg-gradient-to-r from-ember-400 via-ember-500 to-amber-500 bg-clip-text text-transparent">
|
|
116
|
-
{{name}}
|
|
117
|
-
</span>
|
|
145
|
+
<Heading level="h1" size="4xl" weight="bold">
|
|
146
|
+
Built with EmberKit <span className="bg-gradient-to-r from-ember-400 via-ember-500 to-amber-500 bg-clip-text text-transparent">UI System</span>
|
|
118
147
|
</Heading>
|
|
119
|
-
<Text size="xl" color="muted" className="max-w-2xl mx-auto
|
|
120
|
-
A modern
|
|
121
|
-
Build beautiful interfaces with our pre-built component library.
|
|
148
|
+
<Text size="xl" color="muted" className="max-w-2xl mx-auto">
|
|
149
|
+
A modern, component-driven template using the EmberKit design system. Beautiful, accessible, and production-ready.
|
|
122
150
|
</Text>
|
|
123
|
-
<div className="flex gap-4 justify-center">
|
|
124
|
-
<Button variant="primary" size="lg"
|
|
151
|
+
<div className="flex gap-4 justify-center flex-wrap pt-4">
|
|
152
|
+
<Button variant="primary" size="lg">
|
|
125
153
|
Get Started
|
|
126
154
|
</Button>
|
|
127
155
|
<Button variant="secondary" size="lg">
|
|
128
|
-
View Docs
|
|
156
|
+
View Docs →
|
|
129
157
|
</Button>
|
|
130
158
|
</div>
|
|
131
159
|
</div>
|
|
132
160
|
</section>
|
|
133
161
|
|
|
134
|
-
{/* Features Grid */}
|
|
162
|
+
{/* Features Grid using Cards */}
|
|
135
163
|
<section>
|
|
136
|
-
<Heading level="h2" size="2xl" weight="semibold" className="mb-2
|
|
164
|
+
<Heading level="h2" size="2xl" weight="semibold" className="text-center mb-2">
|
|
137
165
|
Why EmberKit?
|
|
138
166
|
</Heading>
|
|
139
|
-
<Text color="muted" className="text-center mb-
|
|
167
|
+
<Text color="muted" className="text-center mb-12 max-w-lg mx-auto">
|
|
140
168
|
Everything you need to build fast, beautiful web applications.
|
|
141
169
|
</Text>
|
|
142
170
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
|
|
143
|
-
{
|
|
144
|
-
{
|
|
145
|
-
{ icon: '🔯', title: 'TypeScript First', desc: 'Full type safety with intelligent autocomplete' },
|
|
146
|
-
{ icon: '🛖', title: 'File-Based Routing', desc: 'Routes automatically created from your file structure' },
|
|
147
|
-
].map((f, i) => (
|
|
148
|
-
<Card key={f.title} padding="lg" className="relative group hover:border-ember-500/50 transition-all duration-300 hover:-translate-y-1" style={{ animationDelay: \`\${i * 100}ms\` }}>
|
|
171
|
+
{features.map((feature) => (
|
|
172
|
+
<Card key={feature.title} padding="lg" className="relative group hover:border-ember-500/50 transition-all hover:-translate-y-1 cursor-pointer">
|
|
149
173
|
<div className="absolute inset-0 rounded-xl bg-gradient-to-br from-ember-500/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity" />
|
|
150
|
-
<div className="relative">
|
|
151
|
-
<div className="
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
<Heading level="h3" size="lg" weight="semibold" className="mb-2">
|
|
155
|
-
{f.title}
|
|
174
|
+
<div className="relative space-y-3">
|
|
175
|
+
<div className="text-3xl">{feature.icon}</div>
|
|
176
|
+
<Heading level="h3" size="md" weight="semibold">
|
|
177
|
+
{feature.title}
|
|
156
178
|
</Heading>
|
|
157
|
-
<Text color="muted">
|
|
179
|
+
<Text color="muted" size="sm">
|
|
180
|
+
{feature.desc}
|
|
181
|
+
</Text>
|
|
158
182
|
</div>
|
|
159
183
|
</Card>
|
|
160
184
|
))}
|
|
161
185
|
</div>
|
|
162
186
|
</section>
|
|
163
187
|
|
|
164
|
-
{/* Component Showcase */}
|
|
188
|
+
{/* Component Showcase with Tabs */}
|
|
165
189
|
<section>
|
|
166
|
-
<Heading level="h2" size="2xl" weight="semibold" className="mb-2
|
|
167
|
-
|
|
190
|
+
<Heading level="h2" size="2xl" weight="semibold" className="text-center mb-2">
|
|
191
|
+
Design System Components
|
|
168
192
|
</Heading>
|
|
169
|
-
<Text color="muted" className="text-center mb-8">
|
|
170
|
-
|
|
193
|
+
<Text color="muted" className="text-center mb-8 max-w-lg mx-auto">
|
|
194
|
+
Pre-built, accessible components ready to use in your project.
|
|
171
195
|
</Text>
|
|
172
196
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
<
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
</div>
|
|
190
|
-
</div>
|
|
191
|
-
|
|
192
|
-
{/* Tab Content */}
|
|
193
|
-
{activeTab.value === 'buttons' && (
|
|
194
|
-
<Card padding="xl" className="max-w-2xl mx-auto">
|
|
195
|
-
<div className="text-center mb-6">
|
|
196
|
-
<Badge variant="primary" className="mb-2">Buttons</Badge>
|
|
197
|
-
<Heading level="h3" size="lg" weight="semibold">Button Variants</Heading>
|
|
198
|
-
</div>
|
|
199
|
-
<div className="flex flex-wrap gap-3 justify-center">
|
|
200
|
-
<Button variant="primary">Primary</Button>
|
|
201
|
-
<Button variant="secondary">Secondary</Button>
|
|
202
|
-
<Button variant="ghost">Ghost</Button>
|
|
203
|
-
<Button variant="primary" size="sm">Small</Button>
|
|
204
|
-
<Button variant="secondary" size="lg">Large</Button>
|
|
205
|
-
</div>
|
|
206
|
-
<div className="mt-6 pt-6 border-t border-slate-700/50">
|
|
207
|
-
<Heading level="h4" size="sm" weight="semibold" className="mb-3 text-slate-400">With Icons</Heading>
|
|
208
|
-
<div className="flex flex-wrap gap-3 justify-center">
|
|
209
|
-
<Button variant="primary">⚡ Get Started</Button>
|
|
210
|
-
<Button variant="secondary">Learn More →</Button>
|
|
211
|
-
<Button variant="ghost">❤ Like</Button>
|
|
197
|
+
<div className="space-y-8">
|
|
198
|
+
{/* Buttons Section */}
|
|
199
|
+
<Card padding="xl">
|
|
200
|
+
<Heading level="h3" size="lg" weight="semibold" className="mb-6">
|
|
201
|
+
Button Component
|
|
202
|
+
</Heading>
|
|
203
|
+
<div className="space-y-4">
|
|
204
|
+
<Text color="muted" size="sm">
|
|
205
|
+
The Button component comes in multiple variants and sizes for different use cases.
|
|
206
|
+
</Text>
|
|
207
|
+
<div className="flex flex-wrap gap-2 pt-4">
|
|
208
|
+
<Button variant="primary">Primary</Button>
|
|
209
|
+
<Button variant="secondary">Secondary</Button>
|
|
210
|
+
<Button variant="ghost">Ghost</Button>
|
|
211
|
+
<Button variant="primary" size="sm">Small</Button>
|
|
212
|
+
<Button variant="secondary" size="lg">Large</Button>
|
|
212
213
|
</div>
|
|
213
214
|
</div>
|
|
214
215
|
</Card>
|
|
215
|
-
)}
|
|
216
|
-
|
|
217
|
-
{activeTab.value === 'cards' && (
|
|
218
|
-
<div className="grid md:grid-cols-2 gap-6 max-w-3xl mx-auto">
|
|
219
|
-
<Card padding="lg" className="hover:border-ember-500/50 transition-colors">
|
|
220
|
-
<Badge variant="success" className="mb-3">Analytics</Badge>
|
|
221
|
-
<Heading level="h3" size="lg" weight="semibold" className="mb-2">
|
|
222
|
-
Revenue Growth
|
|
223
|
-
</Heading>
|
|
224
|
-
<div className="text-3xl font-bold text-ember-400 mb-1">$45,231</div>
|
|
225
|
-
<Text color="muted" className="text-sm">+20.1% from last month</Text>
|
|
226
|
-
<div className="mt-4 h-2 rounded-full bg-slate-700 overflow-hidden">
|
|
227
|
-
<div className="h-full w-3/4 rounded-full bg-gradient-to-r from-ember-500 to-amber-500" />
|
|
228
|
-
</div>
|
|
229
|
-
</Card>
|
|
230
|
-
<Card padding="lg" className="hover:border-ember-500/50 transition-colors">
|
|
231
|
-
<Badge variant="info" className="mb-3">Users</Badge>
|
|
232
|
-
<Heading level="h3" size="lg" weight="semibold" className="mb-2">
|
|
233
|
-
Active Users
|
|
234
|
-
</Heading>
|
|
235
|
-
<div className="text-3xl font-bold text-blue-400 mb-1">2,338</div>
|
|
236
|
-
<Text color="muted" className="text-sm">+15.3% from last month</Text>
|
|
237
|
-
<div className="mt-4 h-2 rounded-full bg-slate-700 overflow-hidden">
|
|
238
|
-
<div className="h-full w-1/2 rounded-full bg-gradient-to-r from-blue-500 to-cyan-500" />
|
|
239
|
-
</div>
|
|
240
|
-
</Card>
|
|
241
|
-
</div>
|
|
242
|
-
)}
|
|
243
216
|
|
|
244
|
-
|
|
245
|
-
<Card padding="xl"
|
|
246
|
-
<
|
|
247
|
-
|
|
248
|
-
|
|
217
|
+
{/* Badge & Alert Section */}
|
|
218
|
+
<Card padding="xl">
|
|
219
|
+
<Heading level="h3" size="lg" weight="semibold" className="mb-6">
|
|
220
|
+
Status Components
|
|
221
|
+
</Heading>
|
|
222
|
+
<div className="space-y-6">
|
|
223
|
+
<div>
|
|
224
|
+
<Text weight="semibold" className="mb-3">Badges</Text>
|
|
225
|
+
<div className="flex flex-wrap gap-2">
|
|
226
|
+
<Badge variant="primary">Primary</Badge>
|
|
227
|
+
<Badge variant="success">Success</Badge>
|
|
228
|
+
<Badge variant="warning">Warning</Badge>
|
|
229
|
+
<Badge variant="info">Info</Badge>
|
|
230
|
+
</div>
|
|
231
|
+
</div>
|
|
232
|
+
<Alert variant="success">
|
|
233
|
+
✓ This is a success alert message. Use it to confirm important actions.
|
|
234
|
+
</Alert>
|
|
235
|
+
<Alert variant="info">
|
|
236
|
+
ℹ This is an info alert. Useful for displaying helpful information.
|
|
237
|
+
</Alert>
|
|
249
238
|
</div>
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
</Button>
|
|
239
|
+
</Card>
|
|
240
|
+
|
|
241
|
+
{/* Components Grid */}
|
|
242
|
+
<Card padding="xl">
|
|
243
|
+
<Heading level="h3" size="lg" weight="semibold" className="mb-6">
|
|
244
|
+
Available Components
|
|
245
|
+
</Heading>
|
|
246
|
+
<div className="grid md:grid-cols-2 gap-4">
|
|
247
|
+
{components.map((comp) => (
|
|
248
|
+
<div key={comp.name} className="p-4 rounded-lg bg-slate-800/30 border border-slate-700/50">
|
|
249
|
+
<Text weight="semibold" size="sm">{comp.name}</Text>
|
|
250
|
+
<Text color="muted" size="xs" className="mt-1">{comp.desc}</Text>
|
|
251
|
+
</div>
|
|
252
|
+
))}
|
|
265
253
|
</div>
|
|
266
254
|
</Card>
|
|
267
|
-
|
|
255
|
+
</div>
|
|
268
256
|
</section>
|
|
269
257
|
|
|
270
|
-
{/* CTA */}
|
|
258
|
+
{/* CTA Section */}
|
|
271
259
|
<section className="relative py-20">
|
|
272
260
|
<div className="pointer-events-none absolute inset-0 flex items-center justify-center">
|
|
273
261
|
<div className="w-[500px] h-[200px] rounded-full bg-ember-500/10 blur-[100px]" />
|
|
274
262
|
</div>
|
|
275
|
-
<
|
|
263
|
+
<Card padding="xl" className="relative z-10 max-w-2xl mx-auto text-center">
|
|
276
264
|
<Heading level="h2" size="2xl" weight="semibold" className="mb-4">
|
|
277
|
-
Ready to
|
|
265
|
+
Ready to Build?
|
|
278
266
|
</Heading>
|
|
279
|
-
<Text color="muted" className="
|
|
267
|
+
<Text color="muted" className="mb-8">
|
|
280
268
|
Start building your next project with EmberKit's powerful components and TypeScript-first API.
|
|
281
269
|
</Text>
|
|
282
|
-
<
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
270
|
+
<div className="flex gap-4 justify-center">
|
|
271
|
+
<Button variant="primary" size="lg">
|
|
272
|
+
Create Project →
|
|
273
|
+
</Button>
|
|
274
|
+
<Button variant="secondary" size="lg">
|
|
275
|
+
Learn More
|
|
276
|
+
</Button>
|
|
277
|
+
</div>
|
|
278
|
+
</Card>
|
|
286
279
|
</section>
|
|
287
280
|
</div>
|
|
288
281
|
);
|
|
@@ -291,69 +284,88 @@ const HomePage: RouteComponent = () => {
|
|
|
291
284
|
export default HomePage;`,
|
|
292
285
|
"src/routes/about.tsx": `import type { RouteComponent } from '@emberkit/core';
|
|
293
286
|
import { Head } from '@emberkit/core';
|
|
294
|
-
import { Heading, Text, Button, Card, Badge } from '@emberkit/ui';
|
|
287
|
+
import { Heading, Text, Button, Card, Badge, Alert } from '@emberkit/ui';
|
|
295
288
|
|
|
296
289
|
const AboutPage: RouteComponent = () => {
|
|
290
|
+
const features = [
|
|
291
|
+
{ icon: '⚙️', title: 'TypeScript-first', desc: 'Full type safety with intelligent autocomplete' },
|
|
292
|
+
{ icon: '🎨', title: 'UI Components', desc: 'Pre-built design system components' },
|
|
293
|
+
{ icon: '🎯', title: 'Tailwind CSS', desc: 'Utility-first styling framework' },
|
|
294
|
+
{ icon: '📁', title: 'File Routing', desc: 'Automatic routes from file structure' },
|
|
295
|
+
];
|
|
296
|
+
|
|
297
|
+
const techStack = ['EmberKit', 'TypeScript', 'Tailwind CSS', 'Vite', 'JSX', 'Design System'];
|
|
298
|
+
|
|
297
299
|
return (
|
|
298
300
|
<>
|
|
299
301
|
<Head>
|
|
300
302
|
<title>About - {{name}}</title>
|
|
301
303
|
</Head>
|
|
302
|
-
<div className="max-w-3xl mx-auto
|
|
304
|
+
<div className="max-w-3xl mx-auto space-y-12">
|
|
303
305
|
{/* Header */}
|
|
304
|
-
<div className="text-center">
|
|
305
|
-
<Badge variant="primary" className="
|
|
306
|
+
<div className="text-center space-y-4">
|
|
307
|
+
<Badge variant="primary" className="inline-block">
|
|
308
|
+
About Us
|
|
309
|
+
</Badge>
|
|
306
310
|
<Heading level="h1" size="3xl" weight="bold">
|
|
307
|
-
About {
|
|
308
|
-
<span className="bg-gradient-to-r from-ember-400 to-ember-600 bg-clip-text text-transparent">{{name}}</span>
|
|
311
|
+
About <span className="bg-gradient-to-r from-ember-400 to-ember-600 bg-clip-text text-transparent">{{name}}</span>
|
|
309
312
|
</Heading>
|
|
313
|
+
<Text size="lg" color="muted" className="max-w-2xl mx-auto">
|
|
314
|
+
A modern, component-driven project built with EmberKit and the UI design system.
|
|
315
|
+
</Text>
|
|
310
316
|
</div>
|
|
311
317
|
|
|
312
|
-
{/* Description */}
|
|
318
|
+
{/* Description Card */}
|
|
313
319
|
<Card padding="xl" className="border-ember-500/20">
|
|
314
320
|
<Text size="lg" color="muted" className="leading-relaxed">
|
|
315
|
-
This project
|
|
316
|
-
It
|
|
317
|
-
pre-built components and Tailwind CSS.
|
|
321
|
+
This project demonstrates how to build modern, beautiful interfaces with EmberKit's pre-built components and Tailwind CSS.
|
|
322
|
+
It showcases best practices in component-driven development, accessible design, and TypeScript-first architecture.
|
|
318
323
|
</Text>
|
|
319
324
|
</Card>
|
|
320
325
|
|
|
321
|
-
{/* Features */}
|
|
322
|
-
<
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
{ icon: '🎨', title: 'UI Components', desc: 'Pre-built atoms, molecules, and organisms' },
|
|
326
|
-
{ icon: '🌈', title: 'Tailwind CSS', desc: 'Utility-first styling with custom theme' },
|
|
327
|
-
{ icon: '🛖', title: 'File Routing', desc: 'Automatic routes from your file structure' },
|
|
328
|
-
].map((f) => (
|
|
329
|
-
<Card key={f.title} padding="lg" className="hover:border-ember-500/50 transition-all hover:-translate-y-0.5">
|
|
330
|
-
<div className="text-2xl mb-3">{f.icon}</div>
|
|
331
|
-
<Heading level="h3" size="md" weight="semibold" className="mb-1">
|
|
332
|
-
{f.title}
|
|
333
|
-
</Heading>
|
|
334
|
-
<Text color="muted" size="sm">{f.desc}</Text>
|
|
335
|
-
</Card>
|
|
336
|
-
))}
|
|
337
|
-
</div>
|
|
338
|
-
|
|
339
|
-
{/* Tech Stack */}
|
|
340
|
-
<Card padding="xl">
|
|
341
|
-
<Heading level="h3" size="lg" weight="semibold" className="mb-4 text-center">
|
|
342
|
-
Tech Stack
|
|
326
|
+
{/* Features Grid */}
|
|
327
|
+
<section>
|
|
328
|
+
<Heading level="h2" size="xl" weight="semibold" className="mb-6">
|
|
329
|
+
Key Features
|
|
343
330
|
</Heading>
|
|
344
|
-
<div className="
|
|
345
|
-
{
|
|
346
|
-
<
|
|
347
|
-
{
|
|
348
|
-
|
|
331
|
+
<div className="grid sm:grid-cols-2 gap-4">
|
|
332
|
+
{features.map((f) => (
|
|
333
|
+
<Card key={f.title} padding="lg" className="hover:border-ember-500/50 transition-all hover:-translate-y-0.5">
|
|
334
|
+
<div className="text-2xl mb-3">{f.icon}</div>
|
|
335
|
+
<Heading level="h3" size="md" weight="semibold" className="mb-1">
|
|
336
|
+
{f.title}
|
|
337
|
+
</Heading>
|
|
338
|
+
<Text color="muted" size="sm">{f.desc}</Text>
|
|
339
|
+
</Card>
|
|
349
340
|
))}
|
|
350
341
|
</div>
|
|
351
|
-
</
|
|
342
|
+
</section>
|
|
343
|
+
|
|
344
|
+
{/* Tech Stack */}
|
|
345
|
+
<section>
|
|
346
|
+
<Card padding="xl">
|
|
347
|
+
<Heading level="h3" size="lg" weight="semibold" className="mb-6 text-center">
|
|
348
|
+
Tech Stack
|
|
349
|
+
</Heading>
|
|
350
|
+
<div className="flex flex-wrap gap-2 justify-center">
|
|
351
|
+
{techStack.map((tech) => (
|
|
352
|
+
<Badge key={tech} variant="primary" className="px-3 py-1.5">
|
|
353
|
+
{tech}
|
|
354
|
+
</Badge>
|
|
355
|
+
))}
|
|
356
|
+
</div>
|
|
357
|
+
</Card>
|
|
358
|
+
</section>
|
|
359
|
+
|
|
360
|
+
{/* Benefits Alert */}
|
|
361
|
+
<Alert variant="success">
|
|
362
|
+
✨ <strong>Pro Tip:</strong> This template uses the EmberKit design system components. Check the component library documentation to learn about all available components and their capabilities.
|
|
363
|
+
</Alert>
|
|
352
364
|
|
|
353
|
-
{/* Back */}
|
|
354
|
-
<div className="text-center">
|
|
365
|
+
{/* Back Button */}
|
|
366
|
+
<div className="text-center pt-4">
|
|
355
367
|
<Button variant="secondary">
|
|
356
|
-
|
|
368
|
+
← Back to Home
|
|
357
369
|
</Button>
|
|
358
370
|
</div>
|
|
359
371
|
</div>
|