@praxisui/page-builder 8.0.0-beta.20 → 8.0.0-beta.22

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
@@ -36,12 +36,14 @@ Peer dependencies (Angular v20):
36
36
 
37
37
  Este pacote expoe o shell ativo do builder canonico de pagina dinamica:
38
38
  - `ComponentPaletteDialogComponent` para adicionar widgets a pagina.
39
- - `FloatingToolbarComponent` e `TileToolbarComponent` para acoes rapidas de add/save/preview/configuracao.
39
+ - `FloatingToolbarComponent` para ações de página/canvas e ações contextuais do widget selecionado no runtime `praxis-dynamic-page`. Quando o widget possui `WidgetShell` com cabeçalho visível, as ações editoriais transitórias entram no próprio header do shell; quando não há header, o runtime usa uma toolbar contextual de fallback. Em ambos os casos o widget ativo fica identificado e pode abrir assistente com contexto, configuração e remoção governada sem persistir controles editoriais no `shell.actions`.
40
40
  - `ConnectionEditorComponent` para inspecionar, criar e remover conexoes canonicas em `composition.links`.
41
41
  - `WidgetShellEditorComponent` e `DynamicPageConfigEditorComponent` para authoring de shell/canvas sem redefinir a semantica canonica de composicao.
42
42
 
43
43
  Conexoes continuam pertencendo ao contrato `WidgetPageDefinition`. O editor visual do Page Builder cria, remove e edita links inline preservando o envelope canonico `page.composition.links`, incluindo `condition` em Json Logic, `policy` operacional e `transform` canônico, sem introduzir modelo paralelo de grafo. O historico de desfazer/refazer do editor e transitorio: ele reemite snapshots canonicos por `pageChange`, mas nao persiste estado de historico dentro da pagina.
44
44
 
45
+ Cada link persistido usa `CompositionLink.id` como identidade estavel. Superficies de authoring tambem devem usar `id` ao criar ou remover links; aliases como `linkId` nao fazem parte do contrato canonico.
46
+
45
47
  O roadmap tecnico para evoluir o editor radial esta registrado em [`connection-editor-reference-study.md`](./connection-editor-reference-study.md).
46
48
 
47
49
  Nested component ports devem ser modeladas no mesmo contrato `composition.links`, usando `component-port + nestedPath`.
@@ -101,6 +103,12 @@ Para gerar uma página a partir de um prompt usando o backend canônico do `prax
101
103
 
102
104
  O chrome conversacional do assistente usa `PraxisAiAssistantShellComponent` de `@praxisui/ai`, mas a presença minimizada deve ser renderizada pelo shell da aplicação com `PraxisAiAssistantSessionHostComponent`, lendo o `PraxisAssistantSessionRegistryService`. O Page Builder apenas registra sua sessão com identidade estável e contexto `Page Builder`; a identidade pública continua sendo o copiloto semântico Praxis. O Page Builder continua dono da semântica agentic de página: resolução de intenção, preview, apply, save, reopen e compilação do plano validado para `WidgetPageDefinition`.
103
105
 
106
+ O composer do Page Builder IA segue o padrão atual de chats LLM: a ação de envio é icon-only, com `aria-label` semântico para gerar preview. O texto não deve aparecer como label visual do botão.
107
+
108
+ Ao minimizar uma sessão com contexto preservado, o assistente recolhe para o próprio botão `auto_awesome` do Page Builder. O botão troca seu nome acessível para reabrir o copiloto e exibe estado visual minimizado, sem criar um dock local paralelo ao host global de sessões.
109
+
110
+ A barra de título do assistente deve ser derivada do contexto de abertura. O Page Builder fornece título, subtítulo e badge de modo diferentes para autoria de página, autoria focada em widget, revisão de preview e continuação governada, em vez de exibir uma descrição estática do produto.
111
+
104
112
  ### Agentic Authoring Manifest
105
113
 
106
114
  `PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST` declara o contrato executável de authoring do pacote e é exportado pelo `public-api` de `@praxisui/page-builder`.
@@ -111,7 +119,7 @@ As fronteiras canônicas são:
111
119
  - o documento persistido continua sendo `WidgetPageDefinition`;
112
120
  - `UiCompositionPlan` é apenas o plano intermediário de IA e deve compilar antes do preview/apply local;
113
121
  - wiring persistido usa `page.composition.links`, incluindo `nestedPath` para component ports internas;
114
- - o Page Builder não redefine inputs de widgets filhos. Edições de `definition.inputs` devem delegar para o manifesto do componente filho ou para `ComponentDocMeta.configEditor`;
122
+ - o Page Builder não redefine inputs de widgets filhos. Edições de `definition.inputs` devem delegar para `ComponentDocMeta.authoringManifestRef` ou `ComponentDocMeta.configEditor` publicado pela lib dona do componente;
115
123
  - `pageIdentity` e ETag pertencem ao fluxo de persistência do `praxis-config-starter` e não entram no documento runtime da página.
116
124
 
117
125
  ```ts
@@ -155,6 +163,7 @@ Fluxo canônico:
155
163
  - Para cenarios corporativos, mantenha streaming e diagnosticos como capacidades opt-in do host. Streaming melhora feedback percebido em prompts curtos ou ambiguos; diagnosticos exibem prompt/contexto/catalogos e devem ficar restritos a auditoria, suporte ou ambientes controlados.
156
164
  - `resolveIntent` e `previewPage` tambem aceitam `sessionId`, `clientTurnId`, `conversationMessages`, `pendingClarification` e `attachmentSummaries` para que respostas curtas e contexto anexado continuem o turno sem reescrever o prompt no frontend.
157
165
  - `attachmentSummaries` deve conter apenas metadados serializaveis (`id`, `name`, `kind`, `mimeType`, `sizeBytes`, `source`, `hasPreview`). O frontend nao envia `File`, bytes, base64 nem URLs locais `blob:`. Quando uma pergunta de clarificacao nasce de um turno com anexos, o backend pode ecoar esses resumos em `pendingClarification.diagnostics.attachmentSummaries`; o Page Builder reenvia esse estado no proximo turno.
166
+ - Enquanto o contrato LLM do Page Builder for metadata-only para anexos, o shell agentic deve ocultar a acao de anexar e desabilitar anexos colados. Nao exponha seletor de arquivo ou paste de imagem como se a LLM fosse processar pixels, PDF ou conteudo binario.
158
167
  - Quando `resolveIntent` retornar candidatos ambiguos, o Page Builder deve preservar `quickReplies` como chips clicaveis ricos. Campos como `description`, `icon`, `tone` e `contextHints` pertencem ao contrato do backend e nao devem ser recriados ou descartados no frontend.
159
168
  - Hosts podem habilitar `[agenticAuthoringIncludeLlmDiagnostics]="true"` apenas em cenarios de auditoria/debug. O input adiciona `contextHints.includeLlmDiagnostics=true` nas chamadas `resolveIntent` e, quando o backend retorna `llmDiagnostics`, o Page Builder mostra esse JSON em um painel tecnico separado da conversa. O padrao permanece desligado para nao expor prompt/contexto operacional em fluxos comuns.
160
169
  - Para criacao de dashboard apos escolha de recurso, `previewPage` pode retornar `uiCompositionPlan.layoutPreset=resource-dashboard`; o builder deve aplicar esse plano como preview de pagina, nao tratar o artefato como fluxo restrito a formulario.
@@ -200,6 +209,99 @@ Exemplo com `praxis-rich-content`: o editor canônico é
200
209
  edita `definition.inputs.document`, `layout` e `rootClassName` sem criar uma DSL
201
210
  local de page-builder para blocos ricos.
202
211
 
