@inspirare/design-system 0.0.8 → 0.0.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.
Files changed (54) hide show
  1. package/dist/index.css +1 -1
  2. package/package.json +5 -3
  3. package/src/App.css +184 -0
  4. package/src/App.tsx +222 -0
  5. package/src/assets/hero.png +0 -0
  6. package/src/assets/react.svg +1 -0
  7. package/src/assets/vite.svg +1 -0
  8. package/src/components/ui/accessibility-improvements.tsx +117 -0
  9. package/src/components/ui/accordion.tsx +66 -0
  10. package/src/components/ui/alert-dialog.tsx +151 -0
  11. package/src/components/ui/avatar.tsx +53 -0
  12. package/src/components/ui/badge.tsx +46 -0
  13. package/src/components/ui/button.tsx +59 -0
  14. package/src/components/ui/calendar.tsx +220 -0
  15. package/src/components/ui/card.tsx +92 -0
  16. package/src/components/ui/checkbox.tsx +32 -0
  17. package/src/components/ui/collapsible.tsx +36 -0
  18. package/src/components/ui/color-picker.tsx +183 -0
  19. package/src/components/ui/command.tsx +184 -0
  20. package/src/components/ui/dialog.tsx +157 -0
  21. package/src/components/ui/drawer.tsx +149 -0
  22. package/src/components/ui/dropdown-menu.tsx +259 -0
  23. package/src/components/ui/form.tsx +168 -0
  24. package/src/components/ui/hover-card.tsx +49 -0
  25. package/src/components/ui/input.tsx +21 -0
  26. package/src/components/ui/label.tsx +24 -0
  27. package/src/components/ui/popover.tsx +55 -0
  28. package/src/components/ui/progress.tsx +31 -0
  29. package/src/components/ui/radio-group.tsx +43 -0
  30. package/src/components/ui/scroll-area.tsx +32 -0
  31. package/src/components/ui/select.tsx +185 -0
  32. package/src/components/ui/separator.tsx +28 -0
  33. package/src/components/ui/sheet.tsx +153 -0
  34. package/src/components/ui/skeleton.tsx +121 -0
  35. package/src/components/ui/slider.tsx +63 -0
  36. package/src/components/ui/sonner.tsx +25 -0
  37. package/src/components/ui/switch.tsx +35 -0
  38. package/src/components/ui/table.tsx +116 -0
  39. package/src/components/ui/tabs.tsx +66 -0
  40. package/src/components/ui/textarea.tsx +18 -0
  41. package/src/components/ui/theme-toggle.tsx +106 -0
  42. package/src/components/ui/toggle-group.tsx +73 -0
  43. package/src/components/ui/toggle.tsx +47 -0
  44. package/src/components/ui/tooltip.tsx +68 -0
  45. package/src/demo/ButtonsDemo.tsx +82 -0
  46. package/src/demo/CalendarDemo.tsx +25 -0
  47. package/src/demo/FeedbackDemo.tsx +113 -0
  48. package/src/demo/FormsDemo.tsx +100 -0
  49. package/src/demo/NavigationDemo.tsx +141 -0
  50. package/src/demo/OverlaysDemo.tsx +187 -0
  51. package/src/index.css +1434 -0
  52. package/src/index.ts +41 -0
  53. package/src/lib/utils.ts +6 -0
  54. package/src/main.tsx +13 -0
