@praxisui/list 9.0.67 → 9.0.68-rc.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/README.md CHANGED
@@ -97,13 +97,17 @@ For HATEOAS records, the canonical `_links.self.href` is the preferred render id
97
97
  - `queryContext?: PraxisDataQueryContext`: runtime query context projected into remote data.
98
98
  - `form?: FormGroup`: external form context for selection/form bindings.
99
99
  - `enableCustomization: boolean`: opens editor and semantic assistant affordances.
100
- - `itemClick`, `actionClick`, `selectionChange`, `exportAction`: public events.
100
+ - `itemClick`, `actionClick`, `selectionChange`, `exportAction`: public interaction events.
101
+ - `configPatchChange`: explicit `{ inputPatch: { config: PraxisListConfig } }` after valid native editor Apply/Save or adapter authoring. Dynamic Page/Page Builder updates its authored page so a later Save Page preserves the edit. Hydration, schema inference, runtime filters and selection do not emit this output. The detached config snapshot excludes runtime query context; existing standalone persistence remains governed by `configPersistenceStrategy`.
102
+
103
+ The hosted list editor exposes **Configuration source** (`configPersistenceStrategy`). Choose **Page configuration** (`input-first`) for a composed page: saved individual list preferences must not replace the page document on reload. **Individual list preferences** preserves `local-first`; **Temporary configuration** uses `volatile`. The choice participates in Apply, Save and Reset alongside the child config, and does not silently replace an existing policy.
101
104
 
102
105
  ## Configuration Highlights
103
106
 
104
107
  - Layout variants: `list`, `cards`, `tiles`.
105
108
  - Runtime-active layout fields include `lines`, `dividers`, `groupBy`, `pageSize`, `density` and `model`.
106
109
  - Templating slots include `leading`, `primary`, `secondary`, `meta`, `trailing`, `features`, `sectionHeader` and `emptyState`.
110
+ - Leading images delegated to Rich Content stay within their reserved track and retain their aspect ratio. Skin overrides are rendered in an instance-scoped style element, using the supplied CSP nonce; updates replace that element's content and destruction removes it. Appearance presets wrap within narrow editors.
107
111
  - In `layout.rowLayout`, canonical semantic slots keep the configured desktop grid and reflow into ordered, non-overlapping rows at narrow viewports; extended operational slots stack without requiring host CSS.
108
112
  - Template expressions use `${item.field}`. Currency/date/number templates can use config i18n defaults.
109
113
  - Selection supports `none`, `single` and `multiple`, with return modes `value`, `item` or `id`.
@@ -122,13 +126,20 @@ Do not document those as active runtime behavior in app-specific guides until th
122
126
 
123
127
  `enableCustomization` opens the canonical list editor and semantic assistant flow. `PRAXIS_LIST_AUTHORING_MANIFEST` is the executable authoring contract for template slots, actions, empty state, selection, layout, data binding, rules, skin, export, localization, accessibility and declared-only warnings.
124
128
 
129
+ The runtime opens its canonical editor when `openConfigEditor()` is invoked; the public `openConfigEditor(): void` method remains stable for templates and host integrations. Generic authoring hosts resolve the editor through `PRAXIS_LIST_COMPONENT_METADATA.configEditor.loadComponent`. This asynchronous resolution does not guarantee a separate downloaded chunk: the public root entrypoint also exports the editor classes, so packaging can include them in the same JavaScript module as the runtime.
130
+
125
131
  `actions[].recordOpen` is runtime materialization evidence produced by governed platform authoring. It round-trips through list config but is intentionally not a free-form field in the visual editor or the list-specific AI manifest. Authors choose business intent; Metadata and Config publish the canonical source field and target identities.
126
132
 
127
133
  Free JSON patches from AI flows are not the public authoring contract; local apply must be compiled from a manifest-backed `componentEditPlan`.
128
134
 
135
+ Invalid JSON in a Surface action remains an unsaved draft and blocks Apply/Save.
136
+ Its validity is combined with raw JSON and document/query validation; visiting
137
+ another tab preserves the text, and Reset discards it explicitly. See
138
+ [Surface consumer validation](../praxis-core/docs/surface-draft-consumers-validation-2026-09-08.md).
139
+
129
140
  ## Public API Snapshot
130
141
 
