@softize/opus 18.0.0 → 18.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.
- package/CHANGELOG.md +54 -0
- package/docs/adr/0010-page-header-owns-page-chrome.md +2 -2
- package/docs/adr/0015-action-size-follows-interaction-density.md +1 -1
- package/docs/adr/0016-productive-surfaces-use-compact-density.md +62 -0
- package/docs/adr/0017-ui-assumes-a-fixed-desktop-layout.md +54 -0
- package/docs/relative-unit-scale.md +9 -2
- package/package.json +1 -1
- package/registry/skills/build-opus-ui/references/evaluations.md +3 -1
- package/registry/skills/build-opus-ui/references/ui-patterns.md +10 -4
- package/src/core/runtime.ts +7 -1
- package/src/core/types.ts +12 -3
- package/src/mcp/index.ts +4 -1
- package/src/ui/components/patterns/action-list-dialog.tsx +2 -2
- package/src/ui/components/patterns/content-header.tsx +1 -1
- package/src/ui/components/patterns/form-dialog.tsx +7 -2
- package/src/ui/components/patterns/list.tsx +239 -47
- package/src/ui/components/patterns/page.tsx +1 -1
- package/src/ui/components/patterns/presentation.tsx +8 -6
- package/src/ui/components/patterns/state-surface.tsx +2 -2
- package/src/ui/components/patterns/surface-header.tsx +4 -4
- package/src/ui/components/patterns/trigger.tsx +1 -1
- package/src/ui/components/primitives/alert.tsx +2 -2
- package/src/ui/components/primitives/breadcrumb.tsx +1 -1
- package/src/ui/components/primitives/button-group.tsx +1 -1
- package/src/ui/components/primitives/button.tsx +3 -3
- package/src/ui/components/primitives/calendar.tsx +1 -1
- package/src/ui/components/primitives/close-button.tsx +40 -0
- package/src/ui/components/primitives/detail.tsx +66 -28
- package/src/ui/components/primitives/dialog.tsx +36 -21
- package/src/ui/components/primitives/drawer.tsx +26 -19
- package/src/ui/components/primitives/empty-value.tsx +3 -3
- package/src/ui/components/primitives/empty.tsx +1 -1
- package/src/ui/components/primitives/field.tsx +12 -12
- package/src/ui/components/primitives/icon-picker.tsx +1 -1
- package/src/ui/components/primitives/input-group.tsx +1 -1
- package/src/ui/components/primitives/input.tsx +2 -2
- package/src/ui/components/primitives/item.tsx +5 -5
- package/src/ui/components/primitives/pagination.tsx +4 -4
- package/src/ui/components/primitives/select.tsx +2 -2
- package/src/ui/components/primitives/table.tsx +26 -17
- package/src/ui/components/primitives/tabs.tsx +80 -23
- package/src/ui/components/primitives/textarea.tsx +1 -1
- package/src/ui/components/primitives/toggle-group.tsx +9 -2
- package/src/ui/docs/content/action-form.md +19 -0
- package/src/ui/docs/content/action-list-dialog.md +1 -1
- package/src/ui/docs/content/action-list.md +7 -1
- package/src/ui/docs/content/action-trigger.md +2 -2
- package/src/ui/docs/content/alert.md +2 -0
- package/src/ui/docs/content/button.md +3 -2
- package/src/ui/docs/content/customization.md +11 -1
- package/src/ui/docs/content/detail.md +9 -8
- package/src/ui/docs/content/dialog.md +12 -5
- package/src/ui/docs/content/drawer.md +6 -3
- package/src/ui/docs/content/empty-value.md +4 -4
- package/src/ui/docs/content/field.md +1 -1
- package/src/ui/docs/content/item.md +2 -0
- package/src/ui/docs/content/page.md +1 -1
- package/src/ui/docs/content/presentation.md +2 -2
- package/src/ui/docs/content/tabs.md +16 -6
- package/src/ui/docs/content/toast.md +2 -1
- package/src/ui/docs/content/tokens.md +45 -2
- package/src/ui/react.tsx +1 -0
- package/src/ui/theme.css +3 -0
|
@@ -4,12 +4,15 @@ Use `Tabs` para alternar painéis relacionados no mesmo contexto. O `value` de c
|
|
|
4
4
|
corresponde ao `TabsContent` que ele abre. `defaultValue` define a aba inicial no modo não
|
|
5
5
|
controlado.
|
|
6
6
|
|
|
7
|
+
`icon` posiciona um ícone decorativo antes do rótulo e normaliza SVGs para `1rem`. Quando a aba
|
|
8
|
+
mostrar somente o ícone, declare `aria-label` para preservar seu nome acessível.
|
|
9
|
+
|
|
7
10
|
```tsx preview col
|
|
8
11
|
<Tabs defaultValue="sessions">
|
|
9
12
|
<TabsList>
|
|
10
|
-
<TabsTrigger value="overview">Visão geral</TabsTrigger>
|
|
11
|
-
<TabsTrigger value="sessions">Sessões</TabsTrigger>
|
|
12
|
-
<TabsTrigger value="skills">Skills</TabsTrigger>
|
|
13
|
+
<TabsTrigger value="overview" icon={<LayoutDashboard />}>Visão geral</TabsTrigger>
|
|
14
|
+
<TabsTrigger value="sessions" icon={<History />}>Sessões</TabsTrigger>
|
|
15
|
+
<TabsTrigger value="skills" icon={<Settings />}>Skills</TabsTrigger>
|
|
13
16
|
</TabsList>
|
|
14
17
|
<TabsContent value="overview">
|
|
15
18
|
<p className="text-sm text-muted-foreground">Resumo do workspace Empresa X.</p>
|
|
@@ -25,8 +28,14 @@ controlado.
|
|
|
25
28
|
|
|
26
29
|
## Variante line
|
|
27
30
|
|
|
28
|
-
Use `variant="line"` em `TabsList` quando a
|
|
29
|
-
cabeçalho.
|
|
31
|
+
Use `variant="line"` em `TabsList` quando a navegação precisar de uma linha-base, como em um
|
|
32
|
+
cabeçalho. Na orientação horizontal, a lista ocupa toda a largura disponível e a aba ativa é
|
|
33
|
+
marcada sobre essa linha, em vez de usar uma superfície preenchida. Dentro de `DrawerBody`, a
|
|
34
|
+
linha atravessa o gutter até as bordas do drawer sem deslocar os rótulos. O mesmo comportamento
|
|
35
|
+
vale para `DialogBody`.
|
|
36
|
+
Os itens removem o padding horizontal, usam `0.75rem` de padding vertical e preservam `1.25rem`
|
|
37
|
+
de espaço entre si. Nessa orientação, a altura é definida pelo conteúdo para que o padding
|
|
38
|
+
vertical amplie a área interativa.
|
|
30
39
|
|
|
31
40
|
```tsx preview col
|
|
32
41
|
<Tabs defaultValue="agents">
|
|
@@ -99,10 +108,11 @@ lateral do gatilho.
|
|
|
99
108
|
|
|
100
109
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
101
110
|
|---|---|---|---|
|
|
102
|
-
| `variant` | `'default' \| 'line'` | `'default'` | `default` usa uma superfície preenchida; `line` marca a aba ativa
|
|
111
|
+
| `variant` | `'default' \| 'line'` | `'default'` | `default` usa uma superfície preenchida; `line` cria uma linha-base horizontal de largura total e marca nela a aba ativa. |
|
|
103
112
|
|
|
104
113
|
## Propriedades de TabsTrigger e TabsContent
|
|
105
114
|
|
|
106
115
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
107
116
|
|---|---|---|---|
|
|
108
117
|
| `value` | `string` | | Identificador que associa o gatilho ao painel correspondente. |
|
|
118
|
+
| `icon` | `ReactNode` | | Ícone decorativo antes do rótulo; SVGs usam `1rem`. |
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
Use `toast` para informar o resultado temporário de uma ação sem interromper o fluxo. Cada tipo usa o
|
|
4
4
|
ícone correspondente do Opus. Escreva o título como rótulo, sem ponto final, e a descrição como uma
|
|
5
5
|
frase. A moldura do ícone permanece quadrada e alinhada à primeira linha mesmo quando a descrição
|
|
6
|
-
ocupa várias linhas.
|
|
6
|
+
ocupa várias linhas. Corpo e padding seguem os mesmos `0.875rem` e `0.75rem` do Alert; os defaults
|
|
7
|
+
internos do Sonner não definem a densidade da casa.
|
|
7
8
|
|
|
8
9
|
```tsx preview
|
|
9
10
|
<Button variant="outline" onClick={() => toast.success('Workspace criado')}>Sucesso</Button>
|
|
@@ -53,7 +53,7 @@ família oferece sólido, foreground, superfície sutil, ênfase e borda. Use as
|
|
|
53
53
|
```tsx preview
|
|
54
54
|
const CONTEXTS = ['neutral', 'primary', 'info', 'success', 'warning', 'danger']
|
|
55
55
|
render(
|
|
56
|
-
<div className="grid w-full
|
|
56
|
+
<div className="grid w-full grid-cols-3 gap-2">
|
|
57
57
|
{CONTEXTS.map((context) => (
|
|
58
58
|
<div
|
|
59
59
|
key={context}
|
|
@@ -79,7 +79,7 @@ render(
|
|
|
79
79
|
```tsx preview
|
|
80
80
|
const LINES = [
|
|
81
81
|
['border', 'Bordas de contêineres (cards, tabelas, separadores).'],
|
|
82
|
-
['input', 'Borda de campos de formulário.'],
|
|
82
|
+
['input', 'Borda e fundo sutil de campos de formulário.'],
|
|
83
83
|
['ring', 'O anel de foco (focus-visible).'],
|
|
84
84
|
]
|
|
85
85
|
render(
|
|
@@ -135,6 +135,49 @@ render(
|
|
|
135
135
|
> aplicação continuam responsáveis pela densidade. Uma aplicação pode ajustar `font-size` em
|
|
136
136
|
> `html`; texto, espaçamento, radius, foco e elevação acompanham a mesma decisão.
|
|
137
137
|
|
|
138
|
+
## Tipografia produtiva
|
|
139
|
+
|
|
140
|
+
Interfaces operacionais precisam acomodar controles, dados e ações sem transformar o corpo comum
|
|
141
|
+
em texto secundário. Use `text-sm` (`0.875rem`) como corpo produtivo: descrições curtas, valores,
|
|
142
|
+
rótulos e texto de componentes. Reserve `text-base` (`1rem`) para leitura mais confortável, como
|
|
143
|
+
prosa longa, conteúdo editorial ou uma ênfase que dependa de tamanho.
|
|
144
|
+
|
|
145
|
+
O tema não reduz o texto do `body`. Componentes e regiões produtivas declaram `text-sm`
|
|
146
|
+
explicitamente em uma raiz controlada, enquanto o texto geral do documento permanece em `1rem`.
|
|
147
|
+
Assim, escolher o corpo da interface não recalibra tipografia, espaçamento ou dimensões globais.
|
|
148
|
+
|
|
149
|
+
`base` nomeia o degrau de `1rem` da escala técnica; não significa que todo produto precisa usá-lo
|
|
150
|
+
como corpo predominante. Preserve a fonte raiz usual do documento para que `1rem` continue sendo a
|
|
151
|
+
referência do navegador e para que espaçamentos e controles em `rem` não mudem quando a intenção for
|
|
152
|
+
somente escolher um papel tipográfico.
|
|
153
|
+
|
|
154
|
+
A herança continua fazendo parte da composição. Declare `text-sm` na raiz de um componente ou de
|
|
155
|
+
uma região produtiva e omita a classe apenas nos filhos que herdam dessa raiz controlada. Um
|
|
156
|
+
elemento também declara `text-sm` quando precisa restaurar o corpo produtivo dentro de um contexto
|
|
157
|
+
com outro tamanho. Não crie um alias como `text-body`: ele esconderia o mesmo degrau sem eliminar
|
|
158
|
+
a necessidade de declarar o papel tipográfico.
|
|
159
|
+
|
|
160
|
+
```tsx preview
|
|
161
|
+
render(
|
|
162
|
+
<div className="space-y-3 text-sm">
|
|
163
|
+
<p>Corpo produtivo para a interface.</p>
|
|
164
|
+
<p className="text-base leading-relaxed">
|
|
165
|
+
Corpo ampliado para um trecho que pede leitura mais confortável.
|
|
166
|
+
</p>
|
|
167
|
+
<div className="text-xs text-muted-foreground">
|
|
168
|
+
Metadado compacto.
|
|
169
|
+
<p className="mt-1 text-sm text-foreground">
|
|
170
|
+
Corpo produtivo restaurado dentro do contexto compacto.
|
|
171
|
+
</p>
|
|
172
|
+
</div>
|
|
173
|
+
</div>,
|
|
174
|
+
)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Alterar `font-size` em `html` permanece válido quando a aplicação quer recalibrar **toda** a
|
|
178
|
+
interface. Essa decisão escala tipografia, espaços, controles, radius e elevação em conjunto; não é
|
|
179
|
+
o mecanismo para fazer `text-sm` se chamar `text-base`.
|
|
180
|
+
|
|
138
181
|
## Radius
|
|
139
182
|
|
|
140
183
|
> A escala mapeada no `@theme inline` preserva o sentido pré-v4 dos utilitários `rounded-*`
|
package/src/ui/react.tsx
CHANGED
package/src/ui/theme.css
CHANGED