@softize/opus 12.11.0 → 13.1.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 (213) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/PROMOTED.md +46 -0
  3. package/README.md +28 -19
  4. package/bin/cli.mjs +87 -216
  5. package/bin/lib/check.mjs +2 -7
  6. package/bin/lib/cli-shared.mjs +131 -0
  7. package/bin/lib/copy.mjs +1 -5
  8. package/bin/lib/db.mjs +16 -74
  9. package/bin/lib/gen-openapi.mjs +3 -3
  10. package/bin/lib/gen-runner.mjs +1 -1
  11. package/bin/lib/gen.mjs +14 -69
  12. package/bin/lib/mcp.mjs +3 -1
  13. package/bin/lib/seed.mjs +5 -62
  14. package/docs/adr/0005-structural-surfaces-share-an-explicit-anatomy.md +93 -10
  15. package/docs/adr/0007-toast-actions-form-an-ordered-collection.md +63 -0
  16. package/docs/adr/0008-hierarchical-navigation-is-composed-at-the-consumer-boundary.md +71 -0
  17. package/docs/ownership-vs-shadcn-lock.md +2 -3
  18. package/docs/protocol.md +7 -7
  19. package/docs/radius-scale.md +1 -1
  20. package/docs/releasing.md +8 -2
  21. package/package.json +7 -3
  22. package/registry/skills/maintain-opus-docs/SKILL.md +83 -0
  23. package/registry/skills/maintain-opus-docs/agents/openai.yaml +4 -0
  24. package/registry/skills/maintain-opus-docs/references/editorial-standard.md +85 -0
  25. package/registry/skills/maintain-opus-docs/references/evaluations.md +34 -0
  26. package/registry/skills/maintain-opus-docs/scripts/audit-docs.mjs +81 -0
  27. package/registry/templates/app/package.json +1 -1
  28. package/registry/templates/app/src/main.tsx +4 -4
  29. package/src/audit/drivers/console.ts +1 -0
  30. package/src/auth/drivers/better-auth.ts +1 -0
  31. package/src/auth/drivers/jwt.ts +1 -0
  32. package/src/cache/drivers/memory.ts +1 -0
  33. package/src/client/drivers/fetch.ts +2 -1
  34. package/src/core/actions.ts +6 -1
  35. package/src/core/audit.ts +9 -3
  36. package/src/core/contracts.ts +7 -0
  37. package/src/core/domain.ts +1 -1
  38. package/src/core/errors.ts +18 -15
  39. package/src/core/index.ts +4 -2
  40. package/src/core/package-version.ts +26 -0
  41. package/src/core/reactions.ts +1 -1
  42. package/src/core/runtime.ts +33 -23
  43. package/src/core/schedules.ts +1 -1
  44. package/src/core/types.ts +2 -2
  45. package/src/dsl/eval.ts +2 -2
  46. package/src/dsl/kysely.ts +2 -2
  47. package/src/dsl/loads.ts +1 -1
  48. package/src/dsl/parser.ts +5 -5
  49. package/src/events/drivers/mitt.ts +1 -0
  50. package/src/mcp/index.ts +2 -1
  51. package/src/observability/drivers/opentelemetry.ts +1 -0
  52. package/src/queue/drivers/bullmq.ts +3 -3
  53. package/src/scheduler/drivers/node-cron.ts +3 -2
  54. package/src/scheduler/every.ts +7 -7
  55. package/src/schema/openapi.ts +3 -3
  56. package/src/seed/index.ts +29 -0
  57. package/src/server/drivers/fastify.ts +5 -2
  58. package/src/server/drivers/node.ts +9 -6
  59. package/src/server/index.ts +3 -1
  60. package/src/storage/drivers/fs.ts +1 -0
  61. package/src/testing/index.ts +3 -3
  62. package/src/ui/components/patterns/confirm.tsx +142 -42
  63. package/src/ui/components/patterns/content-header.tsx +7 -1
  64. package/src/ui/components/patterns/data-state.tsx +1 -1
  65. package/src/ui/components/patterns/dock.tsx +20 -3
  66. package/src/ui/components/patterns/form.tsx +12 -8
  67. package/src/ui/components/patterns/list.tsx +36 -41
  68. package/src/ui/components/patterns/page-state.tsx +2 -2
  69. package/src/ui/components/patterns/page.tsx +19 -1
  70. package/src/ui/components/patterns/shell-nav.tsx +10 -3
  71. package/src/ui/components/patterns/sidebar.tsx +43 -32
  72. package/src/ui/components/patterns/trigger.tsx +39 -38
  73. package/src/ui/components/patterns/view.tsx +26 -17
  74. package/src/ui/components/primitives/alert.tsx +14 -8
  75. package/src/ui/components/primitives/ask.tsx +3 -3
  76. package/src/ui/components/primitives/badge.tsx +11 -6
  77. package/src/ui/components/primitives/breadcrumb.tsx +2 -2
  78. package/src/ui/components/primitives/button.tsx +16 -3
  79. package/src/ui/components/primitives/calendar.tsx +28 -2
  80. package/src/ui/components/primitives/carousel.tsx +3 -3
  81. package/src/ui/components/primitives/chat.tsx +1 -1
  82. package/src/ui/components/primitives/checkbox.tsx +1 -1
  83. package/src/ui/components/primitives/command.tsx +2 -2
  84. package/src/ui/components/primitives/control.ts +12 -0
  85. package/src/ui/components/primitives/copyable.tsx +1 -1
  86. package/src/ui/components/primitives/dialog.tsx +202 -40
  87. package/src/ui/components/primitives/dot.tsx +5 -0
  88. package/src/ui/components/primitives/drawer.tsx +18 -8
  89. package/src/ui/components/primitives/empty.tsx +3 -3
  90. package/src/ui/components/primitives/field.tsx +3 -3
  91. package/src/ui/components/primitives/icon-picker.tsx +3 -1
  92. package/src/ui/components/primitives/input-group.tsx +1 -1
  93. package/src/ui/components/primitives/input-otp.tsx +1 -1
  94. package/src/ui/components/primitives/input.tsx +2 -2
  95. package/src/ui/components/primitives/item.tsx +3 -3
  96. package/src/ui/components/primitives/progress.tsx +32 -3
  97. package/src/ui/components/primitives/radio-group.tsx +1 -1
  98. package/src/ui/components/primitives/resizable.tsx +3 -1
  99. package/src/ui/components/primitives/select.tsx +5 -5
  100. package/src/ui/components/primitives/slider.tsx +5 -1
  101. package/src/ui/components/primitives/sonner.tsx +190 -8
  102. package/src/ui/components/primitives/switch.tsx +1 -0
  103. package/src/ui/components/primitives/tabs.tsx +1 -0
  104. package/src/ui/components/primitives/textarea.tsx +1 -1
  105. package/src/ui/components/primitives/toggle.tsx +1 -1
  106. package/src/ui/components/primitives/tooltip.tsx +1 -0
  107. package/src/ui/docs/DocBrowser.tsx +102 -23
  108. package/src/ui/docs/changelog.tsx +1 -1
  109. package/src/ui/docs/content/accordion.md +22 -16
  110. package/src/ui/docs/content/action-form-card.md +8 -8
  111. package/src/ui/docs/content/action-form-dialog.md +9 -9
  112. package/src/ui/docs/content/action-form.md +37 -36
  113. package/src/ui/docs/content/action-list-dialog.md +11 -6
  114. package/src/ui/docs/content/action-list.md +73 -39
  115. package/src/ui/docs/content/action-trigger.md +29 -15
  116. package/src/ui/docs/content/action-view.md +17 -10
  117. package/src/ui/docs/content/actions.md +9 -9
  118. package/src/ui/docs/content/ai.md +3 -3
  119. package/src/ui/docs/content/alert.md +14 -12
  120. package/src/ui/docs/content/ask.md +11 -0
  121. package/src/ui/docs/content/aspect-ratio.md +4 -4
  122. package/src/ui/docs/content/audit.md +2 -2
  123. package/src/ui/docs/content/auth.md +3 -3
  124. package/src/ui/docs/content/avatar.md +34 -14
  125. package/src/ui/docs/content/badge.md +3 -3
  126. package/src/ui/docs/content/breadcrumb.md +13 -8
  127. package/src/ui/docs/content/button.md +81 -6
  128. package/src/ui/docs/content/calendar.md +18 -5
  129. package/src/ui/docs/content/card.md +27 -1
  130. package/src/ui/docs/content/carousel.md +16 -11
  131. package/src/ui/docs/content/chat.md +23 -3
  132. package/src/ui/docs/content/checkbox.md +7 -7
  133. package/src/ui/docs/content/cli.md +74 -22
  134. package/src/ui/docs/content/collapsible.md +8 -8
  135. package/src/ui/docs/content/command.md +16 -8
  136. package/src/ui/docs/content/composer.md +17 -2
  137. package/src/ui/docs/content/content.md +17 -2
  138. package/src/ui/docs/content/copyable.md +12 -3
  139. package/src/ui/docs/content/customization.md +5 -5
  140. package/src/ui/docs/content/cycle.md +3 -3
  141. package/src/ui/docs/content/data-state.md +11 -12
  142. package/src/ui/docs/content/data.md +26 -33
  143. package/src/ui/docs/content/detail.md +22 -4
  144. package/src/ui/docs/content/dialog.md +339 -31
  145. package/src/ui/docs/content/dictionary-value.md +17 -10
  146. package/src/ui/docs/content/dock.md +11 -3
  147. package/src/ui/docs/content/dot.md +8 -0
  148. package/src/ui/docs/content/drawer.md +27 -14
  149. package/src/ui/docs/content/empty-value.md +2 -2
  150. package/src/ui/docs/content/empty.md +19 -12
  151. package/src/ui/docs/content/events.md +4 -4
  152. package/src/ui/docs/content/field.md +34 -12
  153. package/src/ui/docs/content/getting-started.md +3 -3
  154. package/src/ui/docs/content/icon-picker.md +19 -4
  155. package/src/ui/docs/content/input-otp.md +20 -12
  156. package/src/ui/docs/content/input.md +121 -9
  157. package/src/ui/docs/content/item.md +27 -13
  158. package/src/ui/docs/content/kbd.md +19 -11
  159. package/src/ui/docs/content/label.md +12 -3
  160. package/src/ui/docs/content/log.md +4 -4
  161. package/src/ui/docs/content/markdown.md +7 -6
  162. package/src/ui/docs/content/mcp.md +13 -15
  163. package/src/ui/docs/content/menu.md +40 -16
  164. package/src/ui/docs/content/metric-card.md +13 -0
  165. package/src/ui/docs/content/observability.md +2 -2
  166. package/src/ui/docs/content/page.md +59 -6
  167. package/src/ui/docs/content/pagination.md +22 -17
  168. package/src/ui/docs/content/popover.md +22 -8
  169. package/src/ui/docs/content/progress.md +15 -16
  170. package/src/ui/docs/content/queue.md +5 -5
  171. package/src/ui/docs/content/radio-group.md +20 -12
  172. package/src/ui/docs/content/router.md +11 -6
  173. package/src/ui/docs/content/scheduler.md +4 -5
  174. package/src/ui/docs/content/scroll-area.md +12 -7
  175. package/src/ui/docs/content/select.md +47 -34
  176. package/src/ui/docs/content/semantic-context.md +2 -2
  177. package/src/ui/docs/content/separator.md +5 -5
  178. package/src/ui/docs/content/sidebar.md +329 -54
  179. package/src/ui/docs/content/skeleton.md +9 -2
  180. package/src/ui/docs/content/slider.md +8 -7
  181. package/src/ui/docs/content/spinner.md +8 -8
  182. package/src/ui/docs/content/split.md +29 -5
  183. package/src/ui/docs/content/storage.md +6 -8
  184. package/src/ui/docs/content/switch.md +8 -7
  185. package/src/ui/docs/content/table.md +13 -3
  186. package/src/ui/docs/content/tabs.md +28 -14
  187. package/src/ui/docs/content/testing.md +9 -11
  188. package/src/ui/docs/content/textarea.md +12 -4
  189. package/src/ui/docs/content/toast.md +47 -13
  190. package/src/ui/docs/content/toggle.md +75 -7
  191. package/src/ui/docs/content/tokens.md +7 -7
  192. package/src/ui/docs/content/tooltip.md +19 -11
  193. package/src/ui/docs/content/truncate.md +15 -8
  194. package/src/ui/docs/content/ui.md +24 -9
  195. package/src/ui/docs/content/upgrading.md +7 -8
  196. package/src/ui/docs/doc-client.tsx +5 -5
  197. package/src/ui/docs/doc.tsx +26 -14
  198. package/src/ui/docs/registry.tsx +25 -42
  199. package/src/ui/docs/standalone.tsx +2 -2
  200. package/src/ui/drivers/react.tsx +17 -12
  201. package/src/ui/lib/action-errors.ts +45 -0
  202. package/src/ui/lib/zod-pt-br.ts +31 -4
  203. package/src/ui/meta.ts +65 -95
  204. package/src/ui/react.tsx +17 -16
  205. package/src/ui/theme.css +60 -8
  206. package/src/vite/design.ts +6 -18
  207. package/src/ui/components/primitives/alert-dialog.tsx +0 -192
  208. package/src/ui/docs/content/alert-dialog.md +0 -73
  209. package/src/ui/docs/content/button-group.md +0 -71
  210. package/src/ui/docs/content/confirm.md +0 -120
  211. package/src/ui/docs/content/input-group.md +0 -79
  212. package/src/ui/docs/content/page-state.md +0 -45
  213. package/src/ui/docs/content/toggle-group.md +0 -81