131
- Main exports include `PraxisList`, editor components, `PraxisListConfig`, list data services, templating/rich-content/selection adapters, metadata provider, list i18n helpers, AI capabilities, `PRAXIS_LIST_AUTHORING_MANIFEST` and `PraxisListDocPageComponent`.
142
+ The root `@praxisui/list` entrypoint exports `PraxisList`, `PraxisListConfig`, list data services, templating/rich-content/selection adapters, metadata provider, list i18n helpers, AI capabilities, `PRAXIS_LIST_AUTHORING_MANIFEST` and `PraxisListDocPageComponent`. It also preserves the public editor classes `PraxisListConfigEditor` and `PraxisListWidgetConfigEditor`, and the types `PraxisListWidgetEditorInputs` and `PraxisListWidgetEditorValue`. Hosts can import these names directly from `@praxisui/list`; generic authoring hosts should resolve the configured editor through component metadata.
132
143
 
133
144
  ## Official Links
134
145
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-09-07T00:54:55.301Z",
3
+ "generatedAt": "2026-09-09T10:03:24.330Z",
4
4
  "packageName": "@praxisui/list",
5
- "packageVersion": "9.0.67",
5
+ "packageVersion": "9.0.68-rc.0",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -56,6 +56,12 @@
56
56
  }
57
57
  ],
58
58
  "outputs": [
59
+ {
60
+ "name": "configPatchChange",
61
+ "type": "{ inputPatch: { config: PraxisListConfig } }",
62
+ "required": false,
63
+ "description": "Alteração explícita do editor ou adapter para atualizar a configuração autorada na página; não emite hidratação, filtros ou seleção runtime."
64
+ },
59
65
  {
60
66
  "name": "itemClick",
61
67
  "type": "ListItemEvent",
@@ -476,7 +482,6 @@
476
482
  }
477
483
  ],
478
484
  "configEditor": {
479
- "component": "[ref:PraxisListWidgetConfigEditor]",
480
485
  "title": "Configure list"
481
486
  },