212
+ Exemplo com `praxis-chart`: o editor canônico publicado por
213
+ `@praxisui/charts` usa um adaptador de widget sobre `PraxisChartConfigEditor`.
214
+ O editor de domínio continua editando `PraxisXUiChartContract`; o adaptador
215
+ devolve `{ inputs: { ...chartInputs, chartDocument } }` para que o runtime
216
+ atualize `definition.inputs` sem lógica específica de chart no Page Builder.
217
+
218
+ Exemplo com `praxis-table`: o editor canônico publicado por `@praxisui/table`
219
+ usa um adaptador de widget sobre `PraxisTableConfigEditor`. O editor de domínio
220
+ continua editando `TableAuthoringDocument`; o adaptador devolve
221
+ `{ inputs: { ...tableInputs, config, resourcePath, horizontalScroll } }`,
222
+ preservando `tableId` e `componentInstanceId` enquanto publica apenas inputs
223
+ declarados pelo contrato público da tabela.
224
+
225
+ Exemplo com `praxis-dynamic-form`: o editor canônico publicado por
226
+ `@praxisui/dynamic-form` usa um adaptador de widget sobre
227
+ `PraxisDynamicFormConfigEditor`. O editor de domínio continua editando
228
+ `DynamicFormAuthoringDocument`; o adaptador devolve
229
+ `{ inputs: { ...formInputs, config, mode, formId, componentInstanceId } }` e
230
+ projeta preferências públicas como `backConfig`, `notifyIfOutdated`, `snoozeMs`
231
+ e `autoOpenSettingsOnOutdated`. O Page Builder não interpreta campos, regras ou
232
+ seções do formulário.
233
+
234
+ Exemplo com `praxis-filter-form`: o editor canônico publicado por
235
+ `@praxisui/dynamic-form` também usa `PraxisDynamicFormConfigEditor`, mas por um
236
+ adaptador próprio de widget. O filtro consome o mesmo contrato `FormConfig`,
237
+ enquanto o adaptador devolve somente os inputs públicos do filtro:
238
+ `{ inputs: { ...filterInputs, config, formId, resourcePath, mode } }`.
239
+
240
+ Exemplo com `praxis-files-upload`: o editor canônico publicado por
241
+ `@praxisui/files-upload` usa um adaptador de widget sobre
242
+ `PraxisFilesUploadConfigEditor`. O editor de domínio continua editando
243
+ `FilesUploadConfig`; o adaptador devolve
244
+ `{ inputs: { ...uploadInputs, config, filesUploadId, componentInstanceId } }`
245
+ e preserva bindings públicos como `baseUrl`, `displayMode`, `context` e
246
+ `enableCustomization`. O Page Builder não interpreta estratégia, limites,
247
+ opções de backend, quotas ou rate-limit.
248
+
249
+ Exemplo com `praxis-crud`: o editor canônico publicado por `@praxisui/crud`
250
+ usa um adaptador de widget sobre `CrudMetadataEditorComponent`. O editor de
251
+ domínio continua editando `CrudAuthoringDocument`/`CrudMetadata`; o adaptador
252
+ devolve `{ inputs: { ...crudInputs, metadata, crudId, componentInstanceId } }`
253
+ e preserva `context` e `enableCustomization`. O Page Builder não interpreta
254
+ resource binding, tabela interna, open modes, ações ou defaults de
255
+ modal/drawer.
256
+
257
+ Exemplo com `praxis-list`: o editor canônico publicado por `@praxisui/list`
258
+ usa um adaptador de widget sobre `PraxisListConfigEditor`. O editor de domínio
259
+ continua editando `PraxisListConfig`; o adaptador devolve
260
+ `{ inputs: { ...listInputs, config } }`, preservando `listId` e demais inputs
261
+ do widget.
262
+
263
+ Exemplo com `praxis-expansion`: o editor canônico publicado por
264
+ `@praxisui/expansion` usa um adaptador de widget sobre
265
+ `PraxisExpansionConfigEditor`. O editor de domínio continua editando
266
+ `ExpansionMetadata`; o adaptador devolve
267
+ `{ inputs: { ...expansionInputs, config } }`, preservando `expansionId` e demais
268
+ inputs do widget. Para widgets recém-inseridos sem `config` inicial, o adaptador
269
+ mantém um fallback estável para não sobrescrever edições durante change
270
+ detection.
271
+
272
+ Exemplo com `praxis-tabs`: o editor canônico publicado por `@praxisui/tabs`
273
+ usa um adaptador de widget sobre `PraxisTabsConfigEditor`. O editor de domínio
274
+ continua editando `TabsAuthoringDocument`; o adaptador devolve
275
+ `{ inputs: { ...tabsInputs, config, tabsId } }`, preservando bindings como
276
+ `tabsId` e `componentInstanceId` enquanto publica apenas os inputs consumidos
277
+ pelo runtime.
278
+
279
+ Exemplo com `praxis-stepper`: o editor canônico publicado por
280
+ `@praxisui/stepper` usa um adaptador de widget sobre
281
+ `PraxisStepperConfigEditor`. O editor de domínio continua editando
282
+ `StepperMetadata`; o adaptador devolve
283
+ `{ inputs: { ...stepperInputs, config, stepperId, selectedIndex } }`. Sub-editores
284
+ internos de form/list/upload continuam pertencendo ao editor do stepper. Eles
285
+ devem abrir em host aninhado próprio do `@praxisui/stepper`, mantendo o editor
286
+ pai montado; o Page Builder apenas hospeda o editor publicado pela metadata.
287
+ No fluxo de inclusão, `Apply` e `Save` do sub-editor devem atualizar o mesmo
288
+ widget filho pendente, evitando duplicação de lista/upload dentro do step.
289
+
290
+ ## Child AI Authoring Manifests
291
+
292
+ Componentes que suportam edições governadas por IA devem publicar
293
+ `ComponentDocMeta.authoringManifestRef` na própria lib dona. O Page Builder usa
294
+ esse sinal apenas para discovery, readiness e delegação; ele não recompila nem
295
+ redeclara operações internas do componente filho.
296
+
297
+ Exemplos já publicados pelo catálogo de componentes:
298
+ - `praxis-table` -> `PRAXIS_TABLE_AUTHORING_MANIFEST`
299
+ - `praxis-list` -> `PRAXIS_LIST_AUTHORING_MANIFEST`
300
+ - `praxis-dynamic-form` -> `PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST`
301
+ - `praxis-tabs` -> `PRAXIS_TABS_AUTHORING_MANIFEST`
302
+ - `praxis-stepper` -> `PRAXIS_STEPPER_AUTHORING_MANIFEST`
303
+ - `praxis-expansion` -> `PRAXIS_EXPANSION_AUTHORING_MANIFEST`
304
+
203
305
  Catalogos conhecidos (exports):
