@praxisui/list 9.0.0-beta.4 → 9.0.0-beta.5

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.
@@ -70,18 +70,19 @@ Objetivo: suportar a referencia aberta e preparar cenarios reais.
70
70
 
71
71
  ### Itens
72
72
 
73
- - Evoluir `ListExpansionSectionDef` com `metadata` e `component`.
74
- - Evoluir `expansion` com `dataSource`, `schemaContract` e `rendering`.
75
- - Implementar `expansion.dataSource.mode = inline`.
76
- - Implementar `expansion.dataSource.mode = resource`.
77
- - Implementar `expansion.dataSource.mode = resourcePath`.
78
- - Implementar interpolacao por `paramsMap`.
79
- - Implementar `resourceAllowList`.
80
- - Bloquear `resourcePath` absoluto ou com scheme.
81
- - Implementar cache por item expandido.
82
- - Implementar cancelamento ao colapsar.
83
- - Implementar sanitizacao de schema com `allowedNodes`.
84
- - Implementar shell visual `attached` para detail row.
73
+ - [x] Evoluir `ListExpansionSectionDef` com `metadata`, `component` e `rich-content`.
74
+ - [x] Implementar detail inline por `expansion.sections`.
75
+ - [x] Hospedar `RichContentDocument` em `expansion.sections[].type = rich-content`.
76
+ - [x] Implementar shell visual `attached` para detail row.
77
+ - [ ] Evoluir `expansion` com `dataSource`, `schemaContract` e `rendering` para detail remoto.
78
+ - [ ] Implementar `expansion.dataSource.mode = resource`.
79
+ - [ ] Implementar `expansion.dataSource.mode = resourcePath`.
80
+ - [ ] Implementar interpolacao por `paramsMap`.
81
+ - [ ] Implementar `resourceAllowList`.
82
+ - [ ] Bloquear `resourcePath` absoluto ou com scheme.
83
+ - [ ] Implementar cache por item expandido.
84
+ - [ ] Implementar cancelamento ao colapsar.
85
+ - [ ] Implementar sanitizacao de schema com `allowedNodes`.
85
86
 
86
87
  ### Criterios de aceite
87
88
 
@@ -58,7 +58,7 @@ Confirmar, ponto a ponto, que a evolucao proposta para a `praxis-list` cobre a r
58
58
 
59
59
  ## Checklist de Detail Remoto
60
60
 
61
- - [ ] A expansao pode operar com dados inline.
61
+ - [x] A expansao pode operar com dados inline.
62
62
  - [ ] A expansao pode operar com `resource`.
63
63
  - [ ] A expansao pode operar com `resourcePath`.
64
64
  - [ ] O `resourcePath` suporta `paramsMap`.
@@ -72,7 +72,7 @@ Confirmar, ponto a ponto, que a evolucao proposta para a `praxis-list` cobre a r
72
72
  - [ ] As metricas suportam layouts diferentes sem hacks.
73
73
  - [ ] O trailing suporta diferentes combinacoes de alertas/owner/acoes.
74
74
  - [ ] O bloco de identidade suporta variacao de badge, subtitulo e adornos.
75
- - [ ] A expansao suporta sections declarativas adicionais.
75
+ - [x] A expansao suporta sections declarativas adicionais.
76
76
 
77
77
  ## Cobertura Esperada do Contrato
78
78
 
@@ -86,6 +86,7 @@ Confirmar, ponto a ponto, que a evolucao proposta para a `praxis-list` cobre a r
86
86
  - `expansion.dataSource`
87
87
  - `expansion.schemaContract`
88
88
  - `expansion.rendering`
89
+ - `expansion.sections[].type = rich-content`
89
90
 
90
91
  ### Cobertura completa, mas recomendando renderer dedicado
91
92
 
@@ -2,9 +2,11 @@
2
2
 
3
3
  ## Status
4
4
 
5
- Proposto.
5
+ Aceito e implementado no runtime atual.
6
6
 
7
- Nao implementado no runtime atual.
7
+ Atualizado em 2026-06 para refletir a evolucao de `expansion.sections` com
8
+ `metadata`, `component` e `rich-content`, alem da materializacao estruturada de
9
+ JSON em `itemsExpr`.
8
10
 
9
11
  ## Problema
10
12
 
@@ -28,7 +30,7 @@ Consequencias da ausencia de contrato formal:
28
30
 
29
31
  Tratar expansao inline como evolucao formal do contrato do `praxis-list`, com escopo reduzido e governado.
30
32
 
31
- Regras normativas da proposta V1:
33
+ Regras normativas da V1:
32
34
 
33
35
  1. A V1 cobre apenas `layout.variant = 'list'`.
34
36
  2. A V1 adiciona dois blocos novos ao contrato: `interaction` e `expansion`.
@@ -37,7 +39,8 @@ Regras normativas da proposta V1:
37
39
  5. O conteudo expandido e composto por secoes com tipos fechados e previsiveis.
38
40
  6. `cards` e `tiles` ficam fora do escopo da V1.
39
41
  7. `selection` e expansao podem coexistir, mas o trigger padrao deve favorecer icone dedicado quando houver selecao ativa.
40
- 8. A API canônica so deve promover esse contrato para `Active` depois de implementacao, testes de acessibilidade e exemplos oficiais.
42
+ 8. A API canonica deve hospedar documentos `RichContentDocument` quando a detail row precisar de composicao editorial rica, acoes internas e layout moderno.
43
+ 9. A identidade de renderizacao da linha deve ser independente de `selection.compareBy`, para suportar recursos relacionais em que IDs de selecao ou entidades se repetem.
41
44
 