@@ -0,0 +1,113 @@
1
+ import { Card, CardContent, CardHeader, CardTitle } from "../components/ui/card";
2
+ import { Progress } from "../components/ui/progress";
3
+ import { Skeleton } from "../components/ui/skeleton";
4
+ import { Avatar, AvatarFallback, AvatarImage } from "../components/ui/avatar";
5
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../components/ui/tooltip";
6
+ import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow } from "../components/ui/table";
7
+ import { Button } from "../components/ui/button";
8
+ import { useState, useEffect } from "react";
9
+
10
+ const invoices = [
11
+ { invoice: "INV001", paymentStatus: "Pago", totalAmount: "R$ 250,00", paymentMethod: "Cartão de Crédito" },
12
+ { invoice: "INV002", paymentStatus: "Pendente", totalAmount: "R$ 150,00", paymentMethod: "Boleto" },
13
+ { invoice: "INV003", paymentStatus: "Não Pago", totalAmount: "R$ 350,00", paymentMethod: "Pix" },
14
+ ];
15
+
16
+ export function FeedbackDemo() {
17
+ const [progress, setProgress] = useState(13);
18
+
19
+ useEffect(() => {
20
+ const timer = setTimeout(() => setProgress(66), 500);
21
+ return () => clearTimeout(timer);
22
+ }, []);
23
+
24
+ return (
25
+ <div className="space-y-8">
26
+ <Card>
27
+ <CardHeader>
28
+ <CardTitle>Progresso (Progress)</CardTitle>
29
+ </CardHeader>
30
+ <CardContent>
31
+ <Progress value={progress} className="w-[60%]" />
32
+ </CardContent>
33
+ </Card>
34
+
35
+ <Card>
36
+ <CardHeader>
37
+ <CardTitle>Esqueleto (Skeleton)</CardTitle>
38
+ </CardHeader>
39
+ <CardContent>
40
+ <div className="flex items-center space-x-4">
41
+ <Skeleton className="h-12 w-12 rounded-full" />
42
+ <div className="space-y-2">
43
+ <Skeleton className="h-4 w-[250px]" />
44
+ <Skeleton className="h-4 w-[200px]" />
45
+ </div>
46
+ </div>
47
+ </CardContent>
48
+ </Card>
49
+
50
+ <Card>
51
+ <CardHeader>
52
+ <CardTitle>Avatar</CardTitle>
53
+ </CardHeader>
54
+ <CardContent className="flex gap-4">
55
+ <Avatar>
56
+ <AvatarImage src="https://github.com/shadcn.png" alt="@shadcn" />
57
+ <AvatarFallback>CN</AvatarFallback>
58
+ </Avatar>
59
+ <Avatar>
60
+ <AvatarFallback>IN</AvatarFallback>
61
+ </Avatar>
62
+ </CardContent>
63
+ </Card>
64
+
65
+ <Card>
66
+ <CardHeader>
67
+ <CardTitle>Tooltip</CardTitle>
68
+ </CardHeader>
69
+ <CardContent>
70
+ <TooltipProvider>
71
+ <Tooltip>
72
+ <TooltipTrigger asChild>
73
+ <Button variant="outline">Passe o mouse</Button>
74
+ </TooltipTrigger>
75
+ <TooltipContent>
76
+ <p>Adicione à biblioteca</p>
77
+ </TooltipContent>
78
+ </Tooltip>
79
+ </TooltipProvider>
80
+ </CardContent>
81
+ </Card>
82
+
83
+ <Card>
84
+ <CardHeader>
85
+ <CardTitle>Tabela (Table)</CardTitle>
86
+ </CardHeader>
87
+ <CardContent>
88
+ <Table>
89
+ <TableCaption>Uma lista de faturas recentes.</TableCaption>
90
+ <TableHeader>
91
+ <TableRow>
92
+ <TableHead className="w-[100px]">Fatura</TableHead>
93
+ <TableHead>Status</TableHead>
94
+ <TableHead>Método</TableHead>
95
+ <TableHead className="text-right">Valor</TableHead>
96
+ </TableRow>
97
+ </TableHeader>
98
+ <TableBody>
99
+ {invoices.map((invoice) => (
100
+ <TableRow key={invoice.invoice}>
101
+ <TableCell className="font-medium">{invoice.invoice}</TableCell>
102
+ <TableCell>{invoice.paymentStatus}</TableCell>
103
+ <TableCell>{invoice.paymentMethod}</TableCell>
104
+ <TableCell className="text-right">{invoice.totalAmount}</TableCell>
105
+ </TableRow>
106
+ ))}
107
+ </TableBody>
108
+ </Table>
109
+ </CardContent>
110
+ </Card>
111
+ </div>
112
+ );
113
+ }
@@ -0,0 +1,100 @@
1
+ import { Card, CardContent, CardHeader, CardTitle } from "../components/ui/card";
2
+ import { Input } from "../components/ui/input";
3
+ import { Label } from "../components/ui/label";
4
+ import { Textarea } from "../components/ui/textarea";
5
+ import { Checkbox } from "../components/ui/checkbox";
6
+ import { RadioGroup, RadioGroupItem } from "../components/ui/radio-group";
7
+ import { Switch } from "../components/ui/switch";
8
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../components/ui/select";
9
+ import { Slider } from "../components/ui/slider";
10
+ import { ColorPicker } from "../components/ui/color-picker";
11
+
12
+ export function FormsDemo() {
13
+ return (
14
+ <div className="space-y-8">
15
+ <Card>
16
+ <CardHeader>
17
+ <CardTitle>Campos de Texto e Selects</CardTitle>
18
+ </CardHeader>
19
+ <CardContent className="space-y-6">
20
+ <div className="grid w-full max-w-sm items-center gap-1.5">
21
+ <Label htmlFor="email">E-mail</Label>
22
+ <Input type="email" id="email" placeholder="nome@exemplo.com" />
23
+ <p className="text-sm text-muted-foreground">Insira seu e-mail.</p>
24
+ </div>
25
+
26
+ <div className="grid w-full max-w-sm items-center gap-1.5">
27
+ <Label htmlFor="message">Mensagem</Label>
28
+ <Textarea id="message" placeholder="Escreva sua mensagem aqui." />
29
+ </div>
30
+
31
+ <div className="grid w-full max-w-sm items-center gap-1.5">
32
+ <Label htmlFor="framework">Framework favorito</Label>
33
+ <Select>
34
+ <SelectTrigger id="framework">
35
+ <SelectValue placeholder="Selecione um framework" />
36
+ </SelectTrigger>
37
+ <SelectContent>
38
+ <SelectItem value="react">React</SelectItem>
39
+ <SelectItem value="vue">Vue</SelectItem>
40
+ <SelectItem value="svelte">Svelte</SelectItem>
41
+ </SelectContent>
42
+ </Select>
43
+ </div>
44
+ </CardContent>
45
+ </Card>
46
+
47
+ <Card>
48
+ <CardHeader>
49
+ <CardTitle>Checkboxes, Radios e Switches</CardTitle>
50
+ </CardHeader>
51
+ <CardContent className="space-y-8">
52
+ <div className="flex items-center space-x-2">
53
+ <Checkbox id="terms" />
54
+ <Label htmlFor="terms">Aceitar termos e condições</Label>
55
+ </div>
56
+
57
+ <div className="space-y-3">
58
+ <Label>Notificações</Label>
59
+ <RadioGroup defaultValue="all">
60
+ <div className="flex items-center space-x-2">
61
+ <RadioGroupItem value="all" id="r1" />
62
+ <Label htmlFor="r1">Todas as notificações</Label>
63
+ </div>
64
+ <div className="flex items-center space-x-2">
65
+ <RadioGroupItem value="mentions" id="r2" />
66
+ <Label htmlFor="r2">Apenas menções</Label>
67
+ </div>
68
+ <div className="flex items-center space-x-2">
69
+ <RadioGroupItem value="none" id="r3" />
70
+ <Label htmlFor="r3">Nenhuma</Label>
71
+ </div>
72
+ </RadioGroup>
73
+ </div>
74
+
75
+ <div className="flex items-center space-x-2">
76
+ <Switch id="airplane-mode" />
77
+ <Label htmlFor="airplane-mode">Modo Avião</Label>
78
+ </div>
79
+ </CardContent>
80
+ </Card>
81
+
82
+ <Card>
83
+ <CardHeader>
84
+ <CardTitle>Seletores Especiais</CardTitle>
85
+ </CardHeader>
86
+ <CardContent className="space-y-8">
87
+ <div className="grid w-full max-w-sm items-center gap-3">
88
+ <Label>Slider (Deslizante)</Label>
89
+ <Slider defaultValue={[50]} max={100} step={1} />
90
+ </div>
91
+
92
+ <div className="grid w-full max-w-sm items-center gap-3">
93
+ <Label>Color Picker (Seletor de Cor)</Label>
94
+ <ColorPicker value="#dc663e" onChange={() => {}} />
95
+ </div>
96
+ </CardContent>
97
+ </Card>
98
+ </div>
99
+ );
100
+ }
@@ -0,0 +1,141 @@
1
+ import { Card, CardContent, CardHeader, CardTitle, CardDescription, CardFooter } from "../components/ui/card";
2
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "../components/ui/tabs";
3
+ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "../components/ui/accordion";
4
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../components/ui/collapsible";
5
+ import { ScrollArea } from "../components/ui/scroll-area";
6
+ import { Separator } from "../components/ui/separator";
7
+ import { Button } from "../components/ui/button";
8
+ import { ChevronsUpDown } from "lucide-react";
9
+ import { useState } from "react";
10
+
11
+ export function NavigationDemo() {
12
+ const [isOpen, setIsOpen] = useState(false);
13
+
14
+ return (
15
+ <div className="space-y-8">
16
+ <Card>
17
+ <CardHeader>
18
+ <CardTitle>Abas (Tabs)</CardTitle>
19
+ </CardHeader>
20
+ <CardContent>
21
+ <Tabs defaultValue="account" className="w-[400px]">
22
+ <TabsList className="grid w-full grid-cols-2">
23
+ <TabsTrigger value="account">Conta</TabsTrigger>
24
+ <TabsTrigger value="password">Senha</TabsTrigger>
25
+ </TabsList>
26
+ <TabsContent value="account" className="p-4 bg-muted/50 rounded-lg mt-2">
27
+ Faça alterações na sua conta aqui.
28
+ </TabsContent>
29
+ <TabsContent value="password" className="p-4 bg-muted/50 rounded-lg mt-2">
30
+ Mude sua senha aqui.
31
+ </TabsContent>
32
+ </Tabs>
33
+ </CardContent>
34
+ </Card>
35
+
36
+ <Card>
37
+ <CardHeader>
38
+ <CardTitle>Acordeão (Accordion)</CardTitle>
39
+ </CardHeader>
40
+ <CardContent>
41
+ <Accordion type="single" collapsible className="w-full">
42
+ <AccordionItem value="item-1">
43
+ <AccordionTrigger>É acessível?</AccordionTrigger>
44
+ <AccordionContent>
45
+ Sim. Ele adere ao padrão de design WAI-ARIA.
46
+ </AccordionContent>
47
+ </AccordionItem>
48
+ <AccordionItem value="item-2">
49
+ <AccordionTrigger>É estilizado?</AccordionTrigger>
50
+ <AccordionContent>
51
+ Sim. Vem com estilos padrão que combinam com as cores do Inspirare.
52
+ </AccordionContent>
53
+ </AccordionItem>
54
+ </Accordion>
55
+ </CardContent>
56
+ </Card>
57
+
58
+ <Card>
59
+ <CardHeader>
60
+ <CardTitle>Retrátil (Collapsible)</CardTitle>
61
+ </CardHeader>
62
+ <CardContent>
63
+ <Collapsible
64
+ open={isOpen}
65
+ onOpenChange={setIsOpen}
66
+ className="w-[350px] space-y-2"
67
+ >
68
+ <div className="flex items-center justify-between space-x-4 px-4">
69
+ <h4 className="text-sm font-semibold">
70
+ @peduarte favoritou 3 repositórios
71
+ </h4>
72
+ <CollapsibleTrigger asChild>
73
+ <Button variant="ghost" size="sm" className="w-9 p-0">
74
+ <ChevronsUpDown className="h-4 w-4" />
75
+ <span className="sr-only">Alternar</span>
76
+ </Button>
77
+ </CollapsibleTrigger>
78
+ </div>
79
+ <div className="rounded-md border px-4 py-3 font-mono text-sm">
80
+ @radix-ui/primitives
81
+ </div>
82
+ <CollapsibleContent className="space-y-2">
83
+ <div className="rounded-md border px-4 py-3 font-mono text-sm">
84
+ @radix-ui/colors
85
+ </div>
86
+ <div className="rounded-md border px-4 py-3 font-mono text-sm">
87
+ @stitches/react
88
+ </div>
89
+ </CollapsibleContent>
90
+ </Collapsible>
91
+ </CardContent>
92
+ </Card>
93
+
94
+ <Card>
95
+ <CardHeader>
96
+ <CardTitle>Área de Rolagem & Separador</CardTitle>
97
+ </CardHeader>
98
+ <CardContent>
99
+ <ScrollArea className="h-48 w-full md:w-[400px] rounded-md border">
100
+ <div className="p-4">
101
+ <h4 className="mb-4 text-sm font-medium leading-none">Tags</h4>
102
+ {Array.from({ length: 20 }).map((_, i, a) => (
103
+ <div key={i}>
104
+ <div className="text-sm">
105
+ Inspirare v1.{i}.0
106
+ </div>
107
+ {i !== a.length - 1 && <Separator className="my-2" />}
108
+ </div>
109
+ ))}
110
+ </div>
111
+ </ScrollArea>
112
+ </CardContent>
113
+ </Card>
114
+
115
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
116
+ <Card>
117
+ <CardHeader>
118
+ <CardTitle>Card Padrão</CardTitle>
119
+ <CardDescription>Um layout de card simples.</CardDescription>
120
+ </CardHeader>
121
+ <CardContent>
122
+ <p className="text-sm">Este é o conteúdo dentro do card.</p>
123
+ </CardContent>
124
+ <CardFooter>
125
+ <Button className="w-full">Ação</Button>
126
+ </CardFooter>
127
+ </Card>
128
+
129
+ <Card className="border-primary/50 bg-primary/5">
130
+ <CardHeader>
131
+ <CardTitle className="text-primary">Card Destacado</CardTitle>
132
+ <CardDescription>Um card com ênfase primária.</CardDescription>
133
+ </CardHeader>
134
+ <CardContent>
135
+ <p className="text-sm text-muted-foreground">Útil para informações importantes ou recursos premium.</p>
136
+ </CardContent>
137
+ </Card>
138
+ </div>
139
+ </div>
140
+ );
141
+ }
@@ -0,0 +1,187 @@
1
+ import { Card, CardContent, CardHeader, CardTitle } from "../components/ui/card";
2
+ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, DialogFooter } from "../components/ui/dialog";
3
+ import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger } from "../components/ui/drawer";
4
+ import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger } from "../components/ui/sheet";
5
+ import { Popover, PopoverContent, PopoverTrigger } from "../components/ui/popover";
6
+ import { HoverCard, HoverCardContent, HoverCardTrigger } from "../components/ui/hover-card";
7
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from "../components/ui/alert-dialog";
8
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from "../components/ui/dropdown-menu";
9
+ import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "../components/ui/command";
10
+ import { Button } from "../components/ui/button";
11
+
12
+ export function OverlaysDemo() {
13
+ return (
14
+ <div className="space-y-8">
15
+ <Card>
16
+ <CardHeader>
17
+ <CardTitle>Modais (Dialog, Alert Dialog, Sheet, Drawer)</CardTitle>
18
+ </CardHeader>
19
+ <CardContent className="flex flex-wrap gap-4">
20
+ <Dialog>
21
+ <DialogTrigger asChild>
22
+ <Button variant="outline">Abrir Dialog</Button>
23
+ </DialogTrigger>
24
+ <DialogContent className="sm:max-w-[425px]">
25
+ <DialogHeader>
26
+ <DialogTitle>Editar perfil</DialogTitle>
27
+ <DialogDescription>
28
+ Faça alterações no seu perfil aqui. Clique em salvar quando terminar.
29
+ </DialogDescription>
30
+ </DialogHeader>
31
+ <div className="grid gap-4 py-4">
32
+ <p className="text-sm">Conteúdo do modal vai aqui...</p>
33
+ </div>
34
+ <DialogFooter>
35
+ <Button type="submit">Salvar mudanças</Button>
36
+ </DialogFooter>
37
+ </DialogContent>
38
+ </Dialog>
39
+
40
+ <AlertDialog>
41
+ <AlertDialogTrigger asChild>
42
+ <Button variant="destructive">Abrir Alert Dialog</Button>
43
+ </AlertDialogTrigger>
44
+ <AlertDialogContent>
45
+ <AlertDialogHeader>
46
+ <AlertDialogTitle>Você tem certeza absoluta?</AlertDialogTitle>
47
+ <AlertDialogDescription>
48
+ Esta ação não pode ser desfeita. Isso excluirá permanentemente sua conta e removerá seus dados de nossos servidores.
49
+ </AlertDialogDescription>
50
+ </AlertDialogHeader>
51
+ <AlertDialogFooter>
52
+ <AlertDialogCancel>Cancelar</AlertDialogCancel>
53
+ <AlertDialogAction>Continuar</AlertDialogAction>
54
+ </AlertDialogFooter>
55
+ </AlertDialogContent>
56
+ </AlertDialog>
57
+
58
+ <Sheet>
59
+ <SheetTrigger asChild>
60
+ <Button variant="outline">Abrir Sheet (Painel)</Button>
61
+ </SheetTrigger>
62
+ <SheetContent>
63
+ <SheetHeader>
64
+ <SheetTitle>Tem certeza que deseja continuar?</SheetTitle>
65
+ <SheetDescription>
66
+ Esta ação abrirá um painel lateral na tela. Útil para menus e configurações em dispositivos móveis.
67
+ </SheetDescription>
68
+ </SheetHeader>
69
+ </SheetContent>
70
+ </Sheet>
71
+
72
+ <Drawer>
73
+ <DrawerTrigger asChild>
74
+ <Button variant="outline">Abrir Drawer (Gaveta)</Button>
75
+ </DrawerTrigger>
76
+ <DrawerContent>
77
+ <div className="mx-auto w-full max-w-sm">
78
+ <DrawerHeader>
79
+ <DrawerTitle>Definir meta</DrawerTitle>
80
+ <DrawerDescription>Defina sua meta de atividade diária.</DrawerDescription>
81
+ </DrawerHeader>
82
+ <div className="p-4 pb-0">
83
+ <div className="flex items-center justify-center space-x-2">
84
+ <p>Conteúdo da gaveta</p>
85
+ </div>
86
+ </div>
87
+ <DrawerFooter>
88
+ <Button>Salvar</Button>
89
+ <DrawerClose asChild>
90
+ <Button variant="outline">Cancelar</Button>
91
+ </DrawerClose>
92
+ </DrawerFooter>
93
+ </div>
94
+ </DrawerContent>
95
+ </Drawer>
96
+ </CardContent>
97
+ </Card>
98
+
99
+ <Card>
100
+ <CardHeader>
101
+ <CardTitle>Menús Flutuantes (Dropdown, Popover, HoverCard)</CardTitle>
102
+ </CardHeader>
103
+ <CardContent className="flex flex-wrap gap-4">
104
+ <DropdownMenu>
105
+ <DropdownMenuTrigger asChild>
106
+ <Button variant="outline">Menu (Dropdown)</Button>
107
+ </DropdownMenuTrigger>
108
+ <DropdownMenuContent>
109
+ <DropdownMenuLabel>Minha Conta</DropdownMenuLabel>
110
+ <DropdownMenuSeparator />
111
+ <DropdownMenuItem>Perfil</DropdownMenuItem>
112
+ <DropdownMenuItem>Faturamento</DropdownMenuItem>
113
+ <DropdownMenuItem>Equipe</DropdownMenuItem>
114
+ <DropdownMenuItem>Assinatura</DropdownMenuItem>
115
+ </DropdownMenuContent>
116
+ </DropdownMenu>
117
+
118
+ <Popover>
119
+ <PopoverTrigger asChild>
120
+ <Button variant="outline">Abrir Popover</Button>
121
+ </PopoverTrigger>
122
+ <PopoverContent className="w-80">
123
+ <div className="grid gap-4">
124
+ <div className="space-y-2">
125
+ <h4 className="font-medium leading-none">Dimensões</h4>
126
+ <p className="text-sm text-muted-foreground">
127
+ Defina as dimensões para a camada.
128
+ </p>
129
+ </div>
130
+ </div>
131
+ </PopoverContent>
132
+ </Popover>
133
+
134
+ <HoverCard>
135
+ <HoverCardTrigger asChild>
136
+ <Button variant="link">@nextjs</Button>
137
+ </HoverCardTrigger>
138
+ <HoverCardContent className="w-80">
139
+ <div className="flex justify-between space-x-4">
140
+ <div className="space-y-1">
141
+ <h4 className="text-sm font-semibold">@nextjs</h4>
142
+ <p className="text-sm">
143
+ The React Framework – created and maintained by @vercel.
144
+ </p>
145
+ <div className="flex items-center pt-2">
146
+ <span className="text-xs text-muted-foreground">
147
+ Entrou em Dezembro de 2021
148
+ </span>
149
+ </div>
150
+ </div>
151
+ </div>
152
+ </HoverCardContent>
153
+ </HoverCard>
154
+ </CardContent>
155
+ </Card>
156
+
157
+ <Card>
158
+ <CardHeader>
159
+ <CardTitle>Comandos (Command Palette)</CardTitle>
160
+ </CardHeader>
161
+ <CardContent>
162
+ <Command className="rounded-lg border shadow-md md:min-w-[450px] max-w-md">
163
+ <CommandInput placeholder="Digite um comando ou busque..." />
164
+ <CommandList>
165
+ <CommandEmpty>Nenhum resultado encontrado.</CommandEmpty>
166
+ <CommandGroup heading="Sugestões">
167
+ <CommandItem>Calendário</CommandItem>
168
+ <CommandItem>Procurar Emojis</CommandItem>
169
+ <CommandItem>Calculadora</CommandItem>
170
+ </CommandGroup>
171
+ <CommandSeparator />
172
+ <CommandGroup heading="Configurações">
173
+ <CommandItem>Perfil</CommandItem>
174
+ <CommandItem>Faturamento</CommandItem>
175
+ <CommandItem>Ajustes</CommandItem>
176
+ </CommandGroup>
177
+ </CommandList>
178
+ </Command>
179
+ </CardContent>
180
+ </Card>
181
+ </div>
182
+ );
183
+ }
184
+
185
+ function CommandSeparator() {
186
+ return <div className="-mx-1 h-px bg-border" />;
187
+ }