482
487
  "authoringManifestRef": {
@@ -9061,9 +9066,9 @@
9061
9066
  {
9062
9067
  "chunkIndex": 0,
9063
9068
  "chunkKind": "summary",
9064
- "content": "Component ID: praxis-list\nSelector: praxis-list\nFriendly Name: Praxis List\nDescription: Lista com suporte a seleção (single/multiple), agrupamento e templates.\nLib/Package: @praxisui/list\nTags: widget, list, lista, selection, configurable\nInputs:\n - config (PraxisListConfig)\n - listId (string)\n - componentInstanceId (string)\n - configPersistenceStrategy ('local-first' | 'input-first' | 'volatile')\n - queryContext (PraxisDataQueryContext | null)\n - form (FormGroup)\n - enableCustomization (boolean)\nOutputs:\n - itemClick (ListItemEvent)\n - actionClick (ListActionEvent)\n - selectionChange (ListSelectionEvent)\n",
9069
+ "content": "Component ID: praxis-list\nSelector: praxis-list\nFriendly Name: Praxis List\nDescription: Lista com suporte a seleção (single/multiple), agrupamento e templates.\nLib/Package: @praxisui/list\nTags: widget, list, lista, selection, configurable\nInputs:\n - config (PraxisListConfig)\n - listId (string)\n - componentInstanceId (string)\n - configPersistenceStrategy ('local-first' | 'input-first' | 'volatile')\n - queryContext (PraxisDataQueryContext | null)\n - form (FormGroup)\n - enableCustomization (boolean)\nOutputs:\n - configPatchChange ({ inputPatch: { config: PraxisListConfig } })\n - itemClick (ListItemEvent)\n - actionClick (ListActionEvent)\n - selectionChange (ListSelectionEvent)\n",
9065
9070
  "sourcePointer": "projects/praxis-list/src/lib/praxis-list.metadata.ts",
9066
- "contentHash": "f589cb2341d7a23ed3df996c9d11ffb8902a62747c54cf3c16187b503ab0df9a",
9071
+ "contentHash": "edfe4ebebb53222fa9c50c8dfce03f969d98f8efb5068b074dc51df5fb864e4a",
9067
9072
  "sourceKind": "component_definition",
9068
9073
  "sourceId": "praxis-list",
9069
9074
  "corpusVersion": "1.0.0"
@@ -0,0 +1,189 @@
1
+ # Investigação da API pública dos editores List — 2026-09-09
2
+
3
+ > Registro da investigação inicial; a correção autorizada posteriormente está
4
+ > documentada em “Implementação e validação da correção” ao final.
5
+
6
+ ## Pergunta e escopo
7
+
8
+ O usuário solicitou investigar se a remoção dos editores foi um erro, antes de
9
+ escolher preservar imports ou preparar uma publicação incompatível.
10
+ Classificação do experimento: `contrato-publico`; entrega desta investigação:
11
+ documentação e ferramenta de auditoria. Nenhuma variante experimental foi
12
+ aplicada ao checkout compartilhado ou publicada.
13
+
14
+ Fonte canônica: `projects/praxis-list/src/public-api.ts`, os dois editores e
15
+ `praxis-list.metadata.ts`. Consumidor direto: Stepper, que importa metadata de
16
+ List em seu editor. Page Builder resolve o configurador por metadata. Não foi
17
+ encontrado import direto das quatro declarações em outros componentes de
18
+ `projects/`, `src/` e `examples/` deste checkout; isso não prova ausência de hosts
19
+ externos. Os símbolos já eram públicos e documentados, não uma nova necessidade
20
+ ou uma fachada de símbolos pertencentes a outra biblioteca.
21
+
22
+ Base isolada: `7c9badae7394166101da96fbab084f1a8db2f34d`.
23
+ Commit da remoção: `edb8c2565fe9d4ee23d4d3903b46350fd6fef080`.
24
+ A tarefa paralela de navegação de editores não participa desta evidência.
25
+
26
+ ## O que foi removido e por quê
27
+
28
+ O mesmo commit retirou duas linhas de `export *`, tornou lazy a resolução do
29
+ configurador na metadata e a abertura por `PraxisList.openConfigEditor()` e
30
+ passou a documentar editores opcionais fora do barrel de runtime. Portanto há
31
+ uma intenção explícita de carregamento sob demanda. Não encontramos, nos
32
+ arquivos de histórico e documentação inspecionados, uma falha reproduzida de
33
+ ciclo que justificasse especificamente a retirada dos exports públicos.
34
+
35
+ O pacote **realmente publicado** `@praxisui/list@9.0.67` contém quatro nomes que
36
+ somem do candidato atual:
37
+
38
+ - Classes: `PraxisListConfigEditor`, `PraxisListWidgetConfigEditor`.
39
+ - Interfaces: `PraxisListWidgetEditorInputs`, `PraxisListWidgetEditorValue`.
40
+
41
+ Baseline npm: `https://registry.npmjs.org/`, tarball `praxisui-list-9.0.67.tgz`;
42
+ SHA-1 do tarball: `ee84020b086a6b0c26a12f9014f0702c2c30dd25`;
43
+ SHA-256 da declaração: `552819ed07fe9b0cda6cd2cdf724bc7c5c2e4317ec0d61d6e032c6a2fd365f84`.
44
+ Os imports de classes/componentes usados em templates não são substituídos
45
+ transparentemente por uma função assíncrona em metadata.
46
+
47
+ ## Experimentos controlados
48
+
49
+ Todas as variantes usam as mesmas dependências e configuração do checkout
50
+ isolado. Nenhum package.json, tsconfig ou configuração de build foi alterado.
51
+
52
+ | Variante | Exports ausentes contra npm | Resultado | Separação dos editores |
53
+ | --- | --- | --- | --- |
54
+ | Atual, sem os dois `export *` | 4 | Build List + Stepper; imports ESM passam | Dois chunks de editores separados |
55
+ | Restaurar os dois `export *`, mantendo loaders no fonte | 0 | Build List + Stepper; imports ESM; consumidor TS estrito; 48 testes passam | Um único FESM; loaders viram `Promise.resolve()` |
56
+ | Restaurar somente as duas interfaces com `export type` | 2 classes | Build List e comparação de exports passam como experimento; gate continua acusando as 2 remoções | JavaScript executável idêntico à variante atual |
57
+
58
+ Na restauração completa, o loader da metadata retorna exatamente a classe
59
+ exportada; não há duplicação de classe ou erro de inicialização nas importações
60
+ ESM de List e Stepper testadas. Os 48 testes existentes cobrem metadata,
61
+ `list-config-editor` e `list-widget-config-editor`. Isso não constitui teste de
62
+ todos os hosts, SSR ou certificação visual/E2E da variante.
63
+
64
+ Na variante atual, o entrypoint e o módulo runtime somam **1.076.605 bytes**;
65
+ os dois módulos de editores somam **648.541 bytes**. Restaurando os exports,
66
+ o FESM único tem **1.721.700 bytes**. São bytes de JavaScript parcial Angular,
67
+ sem compressão ou otimização de um aplicativo host. Não representam download
68
+ final, tempo de interação nem aumento equivalente no bundle de todo consumidor.
69
+ O total do pacote não aumentou: mudou principalmente o momento em que o código
70
+ pode ser carregado.
71
+
72
+ A variante de tipos foi compilada diretamente com `ng build praxis-list`;
73
+ o fluxo oficial de produção também remove comentários de source maps. Após
74
+ normalizar somente esses comentários **em memória para comparar**, todos os
75
+ quatro hashes JS coincidem com a variante atual. Nenhum artefato gerado foi
76
+ editado manualmente para obter esse resultado.
77
+
78
+ ## Diagnóstico e decisão recomendada
79
+
80
+ 1. **Erro confirmado na retirada das interfaces.** Ela não era necessária para
81
+ carregar editores sob demanda. `export type` preserva o contrato existente
82
+ sem trazer o código dos editores para o módulo principal.
83
+ 2. **Benefício técnico confirmado na separação das classes.** A otimização não
84
+ era fictícia. Porém, a remoção alterou uma API já publicada e documentada.
85
+ 3. **Não foi demonstrado que restaurar as classes causa falha funcional.** O
86
+ build, consumidor, importação e testes focais passaram. A consequência
87
+ demonstrada é a perda do splitting obtido depois da versão pública 9.0.67.
88
+ 4. **O erro de governança foi misturar otimização com remoção pública sem um
89
+ tratamento explícito de compatibilidade.** Não classificar automaticamente
90
+ como patch compatível nem escolher uma nova major para justificar a alteração.
91
+
92
+ Para uma próxima publicação que preserve o contrato já oferecido aos hosts,
93
+ recomenda-se restaurar os quatro exports e ajustar a promessa documental de
94
+ lazy loading. Isso recupera declarações originais do dono canônico, sem alias,
95
+ DTO duplicado ou fachada entre bibliotecas. Se o requisito prioritário passar
96
+ a ser uma fronteira pública separada para os editores, preparar uma proposta
97
+ arquitetural de entrypoint editorial e migração explícita dos imports. Manter
98
+ as classes estaticamente reexportadas na raiz não garante isolamento lazy,
99
+ mesmo que exista um novo entrypoint. Essa decisão não foi tomada pelo usuário
100
+ nesta investigação; ele solicitou primeiro esclarecer se a retirada estava errada.
101
+
102
+ O estado atual com quatro remoções **não está liberado como publicação
103
+ compatível**. A variante somente com interfaces também não resolve a quebra dos
104
+ imports das classes e não deve ser apresentada como correção completa.
105
+
106
+ ## Reprodução mínima
107
+
108
+ Em um checkout isolado, instalar com `npm ci --no-audit --fund=false`, obter o
109
+ tarball público com `npm pack @praxisui/list@9.0.67 --registry=https://registry.npmjs.org/`
110
+ e descompactá-lo. Usar os mesmos argumentos de build nas variantes completas:
111
+
112
+ ```bash
113
+ node scripts/build-libs.js --prod --only praxis-list,praxis-stepper
114
+ node tools/compare-package-exports.mjs /caminho/baseline/package dist/praxis-list
115
+ node --input-type=module -e "await import('@angular/compiler'); await import('@praxisui/list'); await import('@praxisui/stepper');"
116
+ node node_modules/@angular/cli/bin/ng.js test praxis-list --watch=false --progress=false --browsers=ChromeHeadless --include=projects/praxis-list/src/lib/praxis-list.metadata.spec.ts --include=projects/praxis-list/src/lib/editors/list-widget-config-editor.component.spec.ts --include=projects/praxis-list/src/lib/editors/list-config-editor.component.spec.ts
117
+ ```
118
+
119
+ O gate de comparação verifica nomes exportados, incluindo interfaces, e hashes
120
+ da declaração. Não certifica assinaturas, subpaths ou comportamento. A prova
121
+ adicional TypeScript usou imports dos quatro nomes por `@praxisui/list`,
122
+ atribuição de `{ inputs: { listId, config: {} } }` ao tipo público e compilação
123
+ `strict`, `noEmit`, `NodeNext`, sem caminhos privados de fonte.
124
+
125
+ ## Documentação, skills e limites
126
+
127
+ A skill `praxis-angular-public-api-governance` incorpora a separação entre tipos,
128
+ valores, imports públicos e chunks emitidos. O relatório de prontidão aponta
129
+ para esta investigação. Não há mudança de metadata, JSON, tokens, registry AI,
130
+ contratos backend, configuração de hosts ou conteúdo visual neste fechamento;
131
+ portanto não há artefato derivado desses contratos a regenerar. A recomendação
132
+ de implementação ainda exige atualizar README público e sua projeção na landing
133
+ quando a política final de export/loading for escolhida.
134
+
135
+ Angular MCP executado: `list_projects`, `get_best_practices`,
136
+ `search_documentation` (além da listagem de ferramentas). Foram mantidos tipos
137
+ estritos na prova de consumidor, responsabilidade dos componentes e configuração
138
+ original. A busca MCP falhou por indisponibilidade do serviço; consulta direta
139
+ à documentação oficial confirmou a relação entre entrypoints e code splitting:
140
+ [Angular Package Format](https://angular.dev/tools/libraries/angular-package-format)
141
+ e [Creating Libraries](https://angular.dev/tools/libraries/creating-libraries).
142
+
143
+ Nenhum bump, tag, publicação, deploy ou teste E2E da restauração foi realizado.
144
+ Os experimentos não alteraram o servidor compartilhado na porta 4003.
145
+
146
+ ## Implementação e validação da correção
147
+
148
+ Após a investigação, o usuário autorizou seguir a recomendação. Foram restaurados
149
+ os dois `export *` originais no dono List, recuperando os quatro nomes. Os loaders
150
+ na metadata e em `openConfigEditor()` foram mantidos; o README agora distingue
151
+ abertura do editor e carregamento do JavaScript, sem garantir chunks separados.
152
+ Nenhuma configuração de build, dependência, payload ou manifesto foi alterado.
153
+
154
+ Foi adicionado `src/lib/list-public-api.spec.ts`, que importa as classes e as
155
+ interfaces pelo barrel público e verifica que a metadata resolve a mesma classe
156
+ exportada. A validação desta implementação produziu:
157
+
158
+ - Build oficial isolado de List e Stepper com sincronização das dependências: passou.
159
+ - Importação ESM dos pacotes compilados e identidade do editor resolvido: passou.
160
+ - Comparação com o tarball npm 9.0.67: nenhum nome removido, no build isolado e no
161
+ build focal de List no checkout compartilhado.
162
+ - Testes focais de API, metadata e dois editores: **49/49**.
163
+ - Testes da ferramenta de comparação: **6/6**.
164
+ - E2E `list-authoring-canonical.playwright.spec.ts`: **1/1**, no origin oficial
165
+ `http://localhost:4003`, em contexto isolado. Provou abertura, aplicação JSON,
166
+ salvamento, atualização do runtime, reload e reabertura com o valor preservado.
167
+ A captura do painel foi inspecionada. O host usa os paths de fonte oficiais;
168
+ a prova do pacote compilado foi feita separadamente pelas importações acima.
169
+
170
+ A evidência E2E foi arquivada em `/private/tmp/list-api-fix-browser-evidence`;
171
+ o runner sobrescreveu artefatos históricos rastreados, que foram restaurados
172
+ sem incorporar exclusões ou relatórios transitórios ao commit.
173
+
174
+ As skills `praxis-angular-public-api-governance` e
175
+ `praxis-list-authoring-settings` foram atualizadas, validadas e sincronizadas.
176
+ A skill `praxis-authoring-editors`, revisada pela tarefa de navegação de editores,
177
+ também foi sincronizada nesta rodada; sua evidência de runtime pertence àquela
178
+ tarefa. As auditorias finais registram Praxis **167/167** e Ergon **19/19** sem
179
+ drift, itens ausentes ou fonte inválida.
180
+
181
+ A sincronização oficial de vendor docs na landing não produziu alteração por
182
+ List: o artefato publicado é `praxis-list.json-api.md`, não seu README. A API JSON
183
+ permanece intacta. Check vendor, governança de 145 guias e sitemap passaram.
184
+ Não foi necessário regenerar registry AI/backend, pois os contratos declarativos
185
+ continuam iguais. A nova documentação de exports acompanha o README do pacote.
186
+
187
+ A remoção dos quatro nomes foi corrigida. Esta prova focal não substitui o
188
+ preflight integral de uma futura publicação de todas as bibliotecas, nem certifica
189
+ compatibilidade de todas as assinaturas. Não houve bump, tag, publicação ou deploy.