@dailyautomations/ui 1.0.1 → 1.2.0
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.
- package/CHANGELOG.md +100 -0
- package/INSTALLATION.md +238 -0
- package/MIGRATION.md +207 -0
- package/PAGE_STRUCTURES.md +718 -0
- package/README.md +125 -65
- package/dist/tokens/tailwind.preset.d.ts.map +1 -1
- package/dist/tokens/tailwind.preset.js.map +1 -1
- package/examples/README.md +150 -0
- package/examples/home-page.tsx +321 -0
- package/examples/index.html +12 -0
- package/examples/main.tsx +90 -0
- package/examples/pages/AboutPage.tsx +343 -0
- package/examples/pages/BlogPage.tsx +294 -0
- package/examples/pages/ContactPage.tsx +328 -0
- package/examples/pages/DashboardPage.tsx +355 -0
- package/examples/pages/ListPage.tsx +310 -0
- package/examples/pages/LoginPage.tsx +166 -0
- package/examples/pages/OnboardingPage.tsx +385 -0
- package/examples/pages/PricingPage.tsx +402 -0
- package/examples/pages/SettingsPage.tsx +417 -0
- package/examples/pages/SignupPage.tsx +194 -0
- package/examples/pages/index.ts +13 -0
- package/examples/styles.css +166 -0
- package/package.json +7 -1
- package/src/styles/globals.css +161 -7
- package/src/styles/theme.css +89 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Button } from "../../src/components/common/button"
|
|
5
|
+
import { Card, CardContent } from "../../src/components/common/card"
|
|
6
|
+
import { cn } from "../../src/utils/cn"
|
|
7
|
+
|
|
8
|
+
// Icons
|
|
9
|
+
const Icons = {
|
|
10
|
+
target: (props: React.SVGProps<SVGSVGElement>) => (
|
|
11
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
12
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
|
|
13
|
+
</svg>
|
|
14
|
+
),
|
|
15
|
+
heart: (props: React.SVGProps<SVGSVGElement>) => (
|
|
16
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
17
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"/>
|
|
18
|
+
</svg>
|
|
19
|
+
),
|
|
20
|
+
lightning: (props: React.SVGProps<SVGSVGElement>) => (
|
|
21
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
22
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z"/>
|
|
23
|
+
</svg>
|
|
24
|
+
),
|
|
25
|
+
globe: (props: React.SVGProps<SVGSVGElement>) => (
|
|
26
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
27
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
|
28
|
+
</svg>
|
|
29
|
+
),
|
|
30
|
+
twitter: (props: React.SVGProps<SVGSVGElement>) => (
|
|
31
|
+
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
|
|
32
|
+
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
|
|
33
|
+
</svg>
|
|
34
|
+
),
|
|
35
|
+
linkedin: (props: React.SVGProps<SVGSVGElement>) => (
|
|
36
|
+
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
|
|
37
|
+
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
|
|
38
|
+
</svg>
|
|
39
|
+
),
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Value Card
|
|
43
|
+
interface ValueProps {
|
|
44
|
+
icon: React.ReactNode
|
|
45
|
+
title: string
|
|
46
|
+
description: string
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function ValueCard({ icon, title, description }: ValueProps) {
|
|
50
|
+
return (
|
|
51
|
+
<Card className="group hover:border-purple-500/50 transition-colors">
|
|
52
|
+
<CardContent className="p-6">
|
|
53
|
+
<div className="w-12 h-12 rounded-lg bg-purple-500/10 flex items-center justify-center mb-4 group-hover:bg-purple-500/20 transition-colors">
|
|
54
|
+
{icon}
|
|
55
|
+
</div>
|
|
56
|
+
<h3 className="text-lg font-semibold mb-2">{title}</h3>
|
|
57
|
+
<p className="text-zinc-400 text-sm">{description}</p>
|
|
58
|
+
</CardContent>
|
|
59
|
+
</Card>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Team Member Card
|
|
64
|
+
interface TeamMemberProps {
|
|
65
|
+
name: string
|
|
66
|
+
role: string
|
|
67
|
+
bio: string
|
|
68
|
+
avatar: string
|
|
69
|
+
social?: { twitter?: string; linkedin?: string }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function TeamMember({ name, role, bio, avatar, social }: TeamMemberProps) {
|
|
73
|
+
return (
|
|
74
|
+
<Card className="overflow-hidden group">
|
|
75
|
+
<div className={cn("h-48 bg-gradient-to-br", avatar)} />
|
|
76
|
+
<CardContent className="p-5">
|
|
77
|
+
<h3 className="font-semibold">{name}</h3>
|
|
78
|
+
<p className="text-sm text-purple-400 mb-2">{role}</p>
|
|
79
|
+
<p className="text-sm text-zinc-400 mb-3">{bio}</p>
|
|
80
|
+
{social && (
|
|
81
|
+
<div className="flex gap-2">
|
|
82
|
+
{social.twitter && (
|
|
83
|
+
<a href={social.twitter} className="w-8 h-8 rounded-full bg-zinc-800 flex items-center justify-center hover:bg-zinc-700 transition-colors">
|
|
84
|
+
<Icons.twitter className="w-4 h-4" />
|
|
85
|
+
</a>
|
|
86
|
+
)}
|
|
87
|
+
{social.linkedin && (
|
|
88
|
+
<a href={social.linkedin} className="w-8 h-8 rounded-full bg-zinc-800 flex items-center justify-center hover:bg-zinc-700 transition-colors">
|
|
89
|
+
<Icons.linkedin className="w-4 h-4" />
|
|
90
|
+
</a>
|
|
91
|
+
)}
|
|
92
|
+
</div>
|
|
93
|
+
)}
|
|
94
|
+
</CardContent>
|
|
95
|
+
</Card>
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Stat
|
|
100
|
+
interface StatProps {
|
|
101
|
+
value: string
|
|
102
|
+
label: string
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function Stat({ value, label }: StatProps) {
|
|
106
|
+
return (
|
|
107
|
+
<div className="text-center">
|
|
108
|
+
<p className="text-4xl md:text-5xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-purple-400 to-orange-400">
|
|
109
|
+
{value}
|
|
110
|
+
</p>
|
|
111
|
+
<p className="text-zinc-400 mt-1">{label}</p>
|
|
112
|
+
</div>
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function AboutPage() {
|
|
117
|
+
const team: TeamMemberProps[] = [
|
|
118
|
+
{
|
|
119
|
+
name: "Sarah Chen",
|
|
120
|
+
role: "CEO & Co-founder",
|
|
121
|
+
bio: "Former Google PM. Stanford CS grad. Passionate about AI and automation.",
|
|
122
|
+
avatar: "from-purple-600 to-purple-900",
|
|
123
|
+
social: { twitter: "#", linkedin: "#" },
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: "Mike Torres",
|
|
127
|
+
role: "CTO & Co-founder",
|
|
128
|
+
bio: "Ex-Stripe engineer. Built systems processing billions of transactions.",
|
|
129
|
+
avatar: "from-orange-600 to-red-900",
|
|
130
|
+
social: { twitter: "#", linkedin: "#" },
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: "Emma Wilson",
|
|
134
|
+
role: "Head of Design",
|
|
135
|
+
bio: "Award-winning designer. Previously at Figma and Airbnb.",
|
|
136
|
+
avatar: "from-blue-600 to-cyan-900",
|
|
137
|
+
social: { twitter: "#", linkedin: "#" },
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: "Alex Kim",
|
|
141
|
+
role: "Head of Engineering",
|
|
142
|
+
bio: "Systems architect with 15 years of experience building scalable platforms.",
|
|
143
|
+
avatar: "from-green-600 to-emerald-900",
|
|
144
|
+
social: { linkedin: "#" },
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "Lisa Park",
|
|
148
|
+
role: "VP of Product",
|
|
149
|
+
bio: "Product leader focused on user-centered design and data-driven decisions.",
|
|
150
|
+
avatar: "from-pink-600 to-rose-900",
|
|
151
|
+
social: { twitter: "#", linkedin: "#" },
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: "James Liu",
|
|
155
|
+
role: "Head of AI",
|
|
156
|
+
bio: "PhD in Machine Learning. Published researcher in NLP and document understanding.",
|
|
157
|
+
avatar: "from-indigo-600 to-violet-900",
|
|
158
|
+
social: { linkedin: "#" },
|
|
159
|
+
},
|
|
160
|
+
]
|
|
161
|
+
|
|
162
|
+
return (
|
|
163
|
+
<div className="min-h-screen bg-[#0F0F14] text-white">
|
|
164
|
+
{/* Header */}
|
|
165
|
+
<header className="border-b border-zinc-800">
|
|
166
|
+
<div className="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
|
|
167
|
+
<span className="text-xl font-bold">
|
|
168
|
+
<span className="text-purple-500">daily</span>
|
|
169
|
+
<span className="text-orange-500">X</span>
|
|
170
|
+
</span>
|
|
171
|
+
<nav className="hidden md:flex items-center gap-6">
|
|
172
|
+
<a href="#" className="text-sm text-zinc-400 hover:text-white transition-colors">Product</a>
|
|
173
|
+
<a href="#" className="text-sm text-zinc-400 hover:text-white transition-colors">Pricing</a>
|
|
174
|
+
<a href="#" className="text-sm text-white font-medium">About</a>
|
|
175
|
+
<a href="#" className="text-sm text-zinc-400 hover:text-white transition-colors">Contact</a>
|
|
176
|
+
<Button size="sm">Get Started</Button>
|
|
177
|
+
</nav>
|
|
178
|
+
</div>
|
|
179
|
+
</header>
|
|
180
|
+
|
|
181
|
+
{/* Hero */}
|
|
182
|
+
<section className="py-20 border-b border-zinc-800">
|
|
183
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
184
|
+
<div className="max-w-3xl">
|
|
185
|
+
<h1 className="text-4xl md:text-5xl lg:text-6xl font-bold mb-6 leading-tight">
|
|
186
|
+
We're building the future of{" "}
|
|
187
|
+
<span className="text-transparent bg-clip-text bg-gradient-to-r from-purple-400 to-orange-400">
|
|
188
|
+
document automation
|
|
189
|
+
</span>
|
|
190
|
+
</h1>
|
|
191
|
+
<p className="text-xl text-zinc-400 mb-8">
|
|
192
|
+
Founded in 2023, Daily X is on a mission to eliminate tedious document work and help teams focus on what matters most.
|
|
193
|
+
</p>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
</section>
|
|
197
|
+
|
|
198
|
+
{/* Stats */}
|
|
199
|
+
<section className="py-16 border-b border-zinc-800">
|
|
200
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
201
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-8">
|
|
202
|
+
<Stat value="1M+" label="Documents processed" />
|
|
203
|
+
<Stat value="10K+" label="Happy customers" />
|
|
204
|
+
<Stat value="50+" label="Team members" />
|
|
205
|
+
<Stat value="99.9%" label="Uptime SLA" />
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
</section>
|
|
209
|
+
|
|
210
|
+
{/* Mission */}
|
|
211
|
+
<section className="py-20 border-b border-zinc-800">
|
|
212
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
213
|
+
<div className="grid lg:grid-cols-2 gap-12 items-center">
|
|
214
|
+
<div>
|
|
215
|
+
<span className="inline-flex px-3 py-1 rounded-full text-xs font-medium bg-purple-500/10 text-purple-400 mb-4">
|
|
216
|
+
Our Mission
|
|
217
|
+
</span>
|
|
218
|
+
<h2 className="text-3xl md:text-4xl font-bold mb-6">
|
|
219
|
+
Empowering teams to work smarter, not harder
|
|
220
|
+
</h2>
|
|
221
|
+
<p className="text-zinc-400 mb-4">
|
|
222
|
+
We believe that knowledge workers spend too much time on repetitive document tasks. Our AI-powered platform automates the mundane so teams can focus on creative, high-impact work.
|
|
223
|
+
</p>
|
|
224
|
+
<p className="text-zinc-400">
|
|
225
|
+
From startups to Fortune 500 companies, we're trusted by organizations that value efficiency and innovation.
|
|
226
|
+
</p>
|
|
227
|
+
</div>
|
|
228
|
+
<div className="grid grid-cols-2 gap-4">
|
|
229
|
+
<div className="h-48 rounded-lg bg-gradient-to-br from-purple-600/50 to-purple-900/50" />
|
|
230
|
+
<div className="h-48 rounded-lg bg-gradient-to-br from-orange-600/50 to-orange-900/50 mt-8" />
|
|
231
|
+
<div className="h-48 rounded-lg bg-gradient-to-br from-blue-600/50 to-blue-900/50 -mt-8" />
|
|
232
|
+
<div className="h-48 rounded-lg bg-gradient-to-br from-green-600/50 to-green-900/50" />
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
</section>
|
|
237
|
+
|
|
238
|
+
{/* Values */}
|
|
239
|
+
<section className="py-20 border-b border-zinc-800">
|
|
240
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
241
|
+
<div className="text-center mb-12">
|
|
242
|
+
<span className="inline-flex px-3 py-1 rounded-full text-xs font-medium bg-purple-500/10 text-purple-400 mb-4">
|
|
243
|
+
Our Values
|
|
244
|
+
</span>
|
|
245
|
+
<h2 className="text-3xl md:text-4xl font-bold">What drives us</h2>
|
|
246
|
+
</div>
|
|
247
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
|
|
248
|
+
<ValueCard
|
|
249
|
+
icon={<Icons.target className="w-6 h-6 text-purple-400" />}
|
|
250
|
+
title="Customer First"
|
|
251
|
+
description="Every decision starts with the customer. Their success is our success."
|
|
252
|
+
/>
|
|
253
|
+
<ValueCard
|
|
254
|
+
icon={<Icons.lightning className="w-6 h-6 text-purple-400" />}
|
|
255
|
+
title="Move Fast"
|
|
256
|
+
description="We ship quickly, learn from feedback, and iterate relentlessly."
|
|
257
|
+
/>
|
|
258
|
+
<ValueCard
|
|
259
|
+
icon={<Icons.heart className="w-6 h-6 text-purple-400" />}
|
|
260
|
+
title="Care Deeply"
|
|
261
|
+
description="We sweat the details and take pride in everything we build."
|
|
262
|
+
/>
|
|
263
|
+
<ValueCard
|
|
264
|
+
icon={<Icons.globe className="w-6 h-6 text-purple-400" />}
|
|
265
|
+
title="Think Global"
|
|
266
|
+
description="We build for a diverse world with accessibility and inclusion in mind."
|
|
267
|
+
/>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</section>
|
|
271
|
+
|
|
272
|
+
{/* Team */}
|
|
273
|
+
<section className="py-20 border-b border-zinc-800">
|
|
274
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
275
|
+
<div className="text-center mb-12">
|
|
276
|
+
<span className="inline-flex px-3 py-1 rounded-full text-xs font-medium bg-purple-500/10 text-purple-400 mb-4">
|
|
277
|
+
Our Team
|
|
278
|
+
</span>
|
|
279
|
+
<h2 className="text-3xl md:text-4xl font-bold mb-4">Meet the people behind Daily X</h2>
|
|
280
|
+
<p className="text-zinc-400 max-w-2xl mx-auto">
|
|
281
|
+
We're a diverse team of engineers, designers, and problem-solvers united by a passion for building great products.
|
|
282
|
+
</p>
|
|
283
|
+
</div>
|
|
284
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
285
|
+
{team.map((member) => (
|
|
286
|
+
<TeamMember key={member.name} {...member} />
|
|
287
|
+
))}
|
|
288
|
+
</div>
|
|
289
|
+
</div>
|
|
290
|
+
</section>
|
|
291
|
+
|
|
292
|
+
{/* Timeline */}
|
|
293
|
+
<section className="py-20 border-b border-zinc-800">
|
|
294
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
295
|
+
<div className="text-center mb-12">
|
|
296
|
+
<span className="inline-flex px-3 py-1 rounded-full text-xs font-medium bg-purple-500/10 text-purple-400 mb-4">
|
|
297
|
+
Our Journey
|
|
298
|
+
</span>
|
|
299
|
+
<h2 className="text-3xl md:text-4xl font-bold">From idea to impact</h2>
|
|
300
|
+
</div>
|
|
301
|
+
<div className="max-w-3xl mx-auto">
|
|
302
|
+
{[
|
|
303
|
+
{ year: "2023", title: "Founded", description: "Sarah and Mike start Daily X in a San Francisco garage." },
|
|
304
|
+
{ year: "2024", title: "Seed Round", description: "Raised $5M to build out the core platform and team." },
|
|
305
|
+
{ year: "2024", title: "1K Customers", description: "Reached our first thousand paying customers." },
|
|
306
|
+
{ year: "2025", title: "Series A", description: "Raised $25M led by Sequoia to accelerate growth." },
|
|
307
|
+
{ year: "2026", title: "Global Expansion", description: "Opened offices in NYC and London. 10K+ customers worldwide." },
|
|
308
|
+
].map((event, index) => (
|
|
309
|
+
<div key={index} className="flex gap-6 mb-8 last:mb-0">
|
|
310
|
+
<div className="flex flex-col items-center">
|
|
311
|
+
<div className="w-12 h-12 rounded-full bg-purple-500/20 flex items-center justify-center text-purple-400 font-semibold text-sm">
|
|
312
|
+
{event.year}
|
|
313
|
+
</div>
|
|
314
|
+
{index < 4 && <div className="w-0.5 h-full bg-zinc-800 mt-2" />}
|
|
315
|
+
</div>
|
|
316
|
+
<div className="pt-2">
|
|
317
|
+
<h3 className="font-semibold mb-1">{event.title}</h3>
|
|
318
|
+
<p className="text-zinc-400 text-sm">{event.description}</p>
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
))}
|
|
322
|
+
</div>
|
|
323
|
+
</div>
|
|
324
|
+
</section>
|
|
325
|
+
|
|
326
|
+
{/* CTA */}
|
|
327
|
+
<section className="py-20">
|
|
328
|
+
<div className="max-w-6xl mx-auto px-6 text-center">
|
|
329
|
+
<h2 className="text-3xl md:text-4xl font-bold mb-4">Join our journey</h2>
|
|
330
|
+
<p className="text-xl text-zinc-400 mb-8 max-w-2xl mx-auto">
|
|
331
|
+
We're always looking for talented people to join our team.
|
|
332
|
+
</p>
|
|
333
|
+
<div className="flex gap-4 justify-center">
|
|
334
|
+
<Button size="lg">View open positions</Button>
|
|
335
|
+
<Button variant="outline" size="lg">Contact us</Button>
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
</section>
|
|
339
|
+
</div>
|
|
340
|
+
)
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
export default AboutPage
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Button } from "../../src/components/common/button"
|
|
5
|
+
import { Card, CardContent } from "../../src/components/common/card"
|
|
6
|
+
import { Input } from "../../src/components/common/input"
|
|
7
|
+
import { cn } from "../../src/utils/cn"
|
|
8
|
+
|
|
9
|
+
// Icons
|
|
10
|
+
const Icons = {
|
|
11
|
+
search: (props: React.SVGProps<SVGSVGElement>) => (
|
|
12
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
13
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
|
|
14
|
+
</svg>
|
|
15
|
+
),
|
|
16
|
+
calendar: (props: React.SVGProps<SVGSVGElement>) => (
|
|
17
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
18
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/>
|
|
19
|
+
</svg>
|
|
20
|
+
),
|
|
21
|
+
clock: (props: React.SVGProps<SVGSVGElement>) => (
|
|
22
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
23
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
|
24
|
+
</svg>
|
|
25
|
+
),
|
|
26
|
+
arrowRight: (props: React.SVGProps<SVGSVGElement>) => (
|
|
27
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
28
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3"/>
|
|
29
|
+
</svg>
|
|
30
|
+
),
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Blog Post Card
|
|
34
|
+
interface BlogPostProps {
|
|
35
|
+
title: string
|
|
36
|
+
excerpt: string
|
|
37
|
+
category: string
|
|
38
|
+
date: string
|
|
39
|
+
readTime: string
|
|
40
|
+
image: string
|
|
41
|
+
featured?: boolean
|
|
42
|
+
author: {
|
|
43
|
+
name: string
|
|
44
|
+
avatar: string
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function BlogPost({ title, excerpt, category, date, readTime, image, featured, author }: BlogPostProps) {
|
|
49
|
+
if (featured) {
|
|
50
|
+
return (
|
|
51
|
+
<Card className="overflow-hidden group cursor-pointer">
|
|
52
|
+
<div className="grid md:grid-cols-2 gap-0">
|
|
53
|
+
<div className={cn("h-64 md:h-auto bg-gradient-to-br", image)} />
|
|
54
|
+
<CardContent className="p-8 flex flex-col justify-center">
|
|
55
|
+
<span className="inline-flex w-fit px-3 py-1 rounded-full text-xs font-medium bg-purple-500/10 text-purple-400 mb-4">
|
|
56
|
+
{category}
|
|
57
|
+
</span>
|
|
58
|
+
<h2 className="text-2xl font-bold mb-3 group-hover:text-purple-400 transition-colors">{title}</h2>
|
|
59
|
+
<p className="text-zinc-400 mb-6 line-clamp-3">{excerpt}</p>
|
|
60
|
+
<div className="flex items-center justify-between">
|
|
61
|
+
<div className="flex items-center gap-3">
|
|
62
|
+
<div className={cn("w-10 h-10 rounded-full", author.avatar)} />
|
|
63
|
+
<div>
|
|
64
|
+
<p className="text-sm font-medium">{author.name}</p>
|
|
65
|
+
<p className="text-xs text-zinc-500">{date}</p>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
<span className="text-sm text-zinc-500 flex items-center gap-1">
|
|
69
|
+
<Icons.clock className="w-4 h-4" />
|
|
70
|
+
{readTime}
|
|
71
|
+
</span>
|
|
72
|
+
</div>
|
|
73
|
+
</CardContent>
|
|
74
|
+
</div>
|
|
75
|
+
</Card>
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<Card className="overflow-hidden group cursor-pointer hover:border-zinc-700 transition-colors">
|
|
81
|
+
<div className={cn("h-48 bg-gradient-to-br", image)} />
|
|
82
|
+
<CardContent className="p-5">
|
|
83
|
+
<span className="inline-flex px-2.5 py-0.5 rounded-full text-xs font-medium bg-purple-500/10 text-purple-400 mb-3">
|
|
84
|
+
{category}
|
|
85
|
+
</span>
|
|
86
|
+
<h3 className="text-lg font-semibold mb-2 group-hover:text-purple-400 transition-colors line-clamp-2">{title}</h3>
|
|
87
|
+
<p className="text-sm text-zinc-400 mb-4 line-clamp-2">{excerpt}</p>
|
|
88
|
+
<div className="flex items-center justify-between text-xs text-zinc-500">
|
|
89
|
+
<div className="flex items-center gap-2">
|
|
90
|
+
<div className={cn("w-6 h-6 rounded-full", author.avatar)} />
|
|
91
|
+
<span>{author.name}</span>
|
|
92
|
+
</div>
|
|
93
|
+
<span>{readTime}</span>
|
|
94
|
+
</div>
|
|
95
|
+
</CardContent>
|
|
96
|
+
</Card>
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Category Filter
|
|
101
|
+
const categories = ["All", "Product", "Engineering", "Design", "Company", "Tutorials"]
|
|
102
|
+
|
|
103
|
+
export function BlogPage() {
|
|
104
|
+
const [activeCategory, setActiveCategory] = React.useState("All")
|
|
105
|
+
const [searchQuery, setSearchQuery] = React.useState("")
|
|
106
|
+
|
|
107
|
+
const posts: BlogPostProps[] = [
|
|
108
|
+
{
|
|
109
|
+
title: "Introducing AI-Powered Document Processing",
|
|
110
|
+
excerpt: "We're excited to announce our latest feature that uses machine learning to automatically categorize and extract insights from your documents. This breakthrough technology will save hours of manual work.",
|
|
111
|
+
category: "Product",
|
|
112
|
+
date: "Jan 28, 2026",
|
|
113
|
+
readTime: "5 min read",
|
|
114
|
+
image: "from-purple-600 to-purple-900",
|
|
115
|
+
featured: true,
|
|
116
|
+
author: { name: "Sarah Chen", avatar: "bg-purple-500" },
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
title: "How We Scaled to 1 Million Users",
|
|
120
|
+
excerpt: "A deep dive into our infrastructure journey and the lessons we learned scaling our platform.",
|
|
121
|
+
category: "Engineering",
|
|
122
|
+
date: "Jan 25, 2026",
|
|
123
|
+
readTime: "8 min read",
|
|
124
|
+
image: "from-orange-600 to-red-900",
|
|
125
|
+
author: { name: "Mike Torres", avatar: "bg-orange-500" },
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
title: "Design System 2.0: What's New",
|
|
129
|
+
excerpt: "Exploring the improvements and new components in our updated design system.",
|
|
130
|
+
category: "Design",
|
|
131
|
+
date: "Jan 22, 2026",
|
|
132
|
+
readTime: "4 min read",
|
|
133
|
+
image: "from-blue-600 to-cyan-900",
|
|
134
|
+
author: { name: "Emma Wilson", avatar: "bg-blue-500" },
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
title: "Building Accessible Web Applications",
|
|
138
|
+
excerpt: "Best practices for creating inclusive experiences that work for everyone.",
|
|
139
|
+
category: "Tutorials",
|
|
140
|
+
date: "Jan 20, 2026",
|
|
141
|
+
readTime: "6 min read",
|
|
142
|
+
image: "from-green-600 to-emerald-900",
|
|
143
|
+
author: { name: "Alex Kim", avatar: "bg-green-500" },
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
title: "Our Journey to Carbon Neutrality",
|
|
147
|
+
excerpt: "How we're reducing our environmental footprint and building a sustainable business.",
|
|
148
|
+
category: "Company",
|
|
149
|
+
date: "Jan 18, 2026",
|
|
150
|
+
readTime: "3 min read",
|
|
151
|
+
image: "from-teal-600 to-teal-900",
|
|
152
|
+
author: { name: "Lisa Park", avatar: "bg-teal-500" },
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
title: "Getting Started with the Daily X API",
|
|
156
|
+
excerpt: "A comprehensive guide to integrating our API into your applications.",
|
|
157
|
+
category: "Tutorials",
|
|
158
|
+
date: "Jan 15, 2026",
|
|
159
|
+
readTime: "10 min read",
|
|
160
|
+
image: "from-indigo-600 to-violet-900",
|
|
161
|
+
author: { name: "James Liu", avatar: "bg-indigo-500" },
|
|
162
|
+
},
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
const filteredPosts = posts.filter(post => {
|
|
166
|
+
const matchesCategory = activeCategory === "All" || post.category === activeCategory
|
|
167
|
+
const matchesSearch = post.title.toLowerCase().includes(searchQuery.toLowerCase())
|
|
168
|
+
return matchesCategory && matchesSearch
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
const [featuredPost, ...otherPosts] = filteredPosts
|
|
172
|
+
|
|
173
|
+
return (
|
|
174
|
+
<div className="min-h-screen bg-[#0F0F14] text-white">
|
|
175
|
+
{/* Header */}
|
|
176
|
+
<header className="border-b border-zinc-800">
|
|
177
|
+
<div className="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
|
|
178
|
+
<span className="text-xl font-bold">
|
|
179
|
+
<span className="text-purple-500">daily</span>
|
|
180
|
+
<span className="text-orange-500">X</span>
|
|
181
|
+
<span className="text-zinc-500 font-normal ml-2">/ Blog</span>
|
|
182
|
+
</span>
|
|
183
|
+
<nav className="hidden md:flex items-center gap-6">
|
|
184
|
+
<a href="#" className="text-sm text-zinc-400 hover:text-white transition-colors">Product</a>
|
|
185
|
+
<a href="#" className="text-sm text-zinc-400 hover:text-white transition-colors">Pricing</a>
|
|
186
|
+
<a href="#" className="text-sm text-zinc-400 hover:text-white transition-colors">About</a>
|
|
187
|
+
<Button size="sm">Get Started</Button>
|
|
188
|
+
</nav>
|
|
189
|
+
</div>
|
|
190
|
+
</header>
|
|
191
|
+
|
|
192
|
+
{/* Hero */}
|
|
193
|
+
<section className="py-16 border-b border-zinc-800">
|
|
194
|
+
<div className="max-w-6xl mx-auto px-6 text-center">
|
|
195
|
+
<h1 className="text-4xl md:text-5xl font-bold mb-4">
|
|
196
|
+
Insights & Updates
|
|
197
|
+
</h1>
|
|
198
|
+
<p className="text-xl text-zinc-400 max-w-2xl mx-auto mb-8">
|
|
199
|
+
Stories about product updates, engineering challenges, and the future of document automation.
|
|
200
|
+
</p>
|
|
201
|
+
|
|
202
|
+
{/* Search */}
|
|
203
|
+
<div className="max-w-md mx-auto relative">
|
|
204
|
+
<Icons.search className="w-5 h-5 absolute left-4 top-1/2 -translate-y-1/2 text-zinc-500" />
|
|
205
|
+
<Input
|
|
206
|
+
type="text"
|
|
207
|
+
placeholder="Search articles..."
|
|
208
|
+
value={searchQuery}
|
|
209
|
+
onChange={(e) => setSearchQuery(e.target.value)}
|
|
210
|
+
className="pl-12 h-12"
|
|
211
|
+
/>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
</section>
|
|
215
|
+
|
|
216
|
+
{/* Category Filter */}
|
|
217
|
+
<section className="py-6 border-b border-zinc-800 sticky top-0 bg-[#0F0F14]/95 backdrop-blur z-10">
|
|
218
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
219
|
+
<div className="flex items-center gap-2 overflow-x-auto pb-2">
|
|
220
|
+
{categories.map((category) => (
|
|
221
|
+
<button
|
|
222
|
+
key={category}
|
|
223
|
+
onClick={() => setActiveCategory(category)}
|
|
224
|
+
className={cn(
|
|
225
|
+
"px-4 py-2 rounded-full text-sm font-medium whitespace-nowrap transition-colors",
|
|
226
|
+
activeCategory === category
|
|
227
|
+
? "bg-purple-500 text-white"
|
|
228
|
+
: "bg-zinc-800 text-zinc-400 hover:bg-zinc-700 hover:text-white"
|
|
229
|
+
)}
|
|
230
|
+
>
|
|
231
|
+
{category}
|
|
232
|
+
</button>
|
|
233
|
+
))}
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
</section>
|
|
237
|
+
|
|
238
|
+
{/* Blog Posts */}
|
|
239
|
+
<section className="py-12">
|
|
240
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
241
|
+
{filteredPosts.length === 0 ? (
|
|
242
|
+
<div className="text-center py-16">
|
|
243
|
+
<p className="text-zinc-400">No articles found matching your criteria.</p>
|
|
244
|
+
</div>
|
|
245
|
+
) : (
|
|
246
|
+
<>
|
|
247
|
+
{/* Featured Post */}
|
|
248
|
+
{featuredPost && (
|
|
249
|
+
<div className="mb-12">
|
|
250
|
+
<BlogPost {...featuredPost} featured />
|
|
251
|
+
</div>
|
|
252
|
+
)}
|
|
253
|
+
|
|
254
|
+
{/* Post Grid */}
|
|
255
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
256
|
+
{otherPosts.map((post, index) => (
|
|
257
|
+
<BlogPost key={index} {...post} />
|
|
258
|
+
))}
|
|
259
|
+
</div>
|
|
260
|
+
|
|
261
|
+
{/* Load More */}
|
|
262
|
+
<div className="text-center mt-12">
|
|
263
|
+
<Button variant="outline" size="lg">
|
|
264
|
+
Load more articles
|
|
265
|
+
<Icons.arrowRight className="w-4 h-4 ml-2" />
|
|
266
|
+
</Button>
|
|
267
|
+
</div>
|
|
268
|
+
</>
|
|
269
|
+
)}
|
|
270
|
+
</div>
|
|
271
|
+
</section>
|
|
272
|
+
|
|
273
|
+
{/* Newsletter */}
|
|
274
|
+
<section className="py-16 border-t border-zinc-800">
|
|
275
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
276
|
+
<Card className="bg-gradient-to-r from-purple-900/50 to-orange-900/50 border-0">
|
|
277
|
+
<CardContent className="p-8 md:p-12 text-center">
|
|
278
|
+
<h2 className="text-2xl md:text-3xl font-bold mb-3">Stay in the loop</h2>
|
|
279
|
+
<p className="text-zinc-300 mb-6 max-w-md mx-auto">
|
|
280
|
+
Get the latest articles and product updates delivered to your inbox.
|
|
281
|
+
</p>
|
|
282
|
+
<div className="flex gap-3 max-w-md mx-auto">
|
|
283
|
+
<Input type="email" placeholder="you@example.com" className="flex-1" />
|
|
284
|
+
<Button>Subscribe</Button>
|
|
285
|
+
</div>
|
|
286
|
+
</CardContent>
|
|
287
|
+
</Card>
|
|
288
|
+
</div>
|
|
289
|
+
</section>
|
|
290
|
+
</div>
|
|
291
|
+
)
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export default BlogPage
|