@@ -1,8 +1,8 @@
1
- ## Painel de detalhe (à direita)
1
+ ## Painel lateral de detalhe
2
2
 
3
- O painel que desliza de uma borda da tela modal, com overlay, trap de foco e ESC (o motor é o Dialog do Radix). A régua contra o irmão: conteúdo curto e CENTRADO → `Dialog`; painel na borda que preserva o contexto atrás → `Drawer`.
4
-
5
- side='right' desliza da borda direita. ESC, clique no overlay e o X fecham sem estado manual. É o lugar de detalhe/edição lateral sem sair do contexto.
3
+ Use `Drawer` para abrir detalhes ou edição junto a uma borda, preservando a referência visual da
4
+ tela ao fundo. Para conteúdo curto e centralizado, prefira `Dialog`. Com `side="right"`, o painel
5
+ entra pela direita e pode ser fechado por Esc, pelo overlay ou pelo botão de fechamento.
6
6
 
7
7
  ```tsx preview
8
8
  <Drawer>
@@ -21,9 +21,12 @@ side='right' desliza da borda direita. ESC, clique no overlay e o X fecham — s
21
21
  </Drawer>
22
22
  ```
23
23
 
24
- ## Edição com rodapé (à esquerda)
24
+ ## Edição com ações persistentes
25
25
 
