@softize/opus 12.11.0 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/bin/lib/check.mjs +2 -7
  3. package/bin/lib/copy.mjs +1 -5
  4. package/docs/adr/0005-structural-surfaces-share-an-explicit-anatomy.md +93 -10
  5. package/docs/adr/0007-toast-actions-form-an-ordered-collection.md +63 -0
  6. package/docs/adr/0008-hierarchical-navigation-is-composed-at-the-consumer-boundary.md +71 -0
  7. package/docs/radius-scale.md +1 -1
  8. package/package.json +1 -1
  9. package/registry/skills/maintain-opus-docs/SKILL.md +83 -0
  10. package/registry/skills/maintain-opus-docs/agents/openai.yaml +4 -0
  11. package/registry/skills/maintain-opus-docs/references/editorial-standard.md +85 -0
  12. package/registry/skills/maintain-opus-docs/references/evaluations.md +34 -0
  13. package/registry/skills/maintain-opus-docs/scripts/audit-docs.mjs +81 -0
  14. package/src/ui/components/patterns/confirm.tsx +140 -40
  15. package/src/ui/components/patterns/list.tsx +35 -40
  16. package/src/ui/components/patterns/page-state.tsx +2 -2
  17. package/src/ui/components/patterns/sidebar.tsx +26 -26
  18. package/src/ui/components/patterns/trigger.tsx +25 -22
  19. package/src/ui/components/primitives/alert.tsx +3 -3
  20. package/src/ui/components/primitives/dialog.tsx +196 -39
  21. package/src/ui/components/primitives/drawer.tsx +8 -5
  22. package/src/ui/components/primitives/empty.tsx +3 -3
  23. package/src/ui/components/primitives/item.tsx +3 -3
  24. package/src/ui/components/primitives/sonner.tsx +187 -8
  25. package/src/ui/docs/DocBrowser.tsx +102 -23
  26. package/src/ui/docs/content/accordion.md +22 -16
  27. package/src/ui/docs/content/action-form-card.md +8 -8
  28. package/src/ui/docs/content/action-form-dialog.md +9 -9
  29. package/src/ui/docs/content/action-form.md +28 -34
  30. package/src/ui/docs/content/action-list-dialog.md +11 -6
  31. package/src/ui/docs/content/action-list.md +64 -39
  32. package/src/ui/docs/content/action-trigger.md +21 -14
  33. package/src/ui/docs/content/action-view.md +8 -8
  34. package/src/ui/docs/content/actions.md +9 -9
  35. package/src/ui/docs/content/ai.md +3 -3
  36. package/src/ui/docs/content/alert.md +14 -12
  37. package/src/ui/docs/content/aspect-ratio.md +4 -4
  38. package/src/ui/docs/content/audit.md +2 -2
  39. package/src/ui/docs/content/auth.md +3 -3
  40. package/src/ui/docs/content/avatar.md +34 -14
  41. package/src/ui/docs/content/badge.md +3 -3
  42. package/src/ui/docs/content/breadcrumb.md +13 -8
  43. package/src/ui/docs/content/button.md +81 -6
  44. package/src/ui/docs/content/calendar.md +5 -5
  45. package/src/ui/docs/content/card.md +1 -1
  46. package/src/ui/docs/content/carousel.md +16 -11
  47. package/src/ui/docs/content/chat.md +3 -3
  48. package/src/ui/docs/content/checkbox.md +7 -7
  49. package/src/ui/docs/content/cli.md +5 -5
  50. package/src/ui/docs/content/collapsible.md +8 -8
  51. package/src/ui/docs/content/command.md +16 -8
  52. package/src/ui/docs/content/composer.md +2 -2
  53. package/src/ui/docs/content/content.md +2 -2
  54. package/src/ui/docs/content/copyable.md +4 -3
  55. package/src/ui/docs/content/customization.md +5 -5
  56. package/src/ui/docs/content/cycle.md +3 -3
  57. package/src/ui/docs/content/data-state.md +11 -12
  58. package/src/ui/docs/content/data.md +26 -33
  59. package/src/ui/docs/content/detail.md +3 -3
  60. package/src/ui/docs/content/dialog.md +339 -31
  61. package/src/ui/docs/content/dictionary-value.md +8 -8
  62. package/src/ui/docs/content/dock.md +3 -3
  63. package/src/ui/docs/content/drawer.md +27 -14
  64. package/src/ui/docs/content/empty-value.md +2 -2
  65. package/src/ui/docs/content/empty.md +19 -12
  66. package/src/ui/docs/content/events.md +4 -4
  67. package/src/ui/docs/content/field.md +34 -12
  68. package/src/ui/docs/content/getting-started.md +1 -1
  69. package/src/ui/docs/content/icon-picker.md +8 -4
  70. package/src/ui/docs/content/input-otp.md +20 -12
  71. package/src/ui/docs/content/input.md +121 -9
  72. package/src/ui/docs/content/item.md +27 -13
  73. package/src/ui/docs/content/kbd.md +19 -11
  74. package/src/ui/docs/content/label.md +5 -3
  75. package/src/ui/docs/content/log.md +4 -4
  76. package/src/ui/docs/content/markdown.md +7 -6
  77. package/src/ui/docs/content/mcp.md +13 -15
  78. package/src/ui/docs/content/menu.md +34 -16
  79. package/src/ui/docs/content/observability.md +2 -2
  80. package/src/ui/docs/content/page.md +51 -6
  81. package/src/ui/docs/content/pagination.md +22 -17
  82. package/src/ui/docs/content/popover.md +16 -8
  83. package/src/ui/docs/content/progress.md +7 -5
  84. package/src/ui/docs/content/queue.md +5 -5
  85. package/src/ui/docs/content/radio-group.md +20 -12
  86. package/src/ui/docs/content/router.md +11 -6
  87. package/src/ui/docs/content/scheduler.md +4 -5
  88. package/src/ui/docs/content/scroll-area.md +12 -7
  89. package/src/ui/docs/content/select.md +42 -29
  90. package/src/ui/docs/content/separator.md +5 -5
  91. package/src/ui/docs/content/sidebar.md +323 -54
  92. package/src/ui/docs/content/skeleton.md +3 -2
  93. package/src/ui/docs/content/slider.md +8 -7
  94. package/src/ui/docs/content/spinner.md +8 -8
  95. package/src/ui/docs/content/split.md +8 -5
  96. package/src/ui/docs/content/storage.md +6 -8
  97. package/src/ui/docs/content/switch.md +8 -7
  98. package/src/ui/docs/content/table.md +13 -3
  99. package/src/ui/docs/content/tabs.md +28 -14
  100. package/src/ui/docs/content/testing.md +9 -11
  101. package/src/ui/docs/content/textarea.md +5 -4
  102. package/src/ui/docs/content/toast.md +47 -13
  103. package/src/ui/docs/content/toggle.md +75 -7
  104. package/src/ui/docs/content/tokens.md +3 -3
  105. package/src/ui/docs/content/tooltip.md +19 -11
  106. package/src/ui/docs/content/truncate.md +7 -8
  107. package/src/ui/docs/content/ui.md +10 -9
  108. package/src/ui/docs/content/upgrading.md +7 -8
  109. package/src/ui/docs/registry.tsx +20 -37
  110. package/src/ui/meta.ts +64 -94
  111. package/src/ui/react.tsx +15 -16
  112. package/src/ui/theme.css +50 -0
  113. package/src/ui/components/primitives/alert-dialog.tsx +0 -192
  114. package/src/ui/docs/content/alert-dialog.md +0 -73
  115. package/src/ui/docs/content/button-group.md +0 -71
  116. package/src/ui/docs/content/confirm.md +0 -120
  117. package/src/ui/docs/content/input-group.md +0 -79
  118. package/src/ui/docs/content/page-state.md +0 -45
  119. package/src/ui/docs/content/toggle-group.md +0 -81
