@praxisui/editorial-forms 1.0.0-beta.61

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/LICENSE ADDED
@@ -0,0 +1,6 @@
1
+ This package is licensed under the Apache License, Version 2.0.
2
+
3
+ For the full license text, see the repository root LICENSE file:
4
+ ../../LICENSE
5
+
6
+ Apache License 2.0: https://www.apache.org/licenses/LICENSE-2.0
package/README.md ADDED
@@ -0,0 +1,421 @@
1
+ # @praxisui/editorial-forms
2
+
3
+ Lib dedicada ao runtime de formularios editoriais da plataforma.
4
+
5
+ ## Documentacao principal
6
+
7
+ - `docs/architecture.md`
8
+ - `docs/continuation-plan.md`
9
+ - `docs/editorial-authoring-plan.md`
10
+ - `docs/event-registration-promotion-plan.md`
11
+ - `docs/employee-onboarding-promotion-plan.md`
12
+ - `docs/privacy-consent-promotion-plan.md`
13
+ - `docs/recovery-playbook.md`
14
+ - `docs/dynamic-form-hygiene-plan.md`
15
+
16
+ ## Objetivo
17
+
18
+ Esta lib existe para tratar formularios editoriais como dominio proprio:
19
+
20
+ - jornadas
21
+ - presets
22
+ - blocos semanticos
23
+ - contexto editorial
24
+ - compliance
25
+ - runtime especializado
26
+
27
+ Ela nao deve usar `FormConfig` como modelo principal de authoring.
28
+
29
+ ## Regra arquitetural principal
30
+
31
+ Permitido:
32
+
33
+ - `@praxisui/editorial-forms -> @praxisui/core`
34
+ - `@praxisui/editorial-forms -> @praxisui/dynamic-form` apenas em adaptador/provider opcional
35
+
36
+ Proibido:
37
+
38
+ - `@praxisui/core -> @praxisui/editorial-forms`
39
+ - crescimento do dominio editorial central em `@praxisui/dynamic-form`
40
+
41
+ ## Adaptador opcional para `dataCollection`
42
+
43
+ O runtime central nao embute `PraxisDynamicForm`.
44
+
45
+ Para blocos `dataCollection`, a lib agora expoe:
46
+
47
+ - contrato raiz `EditorialDataBlockAdapter`
48
+ - token multi `EDITORIAL_DATA_BLOCK_ADAPTER`
49
+ - `provideEditorialDataBlockAdapter(...)`
50
+ - `EditorialDataBlockAdapterRegistry`
51
+ - outlet do renderer que resolve `formBlockId` e delega para o adaptador registrado
52
+
53
+ Para consolidacao do motor editorial, a lib agora expoe tambem:
54
+
55
+ - `EditorialRuntimeInput`
56
+ - `EditorialRuntimeHostConfig`
57
+ - `EditorialRuntimeSnapshot`
58
+ - `EditorialResolvedJourney`
59
+ - `EditorialResolvedStep`
60
+ - `EditorialResolvedBlock`
61
+ - `EditorialRuntimeDiagnostic`
62
+ - `EditorialRuntimeOperationalEvent`
63
+ - `resolveEditorialRuntimeSnapshot(...)`
64
+
65
+ Nesta fase, o `themePreset` entra no snapshot como preset efetivo de shell/metadados.
66
+
67
+ Ele ainda nao e tratado como origem de bloco nem materializa blocos por si so.
68
+
69
+ O snapshot resolvido agora tambem formaliza:
70
+
71
+ - proveniencia auditavel por bloco com `primarySource` e `trail`
72
+ - politica deterministica de override da instance (`append`, `insertBefore`, `insertAfter`, `replace`, `remove`)
73
+ - estado resolvido de `dataCollection` antes da engine concreta via `dataCollectionState`
74
+
75
+ O runtime atual distingue:
76
+
77
+ - erro global de runtime
78
+ - erro contextual de jornada/etapa/bloco
79
+
80
+ E aplica bloqueio coerente de avanço/navegacao lateral relevante quando existe erro estrutural bloqueador.
81
+
82
+ A politica de fallback operacional agora e derivada por helper central e reutilizavel:
83
+
84
+ - `normal`
85
+ - `warning`
86
+ - `degraded`
87
+ - `blocked`
88
+
89
+ Para hosts corporativos, `EditorialFormRuntimeComponent` e o outlet de `dataCollection` expõem `operationalEvent` com eventos leves de observabilidade, incluindo:
90
+
91
+ - diagnosticos emitidos
92
+ - fallback alterado
93
+ - erro bloqueador detectado
94
+ - conflito de override
95
+ - adapter de `dataCollection` resolvido, ausente ou invalido
96
+
97
+ ## Contrato estavel para hosts
98
+
99
+ Inputs estaveis do `EditorialFormRuntimeComponent`:
100
+
101
+ - `solution`
102
+ - `instance`
103
+ - `runtimeContext`
104
+ - `hostConfig`
105
+
106
+ Outputs estaveis:
107
+
108
+ - `snapshotChange`
109
+ - `fallbackChange`
110
+ - `operationalEvent`
111
+
112
+ Politica de consumo para hosts de produto:
113
+
114
+ - `snapshotChange` e o sinal estavel para leitura de estado resolvido, auditoria e derivacao de UX de produto
115
+ - `fallbackChange` e o sinal estavel para status operacional exposto ao usuario (`normal`, `warning`, `degraded`, `blocked`)
116
+ - `operationalEvent` e telemetria tecnica leve para logs, monitoracao, debugging e runbooks do host
117
+ - hosts controlados e de produto nao devem depender de parse de DOM para observabilidade
118
+ - hosts de produto nao devem expor o stream bruto de `operationalEvent` na superficie principal da pagina
119
+
120
+ Politica de fallback para hosts de produto:
121
+
122
+ - `normal`: UX nominal; sem contingencia adicional
123
+ - `warning`: UX nominal com monitoramento; nao bloquear progressao
124
+ - `degraded`: UX com contingencia parcial; manter o fluxo quando possivel e encaminhar observabilidade interna
125
+ - `blocked`: UX indisponivel ou bloqueada; impedir progressao e acionar canal de suporte/rollback do host
126
+
127
+ `hostConfig` hoje controla:
128
+
129
+ - `emitOperationalEvents`
130
+ - `forwardAdapterOperationalEvents`
131
+
132
+ `operationalEvent` segue envelope estavel com:
133
+
134
+ - `eventType`
135
+ - `timestamp`
136
+ - `severity`
137
+ - `journeyId`/`stepId`/`blockId` quando aplicavel
138
+ - `payload` tipado por tipo de evento
139
+
140
+ Quando o host quiser reutilizar `@praxisui/dynamic-form`, o caminho e registrar o provider opcional:
141
+
142
+ ```ts
143
+ import { provideEditorialDynamicFormAdapter } from '@praxisui/editorial-forms';
144
+ import { PraxisDynamicForm } from '@praxisui/dynamic-form';
145
+
146
+ providers: [
147
+ provideEditorialDynamicFormAdapter({ component: PraxisDynamicForm }),
148
+ ];
149
+ ```
150
+
151
+ Decisao de superficie publica desta fase:
152
+
153
+ - factory `createEditorialDynamicFormAdapter(...)`
154
+ - provider `provideEditorialDynamicFormAdapter(...)`
155
+ - exportados pelo pacote raiz `@praxisui/editorial-forms`
156
+ - documentados assim para evitar ambiguidade sobre sub-entrypoint, que nao foi mantido nesta iteracao
157
+
158
+ Sem esse provider, blocos `dataCollection` degradam para fallback acessivel e informativo no runtime editorial.
159
+
160
+ Mesmo sem provider, o snapshot ja deixa claro:
161
+
162
+ - `formBlockId`
163
+ - `formConfigRef`
164
+ - se existe config inline
165
+ - origem da config resolvida
166
+ - prontidao do bloco (`requiresAdapter`, `missingConfig`, `invalid`)
167
+
168
+ Politica deterministica atual de resolucao de config para `dataCollection`:
169
+
170
+ 1. `block.formConfig`
171
+ 2. `instance.overrides.runtimeFormConfigs`
172
+ 3. `instance.compatibilityFormConfigs`
173
+
174
+ Regras complementares:
175
+
176
+ - quando `formConfigRef` e `formBlockId` apontarem para candidatos diferentes, a primeira correspondencia valida na ordem acima continua sendo aplicada
177
+ - quando mais de uma fonte candidata for encontrada, o runtime nao falha silenciosamente: ele mantem a selecao deterministica e emite diagnostico `data-collection-config-ambiguous`
178
+ - `resolvedFormConfigSource` e `resolvedFormConfigLookupKey` continuam sendo a referencia auditavel para o host
179
+
180
+ ## Validacao oficial no workspace atual
181
+
182
+ A lib possui specs automatizados para o resolvedor, para o componente de runtime e para os hosts controlados.
183
+
184
+ Comando oficial da suite da lib:
185
+
186
+ - `node ./node_modules/@angular/cli/bin/ng.js test praxis-editorial-forms --watch=false --progress=false --browsers=ChromiumHeadlessNoSandbox`
187
+
188
+ Validacao minima de retomada:
189
+
190
+ - `npm run build:praxis-core`
191
+ - `npm run build:praxis-editorial-forms`
192
+ - `npm run typecheck`
193
+
194
+ Criterio completo desta fase:
195
+
196
+ - suite da lib via `ChromiumHeadlessNoSandbox`
197
+ - specs dos hosts controlados no app
198
+ - Playwright do runtime editorial em host real
199
+
200
+ No workspace atual, a fase de runtime/integrations controladas foi fechada tambem com E2E reais de host:
201
+
202
+ - editor tecnico integrado em `/form-config-editor`:
203
+ - bateria Playwright consolidada com `22 passed`
204
+ - runtime editorial em host real:
205
+ - `/lab/editorial-runtime`
206
+ - `/experiments/editorial-runtime/privacy-consent`
207
+ - `/experiments/editorial-runtime/event-registration`
208
+ - `/experiments/editorial-runtime/employee-onboarding`
209
+ - bateria Playwright consolidada com `8 passed`
210
+
211
+ Cobertura complementar de pagina no host Angular:
212
+
213
+ - `privacy-consent-editorial-runtime.page.spec.ts`
214
+ - valida `solutionId`, jornada `privacy-consent-journey`, labels de step e `consent-form`
215
+ - valida degradacao com diagnostico `data-collection-adapter-missing`
216
+ - valida reativacao com evento `data-collection-adapter-resolved`
217
+ - `event-registration-editorial-runtime.page.spec.ts`
218
+ - valida `solutionId`, jornada `event-registration-journey`, labels de step e `registration-form`
219
+ - valida degradacao com diagnostico `data-collection-adapter-missing`
220
+ - valida reativacao com evento `data-collection-adapter-resolved`
221
+ - `employee-onboarding-editorial-runtime.page.spec.ts`
222
+ - valida `solutionId`, jornada `employee-onboarding-journey` e os dois blocos `dataCollection`
223
+ - valida `identity-form` e `operations-form` como blocos resolvidos no snapshot
224
+ - valida degradacao com diagnostico `data-collection-adapter-missing`
225
+ - valida reativacao com evento `data-collection-adapter-resolved`
226
+
227
+ ## Harness tecnico interno
228
+
229
+ Para validar o motor sem depender do app principal, a lib agora possui:
230
+
231
+ - fixtures tecnicas em `src/lib/testing/editorial-runtime.fixtures.ts`
232
+ - harness interno em `src/lib/testing/editorial-runtime-technical-harness.component.ts`
233
+
234
+ Esse harness existe para specs e verificacao tecnica da lib:
235
+
236
+ - resolution de journey/snapshot
237
+ - diagnostics
238
+ - fallback
239
+ - adapter resolution de `dataCollection`
240
+
241
+ Ordem correta de build para retomadas e validacao local:
242
+
243
+ 1. `npm run build:praxis-core`
244
+ 2. `npm run build:praxis-editorial-forms`
245
+ 3. `npm run typecheck`
246
+
247
+ ## Integracao controlada no host Angular
248
+
249
+ Agora existe uma rota tecnica isolada no app do workspace para validar consumo real do host:
250
+
251
+ - path: `/lab/editorial-runtime`
252
+
253
+ Essa rota:
254
+
255
+ - nao e feature final
256
+ - nao e showcase publico de produto
257
+ - existe para validar integracao host-runtime em Angular real
258
+
259
+ Ela exercita:
260
+
261
+ - fixture saudavel
262
+ - fixture com warning
263
+ - fixture com erro global
264
+ - `dataCollection` sem adapter
265
+ - `dataCollection` com adapter opcional registrado
266
+
267
+ E expõe de forma tecnica:
268
+
269
+ - resumo do snapshot recebido via `snapshotChange`
270
+ - fallback recebido via `fallbackChange`
271
+ - stream recente de `operationalEvent`
272
+
273
+ Para validar localmente a integracao:
274
+
275
+ 1. `npm run build:praxis-core`
276
+ 2. `npm run build:praxis-editorial-forms`
277
+ 3. `npm run typecheck`
278
+ 4. `npm run build -- --configuration development`
279
+
280
+ ## Primeiro caso experimental quase real
281
+
282
+ Agora existe tambem uma rota experimental isolada para o primeiro caso editorial real no novo runtime:
283
+
284
+ - path: `/experiments/editorial-runtime/privacy-consent`
285
+
286
+ `privacy-consent` foi escolhido primeiro porque:
287
+
288
+ - e o caso mais enxuto e regulatorio do catalogo editorial novo
289
+ - permite validar `dataCollection` com menor variabilidade de jornada
290
+ - reaproveita o catalogo editorial canonico sem recolocar `FormConfig` no centro do motor
291
+
292
+ Essa rota deixa explicito:
293
+
294
+ - rota antiga relacionada: `/legacy/privacy-consent-template`
295
+ - rota nova experimental: `/experiments/editorial-runtime/privacy-consent`
296
+ - a rota nova consome `getEditorialSolutionById('privacy-consent')`
297
+ - o host fornece `runtimeContext`, `hostConfig`, `snapshotChange`, `fallbackChange` e `operationalEvent`
298
+ - o adapter opcional de `dataCollection` pode ser ligado ou desligado localmente para validar o comportamento real do host
299
+
300
+ Essa pagina:
301
+
302
+ - nao substitui o demo legado
303
+ - nao representa UX final de produto
304
+ - nao substitui o laboratorio tecnico `/lab/editorial-runtime`
305
+
306
+ Primeira superficie tecnica da fase de authoring:
307
+
308
+ - `/lab/editorial-authoring`
309
+
310
+ ## Terceiro caso experimental quase real
311
+
312
+ Agora existe tambem uma terceira rota experimental isolada para o fluxo mais complexo entre os casos canônicos atuais:
313
+
314
+ - path: `/experiments/editorial-runtime/employee-onboarding`
315
+
316
+ `employee-onboarding` foi escolhido como terceiro passo porque:
317
+
318
+ - possui dois blocos `dataCollection` (`identity-form` e `operations-form`)
319
+ - amplia a validacao do runtime em jornada multi-step com mais variabilidade operacional
320
+ - mantem comparacao simples com o demo legado `/demo/employee-onboarding-template`
321
+
322
+ Essa rota deixa explicito:
323
+
324
+ - rota antiga relacionada: `/demo/employee-onboarding-template`
325
+ - rota nova experimental: `/experiments/editorial-runtime/employee-onboarding`
326
+ - a rota nova consome `getEditorialSolutionById('employee-onboarding')`
327
+ - o host fornece `runtimeContext`, `hostConfig`, `snapshotChange`, `fallbackChange` e `operationalEvent`
328
+ - o host deriva dois `runtimeFormConfigs` locais a partir do template legado apenas para alimentar `identity-form` e `operations-form`
329
+ - o adapter opcional de `dataCollection` pode ser ligado ou desligado localmente para validar o comportamento real do host
330
+
331
+ ## Estado de saida da fase
332
+
333
+ A fase de runtime/integrations controladas fica considerada concluida neste estado porque agora existe:
334
+
335
+ - runtime editorial com snapshot, fallback e telemetria operacional estaveis
336
+ - laboratorio tecnico isolado em `/lab/editorial-runtime`
337
+ - tres integracoes quase reais e isoladas:
338
+ - `/experiments/editorial-runtime/privacy-consent`
339
+ - `/experiments/editorial-runtime/event-registration`
340
+ - `/experiments/editorial-runtime/employee-onboarding`
341
+ - validacao E2E do editor tecnico que ainda serve de engine adaptada para `dataCollection`
342
+ - validacao E2E das rotas editoriais experimentais e do laboratorio tecnico
343
+
344
+ Esta conclusao de fase nao significa rollout de produto.
345
+
346
+ O que continua fora de escopo nesta etapa:
347
+
348
+ - promover as rotas experimentais para feature final
349
+ - substituir os demos legados
350
+ - criar o editor especialista de autoria editorial
351
+
352
+ O proximo salto arquitetural passa a ser:
353
+
354
+ - criterios de promocao dos experimentos
355
+ - endurecimento operacional residual
356
+ - editor especialista para autoria editorial
357
+
358
+ ## Criterio de promocao dos experimentos
359
+
360
+ No estado atual, os tres fluxos integrados permanecem experimentais.
361
+
362
+ Promocao para migracao oficial exige, no minimo:
363
+
364
+ - build/typecheck do workspace verdes
365
+ - validacao Playwright do editor tecnico e do runtime editorial verdes
366
+ - `snapshotChange`, `fallbackChange` e `operationalEvent` observaveis em host real
367
+ - `dataCollection` validado sem adaptador e com adaptador
368
+ - ausencia de regressao para centralidade de `FormConfig`
369
+ - definicao de fallback/observabilidade da UX final
370
+
371
+ Leitura operacional atual:
372
+
373
+ - `privacy-consent`: primeiro candidato a promocao
374
+ - `event-registration`: segundo candidato
375
+ - `employee-onboarding`: caso de robustez antes de rollout
376
+
377
+ Primeiro host de promocao controlada ja criado:
378
+
379
+ - `/privacy-consent`
380
+ - `/controlled/editorial-runtime/privacy-consent`
381
+
382
+ Esse host:
383
+
384
+ - reaproveita o runtime editorial validado
385
+ - remove inspector e toggles manuais do experimento
386
+ - mantem observabilidade operacional discreta
387
+ - assume o caminho principal do fluxo
388
+ - mantem a rota experimental
389
+ - mantem o legado apenas como contingencia explicita em `/legacy/privacy-consent-template`
390
+
391
+ Essa pagina:
392
+
393
+ - nao substitui o demo legado
394
+ - nao representa UX final de produto
395
+ - nao substitui o laboratorio tecnico `/lab/editorial-runtime`
396
+
397
+ ## Segundo caso experimental quase real
398
+
399
+ Agora existe tambem uma segunda rota experimental isolada para ampliar a validacao em um fluxo com mais narrativa e mais blocos semanticos:
400
+
401
+ - path: `/experiments/editorial-runtime/event-registration`
402
+
403
+ `event-registration` foi escolhido como segundo passo porque:
404
+
405
+ - continua tendo apenas um bloco `dataCollection`, reduzindo risco em relacao a `employee-onboarding`
406
+ - exercita melhor a combinacao de `hero`, `contextSummary`, `legalNotice`, `reviewSummary` e `footerLinks`
407
+ - mantem comparacao simples com o demo legado `/demo/event-registration-template`
408
+
409
+ Essa rota deixa explicito:
410
+
411
+ - rota antiga relacionada: `/demo/event-registration-template`
412
+ - rota nova experimental: `/experiments/editorial-runtime/event-registration`
413
+ - a rota nova consome `getEditorialSolutionById('event-registration')`
414
+ - o host fornece `runtimeContext`, `hostConfig`, `snapshotChange`, `fallbackChange` e `operationalEvent`
415
+ - o adapter opcional de `dataCollection` pode ser ligado ou desligado localmente para validar o comportamento real do host
416
+
417
+ Essa pagina:
418
+
419
+ - nao substitui o demo legado
420
+ - nao representa UX final de produto
421
+ - nao substitui o laboratorio tecnico `/lab/editorial-runtime`