26
- side aceita top|right|bottom|left. DrawerFooter ancora as ações no rodapé; DrawerClose fecha sem estado manual.
26
+ `side` aceita `top`, `right`, `bottom` e `left`. `DrawerFooter` mantém as ações no rodapé;
27
+ `DrawerClose` fecha o painel sem exigir controle manual de estado. Como no `Dialog`, o cabeçalho
28
+ recebe um divisor inferior e o rodapé usa divisor superior sobre fundo sutil. O corpo preserva o
29
+ mesmo alinhamento horizontal entre título, conteúdo e ações.
27
30
 
28
31
  ```tsx preview
29
32
  <Drawer>
@@ -40,19 +43,29 @@ side aceita top|right|bottom|left. DrawerFooter ancora as ações no rodapé; Dr
40
43
  </DrawerBody>
41
44
  <DrawerFooter>
42
45
  <DrawerClose asChild>
43
- <Button variant="ghost" size="sm">Cancelar</Button>
46
+ <Button variant="ghost">Cancelar</Button>
44
47
  </DrawerClose>
45
- <Button size="sm">Salvar alterações</Button>
48
+ <Button>Salvar alterações</Button>
46
49
  </DrawerFooter>
47
50
  </DrawerContent>
48
51
  </Drawer>
49
52
  ```
50
53
 
51
- ## Props
54
+ ## Propriedades de Drawer
55
+
56
+ | Propriedade | Tipo | Padrão | Descrição |
57
+ |---|---|---|---|
58
+ | `open` | `boolean` | | Estado no modo controlado. |
59
+ | `onOpenChange` | `(open: boolean) => void` | | Atualiza o estado para permitir abertura ou fechamento por código. |
60
+
61
+ ## Propriedades de DrawerContent
52
62
 
53
- | Prop | Tipo | Default | Descrição |
63
+ | Propriedade | Tipo | Padrão | Descrição |
54
64
  |---|---|---|---|
55
- | `DrawerContent.side` | `'top' \| 'right' \| 'bottom' \| 'left'` | `'right'` | Borda de onde o painel desliza. |
56
- | `DrawerContent.showCloseButton` | `boolean` | `true` | Mostra o X de fechar no canto. Desligue pra painel que exige ação explícita. |
57
- | `DrawerBody` | `HTMLAttributes<HTMLDivElement>` | Região flexível e rolável | Corpo principal entre header e footer. |
58
- | `Drawer.open / onOpenChange` | `boolean / (open: boolean) => void` | | Modo controlado (Radix) — pra abrir/fechar por código (ex.: detalhe de um item selecionado). |
65
+ | `side` | `'top' \| 'right' \| 'bottom' \| 'left'` | `'right'` | Borda de onde o painel aparece. |
66
+ | `showCloseButton` | `boolean` | `true` | Exibe o botão de fechamento. Desative quando o painel exigir uma ação explícita. |
67
+
68
+ ## Propriedades de DrawerBody
69
+
70
+ `DrawerBody` aceita os atributos de `HTMLDivElement` e ocupa a região flexível e rolável entre
71
+ `DrawerHeader` e `DrawerFooter`.
@@ -40,9 +40,9 @@ columns: [
40
40
  ]
41
41
  ```
42
42
 
43
- ## Props
43
+ ## Propriedades de EmptyValue
44
44
 
45
- | Prop | Tipo | Default | Descrição |
45
+ | Propriedade | Tipo | Padrão | Descrição |
46
46
  |---|---|---|---|
47
47
  | `label` | `string` | `'Não informado'` | O que a ausência significa neste domínio. |
48
48
  | `compact` | `boolean` | `false` | Célula compacta: travessão visível, rótulo só para leitura assistiva. |
@@ -10,7 +10,8 @@ no pai para evitar uma moldura dupla.
10
10
 
11
11
  ## Com ícone
12
12
 
13
- EmptyMedia variant=icon desenha o quadrado de fundo muted atrás do ícone; o EmptyHeader agrupa mídia, título e descrição no centro.
13
+ `EmptyMedia variant="icon"` aplica uma moldura quadrada e muted ao ícone. `EmptyHeader` mantém mídia,
14
+ título e descrição agrupados no centro.
14
15
 
15
16
  ```tsx preview col
16
17
  <Empty>
@@ -20,7 +21,7 @@ EmptyMedia variant=icon desenha o quadrado de fundo muted atrás do ícone; o Em
20
21
  </EmptyMedia>