@@ -1,6 +1,8 @@
1
- ## Básico
1
+ ## Informação complementar
2
2
 
3
- Texto auxiliar, nunca essencial quem navega por toque não vê tooltip. Em botão de ícone, o aria-label continua obrigatório.
3
+ Use `Tooltip` para informação curta e complementar. Como a dica não está disponível em todas as
4
+ formas de interação, ela não pode conter informação essencial. Botões somente com ícone continuam
5
+ precisando de `aria-label`.
4
6
 
5
7
  ```tsx preview
6
8
  <Tooltip>
@@ -13,7 +15,7 @@ Texto auxiliar, nunca essencial — quem navega por toque não vê tooltip. Em b
13
15
 
14
16
  ## Lados
15
17
 
16
- side escolhe o lado preferido; o Radix inverte sozinho quando falta espaço.
18
+ `side` define o lado preferido; o Radix reposiciona a dica quando não espaço.
17
19
 
18
20
  ```tsx preview
19
21
  <Tooltip>
@@ -30,9 +32,10 @@ side escolhe o lado preferido; o Radix inverte sozinho quando falta espaço.
30
32
  </Tooltip>
31
33
  ```
32
34
 
33
- ## Provider no root
35
+ ## Provider na raiz
34
36
 
35
- O TooltipProvider embrulha o app uma vez (delay compartilhado); cada Tooltip dispensa provider próprio. Este app já monta o seu no main.tsx.
37
+ Monte um único `TooltipProvider` na raiz para compartilhar o atraso de exibição. Cada `Tooltip` não
38
+ precisa de um provider próprio.
36
39
 
37
40
  ```tsx
