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.
Files changed (199) hide show
  1. package/components/Sidebar.tsx +13 -0
  2. package/components/ui/accordion.tsx +10 -0
  3. package/components/ui/alert-dialog.tsx +10 -0
  4. package/components/ui/alert.tsx +11 -0
  5. package/components/ui/aspect-ratio.tsx +10 -0
  6. package/components/ui/avatar.tsx +10 -0
  7. package/components/ui/badge.tsx +10 -0
  8. package/components/ui/breadcrumb.tsx +10 -0
  9. package/components/ui/button.tsx +34 -8
  10. package/components/ui/calendar.tsx +10 -0
  11. package/components/ui/card.tsx +11 -0
  12. package/components/ui/carousel.tsx +10 -0
  13. package/components/ui/chart.tsx +10 -0
  14. package/components/ui/checkbox.tsx +19 -0
  15. package/components/ui/collapsible.tsx +9 -0
  16. package/components/ui/command.tsx +10 -0
  17. package/components/ui/context-menu.tsx +10 -0
  18. package/components/ui/dialog.tsx +12 -0
  19. package/components/ui/drawer.tsx +10 -0
  20. package/components/ui/dropdown-menu.tsx +12 -0
  21. package/components/ui/empty.tsx +10 -0
  22. package/components/ui/file-upload.tsx +11 -0
  23. package/components/ui/form.tsx +12 -0
  24. package/components/ui/hover-card.tsx +9 -0
  25. package/components/ui/input-otp.tsx +10 -0
  26. package/components/ui/input.tsx +24 -1
  27. package/components/ui/label.tsx +10 -0
  28. package/components/ui/map.tsx +12 -0
  29. package/components/ui/menubar.tsx +10 -0
  30. package/components/ui/navigation-menu.tsx +10 -0
  31. package/components/ui/notification-badge.tsx +10 -0
  32. package/components/ui/page-header.tsx +10 -0
  33. package/components/ui/pagination.tsx +10 -0
  34. package/components/ui/popover.tsx +10 -0
  35. package/components/ui/progress.tsx +10 -0
  36. package/components/ui/radio-group.tsx +10 -0
  37. package/components/ui/rating.tsx +10 -0
  38. package/components/ui/resizable.tsx +10 -0
  39. package/components/ui/route-map.tsx +11 -0
  40. package/components/ui/scroll-area.tsx +10 -0
  41. package/components/ui/search.tsx +10 -0
  42. package/components/ui/select.tsx +9 -0
  43. package/components/ui/separator.tsx +9 -0
  44. package/components/ui/sheet.tsx +9 -0
  45. package/components/ui/skeleton.tsx +10 -0
  46. package/components/ui/slider.tsx +10 -0
  47. package/components/ui/sonner.tsx +7 -16
  48. package/components/ui/stats-card.tsx +10 -0
  49. package/components/ui/stepper.tsx +10 -0
  50. package/components/ui/switch.tsx +9 -0
  51. package/components/ui/table.tsx +11 -0
  52. package/components/ui/tabs.tsx +12 -0
  53. package/components/ui/textarea.tsx +10 -0
  54. package/components/ui/timeline.tsx +10 -0
  55. package/components/ui/toggle-group.tsx +10 -0
  56. package/components/ui/toggle.tsx +9 -0
  57. package/components/ui/tooltip.tsx +10 -0
  58. package/components/ui/tree-view.tsx +10 -0
  59. package/components/ui/xertica-assistant.tsx +12 -0
  60. package/components.json +350 -0
  61. package/dist/components/Sidebar.d.ts +13 -0
  62. package/dist/components/ui/accordion.d.ts +10 -0
  63. package/dist/components/ui/alert-dialog.d.ts +10 -0
  64. package/dist/components/ui/alert.d.ts +11 -0
  65. package/dist/components/ui/aspect-ratio.d.ts +10 -0
  66. package/dist/components/ui/avatar.d.ts +10 -0
  67. package/dist/components/ui/badge.d.ts +10 -0
  68. package/dist/components/ui/breadcrumb.d.ts +10 -0
  69. package/dist/components/ui/button.d.ts +29 -5
  70. package/dist/components/ui/calendar.d.ts +10 -0
  71. package/dist/components/ui/card.d.ts +11 -0
  72. package/dist/components/ui/carousel.d.ts +10 -0
  73. package/dist/components/ui/chart.d.ts +10 -0
  74. package/dist/components/ui/checkbox.d.ts +19 -0
  75. package/dist/components/ui/collapsible.d.ts +9 -0
  76. package/dist/components/ui/command.d.ts +10 -0
  77. package/dist/components/ui/context-menu.d.ts +10 -0
  78. package/dist/components/ui/dialog.d.ts +12 -0
  79. package/dist/components/ui/drawer.d.ts +10 -0
  80. package/dist/components/ui/dropdown-menu.d.ts +12 -0
  81. package/dist/components/ui/empty.d.ts +10 -0
  82. package/dist/components/ui/file-upload.d.ts +11 -0
  83. package/dist/components/ui/form.d.ts +12 -0
  84. package/dist/components/ui/hover-card.d.ts +9 -0
  85. package/dist/components/ui/input-otp.d.ts +10 -0
  86. package/dist/components/ui/input.d.ts +24 -1
  87. package/dist/components/ui/label.d.ts +10 -0
  88. package/dist/components/ui/map.d.ts +12 -0
  89. package/dist/components/ui/menubar.d.ts +10 -0
  90. package/dist/components/ui/navigation-menu.d.ts +10 -0
  91. package/dist/components/ui/notification-badge.d.ts +10 -0
  92. package/dist/components/ui/page-header.d.ts +10 -0
  93. package/dist/components/ui/pagination.d.ts +10 -0
  94. package/dist/components/ui/popover.d.ts +10 -0
  95. package/dist/components/ui/progress.d.ts +10 -0
  96. package/dist/components/ui/radio-group.d.ts +10 -0
  97. package/dist/components/ui/rating.d.ts +10 -0
  98. package/dist/components/ui/resizable.d.ts +10 -0
  99. package/dist/components/ui/route-map.d.ts +11 -0
  100. package/dist/components/ui/scroll-area.d.ts +10 -0
  101. package/dist/components/ui/search.d.ts +10 -0
  102. package/dist/components/ui/select.d.ts +8 -0
  103. package/dist/components/ui/separator.d.ts +9 -0
  104. package/dist/components/ui/sheet.d.ts +9 -0
  105. package/dist/components/ui/skeleton.d.ts +10 -0
  106. package/dist/components/ui/slider.d.ts +10 -0
  107. package/dist/components/ui/sonner.d.ts +7 -16
  108. package/dist/components/ui/stats-card.d.ts +10 -0
  109. package/dist/components/ui/stepper.d.ts +10 -0
  110. package/dist/components/ui/switch.d.ts +9 -0
  111. package/dist/components/ui/table.d.ts +11 -0
  112. package/dist/components/ui/tabs.d.ts +12 -0
  113. package/dist/components/ui/textarea.d.ts +10 -0
  114. package/dist/components/ui/timeline.d.ts +10 -0
  115. package/dist/components/ui/toggle-group.d.ts +10 -0
  116. package/dist/components/ui/toggle.d.ts +9 -0
  117. package/dist/components/ui/tooltip.d.ts +10 -0
  118. package/dist/components/ui/tree-view.d.ts +10 -0
  119. package/dist/components/ui/xertica-assistant.d.ts +12 -0
  120. package/dist/xertica-ui.css +1 -1
  121. package/docs/ai-usage.md +18 -0
  122. package/docs/components/accordion.md +43 -0
  123. package/docs/components/alert-dialog.md +50 -0
  124. package/docs/components/alert.md +36 -0
  125. package/docs/components/aspect-ratio.md +26 -0
  126. package/docs/components/assistant.md +41 -0
  127. package/docs/components/avatar.md +32 -0
  128. package/docs/components/badge.md +30 -0
  129. package/docs/components/breadcrumb.md +47 -0
  130. package/docs/components/button.md +51 -0
  131. package/docs/components/calendar.md +34 -0
  132. package/docs/components/card.md +50 -0
  133. package/docs/components/carousel.md +57 -0
  134. package/docs/components/chart.md +62 -0
  135. package/docs/components/checkbox.md +37 -0
  136. package/docs/components/collapsible.md +38 -0
  137. package/docs/components/command.md +40 -0
  138. package/docs/components/context-menu.md +40 -0
  139. package/docs/components/dialog.md +60 -0
  140. package/docs/components/drawer.md +43 -0
  141. package/docs/components/dropdown-menu.md +51 -0
  142. package/docs/components/empty.md +22 -0
  143. package/docs/components/file-upload.md +27 -0
  144. package/docs/components/form.md +71 -0
  145. package/docs/components/hover-card.md +41 -0
  146. package/docs/components/input-otp.md +42 -0
  147. package/docs/components/input.md +57 -0
  148. package/docs/components/label.md +24 -0
  149. package/docs/components/map.md +46 -0
  150. package/docs/components/menubar.md +53 -0
  151. package/docs/components/navigation-menu.md +42 -0
  152. package/docs/components/notification-badge.md +28 -0
  153. package/docs/components/page-header.md +44 -0
  154. package/docs/components/pagination.md +56 -0
  155. package/docs/components/popover.md +43 -0
  156. package/docs/components/progress.md +29 -0
  157. package/docs/components/radio-group.md +43 -0
  158. package/docs/components/rating.md +32 -0
  159. package/docs/components/resizable.md +53 -0
  160. package/docs/components/scroll-area.md +33 -0
  161. package/docs/components/search.md +26 -0
  162. package/docs/components/select.md +49 -0
  163. package/docs/components/separator.md +38 -0
  164. package/docs/components/sheet.md +40 -0
  165. package/docs/components/sidebar.md +46 -0
  166. package/docs/components/skeleton.md +30 -0
  167. package/docs/components/slider.md +26 -0
  168. package/docs/components/sonner.md +39 -0
  169. package/docs/components/stats-card.md +24 -0
  170. package/docs/components/stepper.md +49 -0
  171. package/docs/components/switch.md +27 -0
  172. package/docs/components/table.md +54 -0
  173. package/docs/components/tabs.md +43 -0
  174. package/docs/components/textarea.md +21 -0
  175. package/docs/components/timeline.md +34 -0
  176. package/docs/components/toggle-group.md +38 -0
  177. package/docs/components/toggle.md +26 -0
  178. package/docs/components/tooltip.md +46 -0
  179. package/docs/components/tree-view.md +29 -0
  180. package/docs/getting-started.md +25 -0
  181. package/docs/guidelines.md +23 -0
  182. package/docs/installation.md +37 -0
  183. package/docs/patterns/analytics.md +62 -0
  184. package/docs/patterns/crud.md +76 -0
  185. package/docs/patterns/dashboard.md +85 -0
  186. package/docs/patterns/form.md +85 -0
  187. package/docs/patterns/login.md +54 -0
  188. package/llms-full.txt +2634 -0
  189. package/llms.txt +37 -0
  190. package/mcp/resources.json +22 -0
  191. package/mcp/tools.json +35 -0
  192. package/package.json +10 -2
  193. package/scripts/ai-validator.ts +83 -0
  194. package/scripts/generate-ai-manifests.ts +64 -0
  195. package/templates/package.json +1 -1
  196. package/templates/src/app/pages/CrudTemplate.tsx +106 -0
  197. package/templates/src/app/pages/DashboardTemplate.tsx +101 -0
  198. package/templates/src/app/pages/FormTemplate.tsx +109 -0
  199. package/templates/src/app/pages/LoginTemplate.tsx +52 -0
@@ -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>) {
@@ -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>) {
@@ -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",
@@ -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
  }
@@ -35,14 +35,40 @@ const buttonVariants = cva(
35
35
  },
36
36
  );
37
37
 
38
- const Button = React.forwardRef<
39
- HTMLButtonElement,
40
- React.ComponentProps<"button"> &
41
- VariantProps<typeof buttonVariants> & {
42
- asChild?: boolean;
43
- loading?: boolean;
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,
@@ -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,
@@ -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>) {
@@ -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>) {
@@ -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>) {
@@ -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,
@@ -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,
@@ -2,10 +2,33 @@ import * as React from "react";
2
2
 
3
3
  import { cn } from "./utils";
4
4
 
5
- interface InputProps extends Omit<React.ComponentProps<"input">, "size"> {
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 = {
@@ -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
@@ -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