21
22
  <EmptyTitle>Nenhum repositório vinculado</EmptyTitle>
22
23
  <EmptyDescription>
23
- O workspace Empresa X ainda não tem repositórios. Vincule um pra abrir sessões.
24
+ O workspace Empresa X ainda não tem repositórios. Vincule um para abrir sessões.
24
25
  </EmptyDescription>
25
26
  </EmptyHeader>
26
27
  </Empty>
@@ -28,7 +29,7 @@ EmptyMedia variant=icon desenha o quadrado de fundo muted atrás do ícone; o Em
28
29
 
29
30
  ## Com ação
30
31
 
31
- EmptyContent guarda os botões abaixo do header é o lugar da chamada pra ação que resolve o vazio.
32
+ `EmptyActions` organiza abaixo do cabeçalho as ações que permitem sair do estado vazio.
32
33
 
33
34
  ```tsx preview col
34
35
  <Empty>
@@ -38,21 +39,22 @@ EmptyContent guarda os botões abaixo do header — é o lugar da chamada pra a
38
39
  </EmptyMedia>
39
40
  <EmptyTitle>Sem skills neste agente</EmptyTitle>
40
41
  <EmptyDescription>
41
- O agente developer não tem skills anexadas. Adicione clean-code ou test pra começar.
42
+ O agente developer não tem skills anexadas. Adicione clean-code ou test para começar.
42
43
  </EmptyDescription>
43
44
  </EmptyHeader>
44
- <EmptyContent>
45
+ <EmptyActions>
45
46
  <Button>
46
47
  <Plus />
47
48
  Anexar skill
48
49
  </Button>
49
- </EmptyContent>
50
+ </EmptyActions>
50
51
  </Empty>
51
52
  ```
52
53
 
53
- ## Mídia default
54
+ ## Mídia sem moldura
54
55
 
55
- EmptyMedia variant=default (o padrão) não desenha fundo bom pra uma ilustração ou um ícone maior que se sustenta sozinho.
56
+ `EmptyMedia` sem `variant` (o padrão, `default`) não desenha fundo. Use essa forma para ilustrações
57
+ ou mídias que tenham presença visual própria.
56
58
 
57
59
  ```tsx preview col
58
60
  <Empty>
@@ -68,9 +70,14 @@ EmptyMedia variant=default (o padrão) não desenha fundo — bom pra uma ilustr
68
70
  </Empty>
69
71
  ```
70
72
 
71
- ## Props
73
+ ## Propriedades de Empty
72
74
 
73
- | Prop | Tipo | Default | Descrição |
75
+ | Propriedade | Tipo | Padrão | Descrição |
74
76
  |---|---|---|---|
75
- | `variant (EmptyMedia)` | `'default' \| 'icon'` | `'default'` | icon desenha o quadrado de fundo muted atrás da mídia; default não desenha fundo. |
76
- | `className (Empty)` | `string` | | A moldura já vem tracejada e centrada — ajuste espaçamento ou borda por aqui. |
77
+ | `className` | `string` | | Classes aplicadas à moldura tracejada e centralizada. |
78
+
79
+ ## Propriedades de EmptyMedia
80
+
81
+ | Propriedade | Tipo | Padrão | Descrição |
82
+ |---|---|---|---|
83
+ | `variant` | `'default' \| 'icon'` | `'default'` | `icon` aplica uma moldura quadrada e muted; `default` exibe a mídia sem fundo. |
@@ -4,9 +4,9 @@ title: Eventos
4
4
 
5
5
  # Eventos
6
6
 
7
- O handler anuncia que algo aconteceu (`ctx.emit`) sem saber quem escuta. Reactions (e
8
- integrações) assinam e reagem. O barramento é um adapter do core (`EventBusAdapter`); o
9
- formato do evento é preservado de ponta a ponta.
7
+ Use eventos quando uma action precisar anunciar um fato sem conhecer seus consumidores.
8
+ `ctx.emit` publica o evento; reactions e integrações podem assiná-lo pelo `EventBusAdapter`. O
9
+ formato declarado permanece o mesmo durante todo o fluxo.
10
10
 
11
11
  ## O contrato
12
12
 
@@ -55,7 +55,7 @@ Actions declaram no contrato o que emitem (`emits: ['nota.emitida']`); o runtime
55
55
  o handler emitir algo não-declarado (`emitMode`). Uma reaction assina `nota.emitida` e roda
56
56
  como sua própria action rastreável (provenance `reaction`).
57
57
 
58
- ## Limites (por enquanto)
58
+ ## Limites atuais
59
59
 
60
60
  O driver `mitt` é in-process — sem durabilidade nem entre-processos. Barramentos duráveis/
61
61
  distribuídos (Redis, NATS…) entram por reincidência de caso real.
@@ -1,6 +1,8 @@
1
- ## Campo vertical
1
+ ## Campo empilhado
2
2
 
3
- A composição base: FieldLabel (htmlFor↔id), o controle e FieldDescription como ajuda empilhados, com o respiro do Field. O rótulo usa a mesma hierarquia compacta de `DetailField`; quando o campo é inválido, muda explicitamente para o tom destrutivo.
3
+ Use `Field` para manter rótulo, controle, ajuda e erro com espaçamento consistente. Na orientação
4
+ vertical, `FieldLabel`, o controle e `FieldDescription` ficam empilhados. Quando o controle usa
5
+ `aria-invalid`, o rótulo acompanha o contexto de erro.
4
6
 
5
7
  ```tsx preview col md
6
8
  <Field>
@@ -12,7 +14,8 @@ A composição base: FieldLabel (htmlFor↔id), o controle e FieldDescription co
12
14
 
13
15
  ## Horizontal com toggle
14
16
 
15
- orientation=horizontal põe o controle na lateral e a label à esquerda. FieldContent agrupa título e descrição num bloco; FieldTitle é o rótulo de texto quando o controle não é um <label>.
17
+ `orientation="horizontal"` posiciona o controle ao lado do texto. `FieldContent` agrupa título e
18
+ descrição; `FieldTitle` nomeia o campo quando o texto não puder ser um `<label>`.
16
19
 
17
20
  ```tsx preview col md
18
21
  <Field orientation="horizontal">
@@ -26,7 +29,8 @@ orientation=horizontal põe o controle na lateral e a label à esquerda. FieldCo
26
29
 
27
30
  ## Conjunto com legenda e erro
28
31
 