38
41
  /* main.tsx do app — uma vez, no root. */
@@ -54,11 +57,16 @@ default nos formulários.
54
57
  </Tooltip>
55
58
  ```
56
59
 
57
- ## Props
60
+ ## Propriedades de TooltipProvider
58
61
 
59
- | Prop | Tipo | Default | Descrição |
62
+ | Propriedade | Tipo | Padrão | Descrição |
60
63
  |---|---|---|---|
61
- | `TooltipProvider.delayDuration` | `number` | `0` | Atraso (ms) até aparecer compartilhado por todos os tooltips do app. |
62
- | `TooltipContent.side` | `'top' \| 'right' \| 'bottom' \| 'left'` | `'top'` | Lado preferido; inverte sozinho sem espaço (Radix). |
63
- | `TooltipContent.sideOffset` | `number` | `0` | Distância (px) entre gatilho e dica. |
64
- | `TooltipContent.className` | `string` | `max-w-sm text-pretty` | Permite substituir o limite e a distribuição de linha quando necessário. |
64
+ | `delayDuration` | `number` | `0` | Atraso antes da exibição, compartilhado pelos tooltips do aplicativo. |
65
+
66
+ ## Propriedades de TooltipContent
67
+
68
+ | Propriedade | Tipo | Padrão | Descrição |
69
+ |---|---|---|---|
70
+ | `side` | `'top' \| 'right' \| 'bottom' \| 'left'` | `'top'` | Lado preferido; o Radix reposiciona a dica quando não há espaço. |
71
+ | `sideOffset` | `number` | `0` | Distância entre o gatilho e a dica. |
72
+ | `className` | `string` | `max-w-sm text-pretty` | Classes para ajustar o limite e a distribuição do texto. |
@@ -1,8 +1,7 @@
1
- ## Básico
1
+ ## Truncar somente quando necessário
2
2
 
3
- Trunca numa linha e mostra tooltip **só quando o texto realmente corta** (medição do
4
- overflow, re-medida em resize). Texto que cabe não ganha dica diferente do `title`
5
- sempre presente, que vira ruído.
3
+ Use `Truncate` para limitar um texto a uma linha e mostrar a dica somente quando houver transbordo.
4
+ O componente mede novamente o conteúdo quando o tamanho muda. Se o texto couber, não cria tooltip.
6
5
 
7
6
  ```tsx preview
8
7
  <div className="w-48 rounded-md border p-2">
@@ -10,9 +9,9 @@ sempre presente, que vira ruído.
10
9
  </div>
