@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,328 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Button } from "../../src/components/common/button"
|
|
5
|
+
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "../../src/components/common/card"
|
|
6
|
+
import { Input } from "../../src/components/common/input"
|
|
7
|
+
import { Label } from "../../src/components/common/label"
|
|
8
|
+
import {
|
|
9
|
+
Select,
|
|
10
|
+
SelectContent,
|
|
11
|
+
SelectItem,
|
|
12
|
+
SelectTrigger,
|
|
13
|
+
SelectValue,
|
|
14
|
+
} from "../../src/components/ui/select"
|
|
15
|
+
import { cn } from "../../src/utils/cn"
|
|
16
|
+
|
|
17
|
+
// Icons
|
|
18
|
+
const Icons = {
|
|
19
|
+
mail: (props: React.SVGProps<SVGSVGElement>) => (
|
|
20
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
21
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/>
|
|
22
|
+
</svg>
|
|
23
|
+
),
|
|
24
|
+
phone: (props: React.SVGProps<SVGSVGElement>) => (
|
|
25
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
26
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"/>
|
|
27
|
+
</svg>
|
|
28
|
+
),
|
|
29
|
+
location: (props: React.SVGProps<SVGSVGElement>) => (
|
|
30
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
31
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"/>
|
|
32
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"/>
|
|
33
|
+
</svg>
|
|
34
|
+
),
|
|
35
|
+
clock: (props: React.SVGProps<SVGSVGElement>) => (
|
|
36
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
37
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
|
38
|
+
</svg>
|
|
39
|
+
),
|
|
40
|
+
chat: (props: React.SVGProps<SVGSVGElement>) => (
|
|
41
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" {...props}>
|
|
42
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"/>
|
|
43
|
+
</svg>
|
|
44
|
+
),
|
|
45
|
+
twitter: (props: React.SVGProps<SVGSVGElement>) => (
|
|
46
|
+
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
|
|
47
|
+
<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"/>
|
|
48
|
+
</svg>
|
|
49
|
+
),
|
|
50
|
+
linkedin: (props: React.SVGProps<SVGSVGElement>) => (
|
|
51
|
+
<svg fill="currentColor" viewBox="0 0 24 24" {...props}>
|
|
52
|
+
<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"/>
|
|
53
|
+
</svg>
|
|
54
|
+
),
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Contact Method Card
|
|
58
|
+
interface ContactMethodProps {
|
|
59
|
+
icon: React.ReactNode
|
|
60
|
+
title: string
|
|
61
|
+
description: string
|
|
62
|
+
action: string
|
|
63
|
+
href: string
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function ContactMethod({ icon, title, description, action, href }: ContactMethodProps) {
|
|
67
|
+
return (
|
|
68
|
+
<Card className="group hover:border-purple-500/50 transition-colors">
|
|
69
|
+
<CardContent className="p-6 text-center">
|
|
70
|
+
<div className="w-12 h-12 rounded-full bg-purple-500/10 flex items-center justify-center mx-auto mb-4 group-hover:bg-purple-500/20 transition-colors">
|
|
71
|
+
{icon}
|
|
72
|
+
</div>
|
|
73
|
+
<h3 className="font-semibold mb-1">{title}</h3>
|
|
74
|
+
<p className="text-sm text-zinc-400 mb-3">{description}</p>
|
|
75
|
+
<a href={href} className="text-sm text-purple-400 hover:text-purple-300 font-medium">
|
|
76
|
+
{action}
|
|
77
|
+
</a>
|
|
78
|
+
</CardContent>
|
|
79
|
+
</Card>
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Office Location Card
|
|
84
|
+
interface OfficeProps {
|
|
85
|
+
city: string
|
|
86
|
+
address: string[]
|
|
87
|
+
timezone: string
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function OfficeCard({ city, address, timezone }: OfficeProps) {
|
|
91
|
+
return (
|
|
92
|
+
<div className="p-5 rounded-lg bg-zinc-900/50 border border-zinc-800">
|
|
93
|
+
<h4 className="font-semibold mb-2">{city}</h4>
|
|
94
|
+
<div className="text-sm text-zinc-400 space-y-1 mb-3">
|
|
95
|
+
{address.map((line, i) => (
|
|
96
|
+
<p key={i}>{line}</p>
|
|
97
|
+
))}
|
|
98
|
+
</div>
|
|
99
|
+
<p className="text-xs text-zinc-500 flex items-center gap-1">
|
|
100
|
+
<Icons.clock className="w-3 h-3" />
|
|
101
|
+
{timezone}
|
|
102
|
+
</p>
|
|
103
|
+
</div>
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function ContactPage() {
|
|
108
|
+
const [isSubmitting, setIsSubmitting] = React.useState(false)
|
|
109
|
+
const [submitted, setSubmitted] = React.useState(false)
|
|
110
|
+
|
|
111
|
+
const handleSubmit = async (e: React.FormEvent) => {
|
|
112
|
+
e.preventDefault()
|
|
113
|
+
setIsSubmitting(true)
|
|
114
|
+
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
115
|
+
setIsSubmitting(false)
|
|
116
|
+
setSubmitted(true)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
<div className="min-h-screen bg-[#0F0F14] text-white">
|
|
121
|
+
{/* Header */}
|
|
122
|
+
<header className="border-b border-zinc-800">
|
|
123
|
+
<div className="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
|
|
124
|
+
<span className="text-xl font-bold">
|
|
125
|
+
<span className="text-purple-500">daily</span>
|
|
126
|
+
<span className="text-orange-500">X</span>
|
|
127
|
+
</span>
|
|
128
|
+
<nav className="hidden md:flex items-center gap-6">
|
|
129
|
+
<a href="#" className="text-sm text-zinc-400 hover:text-white transition-colors">Product</a>
|
|
130
|
+
<a href="#" className="text-sm text-zinc-400 hover:text-white transition-colors">Pricing</a>
|
|
131
|
+
<a href="#" className="text-sm text-zinc-400 hover:text-white transition-colors">About</a>
|
|
132
|
+
<a href="#" className="text-sm text-white font-medium">Contact</a>
|
|
133
|
+
<Button size="sm">Get Started</Button>
|
|
134
|
+
</nav>
|
|
135
|
+
</div>
|
|
136
|
+
</header>
|
|
137
|
+
|
|
138
|
+
{/* Hero */}
|
|
139
|
+
<section className="py-16 border-b border-zinc-800">
|
|
140
|
+
<div className="max-w-6xl mx-auto px-6 text-center">
|
|
141
|
+
<h1 className="text-4xl md:text-5xl font-bold mb-4">
|
|
142
|
+
Get in Touch
|
|
143
|
+
</h1>
|
|
144
|
+
<p className="text-xl text-zinc-400 max-w-2xl mx-auto">
|
|
145
|
+
Have a question or want to learn more? We'd love to hear from you.
|
|
146
|
+
</p>
|
|
147
|
+
</div>
|
|
148
|
+
</section>
|
|
149
|
+
|
|
150
|
+
{/* Contact Methods */}
|
|
151
|
+
<section className="py-12 border-b border-zinc-800">
|
|
152
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
153
|
+
<div className="grid md:grid-cols-3 gap-6">
|
|
154
|
+
<ContactMethod
|
|
155
|
+
icon={<Icons.chat className="w-6 h-6 text-purple-400" />}
|
|
156
|
+
title="Live Chat"
|
|
157
|
+
description="Chat with our team in real-time"
|
|
158
|
+
action="Start a conversation"
|
|
159
|
+
href="#"
|
|
160
|
+
/>
|
|
161
|
+
<ContactMethod
|
|
162
|
+
icon={<Icons.mail className="w-6 h-6 text-purple-400" />}
|
|
163
|
+
title="Email Us"
|
|
164
|
+
description="We'll respond within 24 hours"
|
|
165
|
+
action="hello@dailyx.com"
|
|
166
|
+
href="mailto:hello@dailyx.com"
|
|
167
|
+
/>
|
|
168
|
+
<ContactMethod
|
|
169
|
+
icon={<Icons.phone className="w-6 h-6 text-purple-400" />}
|
|
170
|
+
title="Call Us"
|
|
171
|
+
description="Mon-Fri from 9am to 6pm"
|
|
172
|
+
action="+1 (555) 000-0000"
|
|
173
|
+
href="tel:+15550000000"
|
|
174
|
+
/>
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
</section>
|
|
178
|
+
|
|
179
|
+
{/* Main Content */}
|
|
180
|
+
<section className="py-16">
|
|
181
|
+
<div className="max-w-6xl mx-auto px-6">
|
|
182
|
+
<div className="grid lg:grid-cols-2 gap-12">
|
|
183
|
+
{/* Contact Form */}
|
|
184
|
+
<div>
|
|
185
|
+
<Card>
|
|
186
|
+
<CardHeader>
|
|
187
|
+
<CardTitle>Send us a message</CardTitle>
|
|
188
|
+
<CardDescription>
|
|
189
|
+
Fill out the form below and we'll get back to you as soon as possible.
|
|
190
|
+
</CardDescription>
|
|
191
|
+
</CardHeader>
|
|
192
|
+
<CardContent>
|
|
193
|
+
{submitted ? (
|
|
194
|
+
<div className="text-center py-8">
|
|
195
|
+
<div className="w-16 h-16 rounded-full bg-green-500/20 flex items-center justify-center mx-auto mb-4">
|
|
196
|
+
<svg className="w-8 h-8 text-green-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
197
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
|
|
198
|
+
</svg>
|
|
199
|
+
</div>
|
|
200
|
+
<h3 className="text-lg font-semibold mb-2">Message sent!</h3>
|
|
201
|
+
<p className="text-zinc-400 mb-4">
|
|
202
|
+
Thanks for reaching out. We'll get back to you within 24 hours.
|
|
203
|
+
</p>
|
|
204
|
+
<Button variant="outline" onClick={() => setSubmitted(false)}>
|
|
205
|
+
Send another message
|
|
206
|
+
</Button>
|
|
207
|
+
</div>
|
|
208
|
+
) : (
|
|
209
|
+
<form onSubmit={handleSubmit} className="space-y-4">
|
|
210
|
+
<div className="grid grid-cols-2 gap-4">
|
|
211
|
+
<div className="space-y-2">
|
|
212
|
+
<Label htmlFor="firstName">First name</Label>
|
|
213
|
+
<Input id="firstName" placeholder="John" required />
|
|
214
|
+
</div>
|
|
215
|
+
<div className="space-y-2">
|
|
216
|
+
<Label htmlFor="lastName">Last name</Label>
|
|
217
|
+
<Input id="lastName" placeholder="Doe" required />
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
<div className="space-y-2">
|
|
222
|
+
<Label htmlFor="email">Email</Label>
|
|
223
|
+
<Input id="email" type="email" placeholder="john@company.com" required />
|
|
224
|
+
</div>
|
|
225
|
+
|
|
226
|
+
<div className="space-y-2">
|
|
227
|
+
<Label htmlFor="company">Company</Label>
|
|
228
|
+
<Input id="company" placeholder="Acme Inc." />
|
|
229
|
+
</div>
|
|
230
|
+
|
|
231
|
+
<div className="space-y-2">
|
|
232
|
+
<Label htmlFor="subject">Subject</Label>
|
|
233
|
+
<Select>
|
|
234
|
+
<SelectTrigger>
|
|
235
|
+
<SelectValue placeholder="Select a topic" />
|
|
236
|
+
</SelectTrigger>
|
|
237
|
+
<SelectContent>
|
|
238
|
+
<SelectItem value="sales">Sales inquiry</SelectItem>
|
|
239
|
+
<SelectItem value="support">Technical support</SelectItem>
|
|
240
|
+
<SelectItem value="partnership">Partnership</SelectItem>
|
|
241
|
+
<SelectItem value="feedback">Product feedback</SelectItem>
|
|
242
|
+
<SelectItem value="other">Other</SelectItem>
|
|
243
|
+
</SelectContent>
|
|
244
|
+
</Select>
|
|
245
|
+
</div>
|
|
246
|
+
|
|
247
|
+
<div className="space-y-2">
|
|
248
|
+
<Label htmlFor="message">Message</Label>
|
|
249
|
+
<textarea
|
|
250
|
+
id="message"
|
|
251
|
+
rows={4}
|
|
252
|
+
placeholder="Tell us how we can help..."
|
|
253
|
+
required
|
|
254
|
+
className="w-full px-3 py-2 rounded-md bg-zinc-900 border border-zinc-800 text-sm placeholder:text-zinc-500 focus:outline-none focus:border-purple-500 focus:ring-2 focus:ring-purple-500/20 resize-none"
|
|
255
|
+
/>
|
|
256
|
+
</div>
|
|
257
|
+
|
|
258
|
+
<Button type="submit" className="w-full" loading={isSubmitting}>
|
|
259
|
+
Send message
|
|
260
|
+
</Button>
|
|
261
|
+
</form>
|
|
262
|
+
)}
|
|
263
|
+
</CardContent>
|
|
264
|
+
</Card>
|
|
265
|
+
</div>
|
|
266
|
+
|
|
267
|
+
{/* Sidebar */}
|
|
268
|
+
<div className="space-y-8">
|
|
269
|
+
{/* Office Locations */}
|
|
270
|
+
<div>
|
|
271
|
+
<h3 className="text-lg font-semibold mb-4 flex items-center gap-2">
|
|
272
|
+
<Icons.location className="w-5 h-5 text-purple-400" />
|
|
273
|
+
Our Offices
|
|
274
|
+
</h3>
|
|
275
|
+
<div className="space-y-4">
|
|
276
|
+
<OfficeCard
|
|
277
|
+
city="San Francisco"
|
|
278
|
+
address={["123 Market Street", "Suite 400", "San Francisco, CA 94105"]}
|
|
279
|
+
timezone="PST (UTC-8)"
|
|
280
|
+
/>
|
|
281
|
+
<OfficeCard
|
|
282
|
+
city="New York"
|
|
283
|
+
address={["456 Broadway", "Floor 12", "New York, NY 10013"]}
|
|
284
|
+
timezone="EST (UTC-5)"
|
|
285
|
+
/>
|
|
286
|
+
<OfficeCard
|
|
287
|
+
city="London"
|
|
288
|
+
address={["78 Shoreditch High St", "London E1 6JJ", "United Kingdom"]}
|
|
289
|
+
timezone="GMT (UTC+0)"
|
|
290
|
+
/>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
|
|
294
|
+
{/* Social */}
|
|
295
|
+
<div>
|
|
296
|
+
<h3 className="text-lg font-semibold mb-4">Follow us</h3>
|
|
297
|
+
<div className="flex gap-3">
|
|
298
|
+
<a href="#" className="w-10 h-10 rounded-full bg-zinc-800 flex items-center justify-center hover:bg-zinc-700 transition-colors">
|
|
299
|
+
<Icons.twitter className="w-5 h-5" />
|
|
300
|
+
</a>
|
|
301
|
+
<a href="#" className="w-10 h-10 rounded-full bg-zinc-800 flex items-center justify-center hover:bg-zinc-700 transition-colors">
|
|
302
|
+
<Icons.linkedin className="w-5 h-5" />
|
|
303
|
+
</a>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
|
|
307
|
+
{/* FAQ CTA */}
|
|
308
|
+
<Card className="bg-gradient-to-br from-purple-900/30 to-orange-900/30 border-0">
|
|
309
|
+
<CardContent className="p-6">
|
|
310
|
+
<h3 className="font-semibold mb-2">Looking for quick answers?</h3>
|
|
311
|
+
<p className="text-sm text-zinc-400 mb-4">
|
|
312
|
+
Check out our FAQ and documentation for instant help.
|
|
313
|
+
</p>
|
|
314
|
+
<div className="flex gap-3">
|
|
315
|
+
<Button variant="outline" size="sm">View FAQ</Button>
|
|
316
|
+
<Button variant="outline" size="sm">Read Docs</Button>
|
|
317
|
+
</div>
|
|
318
|
+
</CardContent>
|
|
319
|
+
</Card>
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
323
|
+
</section>
|
|
324
|
+
</div>
|
|
325
|
+
)
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
export default ContactPage
|