29
- FieldSet agrupa campos sob uma FieldLegend; FieldGroup o espaçamento entre eles; FieldSeparator marca uma divisão. FieldError mostra a mensagem só quando há erro (aria-invalid no controle casa o visual).
32
+ `FieldSet` agrupa campos sob uma `FieldLegend`; `FieldGroup` define o espaçamento e
33
+ `FieldSeparator` marca uma divisão. `FieldError` aparece somente quando existe mensagem de erro.
30
34
 
31
35
  ```tsx preview col md
32
36
  <FieldSet>
@@ -35,7 +39,7 @@ FieldSet agrupa campos sob uma FieldLegend; FieldGroup dá o espaçamento entre
35
39
  <Field>
36
40
  <FieldLabel htmlFor="agent-name">Nome</FieldLabel>
37
41
  <Input id="agent-name" defaultValue="" aria-invalid placeholder="Ex.: developer" />
38
- <FieldError>Informe um nome pro agente.</FieldError>
42
+ <FieldError>Informe um nome para o agente.</FieldError>
39
43
  </Field>
40
44
  <FieldSeparator />
41
45
  <Field>
@@ -47,12 +51,30 @@ FieldSet agrupa campos sob uma FieldLegend; FieldGroup dá o espaçamento entre
47
51
  </FieldSet>
48
52
  ```
49
53
 
50
- ## Props
54
+ ## Propriedades de Field
51
55
 
52
- | Prop | Tipo | Default | Descrição |
56
+ | Propriedade | Tipo | Padrão | Descrição |
53
57
  |---|---|---|---|
54
- | `orientation` (Field) | `'vertical' \| 'horizontal' \| 'responsive'` | `'vertical'` | Direção do campo: vertical empilha; horizontal põe o controle ao lado (bom pra toggle); responsive vira horizontal a partir de @md. |
55
- | `variant` (FieldLegend) | `'legend' \| 'label'` | `'legend'` | Tamanho da legenda do FieldSet — legend é o título da seção; label encolhe pro porte de rótulo. |
56
- | `errors` (FieldError) | `Array<{ message?: string }>` | | Lista de erros (ex.: do react-hook-form) — deduplica e vira uma lista. Sem children e sem erros, o FieldError não renderiza. |
57
- | `children` (FieldError) | `React.ReactNode` | | Mensagem de erro literal — tem prioridade sobre errors quando passada. |
58
- | `children` (FieldSeparator) | `React.ReactNode` | | Rótulo opcional no meio da linha divisória (ex.: "ou") — sem filhos, é só a linha. |
58
+ | `orientation` | `'vertical' \| 'horizontal' \| 'responsive'` | `'vertical'` | Direção do campo; `responsive` se torna horizontal a partir do container médio. |
59
+
60
+ ## Propriedades de FieldLegend
61
+
62
+ | Propriedade | Tipo | Padrão | Descrição |
63
+ |---|---|---|---|
64
+ | `variant` | `'legend' \| 'label'` | `'legend'` | Define o porte de título de seção ou de rótulo compacto. |
65
+
66
+ ## Propriedades de FieldError
67
+
68
+ | Propriedade | Tipo | Padrão | Descrição |
69
+ |---|---|---|---|
70
+ | `errors` | `Array<{ message?: string }>` | | Deduplica e apresenta uma lista de erros; sem conteúdo, o componente não renderiza. |
71
+ | `children` | `ReactNode` | | Mensagem literal, com prioridade sobre `errors`. |
72
+
73
+ ## Propriedades de FieldSeparator
74
+
75
+ | Propriedade | Tipo | Padrão | Descrição |
76
+ |---|---|---|---|
77
+ | `children` | `ReactNode` | | Rótulo opcional no centro da divisão; sem conteúdo, exibe somente a linha. |
78
+
79
+ `FieldSet`, `FieldGroup`, `FieldContent`, `FieldLabel`, `FieldTitle` e `FieldDescription` aceitam as
80
+ props nativas dos respectivos elementos e não adicionam propriedades próprias.
@@ -1,8 +1,8 @@
1
1
  ---
2
- title: Getting started
2
+ title: Primeiros passos
3
3
  ---
4
4
 
5
- # Getting started
5
+ # Primeiros passos
6
6
 
7
7
  O Opus ajuda cliente e servidor a preservar as mesmas regras à medida que uma aplicação
8
8
  evolui. Entidades e contratos de action ficam em uma camada compartilhada; o runtime, a UI e
@@ -59,7 +59,7 @@ cd meu-cliente && git init
59
59
  pnpm dlx @softize/opus create apps/portal # o app (modo detectado)
60
60
  ```
61
61
 
62
- ## Carregar o Opus num projeto existente
62
+ ## Carregar o Opus em um projeto existente
63
63
 
64
64
  > O `opus.json` registra a versão usada pelo projeto. Se o arquivo ainda não existe, o setup
65
65
  > cria a estrutura necessária antes das demais etapas.
@@ -1,6 +1,8 @@
1
- O value é o **nome** do ícone (kebab-case, chave da paleta) quem consome renderiza com a mesma paleta: `iconPickerIcons[name] ?? FallbackIcon`. Selecionar o já-escolhido desmarca (volta a `''`).
1
+ Use `IconPicker` para selecionar um ícone por seu nome em kebab-case. O consumidor renderiza o
2
+ valor com a mesma paleta, por exemplo `iconPickerIcons[name] ?? FallbackIcon`. Selecionar novamente o
3
+ ícone atual limpa o valor.
2
4
 
3
- ## Básico
5
+ ## Escolher na paleta padrão
4
6
 
5
7
  ```tsx preview col md
6
8
  const [icon, setIcon] = useState('chart-line')