11
10
  ```
12
11
 
13
- ## Quando cabe, nada acontece
12
+ ## Texto sem transbordo
14
13
 
15
- O mesmo componente, com espaço de sobra: sem tooltip, sem atributo, só o texto.
14
+ Quando espaço suficiente, o componente mantém apenas o texto visível.
16
15
 
17
16
  ```tsx preview
18
17
  <div className="w-96 rounded-md border p-2">
@@ -48,8 +47,8 @@ const { ref, overflowing } = useOverflowing<HTMLSpanElement>(label)
48
47
 
49
48
  ## Conteúdo da dica
50
49
 
51
- `tooltip` sobrepõe o conteúdo mostrado no hover (default: os próprios children) útil
52
- quando a dica precisa de mais contexto que o texto cortado.
50
+ `tooltip` substitui o conteúdo da dica, cujo padrão são os próprios `children`. Use essa propriedade
51
+ quando o texto completo ainda não oferecer contexto suficiente.
53
52
 
54
53
  ```tsx preview
55
54
  <div className="w-48 rounded-md border p-2">
@@ -4,21 +4,22 @@ title: Como consumir
4
4
 
5
5
  # Como consumir a UI
6
6
 
7
- A verdade visual da casa: os componentes do `@softize/opus/ui` renderizados com o nosso tema. O
8
- que você aqui é o que os apps entregam — a referência é esta doc, não o site do shadcn.
7
+ Esta documentação é a referência visual e de uso de `@softize/opus/ui`. Os exemplos são renderizados
8
+ com o tema e o contrato entregues aos aplicativos.
9
9
 
10
10
  ## Por que esta doc existe
11
11
 
12
- > O site do shadcn é catálogo do que existe lá; os exemplos de decoram composições que não
13
- > existem no nosso registry. A expectativa visual e de uso nasce aqui.
12
+ O catálogo do shadcn documenta seu próprio código e pode mostrar composições que não fazem parte do
13
+ Opus. Consulte estas páginas para conhecer os componentes, as variações e os comportamentos
14
+ suportados pelo pacote.
14
15
 
15
- Cada página de componente mostra exemplos vivos por variante (renderizados com o tema da casa), o
16
- snippet de como se escreve e as props que importam. O texto de quando usar vem do próprio
17
- componente (o `meta` co-localizado na fonte) — a doc deriva, não duplica.
16
+ Cada página combina exemplos vivos, código e uma referência de propriedades por componente. A
17
+ orientação inicial vem de `componentMeta`, a mesma fonte usada pelo catálogo e pelas ferramentas.
18
18
 
19
19
  ## Como consumir
20
20
 
21
- > Um barrel pra componentes e hooks; o tema entra por CSS. Nada de copiar componente pra dentro do app.
21
+ Importe componentes e hooks de `@softize/opus/ui/react` e o tema por CSS. Não copie a implementação
22
+ para o aplicativo quando a API pública já atender ao caso.
22
23
 
23
24
  ```tsx
24
25
  // Componentes e hooks — tudo do mesmo barrel.
@@ -36,5 +37,5 @@ import { Button, Dialog, useAction } from '@softize/opus/ui/react'
36
37
  - **Origem shadcn** — port curado do shadcn (Radix + cmdk). Toda divergência do upstream é
37
38
  DECLARADA no componente ou no tema — o que diverge sem declaração é drift e deve ser
38
39
  sincronizado (skill `build-opus-ui`).
39
- - **Nativo do Opus** — nasceu aqui (os patterns de action). Não tem upstream pra acompanhar; a
40
+ - **Nativo do Opus** — nasceu aqui (os patterns de action). Não tem upstream para acompanhar; a
40
41
  referência é esta doc.
@@ -4,11 +4,10 @@ title: Atualizar o Opus
4
4
 
5
5
  # Atualizar o Opus
6
6
 
7
- Projeto em produção fica meses sem tocar no Opus e um dia precisa pular várias
8
- versões de uma vez. O ritual é o mesmo para humano e IA, e não depende de memória:
9
- cada etapa está documentada ou é verificada por um gate que informa o que precisa ser corrigido.
7
+ Use este fluxo para atualizar o Opus por uma ou várias versões. O changelog explica as mudanças e os
8
+ gates apontam as adaptações necessárias no projeto.
10
9
 
