eny.space Landingpage
1"use client"
2
3import * as React from "react"
4
5import {
6 Example,
7 ExampleWrapper,
8} from "@/actions/components/example"
9import {
10 AlertDialog,
11 AlertDialogAction,
12 AlertDialogCancel,
13 AlertDialogContent,
14 AlertDialogDescription,
15 AlertDialogFooter,
16 AlertDialogHeader,
17 AlertDialogMedia,
18 AlertDialogTitle,
19 AlertDialogTrigger,
20} from "@/actions/components/ui/alert-dialog"
21import { Badge } from "@/actions/components/ui/badge"
22import { Button } from "@/actions/components/ui/button"
23import {
24 Card,
25 CardAction,
26 CardContent,
27 CardDescription,
28 CardFooter,
29 CardHeader,
30 CardTitle,
31} from "@/actions/components/ui/card"
32import {
33 Combobox,
34 ComboboxContent,
35 ComboboxEmpty,
36 ComboboxInput,
37 ComboboxItem,
38 ComboboxList,
39} from "@/actions/components/ui/combobox"
40import {
41 DropdownMenu,
42 DropdownMenuCheckboxItem,
43 DropdownMenuContent,
44 DropdownMenuGroup,
45 DropdownMenuItem,
46 DropdownMenuLabel,
47 DropdownMenuPortal,
48 DropdownMenuRadioGroup,
49 DropdownMenuRadioItem,
50 DropdownMenuSeparator,
51 DropdownMenuShortcut,
52 DropdownMenuSub,
53 DropdownMenuSubContent,
54 DropdownMenuSubTrigger,
55 DropdownMenuTrigger,
56} from "@/actions/components/ui/dropdown-menu"
57import { Field, FieldGroup, FieldLabel } from "@/actions/components/ui/field"
58import { Input } from "@/actions/components/ui/input"
59import {
60 Select,
61 SelectContent,
62 SelectGroup,
63 SelectItem,
64 SelectTrigger,
65 SelectValue,
66} from "@/actions/components/ui/select"
67import { Textarea } from "@/actions/components/ui/textarea"
68import { PlusIcon, BluetoothIcon, MoreVerticalIcon, FileIcon, FolderIcon, FolderOpenIcon, FileCodeIcon, MoreHorizontalIcon, FolderSearchIcon, SaveIcon, DownloadIcon, EyeIcon, LayoutIcon, PaletteIcon, SunIcon, MoonIcon, MonitorIcon, UserIcon, CreditCardIcon, SettingsIcon, KeyboardIcon, LanguagesIcon, BellIcon, MailIcon, ShieldIcon, HelpCircleIcon, FileTextIcon, LogOutIcon } from "lucide-react"
69
70export function ComponentExample() {
71 return (
72 <ExampleWrapper>
73 <CardExample />
74 <FormExample />
75 </ExampleWrapper>
76 )
77}
78
79function CardExample() {
80 return (
81 <Example title="Card" className="items-center justify-center">
82 <Card className="relative w-full max-w-sm overflow-hidden pt-0">
83 <div className="absolute inset-0 z-30 aspect-video bg-primary opacity-50 mix-blend-color" />
84 <img
85 src="https://images.unsplash.com/photo-1604076850742-4c7221f3101b?q=80&w=1887&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
86 alt="Photo by mymind on Unsplash"
87 title="Photo by mymind on Unsplash"
88 className="relative z-20 aspect-video w-full object-cover brightness-60 grayscale"
89 />
90 <CardHeader>
91 <CardTitle>Observability Plus is replacing Monitoring</CardTitle>
92 <CardDescription>
93 Switch to the improved way to explore your data, with natural
94 language. Monitoring will no longer be available on the Pro plan in
95 November, 2025
96 </CardDescription>
97 </CardHeader>
98 <CardFooter>
99 <AlertDialog>
100 <AlertDialogTrigger asChild>
101 <Button>
102 <PlusIcon data-icon="inline-start" />
103 Show Dialog
104 </Button>
105 </AlertDialogTrigger>
106 <AlertDialogContent size="sm">
107 <AlertDialogHeader>
108 <AlertDialogMedia>
109 <BluetoothIcon
110 />
111 </AlertDialogMedia>
112 <AlertDialogTitle>Allow accessory to connect?</AlertDialogTitle>
113 <AlertDialogDescription>
114 Do you want to allow the USB accessory to connect to this
115 device?
116 </AlertDialogDescription>
117 </AlertDialogHeader>
118 <AlertDialogFooter>
119 <AlertDialogCancel>Don't allow</AlertDialogCancel>
120 <AlertDialogAction>Allow</AlertDialogAction>
121 </AlertDialogFooter>
122 </AlertDialogContent>
123 </AlertDialog>
124 <Badge variant="secondary" className="ml-auto">
125 Warning
126 </Badge>
127 </CardFooter>
128 </Card>
129 </Example>
130 )
131}
132
133const frameworks = [
134 "Next.js",
135 "SvelteKit",
136 "Nuxt.js",
137 "Remix",
138 "Astro",
139] as const
140
141function FormExample() {
142 const [notifications, setNotifications] = React.useState({
143 email: true,
144 sms: false,
145 push: true,
146 })
147 const [theme, setTheme] = React.useState("light")
148
149 return (
150 <Example title="Form">
151 <Card className="w-full max-w-md">
152 <CardHeader>
153 <CardTitle>User Information</CardTitle>
154 <CardDescription>Please fill in your details below</CardDescription>
155 <CardAction>
156 <DropdownMenu>
157 <DropdownMenuTrigger asChild>
158 <Button variant="ghost" size="icon">
159 <MoreVerticalIcon
160 />
161 <span className="sr-only">More options</span>
162 </Button>
163 </DropdownMenuTrigger>
164 <DropdownMenuContent align="end" className="w-56">
165 <DropdownMenuGroup>
166 <DropdownMenuLabel>File</DropdownMenuLabel>
167 <DropdownMenuItem>
168 <FileIcon
169 />
170 New File
171 <DropdownMenuShortcut>⌘N</DropdownMenuShortcut>
172 </DropdownMenuItem>
173 <DropdownMenuItem>
174 <FolderIcon
175 />
176 New Folder
177 <DropdownMenuShortcut>⇧⌘N</DropdownMenuShortcut>
178 </DropdownMenuItem>
179 <DropdownMenuSub>
180 <DropdownMenuSubTrigger>
181 <FolderOpenIcon
182 />
183 Open Recent
184 </DropdownMenuSubTrigger>
185 <DropdownMenuPortal>
186 <DropdownMenuSubContent>
187 <DropdownMenuGroup>
188 <DropdownMenuLabel>Recent Projects</DropdownMenuLabel>
189 <DropdownMenuItem>
190 <FileCodeIcon
191 />
192 Project Alpha
193 </DropdownMenuItem>
194 <DropdownMenuItem>
195 <FileCodeIcon
196 />
197 Project Beta
198 </DropdownMenuItem>
199 <DropdownMenuSub>
200 <DropdownMenuSubTrigger>
201 <MoreHorizontalIcon
202 />
203 More Projects
204 </DropdownMenuSubTrigger>
205 <DropdownMenuPortal>
206 <DropdownMenuSubContent>
207 <DropdownMenuItem>
208 <FileCodeIcon
209 />
210 Project Gamma
211 </DropdownMenuItem>
212 <DropdownMenuItem>
213 <FileCodeIcon
214 />
215 Project Delta
216 </DropdownMenuItem>
217 </DropdownMenuSubContent>
218 </DropdownMenuPortal>
219 </DropdownMenuSub>
220 </DropdownMenuGroup>
221 <DropdownMenuSeparator />
222 <DropdownMenuGroup>
223 <DropdownMenuItem>
224 <FolderSearchIcon
225 />
226 Browse...
227 </DropdownMenuItem>
228 </DropdownMenuGroup>
229 </DropdownMenuSubContent>
230 </DropdownMenuPortal>
231 </DropdownMenuSub>
232 <DropdownMenuSeparator />
233 <DropdownMenuItem>
234 <SaveIcon
235 />
236 Save
237 <DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
238 </DropdownMenuItem>
239 <DropdownMenuItem>
240 <DownloadIcon
241 />
242 Export
243 <DropdownMenuShortcut>⇧⌘E</DropdownMenuShortcut>
244 </DropdownMenuItem>
245 </DropdownMenuGroup>
246 <DropdownMenuSeparator />
247 <DropdownMenuGroup>
248 <DropdownMenuLabel>View</DropdownMenuLabel>
249 <DropdownMenuCheckboxItem
250 checked={notifications.email}
251 onCheckedChange={(checked) =>
252 setNotifications({
253 ...notifications,
254 email: checked === true,
255 })
256 }
257 >
258 <EyeIcon
259 />
260 Show Sidebar
261 </DropdownMenuCheckboxItem>
262 <DropdownMenuCheckboxItem
263 checked={notifications.sms}
264 onCheckedChange={(checked) =>
265 setNotifications({
266 ...notifications,
267 sms: checked === true,
268 })
269 }
270 >
271 <LayoutIcon
272 />
273 Show Status Bar
274 </DropdownMenuCheckboxItem>
275 <DropdownMenuSub>
276 <DropdownMenuSubTrigger>
277 <PaletteIcon
278 />
279 Theme
280 </DropdownMenuSubTrigger>
281 <DropdownMenuPortal>
282 <DropdownMenuSubContent>
283 <DropdownMenuGroup>
284 <DropdownMenuLabel>Appearance</DropdownMenuLabel>
285 <DropdownMenuRadioGroup
286 value={theme}
287 onValueChange={setTheme}
288 >
289 <DropdownMenuRadioItem value="light">
290 <SunIcon
291 />
292 Light
293 </DropdownMenuRadioItem>
294 <DropdownMenuRadioItem value="dark">
295 <MoonIcon
296 />
297 Dark
298 </DropdownMenuRadioItem>
299 <DropdownMenuRadioItem value="system">
300 <MonitorIcon
301 />
302 System
303 </DropdownMenuRadioItem>
304 </DropdownMenuRadioGroup>
305 </DropdownMenuGroup>
306 </DropdownMenuSubContent>
307 </DropdownMenuPortal>
308 </DropdownMenuSub>
309 </DropdownMenuGroup>
310 <DropdownMenuSeparator />
311 <DropdownMenuGroup>
312 <DropdownMenuLabel>Account</DropdownMenuLabel>
313 <DropdownMenuItem>
314 <UserIcon
315 />
316 Profile
317 <DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
318 </DropdownMenuItem>
319 <DropdownMenuItem>
320 <CreditCardIcon
321 />
322 Billing
323 </DropdownMenuItem>
324 <DropdownMenuSub>
325 <DropdownMenuSubTrigger>
326 <SettingsIcon
327 />
328 Settings
329 </DropdownMenuSubTrigger>
330 <DropdownMenuPortal>
331 <DropdownMenuSubContent>
332 <DropdownMenuGroup>
333 <DropdownMenuLabel>Preferences</DropdownMenuLabel>
334 <DropdownMenuItem>
335 <KeyboardIcon
336 />
337 Keyboard Shortcuts
338 </DropdownMenuItem>
339 <DropdownMenuItem>
340 <LanguagesIcon
341 />
342 Language
343 </DropdownMenuItem>
344 <DropdownMenuSub>
345 <DropdownMenuSubTrigger>
346 <BellIcon
347 />
348 Notifications
349 </DropdownMenuSubTrigger>
350 <DropdownMenuPortal>
351 <DropdownMenuSubContent>
352 <DropdownMenuGroup>
353 <DropdownMenuLabel>
354 Notification Types
355 </DropdownMenuLabel>
356 <DropdownMenuCheckboxItem
357 checked={notifications.push}
358 onCheckedChange={(checked) =>
359 setNotifications({
360 ...notifications,
361 push: checked === true,
362 })
363 }
364 >
365 <BellIcon
366 />
367 Push Notifications
368 </DropdownMenuCheckboxItem>
369 <DropdownMenuCheckboxItem
370 checked={notifications.email}
371 onCheckedChange={(checked) =>
372 setNotifications({
373 ...notifications,
374 email: checked === true,
375 })
376 }
377 >
378 <MailIcon
379 />
380 Email Notifications
381 </DropdownMenuCheckboxItem>
382 </DropdownMenuGroup>
383 </DropdownMenuSubContent>
384 </DropdownMenuPortal>
385 </DropdownMenuSub>
386 </DropdownMenuGroup>
387 <DropdownMenuSeparator />
388 <DropdownMenuGroup>
389 <DropdownMenuItem>
390 <ShieldIcon
391 />
392 Privacy & Security
393 </DropdownMenuItem>
394 </DropdownMenuGroup>
395 </DropdownMenuSubContent>
396 </DropdownMenuPortal>
397 </DropdownMenuSub>
398 </DropdownMenuGroup>
399 <DropdownMenuSeparator />
400 <DropdownMenuGroup>
401 <DropdownMenuItem>
402 <HelpCircleIcon
403 />
404 Help & Support
405 </DropdownMenuItem>
406 <DropdownMenuItem>
407 <FileTextIcon
408 />
409 Documentation
410 </DropdownMenuItem>
411 </DropdownMenuGroup>
412 <DropdownMenuSeparator />
413 <DropdownMenuGroup>
414 <DropdownMenuItem variant="destructive">
415 <LogOutIcon
416 />
417 Sign Out
418 <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
419 </DropdownMenuItem>
420 </DropdownMenuGroup>
421 </DropdownMenuContent>
422 </DropdownMenu>
423 </CardAction>
424 </CardHeader>
425 <CardContent>
426 <form>
427 <FieldGroup>
428 <div className="grid grid-cols-2 gap-4">
429 <Field>
430 <FieldLabel htmlFor="small-form-name">Name</FieldLabel>
431 <Input
432 id="small-form-name"
433 placeholder="Enter your name"
434 required
435 />
436 </Field>
437 <Field>
438 <FieldLabel htmlFor="small-form-role">Role</FieldLabel>
439 <Select defaultValue="">
440 <SelectTrigger id="small-form-role">
441 <SelectValue placeholder="Select a role" />
442 </SelectTrigger>
443 <SelectContent>
444 <SelectGroup>
445 <SelectItem value="developer">Developer</SelectItem>
446 <SelectItem value="designer">Designer</SelectItem>
447 <SelectItem value="manager">Manager</SelectItem>
448 <SelectItem value="other">Other</SelectItem>
449 </SelectGroup>
450 </SelectContent>
451 </Select>
452 </Field>
453 </div>
454 <Field>
455 <FieldLabel htmlFor="small-form-framework">
456 Framework
457 </FieldLabel>
458 <Combobox items={frameworks}>
459 <ComboboxInput
460 id="small-form-framework"
461 placeholder="Select a framework"
462 required
463 />
464 <ComboboxContent>
465 <ComboboxEmpty>No frameworks found.</ComboboxEmpty>
466 <ComboboxList>
467 {(item) => (
468 <ComboboxItem key={item} value={item}>
469 {item}
470 </ComboboxItem>
471 )}
472 </ComboboxList>
473 </ComboboxContent>
474 </Combobox>
475 </Field>
476 <Field>
477 <FieldLabel htmlFor="small-form-comments">Comments</FieldLabel>
478 <Textarea
479 id="small-form-comments"
480 placeholder="Add any additional comments"
481 />
482 </Field>
483 <Field orientation="horizontal">
484 <Button type="submit">Submit</Button>
485 <Button variant="outline" type="button">
486 Cancel
487 </Button>
488 </Field>
489 </FieldGroup>
490 </form>
491 </CardContent>
492 </Card>
493 </Example>
494 )
495}