@@ -15,7 +17,8 @@ render(
15
17
 
16
18
  ## Renderizando o escolhido
17
19
 
18
- A paleta default é exportada (`iconPickerIcons`) use-a pra desenhar o ícone salvo onde ele aparece (item de lista, card, árvore).
20
+ A paleta padrão é exportada como `iconPickerIcons`. Use a mesma coleção para apresentar o ícone
21
+ salvo em listas, cards e árvores.
19
22
 
20
23
  ```tsx preview col md
21
24
  const [icon, setIcon] = useState('store')
@@ -34,7 +37,8 @@ render(
34
37
 
35
38
  ## Paleta própria
36
39
 
37
- `icons` troca o vocabulário (nome → componente lucide). A paleta default é curta de propósito cada ícone importado entra no bundle; monte a sua com o que faz sentido no domínio.
40
+ `icons` substitui a coleção de nomes e componentes Lucide. Mantenha somente os ícones relevantes ao
41
+ domínio, pois cada importação participa do bundle.
38
42
 
39
43
  ```tsx preview col md
40
44
  const [icon, setIcon] = useState('')
@@ -49,3 +53,14 @@ render(
49
53
  />,
50
54
  )
51
55
  ```
56
+
57
+ ## Propriedades de IconPicker
58
+
59
+ | Propriedade | Tipo | Padrão | Descrição |
60
+ |---|---|---|---|
61
+ | `value` | `string` | | Nome do ícone selecionado (chave da paleta); `''` é nenhum. |
62
+ | `onChange` | `(name: string) => void` | | Recebe o nome escolhido. |
63
+ | `icons` | `Record<string, LucideIcon>` | `iconPickerIcons` | Paleta nome → componente. |
64
+ | `placeholder` | `string` | `'Selecione um ícone…'` | Texto do gatilho sem seleção. |
65
+ | `disabled` | `boolean` | | Desabilita o gatilho. |
66
+ | `id`, `aria-invalid`, `aria-describedby` | | | Integração com `Field`/`ActionForm`: o gatilho recebe a identidade e o estado de erro do campo. |
@@ -1,6 +1,7 @@
1
- ## Básico
1
+ ## Código em uma sequência
2
2
 
3
- maxLength define quantas casas existem; cada InputOTPSlot recebe o index da sua posição. Um InputOTPGroup envolve as casas.
3
+ `maxLength` define o comprimento do código. Cada `InputOTPSlot` recebe o índice de uma posição e
4
+ `InputOTPGroup` mantém a sequência agrupada.
4
5
 
5
6
  ```tsx preview
6
7
  <InputOTP maxLength={6}>
@@ -17,7 +18,8 @@ maxLength define quantas casas existem; cada InputOTPSlot recebe o index da sua
17
18
 
18
19
  ## Com separador
19
20
 
20
- Vários grupos com InputOTPSeparator entre eles quebram o código em blocos os index seguem contínuos (0–5) por cima da divisão visual.
21
+ Use `InputOTPSeparator` entre grupos para dividir visualmente o código. Os índices continuam em uma
22
+ única sequência apesar da separação.
21
23
 
22
24
  ```tsx preview
23
25
  <InputOTP maxLength={6}>
@@ -37,7 +39,8 @@ Vários grupos com InputOTPSeparator entre eles quebram o código em blocos —
37
39
 
38
40
  ## Controlado
39
41
 
40
- value + onChange deixam o código no seu estado bom pra liberar a ação só quando todas as casas estão preenchidas.
42
+ Use `value` e `onChange` quando o estado externo precisar validar o comprimento antes de liberar a
43
+ próxima ação.
41
44
 
42
45
  ```tsx preview col-start
43
46
  const [code, setCode] = useState('')
@@ -55,18 +58,23 @@ render(
55
58
  </InputOTPGroup>
56
59
  </InputOTP>
57
60
  <p className="text-sm text-muted-foreground">
58
- {code.length === 6 ? 'Código pronto pra confirmar o acesso ao workspace.' : 'Digite o código de 6 dígitos.'}
61
+ {code.length === 6 ? 'Código pronto para confirmar o acesso ao workspace.' : 'Digite o código de 6 dígitos.'}
59
62
  </p>
60
63
  </>,
61
64
  )
62
65
  ```
63
66
 
64
- ## Props
67
+ ## Propriedades de InputOTP
65
68
 
66
- | Prop | Tipo | Default | Descrição |
69
+ | Propriedade | Tipo | Padrão | Descrição |
67
70
  |---|---|---|---|
68
- | `maxLength` (InputOTP) | `number` | | Quantas casas o código tem — defina um InputOTPSlot por posição. |
69
- | `value` (InputOTP) | `string` | | O código no modo controlado parear com onChange. |
70
- | `onChange` (InputOTP) | `(value: string) => void` | | Chamado a cada dígito; recebe o código acumulado. |
71
- | `disabled` (InputOTP) | `boolean` | `false` | Esmaece e bloqueia a digitação do conjunto inteiro. |
72
- | `index` (InputOTPSlot) | `number` | | A posição da casa (0-based); liga o slot ao dígito correspondente. |
71
+ | `maxLength` | `number` | | Quantidade de posições do código. Defina um `InputOTPSlot` para cada posição. |
72
+ | `value` | `string` | | Código no modo controlado. Use com `onChange`. |
73
+ | `onChange` | `(value: string) => void` | | Chamado a cada entrada com o código acumulado. |
74
+ | `disabled` | `boolean` | `false` | Desabilita a digitação em todo o conjunto. |
75
+
76
+ ## Propriedades de InputOTPSlot
77
+
78
+ | Propriedade | Tipo | Padrão | Descrição |
79
+ |---|---|---|---|
80
+ | `index` | `number` | | Posição do caractere, começando em zero. |
@@ -1,6 +1,7 @@
1
- ## Básico
1
+ ## Campo de uma linha
2
2
 
3
- Placeholder orienta o formato, não substitui o rótulo em formulário de verdade, pareie com Label.
3
+ Use `Input` para texto de uma linha. O placeholder pode sugerir formato ou exemplo, mas não substitui
4
+ o rótulo; em formulários, associe o campo a `Label`.
4
5
 
5
6
  ```tsx preview col md
6
7
  <Input placeholder="Ex.: empresa-x" />
@@ -8,7 +9,8 @@ Placeholder orienta o formato, não substitui o rótulo — em formulário de ve
8
9
 
9
10
  ## Ícone dentro do campo
10
11
 
11
- `icon` põe um ícone LEADING dentro do campo identidade (calendário na data, prédio na filial). É a MESMA prop do Select e do Alert: adorno de campo é **prop**, não composição à mão nem ícone jogado ao lado (que desalinha na quebra de linha e some no responsivo). Decorativo — quem nomeia é o Label.
12
+ `icon` posiciona um ícone decorativo no início do campo. Use-o para reforçar a natureza do valor,
13
+ como calendário em uma data; o `Label` continua responsável pelo nome acessível.
12
14
 
13
15
  ```tsx preview col md
14
16
  <div className="grid gap-2">
@@ -17,12 +19,13 @@ Placeholder orienta o formato, não substitui o rótulo — em formulário de ve
17
19
  </div>
18
20
  ```
19
21
 
20
- Pra mais que um ícone um botão no fim, um prefixo de texto, adorno em bloco — aí é `InputGroup` (a composição rica). Só o ícone leading é a prop.
22
+ Quando o campo precisar combinar vários adornos, prefixos ou botões, use `InputGroup`.
21
23
 
22
24
 
23
25
  ## Ação no fim do campo (trailing)
24
26
 
25
- `trailing` é o par do `icon`: uma ação DENTRO do campo, no fim um botão que age sobre o valor (limpar, mostrar senha). Igual ao Select. Diferente do ícone (decorativo), o trailing é interativo.
27
+ `trailing` posiciona no fim do campo uma ação relacionada ao valor, como limpar ou mostrar uma
28
+ senha. Diferentemente de `icon`, essa região pode ser interativa.
26
29
 
27
30
  ```tsx preview col md
28
31
  function Demo() {
@@ -45,11 +48,11 @@ function Demo() {
45
48
  render(<Demo />)
46
49
  ```
47
50
 
48
- Pra MAIS de um adorno junto (ícone + botão + prefixo de texto), é `InputGroup`. Um ícone e/ou uma ação → props.
51
+ Para combinar mais de um adorno, use `InputGroup`.
49
52
 
50
53
  ## Com Label
51
54
 
52
- htmlFor aponta pro id do campo clicar no rótulo foca o input.
55
+ Associe `htmlFor` no `Label` ao `id` do campo para que o clique no rótulo mova o foco.
53
56
 
54
57
  ```tsx preview col md
55
58
  <div className="grid gap-2">
@@ -60,7 +63,8 @@ htmlFor aponta pro id do campo — clicar no rótulo foca o input.
60
63
 
61
64
  ## Tipos nativos
62
65
 
63
- type é o atributo nativo de <input> — teclado, máscara e validação vêm do browser de graça.
66
+ `type` é repassado ao `<input>` nativo, permitindo que o navegador escolha teclado e validação
67
+ adequados.
64
68
 
65
69
  ```tsx preview col md
66
70
  <Input type="email" placeholder="Ex.: joao@softize.com.br" />
@@ -70,9 +74,117 @@ type é o atributo nativo de <input> — teclado, máscara e validação vêm do
70
74
 
71
75
  ## Estados
72
76
 
73
- Inválido é aria-invalid (borda e anel destructive) — semântica e visual na mesma prop, sem classe de erro à parte. disabled esmaece e bloqueia.
77
+ Use `aria-invalid` para comunicar e apresentar o estado inválido. `disabled` impede interação e
78
+ aplica o tratamento visual correspondente.
74
79
 
75
80
  ```tsx preview col md
76
81
  <Input aria-invalid defaultValue="empresa x" placeholder="Slug do workspace" />
77
82
  <Input disabled defaultValue="softize-multica" />
78
83
  ```
84
+
85
+ ## Propriedades de Input
86
+
87
+ Além das props abaixo, `Input` aceita os atributos nativos de `<input>`.
88
+
89
+ | Propriedade | Tipo | Padrão | Descrição |
90
+ |---|---|---|---|
91
+ | `icon` | `ReactNode` | | Ícone decorativo no início do campo. |
92
+ | `trailing` | `ReactNode` | | Ação interativa no fim do campo. |
93
+ | `type` | `string` | | Tipo nativo do campo, como `text`, `email`, `password` ou `number`. |
94
+
95
+ ## InputGroup
96
+
97
+ Use `InputGroup` quando o campo precisar combinar vários adornos, prefixos, sufixos ou ações em uma
98
+ única moldura. Para somente um ícone ou uma ação no fim, continue usando `icon` ou `trailing` em
99
+ `Input`.
100
+
101
+ ### Com ícone e ação
102
+
103
+ `InputGroupAddon` ancora os adornos nas extremidades. O clique em uma área inerte do addon transfere
104
+ o foco para o campo.
105
+
106
+ ```tsx preview col
107
+ <InputGroup>
108
+ <InputGroupAddon><Search /></InputGroupAddon>
109
+ <InputGroupInput placeholder="Buscar agente" defaultValue="reviewer" />
110
+ <InputGroupAddon align="inline-end">
111
+ <InputGroupButton size="icon-xs" aria-label="Limpar filtro"><X /></InputGroupButton>
112
+ </InputGroupAddon>
113
+ </InputGroup>
114
+ ```
115
+
116
+ ### Prefixo e sufixo
117
+
118
+ `InputGroupText` apresenta texto inerte dentro da moldura.
119
+
120
+ ```tsx preview col
121
+ <InputGroup>
122
+ <InputGroupAddon>
123
+ <GitBranch />
124
+ <InputGroupText>github.com/softize/</InputGroupText>
125
+ </InputGroupAddon>
126
+ <InputGroupInput placeholder="empresa-x-api" />
127
+ <InputGroupAddon align="inline-end"><InputGroupText>.git</InputGroupText></InputGroupAddon>
128
+ </InputGroup>
129
+ ```
130
+
131
+ ### Composer com rodapé
132
+
133
+ Com `InputGroupTextarea`, um addon em `block-end` forma uma região de ações abaixo do texto.
134
+
135
+ ```tsx preview col
136
+ <InputGroup>
137
+ <InputGroupTextarea placeholder="Descreva a tarefa para o agente developer" rows={3} />
138
+ <InputGroupAddon align="block-end">
139
+ <InputGroupText><Sparkles /> Título gerado pela IA</InputGroupText>
140
+ <InputGroupButton
141
+ size="sm"
142
+ context="primary"
143
+ variant="solid"
144
+ className="ml-auto"
145
+ aria-label="Enviar tarefa"
146
+ >
147
+ Enviar <ArrowUp />
148
+ </InputGroupButton>
149
+ </InputGroupAddon>
150
+ </InputGroup>
151
+ ```
152
+
153
+ ### Propriedades de InputGroup
154
+
155
+ | Propriedade | Tipo | Padrão | Descrição |
156
+ |---|---|---|---|
157
+ | `shape` | `'default' \| 'pill'` | `'default'` | Geometria da moldura compartilhada. |
158
+
159
+ ### Propriedades de InputGroupAddon
160
+
161
+ | Propriedade | Tipo | Padrão | Descrição |
162
+ |---|---|---|---|
163
+ | `align` | `'inline-start' \| 'inline-end' \| 'block-start' \| 'block-end'` | `'inline-start'` | Posição do addon nas laterais ou acima/abaixo do controle. |
164
+
165
+ ### Propriedades de InputGroupButton
166
+
167
+ | Propriedade | Tipo | Padrão | Descrição |
168
+ |---|---|---|---|
169
+ | `size` | `'xs' \| 'sm' \| 'icon-xs' \| 'icon-sm'` | `'xs'` | Tamanho do botão embutido; as variantes `icon-*` são quadradas. |
170
+ | `context` | `'neutral' \| 'primary' \| 'danger'` | `'primary'` | Contexto semântico herdado de Button. |
171
+ | `variant` | `'solid' \| 'subtle' \| 'outline' \| 'ghost' \| 'link'` | `'ghost'` | Tratamento visual; use `solid` quando a ação precisar de ênfase. |
172
+
173
+ ### Propriedades de InputGroupInput
174
+
175
+ | Propriedade | Tipo | Padrão | Descrição |
176
+ |---|---|---|---|
177
+ | `value` / `defaultValue` | `string` | | Valor controlado ou inicial do `<input>`. |
178
+ | `placeholder` | `string` | | Exemplo ou formato esperado quando o campo está vazio. |
179
+
180
+ ### Propriedades de InputGroupTextarea
181
+
182
+ | Propriedade | Tipo | Padrão | Descrição |
183
+ |---|---|---|---|
184
+ | `value` / `defaultValue` | `string` | | Valor controlado ou inicial do `<textarea>`. |
185
+ | `placeholder` | `string` | | Exemplo ou orientação exibida quando o campo está vazio. |
186
+ | `rows` | `number` | | Número inicial de linhas visíveis. |
187
+
188
+ ### Propriedades de InputGroupText
189
+
190
+ `InputGroupText` aceita as props nativas de `<span>` e não adiciona propriedades próprias.
@@ -1,8 +1,8 @@
1
- ## Básico
1
+ ## Linha composta
2
2
 
3
3
  A composição completa usa `ItemMedia` à esquerda, `ItemHeader` (`ItemTitle` +
4
- `ItemDescription`) no meio e `ItemActions` à direita. A mídia acompanha a altura útil do header,
5
- mantendo ícone, imagem ou avatar centralizado. `variant="outline"` desenha a borda.
4
+ `ItemDescription`) no meio e `ItemActions` à direita. Ícone e imagem mantêm uma moldura quadrada
5
+ alinhada ao topo, mesmo quando a descrição ocupa mais linhas. `variant="outline"` desenha a borda.
6
6
 