11
- ## 1. Saber que está atrás
10
+ ## 1. Identificar a versão disponível
12
11
 
13
12
  O **Maestro** compara o pin (`opus.json`) com a versão instalada e com a fonte a cada
14
13
  sessão — o alerta no rodapé diz a distância (`v2.9.0 → v2.15.2`) e o **Atualizar** faz
@@ -16,7 +15,7 @@ a parte mecânica: bump da dependência, re-materialização da camada de IA (sk
16
15
  hooks, agentes) e re-sync do bloco gerenciado do CLAUDE.md. Fora do Maestro:
17
16
  `pnpm outdated @softize/opus`.
18
17
 
19
- ## 2. Saber o que mudou
18
+ ## 2. Ler as mudanças acumuladas
20
19
 
21
20
  O changelog **viaja no pacote** — depois do bump, está em
22
21
  `node_modules/@softize/opus/CHANGELOG.md`. Uma entrada por versão; quando quebra,
@@ -26,7 +25,7 @@ A esteira de release **recusa** publicar versão sem entrada — o arquivo não
26
25
  - **minor** (2.9 → 2.10): compatível; leia por curiosidade.
27
26
  - **major** (2.x → 3.0): pare nas seções Breaking de cada versão pulada, na ordem.
28
27
 
29
- ## 3. Deixar os gates cobrarem o resto
28
+ ## 3. Executar as verificações
30
29
 
31
30
  O Opus ship source: o que quebrou aparece com arquivo e linha. Rode, na ordem:
32
31
 
@@ -38,8 +37,8 @@ pnpm manifest:check # a spec projetada ficou fresca?
38
37
  opus db migrate # schema em dia (drift-check embutido)
