@softize/opus 28.0.0 → 30.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 +79 -0
- package/bin/cli.mjs +68 -3
- package/bin/lib/check.mjs +86 -10
- package/bin/lib/copy.mjs +505 -67
- package/bin/lib/materialize.mjs +99 -1
- package/docs/adr/0028-schedules-run-actions-as-the-system-by-action-opt-in.md +1 -1
- package/docs/adr/0037-design-data-lives-outside-the-contract.md +1 -1
- package/docs/adr/0045-surface-replaces-content-and-card.md +3 -0
- package/docs/adr/0061-claude-md-imports-agents-md.md +41 -0
- package/docs/adr/0062-listas-contidas-e-texto-flexivel.md +68 -0
- package/docs/adr/0063-metadados-das-superficies.md +44 -0
- package/docs/adr/README.md +6 -0
- package/docs/code-style.md +47 -8
- package/docs/protocol.md +1 -1
- package/docs/releasing.md +7 -0
- package/package.json +1 -1
- package/registry/instructions/opus.md +3 -1
- package/registry/skills/build-opus-ui/SKILL.md +6 -4
- package/registry/skills/build-opus-ui/references/evaluations.md +10 -1
- package/registry/skills/build-opus-ui/references/ui-patterns.md +10 -2
- package/registry/skills/maintain-opus-docs/SKILL.md +2 -1
- package/registry/skills/maintain-opus-docs/references/editorial-standard.md +9 -0
- package/registry/skills/maintain-opus-docs/references/evaluations.md +8 -0
- package/registry/templates/app/pnpm-workspace.yaml +1 -1
- package/src/core/system-actor.ts +1 -1
- package/src/core/types.ts +1 -1
- package/src/ui/components/patterns/list.tsx +19 -10
- package/src/ui/components/patterns/page.tsx +27 -0
- package/src/ui/components/patterns/structural-header.tsx +25 -3
- package/src/ui/components/patterns/surface.tsx +36 -8
- package/src/ui/components/primitives/dialog.tsx +74 -42
- package/src/ui/components/primitives/drawer.tsx +69 -42
- package/src/ui/components/primitives/table.tsx +3 -3
- package/src/ui/docs/content/action-list.md +15 -8
- package/src/ui/docs/content/actions.md +1 -1
- package/src/ui/docs/content/auth.md +3 -3
- package/src/ui/docs/content/cli.md +6 -0
- package/src/ui/docs/content/communication.md +10 -8
- package/src/ui/docs/content/dialog.md +39 -0
- package/src/ui/docs/content/drawer.md +36 -0
- package/src/ui/docs/content/events.md +13 -13
- package/src/ui/docs/content/installation.md +4 -0
- package/src/ui/docs/content/log.md +1 -1
- package/src/ui/docs/content/page.md +30 -1
- package/src/ui/docs/content/queue.md +2 -2
- package/src/ui/docs/content/router.md +1 -1
- package/src/ui/docs/content/scheduler.md +15 -15
- package/src/ui/docs/content/surface.md +41 -8
- package/src/ui/docs/content/table.md +7 -0
- package/src/ui/docs/content/testing.md +4 -4
- package/src/ui/react.tsx +4 -0
- package/src/vite/design.ts +1 -1
|
@@ -432,6 +432,24 @@ faixa que cobre o conteúdo ao rolar — usa `bg-[var(--surface-background,var(-
|
|
|
432
432
|
página, vale `--background`; dentro de uma superfície elevada, o fundo dela. Um contêiner da
|
|
433
433
|
aplicação que pinte outro fundo declara a mesma variável com a cor que usa.
|
|
434
434
|
|
|
435
|
+
## Metadados junto à identidade
|
|
436
|
+
|
|
437
|
+
Use `SurfaceMeta` para badges, autoria e datas relacionados ao registro. A faixa fica
|
|
438
|
+
abaixo da linha de título e ações, com espaço próprio; `SurfaceDescription` continua
|
|
439
|
+
reservado à orientação textual breve. Os itens quebram em várias linhas quando necessário.
|
|
440
|
+
|
|
441
|
+
```tsx preview col
|
|
442
|
+
render(
|
|
443
|
+
<Surface as="article" title="Manual de atendimento" meta={<><Badge>Publicado</Badge><span>Por Ana</span></>}>
|
|
444
|
+
<p>Conteúdo do manual.</p>
|
|
445
|
+
</Surface>
|
|
446
|
+
);
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
A composição aceita um único `SurfaceMeta` e exige um `SurfaceTitle`. Na forma explícita, coloque-o em `SurfaceHeader`. Em `fieldset`, coloque os metadados no corpo; a legenda permanece restrita a título e mídia decorativa.
|
|
450
|
+
|
|
451
|
+
O total da coleção continua ao lado do título: use `count` na forma curta ou `SurfaceCount` na explícita. Se um `SurfaceMeta` antigo representava esse total, migre para `SurfaceCount`.
|
|
452
|
+
|
|
435
453
|
## Propriedades de Surface
|
|
436
454
|
|
|
437
455
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
@@ -446,6 +464,7 @@ aplicação que pinte outro fundo declara a mesma variável com a cor que usa.
|
|
|
446
464
|
| `media` | `ReactNode` | | Forma curta: conteúdo do slot de mídia, antes do título. Exige `title`. |
|
|
447
465
|
| `count` | `number` | | Forma curta: total de itens ao lado do título. Exige `title`; indisponível em `fieldset`. |
|
|
448
466
|
| `description` | `ReactNode` | | Forma curta: frase de apoio sob o título. Exige `title`; indisponível em `fieldset`. |
|
|
467
|
+
| `meta` | `ReactNode` | | Forma curta: metadados sob o título e a orientação. Exige `title`; indisponível em `fieldset`. |
|
|
449
468
|
| `actions` | `ReactNode` | | Forma curta: ações sobre a superfície inteira. Exige `title`; indisponível em `fieldset`. |
|
|
450
469
|
| `className` | `string` | | Compõe sobre a superfície. Na caixa simples, é onde entra o recuo. |
|
|
451
470
|
| `children` | `ReactNode` | | Filhos livres, que formam o corpo, ou os slots `SurfaceHeader`, `SurfaceBody` e `SurfaceFooter`. |
|
|
@@ -456,7 +475,7 @@ As demais propriedades são as nativas do elemento escolhido em `as`.
|
|
|
456
475
|
|
|
457
476
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
458
477
|
| ----------- | ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
459
|
-
| `children` | `ReactNode` | | No máximo um de cada: `SurfaceMedia`, `SurfaceTitle`, `SurfaceMeta`, `SurfaceDescription` e `SurfaceActions`. Em `fieldset`, o `SurfaceTitle` é obrigatório e somente ele e `SurfaceMedia` são aceitos. |
|
|
478
|
+
| `children` | `ReactNode` | | No máximo um de cada: `SurfaceMedia`, `SurfaceTitle`, `SurfaceCount`, `SurfaceMeta`, `SurfaceDescription` e `SurfaceActions`. Em `fieldset`, o `SurfaceTitle` é obrigatório e somente ele e `SurfaceMedia` são aceitos. |
|
|
460
479
|
| `className` | `string` | | Ajusta a região do header. |
|
|
461
480
|
|
|
462
481
|
`SurfaceHeader` só existe como filho direto de `Surface`.
|
|
@@ -475,13 +494,6 @@ As demais propriedades são as nativas do elemento escolhido em `as`.
|
|
|
475
494
|
| `children` | `ReactNode` | | Nome da superfície. O heading usa o `level` declarado em `Surface`. |
|
|
476
495
|
| `className` | `string` | | Ajusta o título. |
|
|
477
496
|
|
|
478
|
-
## Propriedades de SurfaceMeta
|
|
479
|
-
|
|
480
|
-
| Propriedade | Tipo | Padrão | Descrição |
|
|
481
|
-
| ----------- | ----------- | ------ | -------------------------------------------------------- |
|
|
482
|
-
| `children` | `ReactNode` | | Metadado curto ao lado do título, como o total de itens. |
|
|
483
|
-
| `className` | `string` | | Ajusta o metadado. |
|
|
484
|
-
|
|
485
497
|
## Propriedades de SurfaceDescription
|
|
486
498
|
|
|
487
499
|
| Propriedade | Tipo | Padrão | Descrição |
|
|
@@ -520,3 +532,24 @@ um wrapper filho declara relações locais mais compactas.
|
|
|
520
532
|
é opcional e não repete o título. A mesma regra vale para uma página (`level={1}`), uma seção ou
|
|
521
533
|
um card: condições, limites e consequências necessários à decisão ficam no corpo ou junto do
|
|
522
534
|
controle correspondente. Pular o subheading não deve comprometer a tarefa.
|
|
535
|
+
|
|
536
|
+
## Propriedades de SurfaceCount
|
|
537
|
+
|
|
538
|
+
| Propriedade | Tipo | Descrição |
|
|
539
|
+
| --- | --- | --- |
|
|
540
|
+
| `children` | `ReactNode` | Contador ao lado do título. |
|
|
541
|
+
| `className` | `string` | Ajusta a apresentação do contador. |
|
|
542
|
+
|
|
543
|
+
Aceita atributos nativos de `span`. Deve estar em `SurfaceHeader`, fora de `fieldset`.
|
|
544
|
+
|
|
545
|
+
## Propriedades de SurfaceMeta
|
|
546
|
+
|
|
547
|
+
| Propriedade | Tipo | Descrição |
|
|
548
|
+
| --- | --- | --- |
|
|
549
|
+
| `children` | `ReactNode` | Badges, datas, autoria ou outros metadados do registro. |
|
|
550
|
+
| `className` | `string` | Ajusta a faixa de metadados. |
|
|
551
|
+
|
|
552
|
+
Aceita atributos nativos de `div`. O intervalo superior é de 0,75rem; os itens têm
|
|
553
|
+
0,75rem entre colunas e 0,5rem entre linhas. O componente não insere separadores nem
|
|
554
|
+
carrega dados. Omitir o slot não reserva espaço. Metadados não substituem orientações
|
|
555
|
+
ou condições necessárias à decisão e não substituem a descrição textual da região.
|
|
@@ -8,6 +8,13 @@ A variante padrão não possui borda externa; `TableBody` mantém somente as div
|
|
|
8
8
|
Aplique `text-right` ao cabeçalho e às células quando o domínio pedir alinhamento numérico.
|
|
9
9
|
`TableCaption` descreve a tabela abaixo do conteúdo.
|
|
10
10
|
|
|
11
|
+
As células quebram texto entre palavras. Identificadores longos sem espaços podem exigir
|
|
12
|
+
rolagem horizontal; aplique `wrap-anywhere` à célula quando quiser permitir quebra no meio
|
|
13
|
+
desses valores. Use `whitespace-nowrap` para preservar valores inteiros, como números e datas.
|
|
14
|
+
O contêiner limita a tabela ao espaço recebido e oferece rolagem horizontal quando o conteúdo
|
|
15
|
+
ou larguras mínimas explícitas não cabem. Em uma composição flex ou grid, permita que o ancestral também
|
|
16
|
+
encolha (`min-w-0`); a tabela não pode redefinir a largura de um ancestral.
|
|
17
|
+
|
|
11
18
|
```tsx preview col
|
|
12
19
|
<Table>
|
|
13
20
|
<TableCaption>Sessões recentes do workspace Empresa X.</TableCaption>
|
|
@@ -70,8 +70,8 @@ runtime: `ctx.user` é `null`, `ctx.can` nega tudo e `isSystemActor(ctx)` respon
|
|
|
70
70
|
|
|
71
71
|
```ts
|
|
72
72
|
it('o fechamento diário roda pelo sistema', async () => {
|
|
73
|
-
const { output } = await runAction(
|
|
74
|
-
expect(output.
|
|
73
|
+
const { output } = await runAction(ledgerClose, {}, { schedule: 'ledger.close-day' })
|
|
74
|
+
expect(output.closedEntries).toBeGreaterThan(0)
|
|
75
75
|
})
|
|
76
76
|
```
|
|
77
77
|
|
|
@@ -102,8 +102,8 @@ validação de chave dos drivers reais:
|
|
|
102
102
|
import { memStorage, runAction } from '@softize/opus/testing'
|
|
103
103
|
|
|
104
104
|
const storage = memStorage()
|
|
105
|
-
await runAction(
|
|
106
|
-
expect(storage.keys()).toEqual(['
|
|
105
|
+
await runAction(invoiceAttach, { id: '9' }, { user, storage })
|
|
106
|
+
expect(storage.keys()).toEqual(['invoices/9.pdf'])
|
|
107
107
|
```
|
|
108
108
|
|
|
109
109
|
## fake — dados gerados pelo schema
|
package/src/ui/react.tsx
CHANGED
|
@@ -177,6 +177,7 @@ export {
|
|
|
177
177
|
DialogActions,
|
|
178
178
|
DialogIntro,
|
|
179
179
|
DialogIntroActions,
|
|
180
|
+
DialogMeta,
|
|
180
181
|
DialogBody,
|
|
181
182
|
DialogFooter,
|
|
182
183
|
DialogTitle,
|
|
@@ -326,6 +327,7 @@ export {
|
|
|
326
327
|
DrawerActions,
|
|
327
328
|
DrawerIntro,
|
|
328
329
|
DrawerIntroActions,
|
|
330
|
+
DrawerMeta,
|
|
329
331
|
DrawerClose,
|
|
330
332
|
DrawerContent,
|
|
331
333
|
DrawerFooter,
|
|
@@ -517,6 +519,7 @@ export {
|
|
|
517
519
|
PageHeader,
|
|
518
520
|
PageIntro,
|
|
519
521
|
PageIntroActions,
|
|
522
|
+
PageMeta,
|
|
520
523
|
PageNavigation,
|
|
521
524
|
PageBack,
|
|
522
525
|
PageTitle,
|
|
@@ -549,6 +552,7 @@ export {
|
|
|
549
552
|
SurfaceTitle,
|
|
550
553
|
SurfaceDescription,
|
|
551
554
|
SurfaceMeta,
|
|
555
|
+
SurfaceCount,
|
|
552
556
|
SurfaceActions,
|
|
553
557
|
SurfaceBody,
|
|
554
558
|
SurfaceFooter,
|
package/src/vite/design.ts
CHANGED
|
@@ -89,7 +89,7 @@ export interface OpusDesignOptions {
|
|
|
89
89
|
entry?: string | string[]
|
|
90
90
|
|
|
91
91
|
/**
|
|
92
|
-
* Cenários de design (ADR 0037): módulos que exportam `defineDesignScenario(
|
|
92
|
+
* Cenários de design (ADR 0037): módulos que exportam `defineDesignScenario(contract, response)`.
|
|
93
93
|
* Aceita caminhos e globs, como `entry`. O cenário vence a resposta padrão gerada pelo `fake`;
|
|
94
94
|
* cenário de action inexistente impede o boot, com a lista no erro.
|
|
95
95
|
* Sem default: o projeto decide onde os cenários ficam e se são versionados.
|