xertica-ui 1.5.0 → 1.5.2
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/components/Sidebar.tsx +13 -0
- package/components/ui/accordion.tsx +10 -0
- package/components/ui/alert-dialog.tsx +10 -0
- package/components/ui/alert.tsx +11 -0
- package/components/ui/aspect-ratio.tsx +10 -0
- package/components/ui/avatar.tsx +10 -0
- package/components/ui/badge.tsx +10 -0
- package/components/ui/breadcrumb.tsx +10 -0
- package/components/ui/button.tsx +34 -8
- package/components/ui/calendar.tsx +10 -0
- package/components/ui/card.tsx +11 -0
- package/components/ui/carousel.tsx +10 -0
- package/components/ui/chart.tsx +10 -0
- package/components/ui/checkbox.tsx +19 -0
- package/components/ui/collapsible.tsx +9 -0
- package/components/ui/command.tsx +10 -0
- package/components/ui/context-menu.tsx +10 -0
- package/components/ui/dialog.tsx +12 -0
- package/components/ui/drawer.tsx +10 -0
- package/components/ui/dropdown-menu.tsx +12 -0
- package/components/ui/empty.tsx +10 -0
- package/components/ui/file-upload.tsx +11 -0
- package/components/ui/form.tsx +12 -0
- package/components/ui/hover-card.tsx +9 -0
- package/components/ui/input-otp.tsx +10 -0
- package/components/ui/input.tsx +24 -1
- package/components/ui/label.tsx +10 -0
- package/components/ui/map.tsx +12 -0
- package/components/ui/menubar.tsx +10 -0
- package/components/ui/navigation-menu.tsx +10 -0
- package/components/ui/notification-badge.tsx +10 -0
- package/components/ui/page-header.tsx +10 -0
- package/components/ui/pagination.tsx +10 -0
- package/components/ui/popover.tsx +10 -0
- package/components/ui/progress.tsx +10 -0
- package/components/ui/radio-group.tsx +10 -0
- package/components/ui/rating.tsx +10 -0
- package/components/ui/resizable.tsx +10 -0
- package/components/ui/route-map.tsx +11 -0
- package/components/ui/scroll-area.tsx +10 -0
- package/components/ui/search.tsx +10 -0
- package/components/ui/select.tsx +9 -0
- package/components/ui/separator.tsx +9 -0
- package/components/ui/sheet.tsx +9 -0
- package/components/ui/skeleton.tsx +10 -0
- package/components/ui/slider.tsx +10 -0
- package/components/ui/sonner.tsx +7 -16
- package/components/ui/stats-card.tsx +10 -0
- package/components/ui/stepper.tsx +10 -0
- package/components/ui/switch.tsx +9 -0
- package/components/ui/table.tsx +11 -0
- package/components/ui/tabs.tsx +12 -0
- package/components/ui/textarea.tsx +10 -0
- package/components/ui/timeline.tsx +10 -0
- package/components/ui/toggle-group.tsx +10 -0
- package/components/ui/toggle.tsx +9 -0
- package/components/ui/tooltip.tsx +10 -0
- package/components/ui/tree-view.tsx +10 -0
- package/components/ui/xertica-assistant.tsx +12 -0
- package/components.json +350 -0
- package/dist/components/Sidebar.d.ts +13 -0
- package/dist/components/ui/accordion.d.ts +10 -0
- package/dist/components/ui/alert-dialog.d.ts +10 -0
- package/dist/components/ui/alert.d.ts +11 -0
- package/dist/components/ui/aspect-ratio.d.ts +10 -0
- package/dist/components/ui/avatar.d.ts +10 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/breadcrumb.d.ts +10 -0
- package/dist/components/ui/button.d.ts +29 -5
- package/dist/components/ui/calendar.d.ts +10 -0
- package/dist/components/ui/card.d.ts +11 -0
- package/dist/components/ui/carousel.d.ts +10 -0
- package/dist/components/ui/chart.d.ts +10 -0
- package/dist/components/ui/checkbox.d.ts +19 -0
- package/dist/components/ui/collapsible.d.ts +9 -0
- package/dist/components/ui/command.d.ts +10 -0
- package/dist/components/ui/context-menu.d.ts +10 -0
- package/dist/components/ui/dialog.d.ts +12 -0
- package/dist/components/ui/drawer.d.ts +10 -0
- package/dist/components/ui/dropdown-menu.d.ts +12 -0
- package/dist/components/ui/empty.d.ts +10 -0
- package/dist/components/ui/file-upload.d.ts +11 -0
- package/dist/components/ui/form.d.ts +12 -0
- package/dist/components/ui/hover-card.d.ts +9 -0
- package/dist/components/ui/input-otp.d.ts +10 -0
- package/dist/components/ui/input.d.ts +24 -1
- package/dist/components/ui/label.d.ts +10 -0
- package/dist/components/ui/map.d.ts +12 -0
- package/dist/components/ui/menubar.d.ts +10 -0
- package/dist/components/ui/navigation-menu.d.ts +10 -0
- package/dist/components/ui/notification-badge.d.ts +10 -0
- package/dist/components/ui/page-header.d.ts +10 -0
- package/dist/components/ui/pagination.d.ts +10 -0
- package/dist/components/ui/popover.d.ts +10 -0
- package/dist/components/ui/progress.d.ts +10 -0
- package/dist/components/ui/radio-group.d.ts +10 -0
- package/dist/components/ui/rating.d.ts +10 -0
- package/dist/components/ui/resizable.d.ts +10 -0
- package/dist/components/ui/route-map.d.ts +11 -0
- package/dist/components/ui/scroll-area.d.ts +10 -0
- package/dist/components/ui/search.d.ts +10 -0
- package/dist/components/ui/select.d.ts +8 -0
- package/dist/components/ui/separator.d.ts +9 -0
- package/dist/components/ui/sheet.d.ts +9 -0
- package/dist/components/ui/skeleton.d.ts +10 -0
- package/dist/components/ui/slider.d.ts +10 -0
- package/dist/components/ui/sonner.d.ts +7 -16
- package/dist/components/ui/stats-card.d.ts +10 -0
- package/dist/components/ui/stepper.d.ts +10 -0
- package/dist/components/ui/switch.d.ts +9 -0
- package/dist/components/ui/table.d.ts +11 -0
- package/dist/components/ui/tabs.d.ts +12 -0
- package/dist/components/ui/textarea.d.ts +10 -0
- package/dist/components/ui/timeline.d.ts +10 -0
- package/dist/components/ui/toggle-group.d.ts +10 -0
- package/dist/components/ui/toggle.d.ts +9 -0
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tree-view.d.ts +10 -0
- package/dist/components/ui/xertica-assistant.d.ts +12 -0
- package/dist/xertica-ui.css +1 -1
- package/docs/ai-usage.md +18 -0
- package/docs/components/accordion.md +43 -0
- package/docs/components/alert-dialog.md +50 -0
- package/docs/components/alert.md +36 -0
- package/docs/components/aspect-ratio.md +26 -0
- package/docs/components/assistant.md +41 -0
- package/docs/components/avatar.md +32 -0
- package/docs/components/badge.md +30 -0
- package/docs/components/breadcrumb.md +47 -0
- package/docs/components/button.md +51 -0
- package/docs/components/calendar.md +34 -0
- package/docs/components/card.md +50 -0
- package/docs/components/carousel.md +57 -0
- package/docs/components/chart.md +62 -0
- package/docs/components/checkbox.md +37 -0
- package/docs/components/collapsible.md +38 -0
- package/docs/components/command.md +40 -0
- package/docs/components/context-menu.md +40 -0
- package/docs/components/dialog.md +60 -0
- package/docs/components/drawer.md +43 -0
- package/docs/components/dropdown-menu.md +51 -0
- package/docs/components/empty.md +22 -0
- package/docs/components/file-upload.md +27 -0
- package/docs/components/form.md +71 -0
- package/docs/components/hover-card.md +41 -0
- package/docs/components/input-otp.md +42 -0
- package/docs/components/input.md +57 -0
- package/docs/components/label.md +24 -0
- package/docs/components/map.md +46 -0
- package/docs/components/menubar.md +53 -0
- package/docs/components/navigation-menu.md +42 -0
- package/docs/components/notification-badge.md +28 -0
- package/docs/components/page-header.md +44 -0
- package/docs/components/pagination.md +56 -0
- package/docs/components/popover.md +43 -0
- package/docs/components/progress.md +29 -0
- package/docs/components/radio-group.md +43 -0
- package/docs/components/rating.md +32 -0
- package/docs/components/resizable.md +53 -0
- package/docs/components/scroll-area.md +33 -0
- package/docs/components/search.md +26 -0
- package/docs/components/select.md +49 -0
- package/docs/components/separator.md +38 -0
- package/docs/components/sheet.md +40 -0
- package/docs/components/sidebar.md +46 -0
- package/docs/components/skeleton.md +30 -0
- package/docs/components/slider.md +26 -0
- package/docs/components/sonner.md +39 -0
- package/docs/components/stats-card.md +24 -0
- package/docs/components/stepper.md +49 -0
- package/docs/components/switch.md +27 -0
- package/docs/components/table.md +54 -0
- package/docs/components/tabs.md +43 -0
- package/docs/components/textarea.md +21 -0
- package/docs/components/timeline.md +34 -0
- package/docs/components/toggle-group.md +38 -0
- package/docs/components/toggle.md +26 -0
- package/docs/components/tooltip.md +46 -0
- package/docs/components/tree-view.md +29 -0
- package/docs/getting-started.md +25 -0
- package/docs/guidelines.md +23 -0
- package/docs/installation.md +37 -0
- package/docs/patterns/analytics.md +62 -0
- package/docs/patterns/crud.md +76 -0
- package/docs/patterns/dashboard.md +85 -0
- package/docs/patterns/form.md +85 -0
- package/docs/patterns/login.md +54 -0
- package/llms-full.txt +2634 -0
- package/llms.txt +37 -0
- package/mcp/resources.json +22 -0
- package/mcp/tools.json +35 -0
- package/package.json +10 -2
- package/scripts/ai-validator.ts +83 -0
- package/scripts/generate-ai-manifests.ts +64 -0
- package/templates/package.json +1 -1
- package/templates/src/app/pages/CrudTemplate.tsx +106 -0
- package/templates/src/app/pages/DashboardTemplate.tsx +101 -0
- package/templates/src/app/pages/FormTemplate.tsx +109 -0
- package/templates/src/app/pages/LoginTemplate.tsx +52 -0
package/components/Sidebar.tsx
CHANGED
|
@@ -139,6 +139,19 @@ interface SidebarProps {
|
|
|
139
139
|
navigationGroups?: RouteGroup[];
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
+
/**
|
|
143
|
+
* Sidebar e Navegação Principal.
|
|
144
|
+
*
|
|
145
|
+
* @description
|
|
146
|
+
* Componente complexo que gerencia renderização em Desktop/Mobile com suporte a:
|
|
147
|
+
* - Modo Normal (Lista Simples)
|
|
148
|
+
* - Modo Assistent (Grupos, Pesquisa, Áreas Fixas)
|
|
149
|
+
*
|
|
150
|
+
* @ai-rules
|
|
151
|
+
* 1. NUNCA tente reinventar a Sidebar com classes tailwind. SEMPRE injete este componente no `layout` da aplicação (seja `App.tsx` ou em layout do Next.js).
|
|
152
|
+
* 2. Utilize a prop apropriada `variant="assistant"` ou `variant="default"`.
|
|
153
|
+
* 3. Garanta que o callback `navigate` manipule as rotas do seu roteador local.
|
|
154
|
+
*/
|
|
142
155
|
export function Sidebar({
|
|
143
156
|
expanded,
|
|
144
157
|
onToggle,
|
|
@@ -6,6 +6,16 @@ import { ChevronDownIcon } from "lucide-react";
|
|
|
6
6
|
|
|
7
7
|
import { cn } from "./utils";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Gerenciador de exibição oculta (collapse) vertical focada em empilhamento.
|
|
11
|
+
*
|
|
12
|
+
* @description
|
|
13
|
+
* Baseado em Radix UI Accordion para garantir acessibilidade via teclado.
|
|
14
|
+
*
|
|
15
|
+
* @ai-rules
|
|
16
|
+
* 1. `AccordionItem` REQUER OBRIGATORIAMENTE a prop `value`. Sem ela a lógica local quebra.
|
|
17
|
+
* 2. Em type="single", o accordion só abre um e fecha os outros. Requer prop `collapsible` para que possa fechar a si mesmo.
|
|
18
|
+
*/
|
|
9
19
|
function Accordion({
|
|
10
20
|
...props
|
|
11
21
|
}: React.ComponentProps<typeof AccordionPrimitive.Root>) {
|
|
@@ -6,6 +6,16 @@ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
|
|
|
6
6
|
import { cn } from "./utils";
|
|
7
7
|
import { buttonVariants } from "./button";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Diálogo estrito de requisição de ação destrutiva.
|
|
11
|
+
*
|
|
12
|
+
* @description
|
|
13
|
+
* Um modal que força interação (Sim/Não) bloqueando cliques fora de foco para evitar aceitação acidental.
|
|
14
|
+
*
|
|
15
|
+
* @ai-rules
|
|
16
|
+
* 1. Diferentemente do Dialog, exige imperativamente a bifurcação nos subcomponentes `<AlertDialogCancel>` ou `<AlertDialogAction>`.
|
|
17
|
+
* 2. Empregue somente em fluxos sem volta permanente. Para Informes simples, utilize apenas o `Dialog`.
|
|
18
|
+
*/
|
|
9
19
|
function AlertDialog({
|
|
10
20
|
...props
|
|
11
21
|
}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {
|
package/components/ui/alert.tsx
CHANGED
|
@@ -38,6 +38,17 @@ export interface AlertProps
|
|
|
38
38
|
icon?: React.ReactNode;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Bloco informativo fixo para chamar a atenção do usuário no fluxo de leitura.
|
|
43
|
+
*
|
|
44
|
+
* @description
|
|
45
|
+
* Ideal para exibir validações críticas não transientes ou alertas contextuais.
|
|
46
|
+
* Contém um ícone inerente baseado na variante (pode ser sobrescrito).
|
|
47
|
+
*
|
|
48
|
+
* @ai-rules
|
|
49
|
+
* 1. Sempre use a estrutura completa com `AlertTitle` e `AlertDescription` para não quebrar a tipografia interna.
|
|
50
|
+
* 2. Em telas divididas ou estreitas, o Alert se adapta preenchendo 100% da largura.
|
|
51
|
+
*/
|
|
41
52
|
function Alert({
|
|
42
53
|
className,
|
|
43
54
|
variant,
|
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Proporcionalizador de mídia em container geométrico exato.
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* Permite setar Box `16/9` ou `1/1` responsivo à largura para prevenir Layout-Shift CLS em Imagens.
|
|
10
|
+
*
|
|
11
|
+
* @ai-rules
|
|
12
|
+
* 1. Insira `ratio={16/9}` na raiz.
|
|
13
|
+
* 2. Force o componente filho (ex `<img>` ou `<video>`) a usar `w-full h-full object-cover`.
|
|
14
|
+
*/
|
|
5
15
|
function AspectRatio({
|
|
6
16
|
...props
|
|
7
17
|
}: React.ComponentProps<typeof AspectRatioPrimitive.Root>) {
|
package/components/ui/avatar.tsx
CHANGED
|
@@ -5,6 +5,16 @@ import * as AvatarPrimitive from "@radix-ui/react-avatar";
|
|
|
5
5
|
|
|
6
6
|
import { cn } from "./utils";
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Componente gráfico representativo de entidades e contas (Fotos de Perfil).
|
|
10
|
+
*
|
|
11
|
+
* @description
|
|
12
|
+
* Gerencia nativamente erros 404 e timeouts de imagens com fallback textual (Iniciais).
|
|
13
|
+
*
|
|
14
|
+
* @ai-rules
|
|
15
|
+
* 1. Em layouts complexos nunca coloque elementos HTML `<img>` para Perfil do Usuário; o Fallback interno previne UI quebras.
|
|
16
|
+
* 2. Instancie Root `<Avatar>`, `<AvatarImage>` e por fim `<AvatarFallback>` todos juntos.
|
|
17
|
+
*/
|
|
8
18
|
function Avatar({
|
|
9
19
|
className,
|
|
10
20
|
size = "md",
|
package/components/ui/badge.tsx
CHANGED
|
@@ -31,6 +31,16 @@ const badgeVariants = cva(
|
|
|
31
31
|
},
|
|
32
32
|
);
|
|
33
33
|
|
|
34
|
+
/**
|
|
35
|
+
* Etiqueta informacional de status.
|
|
36
|
+
*
|
|
37
|
+
* @description
|
|
38
|
+
* Indicador visual para tabelas, contadores e pequenas marcações. Não deve ser acionável.
|
|
39
|
+
*
|
|
40
|
+
* @ai-rules
|
|
41
|
+
* 1. Evite o uso da prop genérica `className` para forçar cores, utilize as variantes adequadas.
|
|
42
|
+
* 2. Em listas densas, a variação `outline` diminui o peso visual.
|
|
43
|
+
*/
|
|
34
44
|
export function Badge({
|
|
35
45
|
className,
|
|
36
46
|
variant,
|
|
@@ -4,6 +4,16 @@ import { ChevronRight, MoreHorizontal } from "lucide-react";
|
|
|
4
4
|
|
|
5
5
|
import { cn } from "./utils";
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Navegação hierárquica histórica.
|
|
9
|
+
*
|
|
10
|
+
* @description
|
|
11
|
+
* Permite que usuários vejam exatamente a hierarquia até a página atual e voltem níveis com facilidade.
|
|
12
|
+
*
|
|
13
|
+
* @ai-rules
|
|
14
|
+
* 1. Último nível sempre deve ser `<BreadcrumbPage>`, os do meio `<BreadcrumbLink>`.
|
|
15
|
+
* 2. Não insira `/` como string nativa, utilize o `<BreadcrumbSeparator>`.
|
|
16
|
+
*/
|
|
7
17
|
function Breadcrumb({ ...props }: React.ComponentProps<"nav">) {
|
|
8
18
|
return <nav aria-label="breadcrumb" data-slot="breadcrumb" {...props} />;
|
|
9
19
|
}
|
package/components/ui/button.tsx
CHANGED
|
@@ -35,14 +35,40 @@ const buttonVariants = cva(
|
|
|
35
35
|
},
|
|
36
36
|
);
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
>
|
|
38
|
+
/**
|
|
39
|
+
* Props para o componente Button.
|
|
40
|
+
*
|
|
41
|
+
* @interface ButtonProps
|
|
42
|
+
*/
|
|
43
|
+
export interface ButtonProps
|
|
44
|
+
extends React.ComponentProps<"button">,
|
|
45
|
+
VariantProps<typeof buttonVariants> {
|
|
46
|
+
/**
|
|
47
|
+
* Se true, renderiza o componente filho substituindo a tag <button>.
|
|
48
|
+
* Útil para injetar o estilo de botão em links (<Link href="...">).
|
|
49
|
+
*/
|
|
50
|
+
asChild?: boolean;
|
|
51
|
+
/** Se true, desabilita o botão e mostra um spinner de carregamento preservando a largura. */
|
|
52
|
+
loading?: boolean;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Botão principal do Design System Xertica.
|
|
57
|
+
*
|
|
58
|
+
* @description
|
|
59
|
+
* Componente obrigatório para todas as interações de clique que não sejam navegação nativa.
|
|
60
|
+
*
|
|
61
|
+
* @usage
|
|
62
|
+
* ```tsx
|
|
63
|
+
* <Button variant="default" onClick={submit}>Salvar</Button>
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* @ai-rules
|
|
67
|
+
* 1. NUNCA utilize a tag `<button>` nativa.
|
|
68
|
+
* 2. Em formulários, use `type="submit"` implicitamente.
|
|
69
|
+
* 3. Se precisar parecer um link, use `variant="link"`. Se precisar agir como link com aparência de botão, use `asChild` envelopando na Tag de Navegação.
|
|
70
|
+
*/
|
|
71
|
+
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(({
|
|
46
72
|
className,
|
|
47
73
|
variant,
|
|
48
74
|
size,
|
|
@@ -11,6 +11,16 @@ import {
|
|
|
11
11
|
import { cn } from "./utils"
|
|
12
12
|
import { Button, buttonVariants } from "./button"
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Componente seletor de Data montado no `react-day-picker`.
|
|
16
|
+
*
|
|
17
|
+
* @description
|
|
18
|
+
* Renderiza um calendário complexo mensal/anual customizado para a Xertica UI.
|
|
19
|
+
*
|
|
20
|
+
* @ai-rules
|
|
21
|
+
* 1. Frequentemente invocado dentro de menus Popover para virar um DatePicker em Formulários.
|
|
22
|
+
* 2. Controle a data via propriedade OBRIGATÓRIA `selected={Date}`.
|
|
23
|
+
*/
|
|
14
24
|
function Calendar({
|
|
15
25
|
className,
|
|
16
26
|
classNames,
|
package/components/ui/card.tsx
CHANGED
|
@@ -2,6 +2,17 @@ import * as React from "react";
|
|
|
2
2
|
|
|
3
3
|
import { cn } from "./utils";
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Base estrutural para agrupamento de conteúdo (Superfícies).
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* Dá volume e delimita um assunto visualmente, controlando cor de fundo (`bg-card`),
|
|
10
|
+
* arredondamento e paddings internos.
|
|
11
|
+
*
|
|
12
|
+
* @ai-rules
|
|
13
|
+
* 1. NUNCA crie divs cruas com `bg-white dark:bg-black rounded border shadow`. Utilize `<Card>`!
|
|
14
|
+
* 2. Componentize as descrições no interior usando a ordem semântica (`CardHeader` > `CardContent` > `CardFooter`).
|
|
15
|
+
*/
|
|
5
16
|
function Card({ className, ...props }: React.ComponentProps<"div">) {
|
|
6
17
|
return (
|
|
7
18
|
<div
|
|
@@ -42,6 +42,16 @@ function useCarousel() {
|
|
|
42
42
|
return context;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Visualizador horizonal fluido (Carrossel).
|
|
47
|
+
*
|
|
48
|
+
* @description
|
|
49
|
+
* Baseado no embla-carousel. A manipulação do grid é via flex-basis (`basis-1/3`).
|
|
50
|
+
*
|
|
51
|
+
* @ai-rules
|
|
52
|
+
* 1. OBRIGATORIAMENTE use as arrows providenciadas `CarouselPrevious` e `CarouselNext` se for para ter controles paralelos interativos.
|
|
53
|
+
* 2. NUNCA coloque Tabelas infinitas dentro de um Carrocel, eles servem primáriamente para Banners/Cards. Use `ScrollArea`.
|
|
54
|
+
*/
|
|
45
55
|
function Carousel({
|
|
46
56
|
orientation = "horizontal",
|
|
47
57
|
opts,
|
package/components/ui/chart.tsx
CHANGED
|
@@ -34,6 +34,16 @@ function useChart() {
|
|
|
34
34
|
return context;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Invólucro master do motor Recharts focado em Theme Injecting.
|
|
39
|
+
*
|
|
40
|
+
* @description
|
|
41
|
+
* Substitui injeção manual de temas para `recharts`. A leitura de Tailwind configs faz-se aqui.
|
|
42
|
+
*
|
|
43
|
+
* @ai-rules
|
|
44
|
+
* 1. Nunca passe colors Hex diretamente num `<Bar dataKey="..." fill="..." />` do Recharts. Use a injeção via `fill="var(--color-meuchart)"`.
|
|
45
|
+
* 2. O wrapper é mandatório para usar os subs `ChartLegend` e `ChartTooltip`.
|
|
46
|
+
*/
|
|
37
47
|
function ChartContainer({
|
|
38
48
|
id,
|
|
39
49
|
className,
|
|
@@ -6,6 +6,25 @@ import { Check } from "lucide-react";
|
|
|
6
6
|
|
|
7
7
|
import { cn } from "./utils";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Componente de Checkbox nativo do Radix UI estilizado.
|
|
11
|
+
*
|
|
12
|
+
* @description
|
|
13
|
+
* Usado para capturar marcação múltipla ou boolean única (Ex: Aceite termos).
|
|
14
|
+
*
|
|
15
|
+
* @usage
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <div className="flex items-center space-x-2">
|
|
18
|
+
* <Checkbox id="terms" />
|
|
19
|
+
* <label htmlFor="terms">Aceitar termos</label>
|
|
20
|
+
* </div>
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @ai-rules
|
|
24
|
+
* 1. NUNCA utilize `<input type="checkbox">` nativo.
|
|
25
|
+
* 2. Sempre envolva ou posicione ao lado de um `<label>` real usando `id` e `htmlFor` idênticos.
|
|
26
|
+
* 3. Para formulários Zod, utilize no contexto de `<FormControl>`.
|
|
27
|
+
*/
|
|
9
28
|
const Checkbox = React.forwardRef<
|
|
10
29
|
React.ElementRef<typeof CheckboxPrimitive.Root>,
|
|
11
30
|
React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Painel isolado que expõe e contrai um bloco de conteúdo (Collapse).
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* Ao contrário do Accordion, opera isoladamente e não controla irmãos na árvore DOm.
|
|
10
|
+
*
|
|
11
|
+
* @ai-rules
|
|
12
|
+
* 1. Requer OBRIGATORIAMENTE que o Agent providencie no filho `CollapsibleTrigger` um `<Button>` indicativo (geralmente com ícone Chevron).
|
|
13
|
+
*/
|
|
5
14
|
function Collapsible({
|
|
6
15
|
...props
|
|
7
16
|
}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {
|
|
@@ -13,6 +13,16 @@ import {
|
|
|
13
13
|
DialogTitle,
|
|
14
14
|
} from "./dialog";
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Menu de comandos pesquisáveis (Cmd+K / Spotlight).
|
|
18
|
+
*
|
|
19
|
+
* @description
|
|
20
|
+
* Baseado no cmdk. Abstrai a lógica da barra de busca que filtra grupos densos instantaneamente.
|
|
21
|
+
*
|
|
22
|
+
* @ai-rules
|
|
23
|
+
* 1. CommandInput não leva form-states. Ele apenas filtra nativamente o `CommandList` da DOM em tempo real.
|
|
24
|
+
* 2. `CommandItem` requer obrigatoriamente a prop `value` para ser indexado e filtrável por texto quando o componente filho interno não for apenas texto bruto.
|
|
25
|
+
*/
|
|
16
26
|
function Command({
|
|
17
27
|
className,
|
|
18
28
|
...props
|
|
@@ -6,6 +6,16 @@ import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react";
|
|
|
6
6
|
|
|
7
7
|
import { cn } from "./utils";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Menu local capturável pelo evento Direito do Mouse (Right-click).
|
|
11
|
+
*
|
|
12
|
+
* @description
|
|
13
|
+
* Traz a responsividade do OS para dentro das aplicações pesadas (Right click para ver opções de Tabela).
|
|
14
|
+
*
|
|
15
|
+
* @ai-rules
|
|
16
|
+
* 1. Não é ativado por cliques esquerdos típicos. Em Mobile puritanos é pouco usual sem abstração.
|
|
17
|
+
* 2. O `ContextMenuTrigger` deve cobrir visualmente o local do clique com dimensões claras na tela.
|
|
18
|
+
*/
|
|
9
19
|
function ContextMenu({
|
|
10
20
|
...props
|
|
11
21
|
}: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {
|
package/components/ui/dialog.tsx
CHANGED
|
@@ -7,6 +7,18 @@ import { cva, type VariantProps } from "class-variance-authority";
|
|
|
7
7
|
|
|
8
8
|
import { cn } from "./utils";
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Componente modal (overlay) que interrompe o fluxo para interação focada do usuário.
|
|
12
|
+
*
|
|
13
|
+
* @description
|
|
14
|
+
* Use isso para formulários de criação ("Criar Entidade"), telas de configuração
|
|
15
|
+
* restritas ou alertas massivos de tela cheia.
|
|
16
|
+
*
|
|
17
|
+
* @ai-rules
|
|
18
|
+
* 1. Sempre componha a ordem: `Dialog > DialogTrigger > DialogContent > (Header, Content, Footer)`.
|
|
19
|
+
* 2. O `DialogTrigger` frequentemente precisa do prop genérico `asChild` se aninhar um `<Button>`.
|
|
20
|
+
* 3. NUNCA utilize a tag HTML `<dialog>`.
|
|
21
|
+
*/
|
|
10
22
|
function Dialog({
|
|
11
23
|
...props
|
|
12
24
|
}: React.ComponentProps<typeof DialogPrimitive.Root>) {
|
package/components/ui/drawer.tsx
CHANGED
|
@@ -5,6 +5,16 @@ import { Drawer as DrawerPrimitive } from "vaul";
|
|
|
5
5
|
|
|
6
6
|
import { cn } from "./utils";
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Painel de gaveta acessível (Mobile-first).
|
|
10
|
+
*
|
|
11
|
+
* @description
|
|
12
|
+
* Substitui modais no dispositivo móvel subindo um painel puxável a partir do rodapé.
|
|
13
|
+
*
|
|
14
|
+
* @ai-rules
|
|
15
|
+
* 1. Semelhante ao Dialog genérico, componha com `DrawerTrigger`, `DrawerContent`, `DrawerHeader`, `DrawerFooter`.
|
|
16
|
+
* 2. Em telas mobile corporativas, prefira o Drawer para ações detalhadas e o Sheet exclusivo para Menus Ocultos de Navbar.
|
|
17
|
+
*/
|
|
8
18
|
function Drawer({
|
|
9
19
|
...props
|
|
10
20
|
}: React.ComponentProps<typeof DrawerPrimitive.Root>) {
|
|
@@ -6,6 +6,18 @@ import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react";
|
|
|
6
6
|
|
|
7
7
|
import { cn } from "./utils";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Menu suspenso de comandos e ações locais.
|
|
11
|
+
*
|
|
12
|
+
* @description
|
|
13
|
+
* Ao contrário do `<Select>`, o DropdownMenu não deve ser usado para preencher valores em inputs
|
|
14
|
+
* mas sim disparar ações (Ex: Abrir Perfil, Excluir Documento, Mover).
|
|
15
|
+
*
|
|
16
|
+
* @ai-rules
|
|
17
|
+
* 1. A composição requer a raiz `<DropdownMenu>` contendo `<DropdownMenuTrigger>` e `<DropdownMenuContent>`.
|
|
18
|
+
* 2. Itens internos são criados via `<DropdownMenuItem>`.
|
|
19
|
+
* 3. Se o Trigger abraçar um `<Button>` não-nativo, inclua OBRIGATORIAMENTE o prop genérico `asChild` no Trigger.
|
|
20
|
+
*/
|
|
9
21
|
function DropdownMenu({
|
|
10
22
|
...props
|
|
11
23
|
}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
|
package/components/ui/empty.tsx
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { cn } from "./utils";
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Componente representativo figurativo de uma Entidade sem Registro no DB.
|
|
6
|
+
*
|
|
7
|
+
* @description
|
|
8
|
+
* Substitui caixas vazias ou SVGs puros soltos pra comunicar que a query resultou em 0 achados.
|
|
9
|
+
*
|
|
10
|
+
* @ai-rules
|
|
11
|
+
* 1. NUNCA crie divs cruas "Nenhum valor achado". Use `<Empty> > <EmptyTitle> > <EmptyDescription>`.
|
|
12
|
+
* 2. Alinhe botões de CTA dentro de `<EmptyAction>`.
|
|
13
|
+
*/
|
|
4
14
|
const Empty = React.forwardRef<
|
|
5
15
|
HTMLDivElement,
|
|
6
16
|
React.HTMLAttributes<HTMLDivElement>
|
|
@@ -10,6 +10,17 @@ interface FileUploadProps extends Omit<React.InputHTMLAttributes<HTMLInputElemen
|
|
|
10
10
|
showPreview?: boolean;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Componente para upload de arquivos com suporte a drag-and-drop.
|
|
15
|
+
*
|
|
16
|
+
* @description
|
|
17
|
+
* Gerencia o estado de arquivos selecionados e fornece uma interface padronizada para upload.
|
|
18
|
+
*
|
|
19
|
+
* @ai-rules
|
|
20
|
+
* 1. Utilize `FileUploadTrigger` para definir a área de clique/arraste.
|
|
21
|
+
* 2. Utilize `FileUploadList` para exibir a lista de arquivos selecionados automaticamente.
|
|
22
|
+
* 3. Integre com `onChange` para capturar a lista de arquivos no estado do formulário.
|
|
23
|
+
*/
|
|
13
24
|
const FileUpload = React.forwardRef<HTMLDivElement, FileUploadProps>(
|
|
14
25
|
({
|
|
15
26
|
className,
|
package/components/ui/form.tsx
CHANGED
|
@@ -14,6 +14,18 @@ import {
|
|
|
14
14
|
import { cn } from "./utils";
|
|
15
15
|
import { Label } from "./label";
|
|
16
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Provedor raiz e controller de formulários.
|
|
19
|
+
*
|
|
20
|
+
* @description
|
|
21
|
+
* Envelopa instâncias de `react-hook-form` e provê o contexto global do formário
|
|
22
|
+
* para os componentes filhos (`FormField`, `FormControl`, `FormMessage`).
|
|
23
|
+
*
|
|
24
|
+
* @ai-rules
|
|
25
|
+
* 1. Sempre instancie este envolucro na extremidade do `return` de um formulário.
|
|
26
|
+
* 2. O hook `useForm` (com injetor Zod) é PRÉ-REQUISITO para usar este contexto.
|
|
27
|
+
* 3. Não crie inputs stateful com `useState` se já estiver dentro desta casca.
|
|
28
|
+
*/
|
|
17
29
|
const Form = FormProvider;
|
|
18
30
|
|
|
19
31
|
type FormFieldContextValue<
|
|
@@ -5,6 +5,15 @@ import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
|
|
|
5
5
|
|
|
6
6
|
import { cn } from "./utils";
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Overlay exibido no Hover exibindo um preview de um entidade.
|
|
10
|
+
*
|
|
11
|
+
* @description
|
|
12
|
+
* Nativamente otimizado com timeouts e debounces para não sobrecarregar a UX se o cursor passar velozmente por cima.
|
|
13
|
+
*
|
|
14
|
+
* @ai-rules
|
|
15
|
+
* 1. Se usado sob `<Avatar>` ou tags HTML literais `<a href>`, lembre-se do `asChild` prop no `HoverCardTrigger`.
|
|
16
|
+
*/
|
|
8
17
|
function HoverCard({
|
|
9
18
|
...props
|
|
10
19
|
}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {
|
|
@@ -6,6 +6,16 @@ import { MinusIcon } from "lucide-react";
|
|
|
6
6
|
|
|
7
7
|
import { cn } from "./utils";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Input formatado para códigos de uso único (OTP).
|
|
11
|
+
*
|
|
12
|
+
* @description
|
|
13
|
+
* Divide o input em slots individuais para facilitar a digitação de códigos de verificação.
|
|
14
|
+
*
|
|
15
|
+
* @ai-rules
|
|
16
|
+
* 1. O `maxLength` no Root deve corresponder ao número total de `InputOTPSlot`s.
|
|
17
|
+
* 2. Utilize `InputOTPGroup` para agrupar slots e `InputOTPSeparator` para divisores visuais.
|
|
18
|
+
*/
|
|
9
19
|
function InputOTP({
|
|
10
20
|
className,
|
|
11
21
|
containerClassName,
|
package/components/ui/input.tsx
CHANGED
|
@@ -2,10 +2,33 @@ import * as React from "react";
|
|
|
2
2
|
|
|
3
3
|
import { cn } from "./utils";
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Props para o componente Input.
|
|
7
|
+
*
|
|
8
|
+
* @interface InputProps
|
|
9
|
+
*/
|
|
10
|
+
export interface InputProps extends Omit<React.ComponentProps<"input">, "size"> {
|
|
11
|
+
/** Define o tamanho vertical e padding do input. */
|
|
6
12
|
size?: "sm" | "md" | "lg";
|
|
7
13
|
}
|
|
8
14
|
|
|
15
|
+
/**
|
|
16
|
+
* Campo de entrada de dados simples.
|
|
17
|
+
*
|
|
18
|
+
* @description
|
|
19
|
+
* Usado para capturar inputs de texto curto, senhas e números. Deve ser usado preferencialmente
|
|
20
|
+
* dentro de um `FormField` em aplicações que manipulam estado de formulário.
|
|
21
|
+
*
|
|
22
|
+
* @usage
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <Input type="email" placeholder="nome@exemplo.com" />
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @ai-rules
|
|
28
|
+
* 1. NUNCA utilize a tag `<input>` nativa.
|
|
29
|
+
* 2. Em formulários grandes conecte ao `react-hook-form` via `<FormControl>`.
|
|
30
|
+
* 3. Para blocos grandes de texto multi-linha (Descrição, Biografia), use o componente `<Textarea>` adequado, nunca `<Input>`.
|
|
31
|
+
*/
|
|
9
32
|
const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
10
33
|
({ className, type, size = "md", ...props }, ref) => {
|
|
11
34
|
const sizeClasses = {
|
package/components/ui/label.tsx
CHANGED
|
@@ -5,6 +5,16 @@ import * as LabelPrimitive from "@radix-ui/react-label";
|
|
|
5
5
|
|
|
6
6
|
import { cn } from "./utils";
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Etiqueta acessível para campos de formulário.
|
|
10
|
+
*
|
|
11
|
+
* @description
|
|
12
|
+
* Estilização padronizada para labels, com suporte a estados de erro e desabilitado.
|
|
13
|
+
*
|
|
14
|
+
* @ai-rules
|
|
15
|
+
* 1. Sempre associe ao input correspondente usando `htmlFor` e o `id` do input.
|
|
16
|
+
* 2. No contexto de `Form`, prefira o uso de `FormLabel`.
|
|
17
|
+
*/
|
|
8
18
|
function Label({
|
|
9
19
|
className,
|
|
10
20
|
...props
|
package/components/ui/map.tsx
CHANGED
|
@@ -411,6 +411,18 @@ const MapContent = React.forwardRef<HTMLDivElement, MapProps & { apiKey: string
|
|
|
411
411
|
);
|
|
412
412
|
MapContent.displayName = "MapContent";
|
|
413
413
|
|
|
414
|
+
/**
|
|
415
|
+
* Componente principal de Mapas baseado em Google Maps.
|
|
416
|
+
*
|
|
417
|
+
* @description
|
|
418
|
+
* Suporta Advanced Markers, Círculos, Polígonos e Camadas personalizadas.
|
|
419
|
+
* Carrega automaticamente a API do Google Maps via `useGoogleMapsLoader`.
|
|
420
|
+
*
|
|
421
|
+
* @ai-rules
|
|
422
|
+
* 1. OBRIGATÓRIO: Fornecer uma `apiKey` válida via prop ou variável de ambiente `VITE_GOOGLE_MAPS_API_KEY`.
|
|
423
|
+
* 2. Utilize a prop `markers` para renderizar pontos de interesse, suportando `richContent` para InfoWindows React.
|
|
424
|
+
* 3. Defina `height` explicitamente (default é 400px) para garantir visibilidade no layout.
|
|
425
|
+
*/
|
|
414
426
|
export const Map = React.forwardRef<HTMLDivElement, MapProps>(
|
|
415
427
|
(props, ref) => {
|
|
416
428
|
const { isLoaded, loadError } = useGoogleMapsLoader();
|
|
@@ -6,6 +6,16 @@ import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react";
|
|
|
6
6
|
|
|
7
7
|
import { cn } from "./utils";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Barra de menus navegacional densa no topo (Estilo Apple / Aplicativo Win).
|
|
11
|
+
*
|
|
12
|
+
* @description
|
|
13
|
+
* Arquitetura de dropdowns massiva idealizada para IDEs e Editores Web focados em Dados/Mídias.
|
|
14
|
+
*
|
|
15
|
+
* @ai-rules
|
|
16
|
+
* 1. Menubar não deve substituir a navegação padrão por `<Tabs>` se não houverem dezenas de itens.
|
|
17
|
+
* 2. Em `<MenubarShortcut>`, nunca force tipografia extravagante, o silêncio visual das hotkeys já está previsto ali dentreo.
|
|
18
|
+
*/
|
|
9
19
|
function Menubar({
|
|
10
20
|
className,
|
|
11
21
|
...props
|
|
@@ -5,6 +5,16 @@ import { ChevronDownIcon } from "lucide-react";
|
|
|
5
5
|
|
|
6
6
|
import { cn } from "./utils";
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Menu de navegação complexo para headers de aplicações.
|
|
10
|
+
*
|
|
11
|
+
* @description
|
|
12
|
+
* Suporta submenus ricos e transições suaves, ideal para navegação principal.
|
|
13
|
+
*
|
|
14
|
+
* @ai-rules
|
|
15
|
+
* 1. Utilize `NavigationMenuTrigger` para itens com dropdown e `NavigationMenuLink` para links diretos.
|
|
16
|
+
* 2. Envolva o conteúdo do dropdown em `NavigationMenuContent`.
|
|
17
|
+
*/
|
|
8
18
|
function NavigationMenu({
|
|
9
19
|
className,
|
|
10
20
|
children,
|
|
@@ -9,6 +9,16 @@ interface NotificationBadgeProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
9
9
|
variant?: "default" | "primary" | "destructive";
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Indicador visual de notificações ou contagens.
|
|
14
|
+
*
|
|
15
|
+
* @description
|
|
16
|
+
* Pequena bolha flutuante para mostrar quantidade ou um ponto de alerta.
|
|
17
|
+
*
|
|
18
|
+
* @ai-rules
|
|
19
|
+
* 1. Use a prop `count` para números ou `dot` para apenas um indicador visual.
|
|
20
|
+
* 2. Posicione no canto superior direito do elemento pai usando classes de utilidade.
|
|
21
|
+
*/
|
|
12
22
|
const NotificationBadge = React.forwardRef<HTMLDivElement, NotificationBadgeProps>(
|
|
13
23
|
({
|
|
14
24
|
className,
|
|
@@ -83,6 +83,16 @@ export interface PageHeaderProps {
|
|
|
83
83
|
// Component
|
|
84
84
|
// ============================================================================
|
|
85
85
|
|
|
86
|
+
/**
|
|
87
|
+
* Componente modular padronizado de cabeçalho de telas densas.
|
|
88
|
+
*
|
|
89
|
+
* @description
|
|
90
|
+
* Engloba títulos, subtítulos (descrições) e blocos de ações alinhados.
|
|
91
|
+
*
|
|
92
|
+
* @ai-rules
|
|
93
|
+
* 1. Utilize SEMPRE a trinca `PageHeader > PageHeaderHeading / PageHeaderDescription`.
|
|
94
|
+
* 2. Se houver grupo de botões, use `<PageActions>` englobando-os no lado direito.
|
|
95
|
+
*/
|
|
86
96
|
export function PageHeader({
|
|
87
97
|
breadcrumbs,
|
|
88
98
|
showLanguageSelector = false,
|
|
@@ -8,6 +8,16 @@ import {
|
|
|
8
8
|
import { cn } from "./utils";
|
|
9
9
|
import { Button, buttonVariants } from "./button";
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Navegação de páginas em massa.
|
|
13
|
+
*
|
|
14
|
+
* @description
|
|
15
|
+
* Envelopa a navegação no eixo horizontal com links, elipses e controles Previous/Next.
|
|
16
|
+
*
|
|
17
|
+
* @ai-rules
|
|
18
|
+
* 1. Componha na ordem exata: `Pagination > PaginationContent > PaginationItem > (PaginationLink | PaginationNext | PaginationPrevious)`.
|
|
19
|
+
* 2. Em Single Page Applications (SPA), modifique os `href` de `PaginationLink` para `href="#"` e reaja via `onClick` para evitar reloads de página nativos do HTML.
|
|
20
|
+
*/
|
|
11
21
|
function Pagination({ className, ...props }: React.ComponentProps<"nav">) {
|
|
12
22
|
return (
|
|
13
23
|
<nav
|