39
38
  ```
40
39
 
41
- Verde em tudo = atualizado de verdade. O bump entra no PR como qualquer mudança de
42
- código — atualização de base passa por review, não por fé.
40
+ Com todas as verificações verdes, revise a atualização como qualquer outra mudança de código antes
41
+ de entregá-la.
43
42
 
44
43
  ## Pulou muitas versões?
45
44
 
@@ -27,6 +27,7 @@ import authMd from "./content/auth.md?raw";
27
27
  import auditMd from "./content/audit.md?raw";
28
28
  import eventsMd from "./content/events.md?raw";
29
29
  import logMd from "./content/log.md?raw";
30
+ import observabilityMd from "./content/observability.md?raw";
30
31
  import queueMd from "./content/queue.md?raw";
31
32
  import schedulerMd from "./content/scheduler.md?raw";
32
33
  import actionsMd from "./content/actions.md?raw";
@@ -46,8 +47,6 @@ import customizationMd from "./content/customization.md?raw";
46
47
  // — Componentes —
47
48
  import accordionMd from "./content/accordion.md?raw";
48
49
  import alertMd from "./content/alert.md?raw";
49
- import alertDialogMd from "./content/alert-dialog.md?raw";
50
- import confirmMd from "./content/confirm.md?raw";
51
50
  import aspectRatioMd from "./content/aspect-ratio.md?raw";
52
51
  import avatarMd from "./content/avatar.md?raw";
53
52
  import badgeMd from "./content/badge.md?raw";
@@ -55,7 +54,6 @@ import dotMd from "./content/dot.md?raw";
55
54
  import dockMd from "./content/dock.md?raw";
56
55
  import breadcrumbMd from "./content/breadcrumb.md?raw";
57
56
  import buttonMd from "./content/button.md?raw";
58
- import buttonGroupMd from "./content/button-group.md?raw";
59
57
  import calendarMd from "./content/calendar.md?raw";
60
58
  import cardMd from "./content/card.md?raw";
61
59
  import metricCardMd from "./content/metric-card.md?raw";
@@ -77,7 +75,6 @@ import menuMd from "./content/menu.md?raw";
77
75
  import emptyMd from "./content/empty.md?raw";
78
76
  import fieldMd from "./content/field.md?raw";
79
77
  import inputMd from "./content/input.md?raw";
80
- import inputGroupMd from "./content/input-group.md?raw";
81
78
  import inputOtpMd from "./content/input-otp.md?raw";
82
79
  import itemMd from "./content/item.md?raw";
83
80
  import kbdMd from "./content/kbd.md?raw";
@@ -99,7 +96,6 @@ import tabsMd from "./content/tabs.md?raw";
99
96
  import textareaMd from "./content/textarea.md?raw";
100
97
  import toastMd from "./content/toast.md?raw";
101
98
  import toggleMd from "./content/toggle.md?raw";
102
- import toggleGroupMd from "./content/toggle-group.md?raw";
103
99
  import tooltipMd from "./content/tooltip.md?raw";
104
100
  import truncateMd from "./content/truncate.md?raw";
105
101
 
@@ -122,7 +118,6 @@ import actionTriggerMd from "./content/action-trigger.md?raw";
122
118
  import actionSearchDialogMd from "./content/action-list-dialog.md?raw";
123
119
  import pageMd from "./content/page.md?raw";
124
120
  import contentMd from "./content/content.md?raw";
125
- import pageStateMd from "./content/page-state.md?raw";
126
121
  import sidebarMd from "./content/sidebar.md?raw";
127
122
  import splitMd from "./content/split.md?raw";
128
123
  import routerMd from "./content/router.md?raw";
@@ -139,6 +134,8 @@ export interface DocEntry {
139
134
  export interface DocGroup {
140
135
  /** Sub-rótulo opcional dentro da seção (ex.: Primitivos). Ausente = páginas direto na seção. */
141
136
  label?: string;
137
+ /** Ícone opcional apresentado no nó expansível do grupo. */
138
+ icon?: React.ReactNode;
142
139
  pages: DocEntry[];
143
140
  }
144
141
 
@@ -178,7 +175,7 @@ const comp =
178
175
  </DocPage>
179
176
  );
180
177
 
181
- /** O palco dos patterns no scope dos previews: ícones + client fake + contratos de mentira. */
178
+ /** O palco dos patterns no scope dos previews: ícones, cliente simulado e contratos de exemplo. */
182
179
  const patternScope = {
183
180
  ...iconScope,
184
181
  DocBrowserActionProvider,
@@ -291,6 +288,12 @@ export const PROTOCOL_SECTIONS: DocSection[] = [
291
288
  render: doc(eventsMd),
292
289
  },
293
290
  { slug: "log", title: "Log", badge: "log", render: doc(logMd) },
291
+ {
292
+ slug: "observability",
293
+ title: "Observabilidade",
294
+ badge: "observability",
295
+ render: doc(observabilityMd),
296
+ },
294
297
  {
295
298
  slug: "queue",
296
299
  title: "Filas",
@@ -371,6 +374,7 @@ export const UI_SECTIONS: DocSection[] = [
371
374
  groups: [
372
375
  {
373
376
  label: "Fundamentos",
377
+ icon: <lucideIcons.Blocks className="size-4" />,
374
378
  pages: [
375
379
  {
376
380
  slug: "router",
@@ -381,6 +385,7 @@ export const UI_SECTIONS: DocSection[] = [
381
385
  },
382
386
  {
383
387
  label: "Layout",
388
+ icon: <lucideIcons.PanelsTopLeft className="size-4" />,
384
389
  pages: [
385
390
  {
386
391
  slug: "split",
@@ -402,11 +407,6 @@ export const UI_SECTIONS: DocSection[] = [
402
407
  title: "Content",
403
408
  render: pattern("Content", "content", contentMd),
404
409
  },
405
- {
406
- slug: "page-state",
407
- title: "Page State",
408
- render: pattern("Page State", "page-state", pageStateMd),
409
- },
410
410
  {
411
411
  slug: "accordion",
412
412
  title: "Accordion",
@@ -442,6 +442,7 @@ export const UI_SECTIONS: DocSection[] = [
442
442
  },
443
443
  {
444
444
  label: "Actions",
445
+ icon: <lucideIcons.Zap className="size-4" />,
445
446
  pages: [
446
447
  {
447
448
  slug: "action-form",
@@ -498,6 +499,7 @@ export const UI_SECTIONS: DocSection[] = [
498
499
  },
499
500
  {
500
501
  label: "IA",
502
+ icon: <lucideIcons.Sparkles className="size-4" />,
501
503
  pages: [
502
504
  { slug: "ask", title: "Ask", render: comp("Ask", "ask", askMd) },
503
505
  { slug: "chat", title: "Chat", render: comp("Chat", "chat", chatMd) },
@@ -510,6 +512,7 @@ export const UI_SECTIONS: DocSection[] = [
510
512
  },
511
513
  {
512
514
  label: "Formulário",
515
+ icon: <lucideIcons.TextCursorInput className="size-4" />,
513
516
  pages: [
514
517
  {
515
518
  slug: "calendar",
@@ -536,11 +539,6 @@ export const UI_SECTIONS: DocSection[] = [
536
539
  title: "Input",
537
540
  render: comp("Input", "input", inputMd),
538
541
  },
539
- {
540
- slug: "input-group",
541
- title: "Input Group",
542
- render: comp("Input Group", "input-group", inputGroupMd),
543
- },
544
542
  {
545
543
  slug: "input-otp",
546
544
  title: "Input OTP",
@@ -580,31 +578,23 @@ export const UI_SECTIONS: DocSection[] = [
580
578
  },
581
579
  {
582
580
  label: "Botões",
581
+ icon: <lucideIcons.MousePointerClick className="size-4" />,
583
582
  pages: [
584
583
  {
585
584
  slug: "button",
586
585
  title: "Button",
587
586
  render: comp("Button", "button", buttonMd),
588
587
  },
589
- {
590
- slug: "button-group",
591
- title: "Button Group",
592
- render: comp("Button Group", "button-group", buttonGroupMd),
593
- },
594
588
  {
595
589
  slug: "toggle",
596
590
  title: "Toggle",
597
591
  render: comp("Toggle", "toggle", toggleMd),
598
592
  },
599
- {
600
- slug: "toggle-group",
601
- title: "Toggle Group",
602
- render: comp("Toggle Group", "toggle-group", toggleGroupMd),
603
- },
604
593
  ],
605
594
  },
606
595
  {
607
596
  label: "Navegação",
597
+ icon: <lucideIcons.Compass className="size-4" />,
608
598
  pages: [
609
599
  {
610
600
  slug: "breadcrumb",
@@ -626,6 +616,7 @@ export const UI_SECTIONS: DocSection[] = [
626
616
  },
627
617
  {
628
618
  label: "Exibição",
619
+ icon: <lucideIcons.Eye className="size-4" />,
629
620
  pages: [
630
621
  {
631
622
  slug: "avatar",
@@ -689,17 +680,13 @@ export const UI_SECTIONS: DocSection[] = [
689
680
  },
690
681
  {
691
682
  label: "Feedback",
683
+ icon: <lucideIcons.MessageCircleWarning className="size-4" />,
692
684
  pages: [
693
685
  {
694
686
  slug: "alert",
695
687
  title: "Alert",
696
688
  render: comp("Alert", "alert", alertMd),
697
689
  },
698
- {
699
- slug: "confirm",
700
- title: "Dialog (imperativo)",
701
- render: comp("Dialog (imperativo)", "confirm", confirmMd),
702
- },
703
690
  {
704
691
  slug: "data-state",
705
692
  title: "Data State",
@@ -734,12 +721,8 @@ export const UI_SECTIONS: DocSection[] = [
734
721
  },
735
722
  {
736
723
  label: "Sobreposição",
724
+ icon: <lucideIcons.Layers className="size-4" />,
737
725
  pages: [
738
- {
739
- slug: "alert-dialog",
740
- title: "Alert Dialog",
741
- render: comp("Alert Dialog", "alert-dialog", alertDialogMd),
742
- },
743
726
  {
744
727
  slug: "dialog",
745
728
  title: "Dialog",