204
306
  - `TABLE_AI_CAPABILITIES` - `@praxisui/table` (`praxis-table`)
205
307
  - `CRUD_AI_CAPABILITIES` - `@praxisui/crud` (`praxis-crud`)
@@ -226,6 +328,12 @@ O builder canonico expoe authoring de shell/palette sobre `praxis-dynamic-page`.
226
328
 
227
329
  `page` e um `WidgetPageDefinition` (do `@praxisui/core`) contendo `widgets` e opcionalmente `composition.links`. O envelope `composition` e o caminho `composition.links` formam a superficie canonica persistida para wiring da pagina, com `condition` em Json Logic e `policy` para comportamento operacional.
228
330
 
331
+ Links para acoes globais tambem pertencem a `composition.links`: use
332
+ `composition.links[].to.kind = "global-action"` com `to.ref.actionId` e, quando necessario,
333
+ `to.ref.payload`, `to.ref.payloadExpr` ou `to.ref.meta`. O Page Builder nao cria executor universal
334
+ nem campos paralelos de comando; ele apenas materializa o `GlobalActionRef` governado que o runtime de composicao
335
+ entrega.
336
+
229
337
  Para conectar portas de widgets internos em containers como `praxis-tabs` ou `praxis-expansion`, use `composition.links[].from/to.ref.nestedPath`.
230
338
  `ref.widget` continua sendo o owner top-level no canvas, e o ultimo segmento de `nestedPath` deve ser `kind: "widget"` com `key` estavel.
231
339