42
45
  ## Motivacao
43
46
 
@@ -48,8 +51,9 @@ Objetivos:
48
51
  - manter integridade do contrato;
49
52
  - evitar hacks de playground como falsa demostracao de capacidade;
50
53
  - preservar acessibilidade e navegacao por teclado;
51
- - limitar a V1 a um conjunto pequeno de padroes forte, em vez de abrir um renderer arbitrario;
54
+ - limitar a V1 a um conjunto pequeno de padroes fortes, em vez de abrir um renderer arbitrario;
52
55
  - dar base formal para examples, authoring e documentacao futura.
56
+ - permitir detail rows corporativas mais ricas usando o contrato canonico de rich content, sem criar uma DSL visual paralela dentro da lista.
53
57
 
54
58
  Referencia visual-alvo desta evolucao:
55
59
 
@@ -106,8 +110,17 @@ expansion?: {
106
110
  sections: Array<{
107
111
  id: string;
108
112
  title?: string;
109
- type: 'info-list' | 'chip-list' | 'timeline' | 'key-value';
110
- itemsExpr: string;
113
+ type:
114
+ | 'info-list'
115
+ | 'chip-list'
116
+ | 'timeline'
117
+ | 'key-value'
118
+ | 'metadata'
119
+ | 'component'
120
+ | 'rich-content';
121
+ itemsExpr?: string;
122
+ document?: RichContentDocument;
123
+ documentExpr?: string;
111
124
  emptyLabel?: string;
112
125
  }>;
113
126
  };
@@ -126,6 +139,11 @@ Semantica:
126
139
  - renderer fechado e governado da secao.
127
140
  - `itemsExpr`
128
141
  - expressao que aponta para a colecao renderizada a partir do item atual.
142
+ - pode resolver arrays/objetos JSON; o runtime materializa a estrutura em vez de exibir JSON cru.
143
+ - `document`
144
+ - documento canonico `RichContentDocument` para secoes `type: 'rich-content'`.
145
+ - `documentExpr`
146
+ - expressao que resolve um `RichContentDocument` por item, inclusive quando a origem vier serializada como JSON.
129
147
  - `emptyLabel`
130
148
  - fallback local ou global quando a secao nao tiver conteudo.
131
149
 
@@ -203,6 +221,58 @@ Array<{
203
221
  }>
204
222
  ```
205
223
 
224
+ ### `metadata`
225
+
226
+ Uso:
227
+
228
+ - propriedades regulatórias;
229
+ - fatos operacionais densos;
230
+ - pares chave-valor com enfase visual.
231
+
232
+ Shape esperado:
233
+
234
+ ```ts
235
+ Record<string, unknown> | Array<{ key: string; value: string }>
236
+ ```
237
+
238
+ ### `component`
239
+
240
+ Uso:
241
+
242
+ - componente governado registrado pelo host;
243
+ - renderer operacional permitido por contrato.
244
+
245
+ Observacao:
246
+
247
+ - deve continuar sendo resolvido por contrato de widget/componente conhecido;
248
+ - nao deve virar escape hatch para template arbitrario local.
249
+
250
+ ### `rich-content`
251
+
252
+ Uso:
253
+
254
+ - detalhe editorial moderno;
255
+ - property sheets, action cards, badges, metricas e blocos compostos;
256
+ - conteudo rico reutilizavel em dialogs, tabs, dashboards e expansoes.
257
+
258
+ Shape esperado:
259
+
260
+ ```ts
261
+ {
262
+ type: 'rich-content';
263
+ document?: RichContentDocument;
264
+ documentExpr?: string;
265
+ }
266
+ ```
267
+
268
+ Regras:
269
+
270
+ - a lista hospeda o documento canonico de `@praxisui/rich-content`;
271
+ - acoes internas sao mediadas por `hostCapabilities` da propria lista;
272
+ - `confirmMessage` usa o mesmo `GLOBAL_DIALOG_SERVICE` das acoes nativas;
273
+ - eventos sao reemitidos em `actionClick` com `payload?` e `source: 'rich-content'`;
274
+ - isso nao autoriza HTML livre nem detail builders locais.
275
+
206
276
  ## Exemplo V1
207
277
 
208
278
  ```ts
@@ -259,6 +329,26 @@ const config = {
259
329
  itemsExpr: '${item.proximosEventos}',
260
330
  emptyLabel: 'Sem eventos futuros.',
261
331
  },
332
+ {
333
+ id: 'governed-detail',
334
+ title: 'Detalhe governado',
335
+ type: 'rich-content',
336
+ document: {
337
+ kind: 'praxis.rich-content',
338
+ version: '1.0.0',
339
+ nodes: [
340
+ {
341
+ type: 'propertySheet',
342
+ title: 'Relacionamento',
343
+ columns: 2,
344
+ items: [
345
+ { label: 'Conta', valueExpr: '${item.nomeConta}' },
346
+ { label: 'Risco', valueExpr: '${item.risco}' },
347
+ ],
348
+ },
349
+ ],
350
+ },
351
+ },
262
352
  ],
263
353
  },
264
354
  };
@@ -273,6 +363,10 @@ const config = {
273
363
  - persistencia cross-page do estado aberto;
274
364
  - nesting de expansao dentro de expansao.
275
365
 
366
+ Observacao: `rich-content` nao contradiz a restricao de HTML arbitrario. Ele e
367
+ um contrato canonico, validavel e hospedado pela plataforma, usado quando a
368
+ expansao precisa de composicao visual rica sem perder governanca.
369
+
276
370
  ## Acessibilidade e WCAG AA
277
371
 
278
372
  Requisitos minimos da implementacao: