@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.
- package/CHANGELOG.md +29 -0
- package/bin/lib/check.mjs +2 -7
- package/bin/lib/copy.mjs +1 -5
- package/docs/adr/0005-structural-surfaces-share-an-explicit-anatomy.md +93 -10
- package/docs/adr/0007-toast-actions-form-an-ordered-collection.md +63 -0
- package/docs/adr/0008-hierarchical-navigation-is-composed-at-the-consumer-boundary.md +71 -0
- package/docs/radius-scale.md +1 -1
- package/package.json +1 -1
- package/registry/skills/maintain-opus-docs/SKILL.md +83 -0
- package/registry/skills/maintain-opus-docs/agents/openai.yaml +4 -0
- package/registry/skills/maintain-opus-docs/references/editorial-standard.md +85 -0
- package/registry/skills/maintain-opus-docs/references/evaluations.md +34 -0
- package/registry/skills/maintain-opus-docs/scripts/audit-docs.mjs +81 -0
- package/src/ui/components/patterns/confirm.tsx +140 -40
- package/src/ui/components/patterns/list.tsx +35 -40
- package/src/ui/components/patterns/page-state.tsx +2 -2
- package/src/ui/components/patterns/sidebar.tsx +26 -26
- package/src/ui/components/patterns/trigger.tsx +25 -22
- package/src/ui/components/primitives/alert.tsx +3 -3
- package/src/ui/components/primitives/dialog.tsx +196 -39
- package/src/ui/components/primitives/drawer.tsx +8 -5
- package/src/ui/components/primitives/empty.tsx +3 -3
- package/src/ui/components/primitives/item.tsx +3 -3
- package/src/ui/components/primitives/sonner.tsx +187 -8
- package/src/ui/docs/DocBrowser.tsx +102 -23
- package/src/ui/docs/content/accordion.md +22 -16
- package/src/ui/docs/content/action-form-card.md +8 -8
- package/src/ui/docs/content/action-form-dialog.md +9 -9
- package/src/ui/docs/content/action-form.md +28 -34
- package/src/ui/docs/content/action-list-dialog.md +11 -6
- package/src/ui/docs/content/action-list.md +64 -39
- package/src/ui/docs/content/action-trigger.md +21 -14
- package/src/ui/docs/content/action-view.md +8 -8
- package/src/ui/docs/content/actions.md +9 -9
- package/src/ui/docs/content/ai.md +3 -3
- package/src/ui/docs/content/alert.md +14 -12
- package/src/ui/docs/content/aspect-ratio.md +4 -4
- package/src/ui/docs/content/audit.md +2 -2
- package/src/ui/docs/content/auth.md +3 -3
- package/src/ui/docs/content/avatar.md +34 -14
- package/src/ui/docs/content/badge.md +3 -3
- package/src/ui/docs/content/breadcrumb.md +13 -8
- package/src/ui/docs/content/button.md +81 -6
- package/src/ui/docs/content/calendar.md +5 -5
- package/src/ui/docs/content/card.md +1 -1
- package/src/ui/docs/content/carousel.md +16 -11
- package/src/ui/docs/content/chat.md +3 -3
- package/src/ui/docs/content/checkbox.md +7 -7
- package/src/ui/docs/content/cli.md +5 -5
- package/src/ui/docs/content/collapsible.md +8 -8
- package/src/ui/docs/content/command.md +16 -8
- package/src/ui/docs/content/composer.md +2 -2
- package/src/ui/docs/content/content.md +2 -2
- package/src/ui/docs/content/copyable.md +4 -3
- package/src/ui/docs/content/customization.md +5 -5
- package/src/ui/docs/content/cycle.md +3 -3
- package/src/ui/docs/content/data-state.md +11 -12
- package/src/ui/docs/content/data.md +26 -33
- package/src/ui/docs/content/detail.md +3 -3
- package/src/ui/docs/content/dialog.md +339 -31
- package/src/ui/docs/content/dictionary-value.md +8 -8
- package/src/ui/docs/content/dock.md +3 -3
- package/src/ui/docs/content/drawer.md +27 -14
- package/src/ui/docs/content/empty-value.md +2 -2
- package/src/ui/docs/content/empty.md +19 -12
- package/src/ui/docs/content/events.md +4 -4
- package/src/ui/docs/content/field.md +34 -12
- package/src/ui/docs/content/getting-started.md +1 -1
- package/src/ui/docs/content/icon-picker.md +8 -4
- package/src/ui/docs/content/input-otp.md +20 -12
- package/src/ui/docs/content/input.md +121 -9
- package/src/ui/docs/content/item.md +27 -13
- package/src/ui/docs/content/kbd.md +19 -11
- package/src/ui/docs/content/label.md +5 -3
- package/src/ui/docs/content/log.md +4 -4
- package/src/ui/docs/content/markdown.md +7 -6
- package/src/ui/docs/content/mcp.md +13 -15
- package/src/ui/docs/content/menu.md +34 -16
- package/src/ui/docs/content/observability.md +2 -2
- package/src/ui/docs/content/page.md +51 -6
- package/src/ui/docs/content/pagination.md +22 -17
- package/src/ui/docs/content/popover.md +16 -8
- package/src/ui/docs/content/progress.md +7 -5
- package/src/ui/docs/content/queue.md +5 -5
- package/src/ui/docs/content/radio-group.md +20 -12
- package/src/ui/docs/content/router.md +11 -6
- package/src/ui/docs/content/scheduler.md +4 -5
- package/src/ui/docs/content/scroll-area.md +12 -7
- package/src/ui/docs/content/select.md +42 -29
- package/src/ui/docs/content/separator.md +5 -5
- package/src/ui/docs/content/sidebar.md +323 -54
- package/src/ui/docs/content/skeleton.md +3 -2
- package/src/ui/docs/content/slider.md +8 -7
- package/src/ui/docs/content/spinner.md +8 -8
- package/src/ui/docs/content/split.md +8 -5
- package/src/ui/docs/content/storage.md +6 -8
- package/src/ui/docs/content/switch.md +8 -7
- package/src/ui/docs/content/table.md +13 -3
- package/src/ui/docs/content/tabs.md +28 -14
- package/src/ui/docs/content/testing.md +9 -11
- package/src/ui/docs/content/textarea.md +5 -4
- package/src/ui/docs/content/toast.md +47 -13
- package/src/ui/docs/content/toggle.md +75 -7
- package/src/ui/docs/content/tokens.md +3 -3
- package/src/ui/docs/content/tooltip.md +19 -11
- package/src/ui/docs/content/truncate.md +7 -8
- package/src/ui/docs/content/ui.md +10 -9
- package/src/ui/docs/content/upgrading.md +7 -8
- package/src/ui/docs/registry.tsx +20 -37
- package/src/ui/meta.ts +64 -94
- package/src/ui/react.tsx +15 -16
- package/src/ui/theme.css +50 -0
- package/src/ui/components/primitives/alert-dialog.tsx +0 -192
- package/src/ui/docs/content/alert-dialog.md +0 -73
- package/src/ui/docs/content/button-group.md +0 -71
- package/src/ui/docs/content/confirm.md +0 -120
- package/src/ui/docs/content/input-group.md +0 -79
- package/src/ui/docs/content/page-state.md +0 -45
- package/src/ui/docs/content/toggle-group.md +0 -81
|
@@ -10,7 +10,8 @@ no pai para evitar uma moldura dupla.
|
|
|
10
10
|
|
|
11
11
|
## Com ícone
|
|
12
12
|
|
|
13
|
-
EmptyMedia variant=icon
|
|
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
|
|
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
|
-
|
|
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
|
|
42
|
+
O agente developer não tem skills anexadas. Adicione clean-code ou test para começar.
|
|
42
43
|
</EmptyDescription>
|
|
43
44
|
</EmptyHeader>
|
|
44
|
-
<
|
|
45
|
+
<EmptyActions>
|
|
45
46
|
<Button>
|
|
46
47
|
<Plus />
|
|
47
48
|
Anexar skill
|
|
48
49
|
</Button>
|
|
49
|
-
</
|
|
50
|
+
</EmptyActions>
|
|
50
51
|
</Empty>
|
|
51
52
|
```
|
|
52
53
|
|
|
53
|
-
## Mídia
|
|
54
|
+
## Mídia sem moldura
|
|
54
55
|
|
|
55
|
-
EmptyMedia variant=default
|
|
56
|
+
`EmptyMedia variant="default"` não desenha fundo. Use essa variação para ilustrações ou mídias que
|
|
57
|
+
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
|
-
##
|
|
73
|
+
## Propriedades de Empty
|
|
72
74
|
|
|
73
|
-
|
|
|
75
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
74
76
|
|---|---|---|---|
|
|
75
|
-
| `
|
|
76
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
formato
|
|
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
|
|
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
|
|
1
|
+
## Campo empilhado
|
|
2
2
|
|
|
3
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
##
|
|
54
|
+
## Propriedades de Field
|
|
51
55
|
|
|
52
|
-
|
|
|
56
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
53
57
|
|---|---|---|---|
|
|
54
|
-
| `orientation`
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
|
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.
|
|
@@ -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
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
|
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`
|
|
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('')
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
##
|
|
1
|
+
## Código em uma sequência
|
|
2
2
|
|
|
3
|
-
maxLength define
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
##
|
|
67
|
+
## Propriedades de InputOTP
|
|
65
68
|
|
|
66
|
-
|
|
|
69
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
67
70
|
|---|---|---|---|
|
|
68
|
-
| `maxLength`
|
|
69
|
-
| `value`
|
|
70
|
-
| `onChange`
|
|
71
|
-
| `disabled`
|
|
72
|
-
|
|
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
|
-
##
|
|
1
|
+
## Campo de uma linha
|
|
2
2
|
|
|
3
|
-
|
|
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`
|
|
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
|
-
|
|
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`
|
|
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
|
-
|
|
51
|
+
Para combinar mais de um adorno, use `InputGroup`.
|
|
49
52
|
|
|
50
53
|
## Com Label
|
|
51
54
|
|
|
52
|
-
htmlFor
|
|
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 é
|
|
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
|
-
|
|
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
|
-
##
|
|
1
|
+
## Linha composta
|
|
2
2
|
|
|
3
3
|
A composição completa usa `ItemMedia` à esquerda, `ItemHeader` (`ItemTitle` +
|
|
4
|
-
`ItemDescription`) no meio e `ItemActions` à direita.
|
|
5
|
-
|
|
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
|
|
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
|
|
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
|
-
##
|
|
103
|
+
## Propriedades de Item
|
|
104
104
|
|
|
105
|
-
|
|
|
106
|
-
|
|
107
|
-
| `variant`
|
|
108
|
-
| `
|
|
109
|
-
| `
|
|
110
|
-
|
|
111
|
-
|
|
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.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
##
|
|
1
|
+
## Uma tecla
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Use um `Kbd` para representar cada tecla. O componente apresenta o atalho; a captura do teclado
|
|
4
|
+
continua no handler do aplicativo.
|
|
4
5
|
|
|
5
6
|
```tsx preview
|
|
6
7
|
<Kbd>Esc</Kbd>
|
|
@@ -8,7 +9,7 @@ Uma tecla por Kbd. É só visual — quem escuta o atalho é o seu handler, não
|
|
|
8
9
|
|
|
9
10
|
## Combinação
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
Agrupe as teclas com `KbdGroup` e use `+` como texto entre elas.
|
|
12
13
|
|
|
13
14
|
```tsx preview
|
|
14
15
|
<KbdGroup>
|
|
@@ -20,7 +21,8 @@ Envolva as teclas num KbdGroup e ponha o conector (+) como texto entre elas —
|
|
|
20
21
|
|
|
21
22
|
## Com ícone
|
|
22
23
|
|
|
23
|
-
Um ícone
|
|
24
|
+
Um ícone Lucide recebe automaticamente a escala do componente. Use-o quando o símbolo for mais
|
|
25
|
+
reconhecível que o nome da tecla.
|
|
24
26
|
|
|
25
27
|
```tsx preview col-start
|
|
26
28
|
<KbdGroup>
|
|
@@ -35,7 +37,8 @@ Um ícone (lucide) como filho do Kbd ganha size-3 automático — bom pra ⌘ e
|
|
|
35
37
|
|
|
36
38
|
## No tooltip
|
|
37
39
|
|
|
38
|
-
Dentro de
|
|
40
|
+
Dentro de `TooltipContent`, o componente ajusta o contraste automaticamente. O tooltip deve nomear a
|
|
41
|
+
ação antes de informar seu atalho.
|
|
39
42
|
|
|
40
43
|
```tsx preview
|
|
41
44
|
<Tooltip>
|
|
@@ -52,11 +55,16 @@ Dentro de um TooltipContent o Kbd inverte o tom sozinho (fundo claro sobre o bal
|
|
|
52
55
|
</Tooltip>
|
|
53
56
|
```
|
|
54
57
|
|
|
55
|
-
##
|
|
58
|
+
## Propriedades de Kbd
|
|
56
59
|
|
|
57
|
-
|
|
|
60
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
58
61
|
|---|---|---|---|
|
|
59
|
-
| `children
|
|
60
|
-
| `className
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
| `children` | `React.ReactNode` | | Texto ou ícone que representa a tecla. Ícones Lucide recebem a escala visual do componente. |
|
|
63
|
+
| `className` | `string` | | Classes adicionais aplicadas à tecla. |
|
|
64
|
+
|
|
65
|
+
## Propriedades de KbdGroup
|
|
66
|
+
|
|
67
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
68
|
+
|---|---|---|---|
|
|
69
|
+
| `children` | `React.ReactNode` | | Teclas da combinação e conectores, como `+`, entre elas. |
|
|
70
|
+
| `className` | `string` | | Classes adicionais aplicadas ao agrupador. |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## Com campo de texto
|
|
2
2
|
|
|
3
|
-
htmlFor
|
|
3
|
+
Associe `htmlFor` ao `id` do controle para que clicar no rótulo mova o foco para o campo.
|
|
4
4
|
|
|
5
5
|
```tsx preview col md
|
|
6
6
|
<div className="grid gap-2">
|
|
@@ -11,7 +11,8 @@ htmlFor aponta pro id do controle — clicar no rótulo foca o campo.
|
|
|
11
11
|
|
|
12
12
|
## Com Checkbox
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
`Label` já organiza controles inline com espaçamento. Ao associá-lo ao `Checkbox`, clicar no texto
|
|
15
|
+
também alterna a seleção.
|
|
15
16
|
|
|
16
17
|
```tsx preview
|
|
17
18
|
<div className="flex items-center gap-2">
|
|
@@ -22,7 +23,8 @@ O Label já é flex com gap — controle inline entra sem wrapper extra; clicar
|
|
|
22
23
|
|
|
23
24
|
## Par desabilitado
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
Quando o controle está desabilitado, o rótulo associado acompanha o tratamento visual sem exigir
|
|
27
|
+
uma classe adicional.
|
|
26
28
|
|
|
27
29
|
```tsx preview
|
|
28
30
|
<div className="flex items-center gap-2">
|
|
@@ -4,9 +4,9 @@ title: Log
|
|
|
4
4
|
|
|
5
5
|
# Log
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
`
|
|
9
|
-
|
|
7
|
+
Use `ctx.log` para registrar eventos estruturados com o contexto da requisição e da action. O
|
|
8
|
+
`LoggerAdapter` também recebe os registros internos do runtime, mantendo aplicação e Opus no mesmo
|
|
9
|
+
destino e formato.
|
|
10
10
|
|
|
11
11
|
## O contrato
|
|
12
12
|
|
|
@@ -49,7 +49,7 @@ handler: async (ctx, input) => {
|
|
|
49
49
|
}
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
## Limites
|
|
52
|
+
## Limites atuais
|
|
53
53
|
|
|
54
54
|
Superfície mínima de níveis + `child`. Sem sampling nem transports próprios — isso mora no
|
|
55
55
|
`pino` que você passa. Drivers hoje: `pino`; outros entram por reincidência.
|