7
7
  ```tsx preview col
8
8
  <Item variant="outline">
@@ -25,7 +25,7 @@ mantendo ícone, imagem ou avatar centralizado. `variant="outline"` desenha a bo
25
25
 
26
26
  ## Lista emoldurada
27
27
 
28
- `ItemGroup variant="framed"` aplica a superfície canônica. Os divisores continuam explícitos com `ItemSeparator`, tanto no modo `framed` quanto no `plain` — o padrão pra listas de repositórios, agentes ou sessões.
28
+ `ItemGroup variant="framed"` aplica a superfície canônica. Os divisores continuam explícitos com `ItemSeparator`, tanto no modo `framed` quanto no `plain` — o padrão para listas de repositórios, agentes ou sessões.
29
29
 
30
30
  ```tsx preview col
31
31
  <ItemGroup variant="framed">
@@ -59,7 +59,7 @@ mantendo ícone, imagem ou avatar centralizado. `variant="outline"` desenha a bo
59
59
 
60
60
  ## Clicável e compacto
61
61
 
62
- asChild funde o Item num <a> — a linha inteira vira alvo (hover no fundo). size=sm aperta o respiro; ItemMedia variant=image ancora um avatar.
62
+ asChild funde o Item em um <a> — a linha inteira vira alvo (hover no fundo). size=sm aperta o respiro; ItemMedia variant=image ancora um avatar.
63
63
 
