@praxisui/page-builder 8.0.0-beta.20 → 8.0.0-beta.21
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 +110 -2
- package/fesm2022/praxisui-page-builder.mjs +1091 -159
- package/index.d.ts +147 -7
- package/package.json +4 -4
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 `
|
|
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
|
|
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
|
|