@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.
Files changed (63) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/docs/adr/0010-page-header-owns-page-chrome.md +2 -2
  3. package/docs/adr/0015-action-size-follows-interaction-density.md +1 -1
  4. package/docs/adr/0016-productive-surfaces-use-compact-density.md +62 -0
  5. package/docs/adr/0017-ui-assumes-a-fixed-desktop-layout.md +54 -0
  6. package/docs/relative-unit-scale.md +9 -2
  7. package/package.json +1 -1
  8. package/registry/skills/build-opus-ui/references/evaluations.md +3 -1
  9. package/registry/skills/build-opus-ui/references/ui-patterns.md +10 -4
  10. package/src/core/runtime.ts +7 -1
  11. package/src/core/types.ts +12 -3
  12. package/src/mcp/index.ts +4 -1
  13. package/src/ui/components/patterns/action-list-dialog.tsx +2 -2
  14. package/src/ui/components/patterns/content-header.tsx +1 -1
  15. package/src/ui/components/patterns/form-dialog.tsx +7 -2
  16. package/src/ui/components/patterns/list.tsx +239 -47
  17. package/src/ui/components/patterns/page.tsx +1 -1
  18. package/src/ui/components/patterns/presentation.tsx +8 -6
  19. package/src/ui/components/patterns/state-surface.tsx +2 -2
  20. package/src/ui/components/patterns/surface-header.tsx +4 -4
  21. package/src/ui/components/patterns/trigger.tsx +1 -1
  22. package/src/ui/components/primitives/alert.tsx +2 -2
  23. package/src/ui/components/primitives/breadcrumb.tsx +1 -1
  24. package/src/ui/components/primitives/button-group.tsx +1 -1
  25. package/src/ui/components/primitives/button.tsx +3 -3
  26. package/src/ui/components/primitives/calendar.tsx +1 -1
  27. package/src/ui/components/primitives/close-button.tsx +40 -0
  28. package/src/ui/components/primitives/detail.tsx +66 -28
  29. package/src/ui/components/primitives/dialog.tsx +36 -21
  30. package/src/ui/components/primitives/drawer.tsx +26 -19
  31. package/src/ui/components/primitives/empty-value.tsx +3 -3
  32. package/src/ui/components/primitives/empty.tsx +1 -1
  33. package/src/ui/components/primitives/field.tsx +12 -12
  34. package/src/ui/components/primitives/icon-picker.tsx +1 -1
  35. package/src/ui/components/primitives/input-group.tsx +1 -1
  36. package/src/ui/components/primitives/input.tsx +2 -2
  37. package/src/ui/components/primitives/item.tsx +5 -5
  38. package/src/ui/components/primitives/pagination.tsx +4 -4
  39. package/src/ui/components/primitives/select.tsx +2 -2
  40. package/src/ui/components/primitives/table.tsx +26 -17
  41. package/src/ui/components/primitives/tabs.tsx +80 -23
  42. package/src/ui/components/primitives/textarea.tsx +1 -1
  43. package/src/ui/components/primitives/toggle-group.tsx +9 -2
  44. package/src/ui/docs/content/action-form.md +19 -0
  45. package/src/ui/docs/content/action-list-dialog.md +1 -1
  46. package/src/ui/docs/content/action-list.md +7 -1
  47. package/src/ui/docs/content/action-trigger.md +2 -2
  48. package/src/ui/docs/content/alert.md +2 -0
  49. package/src/ui/docs/content/button.md +3 -2
  50. package/src/ui/docs/content/customization.md +11 -1
  51. package/src/ui/docs/content/detail.md +9 -8
  52. package/src/ui/docs/content/dialog.md +12 -5
  53. package/src/ui/docs/content/drawer.md +6 -3
  54. package/src/ui/docs/content/empty-value.md +4 -4
  55. package/src/ui/docs/content/field.md +1 -1
  56. package/src/ui/docs/content/item.md +2 -0
  57. package/src/ui/docs/content/page.md +1 -1
  58. package/src/ui/docs/content/presentation.md +2 -2
  59. package/src/ui/docs/content/tabs.md +16 -6
  60. package/src/ui/docs/content/toast.md +2 -1
  61. package/src/ui/docs/content/tokens.md +45 -2
  62. package/src/ui/react.tsx +1 -0
  63. 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 lista precisar se integrar a uma borda, como em um
29
- cabeçalho. A aba ativa é marcada por uma linha em vez de uma superfície preenchida.
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 junto à borda. |
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 gap-2 sm:grid-cols-2 lg:grid-cols-3">
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
@@ -388,6 +388,7 @@ export {
388
388
  export type {
389
389
  ActionFilterBarProps,
390
390
  ActionFilterState,
391
+ AdvancedFiltersLayout,
391
392
  ActionListProps,
392
393
  ActionListColumn,
393
394
  ActionListState,
package/src/ui/theme.css CHANGED
@@ -333,6 +333,9 @@
333
333
  * do Sonner, independentemente da ordem em que a biblioteca injeta seus estilos. */
334
334
  .opus-toast {
335
335
  gap: 0.75rem;
336
+ padding: 0.75rem;
337
+ font-size: 0.875rem;
338
+ line-height: 1.25rem;
336
339
  }
337
340
 
338
341
  .opus-toast .opus-toast-icon {