64
64
  ```tsx preview col
65
65
  <Item asChild size="sm" variant="outline">
@@ -100,12 +100,26 @@ Use `ItemBody` quando a linha também apresenta um valor ou controle que não pe
100
100
  `ItemContent` permanece exportado somente para compatibilidade durante a versão 12. Código novo
101
101
  usa `ItemHeader` ou `ItemBody` conforme o papel do conteúdo.
102
102
 
103
- ## Props
103
+ ## Propriedades de Item
104
104
 
105
- | Prop | Tipo | Default | Descrição |
106
- | --------------------- | ----------------------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------- |
107
- | `variant` (ItemGroup) | `'plain' \| 'framed'` | `'plain'` | `framed` aplica moldura e superfície; `plain` mantém a composição livre. Os divisores são explícitos nos dois modos. |
108
- | `variant` (Item) | `'default' \| 'outline' \| 'muted'` | `'default'` | O fundo da linha default transparente, outline com borda, muted levemente tingido. |
109
- | `size` (Item) | `'default' \| 'sm'` | `'default'` | O respiro interno sm aperta o padding pra listas densas. |
110
- | `asChild` (Item) | `boolean` | `false` | Funde o Item no filho (ex.: <a> ou <button>) — a linha inteira vira o alvo. |
111
- | `variant` (ItemMedia) | `'default' \| 'icon' \| 'image'` | `'default'` | A moldura da mídia — `icon` tem largura estável e acompanha a altura do header; `image` recorta a imagem; `default` não adiciona fundo. |
105
+ | Propriedade | Tipo | Padrão | Descrição |
106
+ |---|---|---|---|
107
+ | `variant` | `'default' \| 'outline' \| 'muted'` | `'default'` | O fundo da linha: transparente, com borda ou levemente tingido. |
108
+ | `size` | `'default' \| 'sm'` | `'default'` | O respiro interno; `sm` atende listas densas. |
109
+ | `asChild` | `boolean` | `false` | Funde o Item no filho para que a linha inteira assuma sua semântica. |
110
+
111
+ ## Propriedades de ItemGroup
112
+
113
+ | Propriedade | Tipo | Padrão | Descrição |
114
+ |---|---|---|---|
115
+ | `variant` | `'plain' \| 'framed'` | `'plain'` | `framed` aplica moldura e superfície; os divisores permanecem explícitos nos dois modos. |
116
+
117
+ ## Propriedades de ItemMedia
118
+
119
+ | Propriedade | Tipo | Padrão | Descrição |
120
+ |---|---|---|---|
121
+ | `variant` | `'default' \| 'icon' \| 'image'` | `'default'` | Define mídia livre ou uma moldura quadrada para ícone ou imagem. |
122
+
123
+ `ItemHeader`, `ItemTitle`, `ItemDescription`, `ItemBody`, `ItemActions`, `ItemFooter` e
124
+ `ItemSeparator` aceitam as props nativas dos respectivos elementos e não adicionam propriedades
125
+ próprias. `ItemContent` preserva esse mesmo contrato somente durante a migração da versão 12.