@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.
Files changed (52) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/bin/cli.mjs +68 -3
  3. package/bin/lib/check.mjs +86 -10
  4. package/bin/lib/copy.mjs +505 -67
  5. package/bin/lib/materialize.mjs +99 -1
  6. package/docs/adr/0028-schedules-run-actions-as-the-system-by-action-opt-in.md +1 -1
  7. package/docs/adr/0037-design-data-lives-outside-the-contract.md +1 -1
  8. package/docs/adr/0045-surface-replaces-content-and-card.md +3 -0
  9. package/docs/adr/0061-claude-md-imports-agents-md.md +41 -0
  10. package/docs/adr/0062-listas-contidas-e-texto-flexivel.md +68 -0
  11. package/docs/adr/0063-metadados-das-superficies.md +44 -0
  12. package/docs/adr/README.md +6 -0
  13. package/docs/code-style.md +47 -8
  14. package/docs/protocol.md +1 -1
  15. package/docs/releasing.md +7 -0
  16. package/package.json +1 -1
  17. package/registry/instructions/opus.md +3 -1
  18. package/registry/skills/build-opus-ui/SKILL.md +6 -4
  19. package/registry/skills/build-opus-ui/references/evaluations.md +10 -1
  20. package/registry/skills/build-opus-ui/references/ui-patterns.md +10 -2
  21. package/registry/skills/maintain-opus-docs/SKILL.md +2 -1
  22. package/registry/skills/maintain-opus-docs/references/editorial-standard.md +9 -0
  23. package/registry/skills/maintain-opus-docs/references/evaluations.md +8 -0
  24. package/registry/templates/app/pnpm-workspace.yaml +1 -1
  25. package/src/core/system-actor.ts +1 -1
  26. package/src/core/types.ts +1 -1
  27. package/src/ui/components/patterns/list.tsx +19 -10
  28. package/src/ui/components/patterns/page.tsx +27 -0
  29. package/src/ui/components/patterns/structural-header.tsx +25 -3
  30. package/src/ui/components/patterns/surface.tsx +36 -8
  31. package/src/ui/components/primitives/dialog.tsx +74 -42
  32. package/src/ui/components/primitives/drawer.tsx +69 -42
  33. package/src/ui/components/primitives/table.tsx +3 -3
  34. package/src/ui/docs/content/action-list.md +15 -8
  35. package/src/ui/docs/content/actions.md +1 -1
  36. package/src/ui/docs/content/auth.md +3 -3
  37. package/src/ui/docs/content/cli.md +6 -0
  38. package/src/ui/docs/content/communication.md +10 -8
  39. package/src/ui/docs/content/dialog.md +39 -0
  40. package/src/ui/docs/content/drawer.md +36 -0
  41. package/src/ui/docs/content/events.md +13 -13
  42. package/src/ui/docs/content/installation.md +4 -0
  43. package/src/ui/docs/content/log.md +1 -1
  44. package/src/ui/docs/content/page.md +30 -1
  45. package/src/ui/docs/content/queue.md +2 -2
  46. package/src/ui/docs/content/router.md +1 -1
  47. package/src/ui/docs/content/scheduler.md +15 -15
  48. package/src/ui/docs/content/surface.md +41 -8
  49. package/src/ui/docs/content/table.md +7 -0
  50. package/src/ui/docs/content/testing.md +4 -4
  51. package/src/ui/react.tsx +4 -0
  52. 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(caixaFechar, {}, { schedule: 'caixa.fechar-dia' })
74
- expect(output.fechados).toBeGreaterThan(0)
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(notaAnexar, { id: '9' }, { user, storage })
106
- expect(storage.keys()).toEqual(['notas/9.pdf'])
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,
@@ -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(contrato, resposta)`.
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.