@praxisui/core 9.0.4-rc.12 → 9.0.4-rc.13

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.
@@ -19289,6 +19289,91 @@ function providePraxisHttpCollectionExportProvider(options = {}) {
19289
19289
  ];
19290
19290
  }
19291
19291
 
19292
+ const TEXT_DESCRIPTOR_KEYS = new Set(['key', 'text', 'params']);
19293
+ /**
19294
+ * Resolves explicit `PraxisTextValue` descriptors in a JSON-like authored
19295
+ * document without mutating the canonical source document.
19296
+ *
19297
+ * Plain strings are intentionally preserved: host-owned business copy only
19298
+ * becomes locale-aware when the author supplies an explicit descriptor.
19299
+ */
19300
+ function resolvePraxisI18nDocument(document, options) {
19301
+ const locale = normalizedLocale(options.locale) ||
19302
+ normalizedLocale(options.config?.locale) ||
19303
+ options.i18n.getLocale();
19304
+ const fallbackLocale = normalizedLocale(options.config?.fallbackLocale) ||
19305
+ options.i18n.getFallbackLocale();
19306
+ const ancestors = new Set();
19307
+ const visit = (value) => {
19308
+ if (isPraxisI18nMessageDescriptor(value)) {
19309
+ return resolveDescriptor(value, locale, fallbackLocale, options);
19310
+ }
19311
+ if (Array.isArray(value)) {
19312
+ if (ancestors.has(value))
19313
+ return value;
19314
+ ancestors.add(value);
19315
+ try {
19316
+ return value.map(visit);
19317
+ }
19318
+ finally {
19319
+ ancestors.delete(value);
19320
+ }
19321
+ }
19322
+ if (!isPlainRecord(value)) {
19323
+ return value;
19324
+ }
19325
+ if (ancestors.has(value))
19326
+ return value;
19327
+ ancestors.add(value);
19328
+ try {
19329
+ return Object.fromEntries(Object.entries(value).map(([key, nestedValue]) => [
19330
+ key,
19331
+ visit(nestedValue),
19332
+ ]));
19333
+ }
19334
+ finally {
19335
+ ancestors.delete(value);
19336
+ }
19337
+ };
19338
+ return visit(document);
19339
+ }
19340
+ function isPraxisI18nMessageDescriptor(value) {
19341
+ if (!isPlainRecord(value))
19342
+ return false;
19343
+ const keys = Object.keys(value);
19344
+ if (!keys.length || keys.some((key) => !TEXT_DESCRIPTOR_KEYS.has(key))) {
19345
+ return false;
19346
+ }
19347
+ const key = value['key'];
19348
+ const text = value['text'];
19349
+ const params = value['params'];
19350
+ return (((typeof key === 'string' && !!key.trim()) ||
19351
+ (typeof text === 'string' && !!text)) &&
19352
+ (params == null || isPlainRecord(params)));
19353
+ }
19354
+ function resolveDescriptor(descriptor, locale, fallbackLocale, options) {
19355
+ const key = descriptor.key?.trim();
19356
+ if (!key) {
19357
+ return options.i18n.resolve(descriptor, descriptor.text, options.namespace);
19358
+ }
19359
+ const pageMessage = options.config?.dictionaries?.[locale]?.[key] ??
19360
+ options.config?.dictionaries?.[fallbackLocale]?.[key];
19361
+ if (pageMessage != null) {
19362
+ return interpolatePraxisTranslation(pageMessage, descriptor.params);
19363
+ }
19364
+ return options.i18n.tForLocale(locale, key, descriptor.params, descriptor.text, options.namespace);
19365
+ }
19366
+ function normalizedLocale(value) {
19367
+ const normalized = value?.trim();
19368
+ return normalized || undefined;
19369
+ }
19370
+ function isPlainRecord(value) {
19371
+ if (!value || typeof value !== 'object' || Array.isArray(value))
19372
+ return false;
19373
+ const prototype = Object.getPrototypeOf(value);
19374
+ return prototype === Object.prototype || prototype === null;
19375
+ }
19376
+
19292
19377
  const RESOURCE_DISCOVERY_I18N_NAMESPACE = 'resourceDiscovery';
19293
19378
  const RESOURCE_AVAILABILITY_REASON_KEY_BY_CODE = {
19294
19379
  'resource-state-blocked': 'availability.reason.resource-state-blocked',
@@ -26741,157 +26826,920 @@ const ENUMS = {
26741
26826
  railSide: ['left', 'right'],
26742
26827
  deviceKind: ['desktop', 'tablet', 'mobile'],
26743
26828
  stateMergeStrategy: ['replace', 'merge', 'append', 'remove-keys'],
26744
- derivedStateComputeKind: ['json-logic', 'template', 'operator', 'transformer'],
26829
+ derivedStateComputeKind: [
26830
+ 'json-logic',
26831
+ 'template',
26832
+ 'operator',
26833
+ 'transformer',
26834
+ ],
26745
26835
  shellKind: ['dashboard-card', 'none'],
26746
26836
  actionVariant: ['icon', 'text', 'outlined'],
26747
26837
  actionPlacement: ['header', 'window'],
26748
26838
  };
26749
26839
  const CAPS = [
26750
- { path: 'page', category: 'page', valueKind: 'object', description: 'Definição da página dinâmica.' },
26751
- { path: 'page.context', category: 'context', valueKind: 'object', description: 'Contexto compartilhado entre widgets.' },
26752
- { path: 'page.layoutPreset', category: 'layout', valueKind: 'string', description: 'ID canônico opcional do preset estrutural da página.' },
26753
- { path: 'page.layoutPresetOptions', category: 'layout', valueKind: 'object', description: 'Opções específicas do preset estrutural consumidas por builders e runtimes futuros.' },
26754
- { path: 'page.themePreset', category: 'appearance', valueKind: 'string', description: 'ID opcional do preset de tema para shell, gráficos, densidade e defaults visuais.' },
26755
- { path: 'page.layout', category: 'layout', valueKind: 'object', description: 'Layout base da página.' },
26756
- { path: 'page.layout.orientation', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.layoutOrientation, description: 'Orientacao do grid (vertical/columns).' },
26757
- { path: 'page.layout.columns', category: 'layout', valueKind: 'number', description: 'Numero de colunas (quando orientation=columns).' },
26758
- { path: 'page.layout.gap', category: 'layout', valueKind: 'string', description: 'Gap entre widgets (ex: 16px).' },
26759
- { path: 'page.layout.breakpoints', category: 'layout', valueKind: 'object', description: 'Colunas por breakpoint.' },
26760
- { path: 'page.layout.breakpoints.sm', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint sm.' },
26761
- { path: 'page.layout.breakpoints.md', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint md.' },
26762
- { path: 'page.layout.breakpoints.lg', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint lg.' },
26763
- { path: 'page.layout.breakpoints.xl', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint xl.' },
26764
- { path: 'page.canvas', category: 'layout', valueKind: 'object', description: 'Canvas espacial canônico da página quando houver geometria explícita.' },
26765
- { path: 'page.canvas.mode', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.canvasMode, description: 'Modo canonico do canvas. Valor atual: grid.' },
26766
- { path: 'page.canvas.columns', category: 'layout', valueKind: 'number', description: 'Numero de colunas do canvas espacial.' },
26767
- { path: 'page.canvas.rowUnit', category: 'layout', valueKind: 'string', description: 'Altura base das linhas do canvas, como 80px.' },
26768
- { path: 'page.canvas.gap', category: 'layout', valueKind: 'string', description: 'Espacamento entre itens do canvas.' },
26769
- { path: 'page.canvas.autoRows', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.canvasAutoRows, description: 'Politica de linhas automaticas do canvas.' },
26770
- { path: 'page.canvas.collisionPolicy', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.canvasCollisionPolicy, description: 'Politica de colisao do canvas espacial.' },
26771
- { path: 'page.canvas.items', category: 'layout', valueKind: 'object', description: 'Mapa canonico de geometria por widget key.' },
26772
- { path: 'page.canvas.items.<widgetKey>.col', category: 'layout', valueKind: 'number', description: 'Coluna inicial do widget no canvas.' },
26773
- { path: 'page.canvas.items.<widgetKey>.row', category: 'layout', valueKind: 'number', description: 'Linha inicial do widget no canvas.' },
26774
- { path: 'page.canvas.items.<widgetKey>.colSpan', category: 'layout', valueKind: 'number', description: 'Quantidade de colunas ocupadas pelo widget.' },
26775
- { path: 'page.canvas.items.<widgetKey>.rowSpan', category: 'layout', valueKind: 'number', description: 'Quantidade de linhas ocupadas pelo widget.' },
26776
- { path: 'page.canvas.items.<widgetKey>.zIndex', category: 'layout', valueKind: 'number', description: 'Camada opcional do item no canvas.' },
26777
- { path: 'page.canvas.items.<widgetKey>.constraints', category: 'layout', valueKind: 'object', description: 'Restricoes opcionais de posicao e tamanho do item no canvas.' },
26778
- { path: 'page.canvas.items.<widgetKey>.constraints.minColSpan', category: 'layout', valueKind: 'number', description: 'Span mínimo de colunas permitido.' },
26779
- { path: 'page.canvas.items.<widgetKey>.constraints.minRowSpan', category: 'layout', valueKind: 'number', description: 'Span mínimo de linhas permitido.' },
26780
- { path: 'page.canvas.items.<widgetKey>.constraints.maxColSpan', category: 'layout', valueKind: 'number', description: 'Span máximo de colunas permitido.' },
26781
- { path: 'page.canvas.items.<widgetKey>.constraints.maxRowSpan', category: 'layout', valueKind: 'number', description: 'Span máximo de linhas permitido.' },
26782
- { path: 'page.canvas.items.<widgetKey>.constraints.lockPosition', category: 'layout', valueKind: 'boolean', description: 'Bloqueia alteracao de posicao do item no canvas.' },
26783
- { path: 'page.canvas.items.<widgetKey>.constraints.lockSize', category: 'layout', valueKind: 'boolean', description: 'Bloqueia alteracao de tamanho do item no canvas.' },
26784
- { path: 'page.widgets', category: 'widgets', valueKind: 'array', description: 'Lista de widgets renderizados.' },
26785
- { path: 'page.widgets[].key', category: 'widgets', valueKind: 'string', description: 'Identificador unico do widget.' },
26786
- { path: 'page.widgets[].className', category: 'widgets', valueKind: 'string', description: 'Classe CSS opcional do widget.' },
26787
- { path: 'page.widgets[].definition.id', category: 'widgets', valueKind: 'string', description: 'ID do componente do widget (ex: praxis-table).' },
26788
- { path: 'page.widgets[].definition.inputs', category: 'widgets', valueKind: 'object', description: 'Inputs iniciais do widget.' },
26789
- { path: 'page.widgets[].definition.inputs.hostCapabilities', category: 'widgets', valueKind: 'object', description: 'Capacidades runtime mediadas pelo host quando definition.id = praxis-rich-content. Não pertence ao JSON persistido.' },
26790
- { path: 'page.widgets[].definition.inputs.hostCapabilities.dispatchAction', category: 'widgets', valueKind: 'object', description: 'Dispatcher runtime para actionButton e actions declarativas de rich content hospedado na página.' },
26791
- { path: 'page.widgets[].definition.inputs.hostCapabilities.isActionAvailable', category: 'widgets', valueKind: 'object', description: 'Resolver runtime de disponibilidade de actionId para rich content hospedado na página.' },
26792
- { path: 'page.widgets[].definition.inputs.hostCapabilities.hasCapability', category: 'widgets', valueKind: 'object', description: 'Resolver runtime de capabilities como page.customization.enabled e page.widget.selected para rich content hospedado na página.' },
26793
- { path: 'page.widgets[].definition.bindingOrder', category: 'widgets', valueKind: 'array', description: 'Ordem de binding de inputs.' },
26794
- { path: 'page.widgets[].shell', category: 'shell', valueKind: 'object', description: 'Configuração do shell do widget.' },
26795
- { path: 'page.widgets[].shell.kind', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.shellKind, description: 'Tipo de shell.' },
26796
- { path: 'page.widgets[].shell.title', category: 'shell', valueKind: 'string', description: 'Título do shell.' },
26797
- { path: 'page.widgets[].shell.subtitle', category: 'shell', valueKind: 'string', description: 'Subtítulo do shell.' },
26798
- { path: 'page.widgets[].shell.icon', category: 'shell', valueKind: 'string', description: 'Ícone do shell.' },
26799
- { path: 'page.widgets[].shell.showHeader', category: 'shell', valueKind: 'boolean', description: 'Exibe o header do shell.' },
26800
- { path: 'page.widgets[].shell.actions', category: 'shell', valueKind: 'array', description: 'Ações do shell.' },
26801
- { path: 'page.widgets[].shell.actions[].id', category: 'shell', valueKind: 'string', description: 'ID da ação.' },
26802
- { path: 'page.widgets[].shell.actions[].label', category: 'shell', valueKind: 'string', description: 'Label da ação.' },
26803
- { path: 'page.widgets[].shell.actions[].icon', category: 'shell', valueKind: 'string', description: 'Ícone da ação.' },
26804
- { path: 'page.widgets[].shell.actions[].variant', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.actionVariant, description: 'Estilo visual da ação.' },
26805
- { path: 'page.widgets[].shell.actions[].placement', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.actionPlacement, description: 'Posicionamento da ação.' },
26806
- { path: 'page.widgets[].shell.actions[].emit', category: 'shell', valueKind: 'string', description: 'Evento emitido ao acionar a ação.' },
26807
- { path: 'page.state', category: 'state', valueKind: 'object', description: 'Estado declarativo opcional compartilhado por widgets e composicao.' },
26808
- { path: 'page.state.values', category: 'state', valueKind: 'object', description: 'Valores primarios mutaveis escritos por widgets, defaults ou host.' },
26809
- { path: 'page.state.schema', category: 'state', valueKind: 'object', description: 'Descritores dos paths primarios de estado.' },
26810
- { path: 'page.state.schema.<token>.type', category: 'state', valueKind: 'string', description: 'Tipo semantico opcional do path de estado.' },
26811
- { path: 'page.state.schema.<token>.initial', category: 'state', valueKind: 'object', description: 'Valor inicial usado quando page.state.values omite o path.' },
26812
- { path: 'page.state.schema.<token>.persist', category: 'state', valueKind: 'boolean', description: 'Indica se o path primário deve ser persistido com a página.' },
26813
- { path: 'page.state.schema.<token>.mergeStrategy', category: 'state', valueKind: 'enum', allowedValues: ENUMS.stateMergeStrategy, description: 'Como escritas de widget/estado combinam com o valor atual.' },
26814
- { path: 'page.state.schema.<token>.description', category: 'state', valueKind: 'string', description: 'Descrição opcional do path para builders e catálogos AI.' },
26815
- { path: 'page.state.schema.<token>.tags', category: 'state', valueKind: 'array', description: 'Tags opcionais para busca e governanca do estado.' },
26816
- { path: 'page.state.derived', category: 'state', valueKind: 'object', description: 'Descritores de estado derivado recomputado pelo runtime.' },
26817
- { path: 'page.state.derived.<token>.dependsOn', category: 'state', valueKind: 'array', description: 'Paths de estado que alimentam o valor derivado.' },
26818
- { path: 'page.state.derived.<token>.compute', category: 'state', valueKind: 'object', description: 'Descritor de computacao do estado derivado.' },
26819
- { path: 'page.state.derived.<token>.compute.kind', category: 'state', valueKind: 'enum', allowedValues: ENUMS.derivedStateComputeKind, description: 'Tipo de computacao do estado derivado.' },
26820
- { path: 'page.state.derived.<token>.compute.expression', category: 'state', valueKind: 'expression', description: 'Expressao Json Logic para compute.kind=json-logic.' },
26821
- { path: 'page.state.derived.<token>.compute.value', category: 'state', valueKind: 'object', description: 'Valor template para compute.kind=template.' },
26822
- { path: 'page.state.derived.<token>.compute.operator', category: 'state', valueKind: 'string', description: 'Operador para compute.kind=operator.' },
26823
- { path: 'page.state.derived.<token>.compute.options', category: 'state', valueKind: 'object', description: 'Opções do operador ou transformer.' },
26824
- { path: 'page.state.derived.<token>.compute.transformerId', category: 'state', valueKind: 'string', description: 'Identificador do transformer para compute.kind=transformer.' },
26825
- { path: 'page.state.derived.<token>.description', category: 'state', valueKind: 'string', description: 'Descrição opcional do estado derivado.' },
26826
- { path: 'page.state.derived.<token>.cache', category: 'state', valueKind: 'boolean', description: 'Permite cache futuro do valor derivado.' },
26827
- { path: 'page.composition', category: 'connections', valueKind: 'object', description: 'Envelope canonico da composicao persistida.' },
26828
- { path: 'page.composition.version', category: 'connections', valueKind: 'string', description: 'Versao do envelope de composicao.' },
26829
- { path: 'page.composition.links', category: 'connections', valueKind: 'array', description: 'Links canonicos entre widgets, estado e actions globais.' },
26830
- { path: 'page.composition.links[].id', category: 'connections', valueKind: 'string', description: 'Identificador estavel do link.' },
26831
- { path: 'page.composition.links[].from', category: 'connections', valueKind: 'object', description: 'Endpoint de origem do link.' },
26832
- { path: 'page.composition.links[].from.kind', category: 'connections', valueKind: 'string', description: 'Tipo do endpoint de origem, como component-port ou state.' },
26833
- { path: 'page.composition.links[].from.ref', category: 'connections', valueKind: 'object', description: 'Referencia estruturada do endpoint de origem.' },
26834
- { path: 'page.composition.links[].from.ref.widget', category: 'connections', valueKind: 'string', description: 'Widget top-level dono do endpoint de origem.' },
26835
- { path: 'page.composition.links[].from.ref.port', category: 'connections', valueKind: 'string', description: 'Porta de origem do componente.' },
26836
- { path: 'page.composition.links[].from.ref.direction', category: 'connections', valueKind: 'string', description: 'Direcao da porta de origem.' },
26837
- { path: 'page.composition.links[].from.ref.nestedPath', category: 'connections', valueKind: 'array', description: 'NestedPath canonico para porta de componente filho de origem.' },
26838
- { path: 'page.composition.links[].from.ref.nestedPath[].kind', category: 'connections', valueKind: 'string', description: 'Tipo do segmento nested de origem.' },
26839
- { path: 'page.composition.links[].from.ref.nestedPath[].id', category: 'connections', valueKind: 'string', description: 'Identificador estrutural do segmento nested de origem.' },
26840
- { path: 'page.composition.links[].from.ref.nestedPath[].key', category: 'connections', valueKind: 'string', description: 'Chave estavel do widget filho no segmento terminal de origem.', critical: true },
26841
- { path: 'page.composition.links[].from.ref.nestedPath[].index', category: 'connections', valueKind: 'number', description: 'Índice auxiliar para diagnóstico visual; não use como identidade primária.' },
26842
- { path: 'page.composition.links[].from.ref.nestedPath[].componentType', category: 'connections', valueKind: 'string', description: 'Tipo do componente real do widget filho de origem.' },
26843
- { path: 'page.composition.links[].to', category: 'connections', valueKind: 'object', description: 'Endpoint de destino do link.' },
26844
- { path: 'page.composition.links[].to.kind', category: 'connections', valueKind: 'string', description: 'Tipo do endpoint de destino, como component-port, state ou global-action.' },
26845
- { path: 'page.composition.links[].to.ref', category: 'connections', valueKind: 'object', description: 'Referencia estruturada do endpoint de destino.' },
26846
- { path: 'page.composition.links[].to.ref.[actionId]', category: 'connections', valueKind: 'string', description: 'ID da action global quando to.kind = global-action.' },
26847
- { path: 'page.composition.links[].to.ref.payload', category: 'connections', valueKind: 'object', description: 'Payload fixo opcional da action global; quando omitido, o runtime entrega o valor transformado do link.' },
26848
- { path: 'page.composition.links[].to.ref.payloadExpr', category: 'connections', valueKind: 'expression', description: 'Expressao opcional de payload da action global suportada pelo GlobalActionService.' },
26849
- { path: 'page.composition.links[].to.ref.widget', category: 'connections', valueKind: 'string', description: 'Widget top-level dono do endpoint de destino.' },
26850
- { path: 'page.composition.links[].to.ref.port', category: 'connections', valueKind: 'string', description: 'Porta de destino do componente.' },
26851
- { path: 'page.composition.links[].to.ref.direction', category: 'connections', valueKind: 'string', description: 'Direcao da porta de destino.' },
26852
- { path: 'page.composition.links[].to.ref.nestedPath', category: 'connections', valueKind: 'array', description: 'NestedPath canonico para porta de componente filho de destino.' },
26853
- { path: 'page.composition.links[].to.ref.nestedPath[].kind', category: 'connections', valueKind: 'string', description: 'Tipo do segmento nested de destino.' },
26854
- { path: 'page.composition.links[].to.ref.nestedPath[].id', category: 'connections', valueKind: 'string', description: 'Identificador estrutural do segmento nested de destino.' },
26855
- { path: 'page.composition.links[].to.ref.nestedPath[].key', category: 'connections', valueKind: 'string', description: 'Chave estavel do widget filho no segmento terminal de destino.', critical: true },
26856
- { path: 'page.composition.links[].to.ref.nestedPath[].index', category: 'connections', valueKind: 'number', description: 'Índice auxiliar para diagnóstico visual; não use como identidade primária.' },
26857
- { path: 'page.composition.links[].to.ref.nestedPath[].componentType', category: 'connections', valueKind: 'string', description: 'Tipo do componente real do widget filho de destino.' },
26858
- { path: 'page.composition.links[].intent', category: 'connections', valueKind: 'string', description: 'Intenção semântica do link.' },
26859
- { path: 'page.composition.links[].transform', category: 'connections', valueKind: 'object', description: 'Pipeline de transformacao do link.' },
26860
- { path: 'page.composition.links[].condition', category: 'connections', valueKind: 'expression', description: 'Guarda semântica opcional do link, expressa como um único AST Json Logic canônico.' },
26861
- { path: 'page.composition.links[].policy', category: 'connections', valueKind: 'object', description: 'Politicas operacionais opcionais do link, como debounce, distinct e missing-value.' },
26862
- { path: 'page.composition.links[].metadata', category: 'connections', valueKind: 'object', description: 'Metadados opcionais do link.' },
26863
- { path: 'page.grouping', category: 'layout', valueKind: 'array', description: 'Modelo semantico opcional de secoes, abas, areas hero e rails.' },
26864
- { path: 'page.grouping[].kind', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.groupingKind, description: 'Tipo do agrupamento semantico.' },
26865
- { path: 'page.grouping[].id', category: 'layout', valueKind: 'string', description: 'Identificador estavel do agrupamento.' },
26866
- { path: 'page.grouping[].label', category: 'layout', valueKind: 'string', description: 'Rotulo opcional do agrupamento.' },
26867
- { path: 'page.grouping[].widgetKeys', category: 'layout', valueKind: 'array', description: 'Widgets pertencentes ao agrupamento section, hero ou rail.' },
26868
- { path: 'page.grouping[].layout', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.groupingLayout, description: 'Layout opcional para agrupamento section.' },
26869
- { path: 'page.grouping[].tabs', category: 'layout', valueKind: 'array', description: 'Abas do agrupamento kind=tabs.' },
26870
- { path: 'page.grouping[].tabs[].id', category: 'layout', valueKind: 'string', description: 'Identificador estavel da aba.' },
26871
- { path: 'page.grouping[].tabs[].label', category: 'layout', valueKind: 'string', description: 'Rotulo da aba.' },
26872
- { path: 'page.grouping[].tabs[].widgetKeys', category: 'layout', valueKind: 'array', description: 'Widgets renderizados dentro da aba.' },
26873
- { path: 'page.grouping[].emphasis', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.heroEmphasis, description: 'Enfase opcional para agrupamento hero.' },
26874
- { path: 'page.grouping[].side', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.railSide, description: 'Lado do rail quando kind=rail.' },
26875
- { path: 'page.slotAssignments', category: 'layout', valueKind: 'object', description: 'Mapa canonico de widget key para slot semantico de preset.' },
26876
- { path: 'page.deviceLayouts', category: 'layout', valueKind: 'object', description: 'Variantes opcionais de layout por dispositivo.' },
26877
- { path: 'page.deviceLayouts.desktop', category: 'layout', valueKind: 'object', description: 'Overrides de layout para desktop.' },
26878
- { path: 'page.deviceLayouts.tablet', category: 'layout', valueKind: 'object', description: 'Overrides de layout para tablet.' },
26879
- { path: 'page.deviceLayouts.mobile', category: 'layout', valueKind: 'object', description: 'Overrides de layout para mobile.' },
26880
- { path: 'page.deviceLayouts.desktop.layout', category: 'layout', valueKind: 'object', description: 'Override de WidgetPageLayout para desktop.' },
26881
- { path: 'page.deviceLayouts.desktop.canvas', category: 'layout', valueKind: 'object', description: 'Override de canvas para desktop.' },
26882
- { path: 'page.deviceLayouts.desktop.groupingOverrides', category: 'layout', valueKind: 'array', description: 'Overrides de agrupamentos para desktop.' },
26883
- { path: 'page.deviceLayouts.desktop.widgetOverrides', category: 'layout', valueKind: 'object', description: 'Overrides por widget key para desktop.' },
26884
- { path: 'page.deviceLayouts.desktop.widgetOverrides.<widgetKey>.hidden', category: 'layout', valueKind: 'boolean', description: 'Oculta o widget em desktop.' },
26885
- { path: 'page.deviceLayouts.tablet.layout', category: 'layout', valueKind: 'object', description: 'Override de WidgetPageLayout para tablet.' },
26886
- { path: 'page.deviceLayouts.tablet.canvas', category: 'layout', valueKind: 'object', description: 'Override de canvas para tablet.' },
26887
- { path: 'page.deviceLayouts.tablet.groupingOverrides', category: 'layout', valueKind: 'array', description: 'Overrides de agrupamentos para tablet.' },
26888
- { path: 'page.deviceLayouts.tablet.widgetOverrides', category: 'layout', valueKind: 'object', description: 'Overrides por widget key para tablet.' },
26889
- { path: 'page.deviceLayouts.tablet.widgetOverrides.<widgetKey>.hidden', category: 'layout', valueKind: 'boolean', description: 'Oculta o widget em tablet.' },
26890
- { path: 'page.deviceLayouts.mobile.layout', category: 'layout', valueKind: 'object', description: 'Override de WidgetPageLayout para mobile.' },
26891
- { path: 'page.deviceLayouts.mobile.canvas', category: 'layout', valueKind: 'object', description: 'Override de canvas para mobile.' },
26892
- { path: 'page.deviceLayouts.mobile.groupingOverrides', category: 'layout', valueKind: 'array', description: 'Overrides de agrupamentos para mobile.' },
26893
- { path: 'page.deviceLayouts.mobile.widgetOverrides', category: 'layout', valueKind: 'object', description: 'Overrides por widget key para mobile.' },
26894
- { path: 'page.deviceLayouts.mobile.widgetOverrides.<widgetKey>.hidden', category: 'layout', valueKind: 'boolean', description: 'Oculta o widget em mobile.' },
26840
+ {
26841
+ path: 'page',
26842
+ category: 'page',
26843
+ valueKind: 'object',
26844
+ description: 'Definição da página dinâmica.',
26845
+ },
26846
+ {
26847
+ path: 'page.context',
26848
+ category: 'context',
26849
+ valueKind: 'object',
26850
+ description: 'Contexto compartilhado entre widgets.',
26851
+ },
26852
+ {
26853
+ path: 'page.i18n',
26854
+ category: 'localization',
26855
+ valueKind: 'object',
26856
+ description: 'Catálogo de copy de negócio da página, resolvido apenas na projeção runtime.',
26857
+ },
26858
+ {
26859
+ path: 'page.i18n.fallbackLocale',
26860
+ category: 'localization',
26861
+ valueKind: 'string',
26862
+ description: 'Locale de fallback do catálogo próprio da página.',
26863
+ },
26864
+ {
26865
+ path: 'page.i18n.dictionaries',
26866
+ category: 'localization',
26867
+ valueKind: 'object',
26868
+ description: 'Dicionários locale -> chave semântica -> texto usados por descritores PraxisTextValue explícitos.',
26869
+ },
26870
+ {
26871
+ path: 'page.layoutPreset',
26872
+ category: 'layout',
26873
+ valueKind: 'string',
26874
+ description: 'ID canônico opcional do preset estrutural da página.',
26875
+ },
26876
+ {
26877
+ path: 'page.layoutPresetOptions',
26878
+ category: 'layout',
26879
+ valueKind: 'object',
26880
+ description: 'Opções específicas do preset estrutural consumidas por builders e runtimes futuros.',
26881
+ },
26882
+ {
26883
+ path: 'page.themePreset',
26884
+ category: 'appearance',
26885
+ valueKind: 'string',
26886
+ description: 'ID opcional do preset de tema para shell, gráficos, densidade e defaults visuais.',
26887
+ },
26888
+ {
26889
+ path: 'page.layout',
26890
+ category: 'layout',
26891
+ valueKind: 'object',
26892
+ description: 'Layout base da página.',
26893
+ },
26894
+ {
26895
+ path: 'page.layout.orientation',
26896
+ category: 'layout',
26897
+ valueKind: 'enum',
26898
+ allowedValues: ENUMS.layoutOrientation,
26899
+ description: 'Orientacao do grid (vertical/columns).',
26900
+ },
26901
+ {
26902
+ path: 'page.layout.columns',
26903
+ category: 'layout',
26904
+ valueKind: 'number',
26905
+ description: 'Numero de colunas (quando orientation=columns).',
26906
+ },
26907
+ {
26908
+ path: 'page.layout.gap',
26909
+ category: 'layout',
26910
+ valueKind: 'string',
26911
+ description: 'Gap entre widgets (ex: 16px).',
26912
+ },
26913
+ {
26914
+ path: 'page.layout.breakpoints',
26915
+ category: 'layout',
26916
+ valueKind: 'object',
26917
+ description: 'Colunas por breakpoint.',
26918
+ },
26919
+ {
26920
+ path: 'page.layout.breakpoints.sm',
26921
+ category: 'layout',
26922
+ valueKind: 'number',
26923
+ description: 'Colunas para breakpoint sm.',
26924
+ },
26925
+ {
26926
+ path: 'page.layout.breakpoints.md',
26927
+ category: 'layout',
26928
+ valueKind: 'number',
26929
+ description: 'Colunas para breakpoint md.',
26930
+ },
26931
+ {
26932
+ path: 'page.layout.breakpoints.lg',
26933
+ category: 'layout',
26934
+ valueKind: 'number',
26935
+ description: 'Colunas para breakpoint lg.',
26936
+ },
26937
+ {
26938
+ path: 'page.layout.breakpoints.xl',
26939
+ category: 'layout',
26940
+ valueKind: 'number',
26941
+ description: 'Colunas para breakpoint xl.',
26942
+ },
26943
+ {
26944
+ path: 'page.canvas',
26945
+ category: 'layout',
26946
+ valueKind: 'object',
26947
+ description: 'Canvas espacial canônico da página quando houver geometria explícita.',
26948
+ },
26949
+ {
26950
+ path: 'page.canvas.mode',
26951
+ category: 'layout',
26952
+ valueKind: 'enum',
26953
+ allowedValues: ENUMS.canvasMode,
26954
+ description: 'Modo canonico do canvas. Valor atual: grid.',
26955
+ },
26956
+ {
26957
+ path: 'page.canvas.columns',
26958
+ category: 'layout',
26959
+ valueKind: 'number',
26960
+ description: 'Numero de colunas do canvas espacial.',
26961
+ },
26962
+ {
26963
+ path: 'page.canvas.rowUnit',
26964
+ category: 'layout',
26965
+ valueKind: 'string',
26966
+ description: 'Altura base das linhas do canvas, como 80px.',
26967
+ },
26968
+ {
26969
+ path: 'page.canvas.gap',
26970
+ category: 'layout',
26971
+ valueKind: 'string',
26972
+ description: 'Espacamento entre itens do canvas.',
26973
+ },
26974
+ {
26975
+ path: 'page.canvas.autoRows',
26976
+ category: 'layout',
26977
+ valueKind: 'enum',
26978
+ allowedValues: ENUMS.canvasAutoRows,
26979
+ description: 'Politica de linhas automaticas do canvas.',
26980
+ },
26981
+ {
26982
+ path: 'page.canvas.collisionPolicy',
26983
+ category: 'layout',
26984
+ valueKind: 'enum',
26985
+ allowedValues: ENUMS.canvasCollisionPolicy,
26986
+ description: 'Politica de colisao do canvas espacial.',
26987
+ },
26988
+ {
26989
+ path: 'page.canvas.items',
26990
+ category: 'layout',
26991
+ valueKind: 'object',
26992
+ description: 'Mapa canonico de geometria por widget key.',
26993
+ },
26994
+ {
26995
+ path: 'page.canvas.items.<widgetKey>.col',
26996
+ category: 'layout',
26997
+ valueKind: 'number',
26998
+ description: 'Coluna inicial do widget no canvas.',
26999
+ },
27000
+ {
27001
+ path: 'page.canvas.items.<widgetKey>.row',
27002
+ category: 'layout',
27003
+ valueKind: 'number',
27004
+ description: 'Linha inicial do widget no canvas.',
27005
+ },
27006
+ {
27007
+ path: 'page.canvas.items.<widgetKey>.colSpan',
27008
+ category: 'layout',
27009
+ valueKind: 'number',
27010
+ description: 'Quantidade de colunas ocupadas pelo widget.',
27011
+ },
27012
+ {
27013
+ path: 'page.canvas.items.<widgetKey>.rowSpan',
27014
+ category: 'layout',
27015
+ valueKind: 'number',
27016
+ description: 'Quantidade de linhas ocupadas pelo widget.',
27017
+ },
27018
+ {
27019
+ path: 'page.canvas.items.<widgetKey>.zIndex',
27020
+ category: 'layout',
27021
+ valueKind: 'number',
27022
+ description: 'Camada opcional do item no canvas.',
27023
+ },
27024
+ {
27025
+ path: 'page.canvas.items.<widgetKey>.constraints',
27026
+ category: 'layout',
27027
+ valueKind: 'object',
27028
+ description: 'Restricoes opcionais de posicao e tamanho do item no canvas.',
27029
+ },
27030
+ {
27031
+ path: 'page.canvas.items.<widgetKey>.constraints.minColSpan',
27032
+ category: 'layout',
27033
+ valueKind: 'number',
27034
+ description: 'Span mínimo de colunas permitido.',
27035
+ },
27036
+ {
27037
+ path: 'page.canvas.items.<widgetKey>.constraints.minRowSpan',
27038
+ category: 'layout',
27039
+ valueKind: 'number',
27040
+ description: 'Span mínimo de linhas permitido.',
27041
+ },
27042
+ {
27043
+ path: 'page.canvas.items.<widgetKey>.constraints.maxColSpan',
27044
+ category: 'layout',
27045
+ valueKind: 'number',
27046
+ description: 'Span máximo de colunas permitido.',
27047
+ },
27048
+ {
27049
+ path: 'page.canvas.items.<widgetKey>.constraints.maxRowSpan',
27050
+ category: 'layout',
27051
+ valueKind: 'number',
27052
+ description: 'Span máximo de linhas permitido.',
27053
+ },
27054
+ {
27055
+ path: 'page.canvas.items.<widgetKey>.constraints.lockPosition',
27056
+ category: 'layout',
27057
+ valueKind: 'boolean',
27058
+ description: 'Bloqueia alteracao de posicao do item no canvas.',
27059
+ },
27060
+ {
27061
+ path: 'page.canvas.items.<widgetKey>.constraints.lockSize',
27062
+ category: 'layout',
27063
+ valueKind: 'boolean',
27064
+ description: 'Bloqueia alteracao de tamanho do item no canvas.',
27065
+ },
27066
+ {
27067
+ path: 'page.widgets',
27068
+ category: 'widgets',
27069
+ valueKind: 'array',
27070
+ description: 'Lista de widgets renderizados.',
27071
+ },
27072
+ {
27073
+ path: 'page.widgets[].key',
27074
+ category: 'widgets',
27075
+ valueKind: 'string',
27076
+ description: 'Identificador unico do widget.',
27077
+ },
27078
+ {
27079
+ path: 'page.widgets[].className',
27080
+ category: 'widgets',
27081
+ valueKind: 'string',
27082
+ description: 'Classe CSS opcional do widget.',
27083
+ },
27084
+ {
27085
+ path: 'page.widgets[].definition.id',
27086
+ category: 'widgets',
27087
+ valueKind: 'string',
27088
+ description: 'ID do componente do widget (ex: praxis-table).',
27089
+ },
27090
+ {
27091
+ path: 'page.widgets[].definition.inputs',
27092
+ category: 'widgets',
27093
+ valueKind: 'object',
27094
+ description: 'Inputs iniciais do widget.',
27095
+ },
27096
+ {
27097
+ path: 'page.widgets[].definition.inputs.hostCapabilities',
27098
+ category: 'widgets',
27099
+ valueKind: 'object',
27100
+ description: 'Capacidades runtime mediadas pelo host quando definition.id = praxis-rich-content. Não pertence ao JSON persistido.',
27101
+ },
27102
+ {
27103
+ path: 'page.widgets[].definition.inputs.hostCapabilities.dispatchAction',
27104
+ category: 'widgets',
27105
+ valueKind: 'object',
27106
+ description: 'Dispatcher runtime para actionButton e actions declarativas de rich content hospedado na página.',
27107
+ },
27108
+ {
27109
+ path: 'page.widgets[].definition.inputs.hostCapabilities.isActionAvailable',
27110
+ category: 'widgets',
27111
+ valueKind: 'object',
27112
+ description: 'Resolver runtime de disponibilidade de actionId para rich content hospedado na página.',
27113
+ },
27114
+ {
27115
+ path: 'page.widgets[].definition.inputs.hostCapabilities.hasCapability',
27116
+ category: 'widgets',
27117
+ valueKind: 'object',
27118
+ description: 'Resolver runtime de capabilities como page.customization.enabled e page.widget.selected para rich content hospedado na página.',
27119
+ },
27120
+ {
27121
+ path: 'page.widgets[].definition.bindingOrder',
27122
+ category: 'widgets',
27123
+ valueKind: 'array',
27124
+ description: 'Ordem de binding de inputs.',
27125
+ },
27126
+ {
27127
+ path: 'page.widgets[].shell',
27128
+ category: 'shell',
27129
+ valueKind: 'object',
27130
+ description: 'Configuração do shell do widget.',
27131
+ },
27132
+ {
27133
+ path: 'page.widgets[].shell.kind',
27134
+ category: 'shell',
27135
+ valueKind: 'enum',
27136
+ allowedValues: ENUMS.shellKind,
27137
+ description: 'Tipo de shell.',
27138
+ },
27139
+ {
27140
+ path: 'page.widgets[].shell.title',
27141
+ category: 'shell',
27142
+ valueKind: 'string',
27143
+ description: 'Título do shell.',
27144
+ },
27145
+ {
27146
+ path: 'page.widgets[].shell.subtitle',
27147
+ category: 'shell',
27148
+ valueKind: 'string',
27149
+ description: 'Subtítulo do shell.',
27150
+ },
27151
+ {
27152
+ path: 'page.widgets[].shell.icon',
27153
+ category: 'shell',
27154
+ valueKind: 'string',
27155
+ description: 'Ícone do shell.',
27156
+ },
27157
+ {
27158
+ path: 'page.widgets[].shell.showHeader',
27159
+ category: 'shell',
27160
+ valueKind: 'boolean',
27161
+ description: 'Exibe o header do shell.',
27162
+ },
27163
+ {
27164
+ path: 'page.widgets[].shell.actions',
27165
+ category: 'shell',
27166
+ valueKind: 'array',
27167
+ description: 'Ações do shell.',
27168
+ },
27169
+ {
27170
+ path: 'page.widgets[].shell.actions[].id',
27171
+ category: 'shell',
27172
+ valueKind: 'string',
27173
+ description: 'ID da ação.',
27174
+ },
27175
+ {
27176
+ path: 'page.widgets[].shell.actions[].label',
27177
+ category: 'shell',
27178
+ valueKind: 'string',
27179
+ description: 'Label da ação.',
27180
+ },
27181
+ {
27182
+ path: 'page.widgets[].shell.actions[].icon',
27183
+ category: 'shell',
27184
+ valueKind: 'string',
27185
+ description: 'Ícone da ação.',
27186
+ },
27187
+ {
27188
+ path: 'page.widgets[].shell.actions[].variant',
27189
+ category: 'shell',
27190
+ valueKind: 'enum',
27191
+ allowedValues: ENUMS.actionVariant,
27192
+ description: 'Estilo visual da ação.',
27193
+ },
27194
+ {
27195
+ path: 'page.widgets[].shell.actions[].placement',
27196
+ category: 'shell',
27197
+ valueKind: 'enum',
27198
+ allowedValues: ENUMS.actionPlacement,
27199
+ description: 'Posicionamento da ação.',
27200
+ },
27201
+ {
27202
+ path: 'page.widgets[].shell.actions[].emit',
27203
+ category: 'shell',
27204
+ valueKind: 'string',
27205
+ description: 'Evento emitido ao acionar a ação.',
27206
+ },
27207
+ {
27208
+ path: 'page.state',
27209
+ category: 'state',
27210
+ valueKind: 'object',
27211
+ description: 'Estado declarativo opcional compartilhado por widgets e composicao.',
27212
+ },
27213
+ {
27214
+ path: 'page.state.values',
27215
+ category: 'state',
27216
+ valueKind: 'object',
27217
+ description: 'Valores primarios mutaveis escritos por widgets, defaults ou host.',
27218
+ },
27219
+ {
27220
+ path: 'page.state.schema',
27221
+ category: 'state',
27222
+ valueKind: 'object',
27223
+ description: 'Descritores dos paths primarios de estado.',
27224
+ },
27225
+ {
27226
+ path: 'page.state.schema.<token>.type',
27227
+ category: 'state',
27228
+ valueKind: 'string',
27229
+ description: 'Tipo semantico opcional do path de estado.',
27230
+ },
27231
+ {
27232
+ path: 'page.state.schema.<token>.initial',
27233
+ category: 'state',
27234
+ valueKind: 'object',
27235
+ description: 'Valor inicial usado quando page.state.values omite o path.',
27236
+ },
27237
+ {
27238
+ path: 'page.state.schema.<token>.persist',
27239
+ category: 'state',
27240
+ valueKind: 'boolean',
27241
+ description: 'Indica se o path primário deve ser persistido com a página.',
27242
+ },
27243
+ {
27244
+ path: 'page.state.schema.<token>.mergeStrategy',
27245
+ category: 'state',
27246
+ valueKind: 'enum',
27247
+ allowedValues: ENUMS.stateMergeStrategy,
27248
+ description: 'Como escritas de widget/estado combinam com o valor atual.',
27249
+ },
27250
+ {
27251
+ path: 'page.state.schema.<token>.description',
27252
+ category: 'state',
27253
+ valueKind: 'string',
27254
+ description: 'Descrição opcional do path para builders e catálogos AI.',
27255
+ },
27256
+ {
27257
+ path: 'page.state.schema.<token>.tags',
27258
+ category: 'state',
27259
+ valueKind: 'array',
27260
+ description: 'Tags opcionais para busca e governanca do estado.',
27261
+ },
27262
+ {
27263
+ path: 'page.state.derived',
27264
+ category: 'state',
27265
+ valueKind: 'object',
27266
+ description: 'Descritores de estado derivado recomputado pelo runtime.',
27267
+ },
27268
+ {
27269
+ path: 'page.state.derived.<token>.dependsOn',
27270
+ category: 'state',
27271
+ valueKind: 'array',
27272
+ description: 'Paths de estado que alimentam o valor derivado.',
27273
+ },
27274
+ {
27275
+ path: 'page.state.derived.<token>.compute',
27276
+ category: 'state',
27277
+ valueKind: 'object',
27278
+ description: 'Descritor de computacao do estado derivado.',
27279
+ },
27280
+ {
27281
+ path: 'page.state.derived.<token>.compute.kind',
27282
+ category: 'state',
27283
+ valueKind: 'enum',
27284
+ allowedValues: ENUMS.derivedStateComputeKind,
27285
+ description: 'Tipo de computacao do estado derivado.',
27286
+ },
27287
+ {
27288
+ path: 'page.state.derived.<token>.compute.expression',
27289
+ category: 'state',
27290
+ valueKind: 'expression',
27291
+ description: 'Expressao Json Logic para compute.kind=json-logic.',
27292
+ },
27293
+ {
27294
+ path: 'page.state.derived.<token>.compute.value',
27295
+ category: 'state',
27296
+ valueKind: 'object',
27297
+ description: 'Valor template para compute.kind=template.',
27298
+ },
27299
+ {
27300
+ path: 'page.state.derived.<token>.compute.operator',
27301
+ category: 'state',
27302
+ valueKind: 'string',
27303
+ description: 'Operador para compute.kind=operator.',
27304
+ },
27305
+ {
27306
+ path: 'page.state.derived.<token>.compute.options',
27307
+ category: 'state',
27308
+ valueKind: 'object',
27309
+ description: 'Opções do operador ou transformer.',
27310
+ },
27311
+ {
27312
+ path: 'page.state.derived.<token>.compute.transformerId',
27313
+ category: 'state',
27314
+ valueKind: 'string',
27315
+ description: 'Identificador do transformer para compute.kind=transformer.',
27316
+ },
27317
+ {
27318
+ path: 'page.state.derived.<token>.description',
27319
+ category: 'state',
27320
+ valueKind: 'string',
27321
+ description: 'Descrição opcional do estado derivado.',
27322
+ },
27323
+ {
27324
+ path: 'page.state.derived.<token>.cache',
27325
+ category: 'state',
27326
+ valueKind: 'boolean',
27327
+ description: 'Permite cache futuro do valor derivado.',
27328
+ },
27329
+ {
27330
+ path: 'page.composition',
27331
+ category: 'connections',
27332
+ valueKind: 'object',
27333
+ description: 'Envelope canonico da composicao persistida.',
27334
+ },
27335
+ {
27336
+ path: 'page.composition.version',
27337
+ category: 'connections',
27338
+ valueKind: 'string',
27339
+ description: 'Versao do envelope de composicao.',
27340
+ },
27341
+ {
27342
+ path: 'page.composition.links',
27343
+ category: 'connections',
27344
+ valueKind: 'array',
27345
+ description: 'Links canonicos entre widgets, estado e actions globais.',
27346
+ },
27347
+ {
27348
+ path: 'page.composition.links[].id',
27349
+ category: 'connections',
27350
+ valueKind: 'string',
27351
+ description: 'Identificador estavel do link.',
27352
+ },
27353
+ {
27354
+ path: 'page.composition.links[].from',
27355
+ category: 'connections',
27356
+ valueKind: 'object',
27357
+ description: 'Endpoint de origem do link.',
27358
+ },
27359
+ {
27360
+ path: 'page.composition.links[].from.kind',
27361
+ category: 'connections',
27362
+ valueKind: 'string',
27363
+ description: 'Tipo do endpoint de origem, como component-port ou state.',
27364
+ },
27365
+ {
27366
+ path: 'page.composition.links[].from.ref',
27367
+ category: 'connections',
27368
+ valueKind: 'object',
27369
+ description: 'Referencia estruturada do endpoint de origem.',
27370
+ },
27371
+ {
27372
+ path: 'page.composition.links[].from.ref.widget',
27373
+ category: 'connections',
27374
+ valueKind: 'string',
27375
+ description: 'Widget top-level dono do endpoint de origem.',
27376
+ },
27377
+ {
27378
+ path: 'page.composition.links[].from.ref.port',
27379
+ category: 'connections',
27380
+ valueKind: 'string',
27381
+ description: 'Porta de origem do componente.',
27382
+ },
27383
+ {
27384
+ path: 'page.composition.links[].from.ref.direction',
27385
+ category: 'connections',
27386
+ valueKind: 'string',
27387
+ description: 'Direcao da porta de origem.',
27388
+ },
27389
+ {
27390
+ path: 'page.composition.links[].from.ref.nestedPath',
27391
+ category: 'connections',
27392
+ valueKind: 'array',
27393
+ description: 'NestedPath canonico para porta de componente filho de origem.',
27394
+ },
27395
+ {
27396
+ path: 'page.composition.links[].from.ref.nestedPath[].kind',
27397
+ category: 'connections',
27398
+ valueKind: 'string',
27399
+ description: 'Tipo do segmento nested de origem.',
27400
+ },
27401
+ {
27402
+ path: 'page.composition.links[].from.ref.nestedPath[].id',
27403
+ category: 'connections',
27404
+ valueKind: 'string',
27405
+ description: 'Identificador estrutural do segmento nested de origem.',
27406
+ },
27407
+ {
27408
+ path: 'page.composition.links[].from.ref.nestedPath[].key',
27409
+ category: 'connections',
27410
+ valueKind: 'string',
27411
+ description: 'Chave estavel do widget filho no segmento terminal de origem.',
27412
+ critical: true,
27413
+ },
27414
+ {
27415
+ path: 'page.composition.links[].from.ref.nestedPath[].index',
27416
+ category: 'connections',
27417
+ valueKind: 'number',
27418
+ description: 'Índice auxiliar para diagnóstico visual; não use como identidade primária.',
27419
+ },
27420
+ {
27421
+ path: 'page.composition.links[].from.ref.nestedPath[].componentType',
27422
+ category: 'connections',
27423
+ valueKind: 'string',
27424
+ description: 'Tipo do componente real do widget filho de origem.',
27425
+ },
27426
+ {
27427
+ path: 'page.composition.links[].to',
27428
+ category: 'connections',
27429
+ valueKind: 'object',
27430
+ description: 'Endpoint de destino do link.',
27431
+ },
27432
+ {
27433
+ path: 'page.composition.links[].to.kind',
27434
+ category: 'connections',
27435
+ valueKind: 'string',
27436
+ description: 'Tipo do endpoint de destino, como component-port, state ou global-action.',
27437
+ },
27438
+ {
27439
+ path: 'page.composition.links[].to.ref',
27440
+ category: 'connections',
27441
+ valueKind: 'object',
27442
+ description: 'Referencia estruturada do endpoint de destino.',
27443
+ },
27444
+ {
27445
+ path: 'page.composition.links[].to.ref.[actionId]',
27446
+ category: 'connections',
27447
+ valueKind: 'string',
27448
+ description: 'ID da action global quando to.kind = global-action.',
27449
+ },
27450
+ {
27451
+ path: 'page.composition.links[].to.ref.payload',
27452
+ category: 'connections',
27453
+ valueKind: 'object',
27454
+ description: 'Payload fixo opcional da action global; quando omitido, o runtime entrega o valor transformado do link.',
27455
+ },
27456
+ {
27457
+ path: 'page.composition.links[].to.ref.payloadExpr',
27458
+ category: 'connections',
27459
+ valueKind: 'expression',
27460
+ description: 'Expressao opcional de payload da action global suportada pelo GlobalActionService.',
27461
+ },
27462
+ {
27463
+ path: 'page.composition.links[].to.ref.widget',
27464
+ category: 'connections',
27465
+ valueKind: 'string',
27466
+ description: 'Widget top-level dono do endpoint de destino.',
27467
+ },
27468
+ {
27469
+ path: 'page.composition.links[].to.ref.port',
27470
+ category: 'connections',
27471
+ valueKind: 'string',
27472
+ description: 'Porta de destino do componente.',
27473
+ },
27474
+ {
27475
+ path: 'page.composition.links[].to.ref.direction',
27476
+ category: 'connections',
27477
+ valueKind: 'string',
27478
+ description: 'Direcao da porta de destino.',
27479
+ },
27480
+ {
27481
+ path: 'page.composition.links[].to.ref.nestedPath',
27482
+ category: 'connections',
27483
+ valueKind: 'array',
27484
+ description: 'NestedPath canonico para porta de componente filho de destino.',
27485
+ },
27486
+ {
27487
+ path: 'page.composition.links[].to.ref.nestedPath[].kind',
27488
+ category: 'connections',
27489
+ valueKind: 'string',
27490
+ description: 'Tipo do segmento nested de destino.',
27491
+ },
27492
+ {
27493
+ path: 'page.composition.links[].to.ref.nestedPath[].id',
27494
+ category: 'connections',
27495
+ valueKind: 'string',
27496
+ description: 'Identificador estrutural do segmento nested de destino.',
27497
+ },
27498
+ {
27499
+ path: 'page.composition.links[].to.ref.nestedPath[].key',
27500
+ category: 'connections',
27501
+ valueKind: 'string',
27502
+ description: 'Chave estavel do widget filho no segmento terminal de destino.',
27503
+ critical: true,
27504
+ },
27505
+ {
27506
+ path: 'page.composition.links[].to.ref.nestedPath[].index',
27507
+ category: 'connections',
27508
+ valueKind: 'number',
27509
+ description: 'Índice auxiliar para diagnóstico visual; não use como identidade primária.',
27510
+ },
27511
+ {
27512
+ path: 'page.composition.links[].to.ref.nestedPath[].componentType',
27513
+ category: 'connections',
27514
+ valueKind: 'string',
27515
+ description: 'Tipo do componente real do widget filho de destino.',
27516
+ },
27517
+ {
27518
+ path: 'page.composition.links[].intent',
27519
+ category: 'connections',
27520
+ valueKind: 'string',
27521
+ description: 'Intenção semântica do link.',
27522
+ },
27523
+ {
27524
+ path: 'page.composition.links[].transform',
27525
+ category: 'connections',
27526
+ valueKind: 'object',
27527
+ description: 'Pipeline de transformacao do link.',
27528
+ },
27529
+ {
27530
+ path: 'page.composition.links[].condition',
27531
+ category: 'connections',
27532
+ valueKind: 'expression',
27533
+ description: 'Guarda semântica opcional do link, expressa como um único AST Json Logic canônico.',
27534
+ },
27535
+ {
27536
+ path: 'page.composition.links[].policy',
27537
+ category: 'connections',
27538
+ valueKind: 'object',
27539
+ description: 'Politicas operacionais opcionais do link, como debounce, distinct e missing-value.',
27540
+ },
27541
+ {
27542
+ path: 'page.composition.links[].metadata',
27543
+ category: 'connections',
27544
+ valueKind: 'object',
27545
+ description: 'Metadados opcionais do link.',
27546
+ },
27547
+ {
27548
+ path: 'page.grouping',
27549
+ category: 'layout',
27550
+ valueKind: 'array',
27551
+ description: 'Modelo semantico opcional de secoes, abas, areas hero e rails.',
27552
+ },
27553
+ {
27554
+ path: 'page.grouping[].kind',
27555
+ category: 'layout',
27556
+ valueKind: 'enum',
27557
+ allowedValues: ENUMS.groupingKind,
27558
+ description: 'Tipo do agrupamento semantico.',
27559
+ },
27560
+ {
27561
+ path: 'page.grouping[].id',
27562
+ category: 'layout',
27563
+ valueKind: 'string',
27564
+ description: 'Identificador estavel do agrupamento.',
27565
+ },
27566
+ {
27567
+ path: 'page.grouping[].label',
27568
+ category: 'layout',
27569
+ valueKind: 'string',
27570
+ description: 'Rotulo opcional do agrupamento.',
27571
+ },
27572
+ {
27573
+ path: 'page.grouping[].widgetKeys',
27574
+ category: 'layout',
27575
+ valueKind: 'array',
27576
+ description: 'Widgets pertencentes ao agrupamento section, hero ou rail.',
27577
+ },
27578
+ {
27579
+ path: 'page.grouping[].layout',
27580
+ category: 'layout',
27581
+ valueKind: 'enum',
27582
+ allowedValues: ENUMS.groupingLayout,
27583
+ description: 'Layout opcional para agrupamento section.',
27584
+ },
27585
+ {
27586
+ path: 'page.grouping[].tabs',
27587
+ category: 'layout',
27588
+ valueKind: 'array',
27589
+ description: 'Abas do agrupamento kind=tabs.',
27590
+ },
27591
+ {
27592
+ path: 'page.grouping[].tabs[].id',
27593
+ category: 'layout',
27594
+ valueKind: 'string',
27595
+ description: 'Identificador estavel da aba.',
27596
+ },
27597
+ {
27598
+ path: 'page.grouping[].tabs[].label',
27599
+ category: 'layout',
27600
+ valueKind: 'string',
27601
+ description: 'Rotulo da aba.',
27602
+ },
27603
+ {
27604
+ path: 'page.grouping[].tabs[].widgetKeys',
27605
+ category: 'layout',
27606
+ valueKind: 'array',
27607
+ description: 'Widgets renderizados dentro da aba.',
27608
+ },
27609
+ {
27610
+ path: 'page.grouping[].emphasis',
27611
+ category: 'layout',
27612
+ valueKind: 'enum',
27613
+ allowedValues: ENUMS.heroEmphasis,
27614
+ description: 'Enfase opcional para agrupamento hero.',
27615
+ },
27616
+ {
27617
+ path: 'page.grouping[].side',
27618
+ category: 'layout',
27619
+ valueKind: 'enum',
27620
+ allowedValues: ENUMS.railSide,
27621
+ description: 'Lado do rail quando kind=rail.',
27622
+ },
27623
+ {
27624
+ path: 'page.slotAssignments',
27625
+ category: 'layout',
27626
+ valueKind: 'object',
27627
+ description: 'Mapa canonico de widget key para slot semantico de preset.',
27628
+ },
27629
+ {
27630
+ path: 'page.deviceLayouts',
27631
+ category: 'layout',
27632
+ valueKind: 'object',
27633
+ description: 'Variantes opcionais de layout por dispositivo.',
27634
+ },
27635
+ {
27636
+ path: 'page.deviceLayouts.desktop',
27637
+ category: 'layout',
27638
+ valueKind: 'object',
27639
+ description: 'Overrides de layout para desktop.',
27640
+ },
27641
+ {
27642
+ path: 'page.deviceLayouts.tablet',
27643
+ category: 'layout',
27644
+ valueKind: 'object',
27645
+ description: 'Overrides de layout para tablet.',
27646
+ },
27647
+ {
27648
+ path: 'page.deviceLayouts.mobile',
27649
+ category: 'layout',
27650
+ valueKind: 'object',
27651
+ description: 'Overrides de layout para mobile.',
27652
+ },
27653
+ {
27654
+ path: 'page.deviceLayouts.desktop.layout',
27655
+ category: 'layout',
27656
+ valueKind: 'object',
27657
+ description: 'Override de WidgetPageLayout para desktop.',
27658
+ },
27659
+ {
27660
+ path: 'page.deviceLayouts.desktop.canvas',
27661
+ category: 'layout',
27662
+ valueKind: 'object',
27663
+ description: 'Override de canvas para desktop.',
27664
+ },
27665
+ {
27666
+ path: 'page.deviceLayouts.desktop.groupingOverrides',
27667
+ category: 'layout',
27668
+ valueKind: 'array',
27669
+ description: 'Overrides de agrupamentos para desktop.',
27670
+ },
27671
+ {
27672
+ path: 'page.deviceLayouts.desktop.widgetOverrides',
27673
+ category: 'layout',
27674
+ valueKind: 'object',
27675
+ description: 'Overrides por widget key para desktop.',
27676
+ },
27677
+ {
27678
+ path: 'page.deviceLayouts.desktop.widgetOverrides.<widgetKey>.hidden',
27679
+ category: 'layout',
27680
+ valueKind: 'boolean',
27681
+ description: 'Oculta o widget em desktop.',
27682
+ },
27683
+ {
27684
+ path: 'page.deviceLayouts.tablet.layout',
27685
+ category: 'layout',
27686
+ valueKind: 'object',
27687
+ description: 'Override de WidgetPageLayout para tablet.',
27688
+ },
27689
+ {
27690
+ path: 'page.deviceLayouts.tablet.canvas',
27691
+ category: 'layout',
27692
+ valueKind: 'object',
27693
+ description: 'Override de canvas para tablet.',
27694
+ },
27695
+ {
27696
+ path: 'page.deviceLayouts.tablet.groupingOverrides',
27697
+ category: 'layout',
27698
+ valueKind: 'array',
27699
+ description: 'Overrides de agrupamentos para tablet.',
27700
+ },
27701
+ {
27702
+ path: 'page.deviceLayouts.tablet.widgetOverrides',
27703
+ category: 'layout',
27704
+ valueKind: 'object',
27705
+ description: 'Overrides por widget key para tablet.',
27706
+ },
27707
+ {
27708
+ path: 'page.deviceLayouts.tablet.widgetOverrides.<widgetKey>.hidden',
27709
+ category: 'layout',
27710
+ valueKind: 'boolean',
27711
+ description: 'Oculta o widget em tablet.',
27712
+ },
27713
+ {
27714
+ path: 'page.deviceLayouts.mobile.layout',
27715
+ category: 'layout',
27716
+ valueKind: 'object',
27717
+ description: 'Override de WidgetPageLayout para mobile.',
27718
+ },
27719
+ {
27720
+ path: 'page.deviceLayouts.mobile.canvas',
27721
+ category: 'layout',
27722
+ valueKind: 'object',
27723
+ description: 'Override de canvas para mobile.',
27724
+ },
27725
+ {
27726
+ path: 'page.deviceLayouts.mobile.groupingOverrides',
27727
+ category: 'layout',
27728
+ valueKind: 'array',
27729
+ description: 'Overrides de agrupamentos para mobile.',
27730
+ },
27731
+ {
27732
+ path: 'page.deviceLayouts.mobile.widgetOverrides',
27733
+ category: 'layout',
27734
+ valueKind: 'object',
27735
+ description: 'Overrides por widget key para mobile.',
27736
+ },
27737
+ {
27738
+ path: 'page.deviceLayouts.mobile.widgetOverrides.<widgetKey>.hidden',
27739
+ category: 'layout',
27740
+ valueKind: 'boolean',
27741
+ description: 'Oculta o widget em mobile.',
27742
+ },
26895
27743
  ];
26896
27744
  const DYNAMIC_PAGE_AI_CAPABILITIES = {
26897
27745
  version: 'v1.2',
@@ -26899,7 +27747,7 @@ const DYNAMIC_PAGE_AI_CAPABILITIES = {
26899
27747
  targets: ['praxis-dynamic-page'],
26900
27748
  notes: [
26901
27749
  'Este catálogo é específico para o runtime praxis-dynamic-page; operações de authoring/mutação pertencem ao manifesto do praxis-page-builder.',
26902
- 'WidgetPageDefinition e o contrato canonico persistido: widgets, composition.links, state, context, layout, canvas, presets, grouping, slotAssignments, deviceLayouts e themePreset.',
27750
+ 'WidgetPageDefinition e o contrato canonico persistido: widgets, composition.links, state, context, i18n, layout, canvas, presets, grouping, slotAssignments, deviceLayouts e themePreset.',
26903
27751
  'Widgets e page.composition.links sao arrays; ferramentas de patch legadas fazem merge por key estavel e id estavel.',
26904
27752
  'page.canvas.items é um mapa por widget key; não modele canvas.items como array.',
26905
27753
  'Taxonomia editorial: condition usa Json Logic canônico; transform usa pipeline declarativo; não trate ambos como a mesma "expression".',
@@ -26927,9 +27775,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
26927
27775
  },
26928
27776
  'page.canvas.mode': {
26929
27777
  mode: 'enum',
26930
- options: [
26931
- { value: 'grid', label: 'Grid' },
26932
- ],
27778
+ options: [{ value: 'grid', label: 'Grid' }],
26933
27779
  },
26934
27780
  'page.canvas.autoRows': {
26935
27781
  mode: 'enum',
@@ -27018,9 +27864,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27018
27864
  },
27019
27865
  'page.composition.version': {
27020
27866
  mode: 'enum',
27021
- options: [
27022
- { value: '1.0.0', label: 'Schema canonico 1.0.0' },
27023
- ],
27867
+ options: [{ value: '1.0.0', label: 'Schema canonico 1.0.0' }],
27024
27868
  },
27025
27869
  'page.composition.links[].intent': {
27026
27870
  mode: 'enum',
@@ -27033,22 +27877,37 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27033
27877
  'page.composition.links[].from.ref.port': {
27034
27878
  mode: 'suggested',
27035
27879
  options: [
27036
- { value: 'rowClick', label: 'Clique na linha (praxis-table)', example: 'Usar table.rowClick -> form.resourceId via transform pick-path payload.row.id' },
27880
+ {
27881
+ value: 'rowClick',
27882
+ label: 'Clique na linha (praxis-table)',
27883
+ example: 'Usar table.rowClick -> form.resourceId via transform pick-path payload.row.id',
27884
+ },
27037
27885
  { value: 'rowAction', label: 'Ação da linha (praxis-table)' },
27038
- { value: 'formSubmit', label: 'Submit do formulario (praxis-dynamic-form)' },
27886
+ {
27887
+ value: 'formSubmit',
27888
+ label: 'Submit do formulario (praxis-dynamic-form)',
27889
+ },
27039
27890
  ],
27040
27891
  },
27041
27892
  'page.composition.links[].to.ref.port': {
27042
27893
  mode: 'suggested',
27043
27894
  options: [
27044
- { value: 'resourceId', label: 'ID do registro (praxis-dynamic-form)', example: 'transform pick-path payload.row.id' },
27895
+ {
27896
+ value: 'resourceId',
27897
+ label: 'ID do registro (praxis-dynamic-form)',
27898
+ example: 'transform pick-path payload.row.id',
27899
+ },
27045
27900
  { value: 'mode', label: 'Modo do formulario (create|edit|view)' },
27046
27901
  ],
27047
27902
  },
27048
27903
  'page.composition.links[].transform.steps[].config.path': {
27049
27904
  mode: 'suggested',
27050
27905
  options: [
27051
- { value: 'payload.row.id', label: 'ID padrão do registro', example: 'rowClick -> resourceId' },
27906
+ {
27907
+ value: 'payload.row.id',
27908
+ label: 'ID padrão do registro',
27909
+ example: 'rowClick -> resourceId',
27910
+ },
27052
27911
  ],
27053
27912
  },
27054
27913
  },
@@ -27060,9 +27919,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27060
27919
  scope: 'ROW',
27061
27920
  patchTemplate: {
27062
27921
  page: {
27063
- widgets: [
27064
- { key: '{{target}}', _remove: true },
27065
- ],
27922
+ widgets: [{ key: '{{target}}', _remove: true }],
27066
27923
  },
27067
27924
  },
27068
27925
  },
@@ -27071,9 +27928,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27071
27928
  intentExamples: ['remover conexao', 'excluir conexao', 'apagar conexao'],
27072
27929
  requiresExistingTarget: true,
27073
27930
  scope: 'ROW',
27074
- params: [
27075
- { name: 'id', type: 'STRING' },
27076
- ],
27931
+ params: [{ name: 'id', type: 'STRING' }],
27077
27932
  patchTemplate: {
27078
27933
  page: {
27079
27934
  composition: {
@@ -27091,7 +27946,12 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27091
27946
  },
27092
27947
  {
27093
27948
  id: 'page.layout.orientation.set',
27094
- intentExamples: ['orientacao', 'orientation', 'layout vertical', 'layout colunas'],
27949
+ intentExamples: [
27950
+ 'orientacao',
27951
+ 'orientation',
27952
+ 'layout vertical',
27953
+ 'layout colunas',
27954
+ ],
27095
27955
  patchTemplate: {
27096
27956
  page: {
27097
27957
  layout: {
@@ -27176,7 +28036,12 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27176
28036
  },
27177
28037
  {
27178
28038
  id: 'page.connection.set',
27179
- intentExamples: ['set connection', 'definir conexao', 'valor fixo', 'set constante'],
28039
+ intentExamples: [
28040
+ 'set connection',
28041
+ 'definir conexao',
28042
+ 'valor fixo',
28043
+ 'set constante',
28044
+ ],
27180
28045
  params: [
27181
28046
  { name: 'fromWidget', type: 'STRING' },
27182
28047
  { name: 'fromOutput', type: 'STRING' },
@@ -27193,11 +28058,19 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27193
28058
  id: '{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}',
27194
28059
  from: {
27195
28060
  kind: 'component-port',
27196
- ref: { widget: '{{params.fromWidget}}', port: '{{params.fromOutput}}', direction: 'output' },
28061
+ ref: {
28062
+ widget: '{{params.fromWidget}}',
28063
+ port: '{{params.fromOutput}}',
28064
+ direction: 'output',
28065
+ },
27197
28066
  },
27198
28067
  to: {
27199
28068
  kind: 'component-port',
27200
- ref: { widget: '{{params.toWidget}}', port: '{{params.toInput}}', direction: 'input' },
28069
+ ref: {
28070
+ widget: '{{params.toWidget}}',
28071
+ port: '{{params.toInput}}',
28072
+ direction: 'input',
28073
+ },
27201
28074
  },
27202
28075
  intent: 'event-propagation',
27203
28076
  transform: {
@@ -27225,7 +28098,12 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27225
28098
  },
27226
28099
  {
27227
28100
  id: 'page.widget.upsert',
27228
- intentExamples: ['adicionar widget', 'novo widget', 'inserir widget', 'atualizar widget'],
28101
+ intentExamples: [
28102
+ 'adicionar widget',
28103
+ 'novo widget',
28104
+ 'inserir widget',
28105
+ 'atualizar widget',
28106
+ ],
27229
28107
  params: [
27230
28108
  { name: 'widgetKey', type: 'STRING' },
27231
28109
  { name: 'widgetType', type: 'STRING' },
@@ -27248,7 +28126,12 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27248
28126
  },
27249
28127
  {
27250
28128
  id: 'page.connection.move',
27251
- intentExamples: ['mover conexao', 'alterar conexao', 'editar conexao', 'trocar conexao'],
28129
+ intentExamples: [
28130
+ 'mover conexao',
28131
+ 'alterar conexao',
28132
+ 'editar conexao',
28133
+ 'trocar conexao',
28134
+ ],
27252
28135
  params: [
27253
28136
  { name: 'fromWidget', type: 'STRING' },
27254
28137
  { name: 'fromOutput', type: 'STRING' },
@@ -27269,11 +28152,19 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27269
28152
  id: '{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}',
27270
28153
  from: {
27271
28154
  kind: 'component-port',
27272
- ref: { widget: '{{params.fromWidget}}', port: '{{params.fromOutput}}', direction: 'output' },
28155
+ ref: {
28156
+ widget: '{{params.fromWidget}}',
28157
+ port: '{{params.fromOutput}}',
28158
+ direction: 'output',
28159
+ },
27273
28160
  },
27274
28161
  to: {
27275
28162
  kind: 'component-port',
27276
- ref: { widget: '{{params.toWidget}}', port: '{{params.toInput}}', direction: 'input' },
28163
+ ref: {
28164
+ widget: '{{params.toWidget}}',
28165
+ port: '{{params.toInput}}',
28166
+ direction: 'input',
28167
+ },
27277
28168
  },
27278
28169
  intent: 'event-propagation',
27279
28170
  metadata: {
@@ -27317,7 +28208,11 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27317
28208
  },
27318
28209
  {
27319
28210
  id: 'page.widget.createForm',
27320
- intentExamples: ['criar formulario', 'adicionar formulario', 'widget formulario'],
28211
+ intentExamples: [
28212
+ 'criar formulario',
28213
+ 'adicionar formulario',
28214
+ 'widget formulario',
28215
+ ],
27321
28216
  operation: 'create',
27322
28217
  scope: 'ROW',
27323
28218
  valueType: 'OBJECT',
@@ -27349,7 +28244,12 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27349
28244
  },
27350
28245
  {
27351
28246
  id: 'page.connection.bindRowToForm',
27352
- intentExamples: ['conectar tabela ao formulario', 'master detail', 'master-detail', 'detalhe'],
28247
+ intentExamples: [
28248
+ 'conectar tabela ao formulario',
28249
+ 'master detail',
28250
+ 'master-detail',
28251
+ 'detalhe',
28252
+ ],
27353
28253
  operation: 'create',
27354
28254
  scope: 'ROW',
27355
28255
  valueType: 'OBJECT',
@@ -27370,11 +28270,19 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27370
28270
  id: '{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}',
27371
28271
  from: {
27372
28272
  kind: 'component-port',
27373
- ref: { widget: '{{params.fromWidget}}', port: '{{params.fromOutput}}', direction: 'output' },
28273
+ ref: {
28274
+ widget: '{{params.fromWidget}}',
28275
+ port: '{{params.fromOutput}}',
28276
+ direction: 'output',
28277
+ },
27374
28278
  },
27375
28279
  to: {
27376
28280
  kind: 'component-port',
27377
- ref: { widget: '{{params.toWidget}}', port: '{{params.toInput}}', direction: 'input' },
28281
+ ref: {
28282
+ widget: '{{params.toWidget}}',
28283
+ port: '{{params.toInput}}',
28284
+ direction: 'input',
28285
+ },
27378
28286
  },
27379
28287
  intent: 'event-propagation',
27380
28288
  transform: {
@@ -27403,7 +28311,12 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27403
28311
  },
27404
28312
  {
27405
28313
  id: 'page.connection.bindMasterDetail',
27406
- intentExamples: ['master detail', 'master-detail', 'conectar tabela ao formulario', 'detalhe'],
28314
+ intentExamples: [
28315
+ 'master detail',
28316
+ 'master-detail',
28317
+ 'conectar tabela ao formulario',
28318
+ 'detalhe',
28319
+ ],
27407
28320
  operation: 'create',
27408
28321
  scope: 'ROW',
27409
28322
  valueType: 'OBJECT',
@@ -27421,11 +28334,19 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27421
28334
  id: '{{params.fromWidget}}.rowClick->{{params.toWidget}}.resourceId',
27422
28335
  from: {
27423
28336
  kind: 'component-port',
27424
- ref: { widget: '{{params.fromWidget}}', port: 'rowClick', direction: 'output' },
28337
+ ref: {
28338
+ widget: '{{params.fromWidget}}',
28339
+ port: 'rowClick',
28340
+ direction: 'output',
28341
+ },
27425
28342
  },
27426
28343
  to: {
27427
28344
  kind: 'component-port',
27428
- ref: { widget: '{{params.toWidget}}', port: 'resourceId', direction: 'input' },
28345
+ ref: {
28346
+ widget: '{{params.toWidget}}',
28347
+ port: 'resourceId',
28348
+ direction: 'input',
28349
+ },
27429
28350
  },
27430
28351
  intent: 'event-propagation',
27431
28352
  transform: {
@@ -27454,7 +28375,12 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27454
28375
  },
27455
28376
  {
27456
28377
  id: 'page.template.applyMasterDetail',
27457
- intentExamples: ['criar página master detail', 'setup master detail', 'tabela e formulário', 'master-detail'],
28378
+ intentExamples: [
28379
+ 'criar página master detail',
28380
+ 'setup master detail',
28381
+ 'tabela e formulário',
28382
+ 'master-detail',
28383
+ ],
27458
28384
  operation: 'create',
27459
28385
  scope: 'GLOBAL',
27460
28386
  valueType: 'OBJECT',
@@ -27501,11 +28427,19 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27501
28427
  id: '{{params.tableId}}.rowClick->{{params.formId}}.resourceId',
27502
28428
  from: {
27503
28429
  kind: 'component-port',
27504
- ref: { widget: '{{params.tableId}}', port: 'rowClick', direction: 'output' },
28430
+ ref: {
28431
+ widget: '{{params.tableId}}',
28432
+ port: 'rowClick',
28433
+ direction: 'output',
28434
+ },
27505
28435
  },
27506
28436
  to: {
27507
28437
  kind: 'component-port',
27508
- ref: { widget: '{{params.formId}}', port: 'resourceId', direction: 'input' },
28438
+ ref: {
28439
+ widget: '{{params.formId}}',
28440
+ port: 'resourceId',
28441
+ direction: 'input',
28442
+ },
27509
28443
  },
27510
28444
  intent: 'event-propagation',
27511
28445
  transform: {
@@ -27540,7 +28474,8 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
27540
28474
  hints: [
27541
28475
  'praxis-dynamic-page e runtime de composicao: consome WidgetPageDefinition, renderiza widgets e mantem relacoes em page.composition.links.',
27542
28476
  'Mutações agentic de página pertencem ao manifesto do praxis-page-builder; use este context pack como descoberta/runtime guidance.',
27543
- 'WidgetPageDefinition inclui widgets, composition.links, state, context, layout, canvas, layoutPreset, layoutPresetOptions, grouping, slotAssignments, deviceLayouts e themePreset.',
28477
+ 'WidgetPageDefinition inclui widgets, composition.links, state, context, i18n, layout, canvas, layoutPreset, layoutPresetOptions, grouping, slotAssignments, deviceLayouts e themePreset.',
28478
+ 'page.i18n carrega copy de negócio do documento; use descritores PraxisTextValue explícitos em shells e inputs e preserve strings comuns como dados do domínio.',
27544
28479
  'page.canvas.items é um mapa por widget key, não um array; cada entrada guarda col, row, colSpan, rowSpan, zIndex e constraints opcionais.',
27545
28480
  'Widgets e composition.links sao arrays; o patching deve fazer merge por key (widgets) e por id (links).',
27546
28481
  'Preferir mudanças incrementais: alterar/estender em vez de substituir toda a página.',
@@ -35187,7 +36122,8 @@ class DynamicWidgetPageComponent {
35187
36122
  ngOnChanges(changes) {
35188
36123
  if (changes['page'] ||
35189
36124
  changes['context'] ||
35190
- changes['enableCustomization']) {
36125
+ changes['enableCustomization'] ||
36126
+ changes['pageIdentity']) {
35191
36127
  this.widgetShellRenderCache.clear();
35192
36128
  const parsed = this.parsePage(this.page);
35193
36129
  const resolvedPage = parsed ? this.resolvePagePresets(parsed) : parsed;
@@ -35272,10 +36208,10 @@ class DynamicWidgetPageComponent {
35272
36208
  const stateProjectionChanged = !this.areStateValuesEqual(widgets, projectedWidgets);
35273
36209
  widgets = projectedWidgets;
35274
36210
  const nextRuntime = this.buildStateRuntime(state, pageWithPatchedInputs.context);
35275
- if (this.isTransientOnlyCompositionCycle(cycle)
35276
- && !updatedPrimaryStatePaths.length
35277
- && !directDelivery.changed
35278
- && !widgetInputPatchResult.changed) {
36211
+ if (this.isTransientOnlyCompositionCycle(cycle) &&
36212
+ !updatedPrimaryStatePaths.length &&
36213
+ !directDelivery.changed &&
36214
+ !widgetInputPatchResult.changed) {
35279
36215
  this.applyResponsivePresentation(pageWithPatchedInputs, widgets, nextRuntime);
35280
36216
  return;
35281
36217
  }
@@ -35294,8 +36230,8 @@ class DynamicWidgetPageComponent {
35294
36230
  const linksById = new Map(this.compositionDefinition.links.map((link) => [link.id, link]));
35295
36231
  return cycle.matchedLinkIds.every((linkId) => {
35296
36232
  const link = linksById.get(linkId);
35297
- return link?.to.kind === 'state'
35298
- && (link.to.ref.layer ?? 'values') === 'transient';
36233
+ return (link?.to.kind === 'state' &&
36234
+ (link.to.ref.layer ?? 'values') === 'transient');
35299
36235
  });
35300
36236
  }
35301
36237
  applyWidgetInputPatchToPage(page, widgetKey, evt) {
@@ -35374,7 +36310,8 @@ class DynamicWidgetPageComponent {
35374
36310
  const nestedPath = normalizeWidgetEventPath(evt, {
35375
36311
  ownerComponentId: owner.definition.id,
35376
36312
  });
35377
- if (nestedPath.length && this.nestedWidgetAccessor.resolveNestedWidget(owner, nestedPath)) {
36313
+ if (nestedPath.length &&
36314
+ this.nestedWidgetAccessor.resolveNestedWidget(owner, nestedPath)) {
35378
36315
  return nestedPath;
35379
36316
  }
35380
36317
  const sourceChildWidgetKey = String(evt?.sourceChildWidgetKey || '').trim();
@@ -35382,16 +36319,18 @@ class DynamicWidgetPageComponent {
35382
36319
  return null;
35383
36320
  }
35384
36321
  const sourceComponentId = String(evt?.sourceComponentId || '').trim();
35385
- const match = this.nestedWidgetAccessor.listNestedWidgets(owner).find((candidate) => candidate.childWidgetKey === sourceChildWidgetKey
35386
- && (!sourceComponentId || candidate.componentId === sourceComponentId));
36322
+ const match = this.nestedWidgetAccessor
36323
+ .listNestedWidgets(owner)
36324
+ .find((candidate) => candidate.childWidgetKey === sourceChildWidgetKey &&
36325
+ (!sourceComponentId || candidate.componentId === sourceComponentId));
35387
36326
  return match?.nestedPath || null;
35388
36327
  }
35389
36328
  extractWidgetInputPatch(payload) {
35390
36329
  if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
35391
36330
  return null;
35392
36331
  }
35393
- const candidate = payload.inputPatch
35394
- ?? payload.payload?.inputPatch;
36332
+ const candidate = payload.inputPatch ??
36333
+ payload.payload?.inputPatch;
35395
36334
  if (!candidate ||
35396
36335
  typeof candidate !== 'object' ||
35397
36336
  Array.isArray(candidate)) {
@@ -35412,8 +36351,7 @@ class DynamicWidgetPageComponent {
35412
36351
  const hasWidgetInput = Object.prototype.hasOwnProperty.call(declaredInputs, inputName);
35413
36352
  const hasMetadataInput = !!this.componentMetadata
35414
36353
  ?.get(widget.definition?.id || '')
35415
- ?.inputs
35416
- ?.some((input) => input.name === inputName);
36354
+ ?.inputs?.some((input) => input.name === inputName);
35417
36355
  if (!hasWidgetInput && !hasMetadataInput) {
35418
36356
  return null;
35419
36357
  }
@@ -35495,10 +36433,12 @@ class DynamicWidgetPageComponent {
35495
36433
  activeWidgetKeys: widgetKeys.slice(0, 80),
35496
36434
  selectedWidgetKey,
35497
36435
  composition: {
35498
- version: this.pageDefinition?.composition?.version
35499
- || '1.0.0',
36436
+ version: this.pageDefinition?.composition?.version || '1.0.0',
35500
36437
  linkCount: compositionLinks.length,
35501
- linkIds: compositionLinks.map((link) => link.id).filter(Boolean).slice(0, 80),
36438
+ linkIds: compositionLinks
36439
+ .map((link) => link.id)
36440
+ .filter(Boolean)
36441
+ .slice(0, 80),
35502
36442
  },
35503
36443
  relationSurfaceRefs: compositionSurfaceRefs.slice(0, 80),
35504
36444
  },
@@ -35534,23 +36474,27 @@ class DynamicWidgetPageComponent {
35534
36474
  };
35535
36475
  }
35536
36476
  registerRuntimeComponentObservationProvider() {
35537
- if (!this.runtimeObservationRegistry || this.runtimeObservationRegistration) {
36477
+ if (!this.runtimeObservationRegistry ||
36478
+ this.runtimeObservationRegistration) {
35538
36479
  return;
35539
36480
  }
35540
- this.runtimeObservationRegistration = this.runtimeObservationRegistry.register({
35541
- getObservation: () => this.buildRuntimeComponentObservation(),
35542
- });
36481
+ this.runtimeObservationRegistration =
36482
+ this.runtimeObservationRegistry.register({
36483
+ getObservation: () => this.buildRuntimeComponentObservation(),
36484
+ });
35543
36485
  }
35544
36486
  resolveRuntimePageId() {
35545
- const identityKey = this.pageIdentity ? buildPageKey(this.pageIdentity) : '';
35546
- return this.componentInstanceId
35547
- || identityKey
35548
- || this.stringOrNull(this.pageDefinition?.context?.['pageId'])
35549
- || 'dynamic-page:default';
36487
+ const identityKey = this.pageIdentity
36488
+ ? buildPageKey(this.pageIdentity)
36489
+ : '';
36490
+ return (this.componentInstanceId ||
36491
+ identityKey ||
36492
+ this.stringOrNull(this.pageDefinition?.context?.['pageId']) ||
36493
+ 'dynamic-page:default');
35550
36494
  }
35551
36495
  resolveRuntimeComponentInstanceId(pageId) {
35552
- return this.componentInstanceId
35553
- || (pageId ? `dynamic-page:${pageId}` : 'dynamic-page:default');
36496
+ return (this.componentInstanceId ||
36497
+ (pageId ? `dynamic-page:${pageId}` : 'dynamic-page:default'));
35554
36498
  }
35555
36499
  isRuntimeObservationVisible() {
35556
36500
  const nativeElement = this.pageCanvasHost?.nativeElement;
@@ -35566,13 +36510,19 @@ class DynamicWidgetPageComponent {
35566
36510
  label: surface.label,
35567
36511
  sourceWidget: surface.source.widget,
35568
36512
  targetWidget: surface.target.widget,
35569
- ...(surface.target.resourcePath ? { targetResourcePath: surface.target.resourcePath } : {}),
35570
- ...(surface.runtimeSurfaceInstanceRef ? {
35571
- runtimeSurfaceInstanceRef: surface.runtimeSurfaceInstanceRef,
35572
- targetRuntimeSurfaceInstanceRef: surface.runtimeSurfaceInstanceRef,
35573
- } : {}),
36513
+ ...(surface.target.resourcePath
36514
+ ? { targetResourcePath: surface.target.resourcePath }
36515
+ : {}),
36516
+ ...(surface.runtimeSurfaceInstanceRef
36517
+ ? {
36518
+ runtimeSurfaceInstanceRef: surface.runtimeSurfaceInstanceRef,
36519
+ targetRuntimeSurfaceInstanceRef: surface.runtimeSurfaceInstanceRef,
36520
+ }
36521
+ : {}),
35574
36522
  statePath: surface.statePath,
35575
- ...(surface.queryMapping ? { queryMapping: surface.queryMapping } : {}),
36523
+ ...(surface.queryMapping
36524
+ ? { queryMapping: surface.queryMapping }
36525
+ : {}),
35576
36526
  operationId: surface.operationId,
35577
36527
  });
35578
36528
  }
@@ -35583,10 +36533,18 @@ class DynamicWidgetPageComponent {
35583
36533
  const claims = [
35584
36534
  { kind: 'component', ref: 'praxis-dynamic-page', observed: true },
35585
36535
  { kind: 'stateDigest', ref: `page:${context.pageId}`, observed: true },
35586
- { kind: 'dataDigest', ref: `page:${context.pageId}:composition`, observed: true },
36536
+ {
36537
+ kind: 'dataDigest',
36538
+ ref: `page:${context.pageId}:composition`,
36539
+ observed: true,
36540
+ },
35587
36541
  ];
35588
36542
  for (const widgetKey of context.widgetKeys.slice(0, 80)) {
35589
- claims.push({ kind: 'component', ref: `widget:${widgetKey}`, observed: true });
36543
+ claims.push({
36544
+ kind: 'component',
36545
+ ref: `widget:${widgetKey}`,
36546
+ observed: true,
36547
+ });
35590
36548
  }
35591
36549
  for (const surfaceRef of context.activeSurfaceRefs.slice(0, 80)) {
35592
36550
  claims.push({ kind: 'surface', ref: surfaceRef, observed: true });
@@ -35656,9 +36614,9 @@ class DynamicWidgetPageComponent {
35656
36614
  const sourceWidget = widgetByKey.get(sourceRef.widget);
35657
36615
  if (!sourceWidget)
35658
36616
  continue;
35659
- const targets = stateToQueryLinks.filter((link) => link.from.kind === 'state'
35660
- && link.from.ref.path === statePath
35661
- && link.to.kind === 'component-port');
36617
+ const targets = stateToQueryLinks.filter((link) => link.from.kind === 'state' &&
36618
+ link.from.ref.path === statePath &&
36619
+ link.to.kind === 'component-port');
35662
36620
  if (!targets.length)
35663
36621
  continue;
35664
36622
  const sourceKey = this.recordSurfaceSourceKey(sourceRef.widget, sourceRef.nestedPath);
@@ -35717,9 +36675,9 @@ class DynamicWidgetPageComponent {
35717
36675
  return surfacesBySource;
35718
36676
  }
35719
36677
  resolveRecordSurfaceQueryMapping(sourceWidget, targetLink) {
35720
- const sourceField = this.stringOrNull(sourceWidget?.definition.inputs?.['config']?.['meta']?.['idField'])
35721
- || this.stringOrNull(sourceWidget?.definition.inputs?.['config']?.['idField'])
35722
- || this.stringOrNull(sourceWidget?.definition.inputs?.['idField']);
36678
+ const sourceField = this.stringOrNull(sourceWidget?.definition.inputs?.['config']?.['meta']?.['idField']) ||
36679
+ this.stringOrNull(sourceWidget?.definition.inputs?.['config']?.['idField']) ||
36680
+ this.stringOrNull(sourceWidget?.definition.inputs?.['idField']);
35723
36681
  const targetFilterField = this.resolveQueryContextFilterField(targetLink);
35724
36682
  if (!sourceField || !targetFilterField) {
35725
36683
  return undefined;
@@ -35750,24 +36708,31 @@ class DynamicWidgetPageComponent {
35750
36708
  return null;
35751
36709
  }
35752
36710
  isTableRowClickToStateLink(link) {
35753
- return link.from.kind === 'component-port'
35754
- && link.from.ref.componentType === 'praxis-table'
35755
- && link.from.ref.port === 'rowClick'
35756
- && link.from.ref.direction === 'output'
35757
- && link.to.kind === 'state'
35758
- && !!link.to.ref.path;
36711
+ return (link.from.kind === 'component-port' &&
36712
+ link.from.ref.componentType === 'praxis-table' &&
36713
+ link.from.ref.port === 'rowClick' &&
36714
+ link.from.ref.direction === 'output' &&
36715
+ link.to.kind === 'state' &&
36716
+ !!link.to.ref.path);
35759
36717
  }
35760
36718
  isStateToTableQueryContextLink(link) {
35761
- return link.from.kind === 'state'
35762
- && !!link.from.ref.path
35763
- && link.to.kind === 'component-port'
35764
- && link.to.ref.componentType === 'praxis-table'
35765
- && link.to.ref.port === 'queryContext'
35766
- && link.to.ref.direction === 'input';
36719
+ return (link.from.kind === 'state' &&
36720
+ !!link.from.ref.path &&
36721
+ link.to.kind === 'component-port' &&
36722
+ link.to.ref.componentType === 'praxis-table' &&
36723
+ link.to.ref.port === 'queryContext' &&
36724
+ link.to.ref.direction === 'input');
35767
36725
  }
35768
36726
  resolveRecordSurfaceId(ref) {
35769
- const tab = [...(ref.nestedPath || [])].reverse().find((segment) => segment.kind === 'tab');
35770
- return String(tab?.id || ref.nestedPath?.map((segment) => segment.key || segment.id).filter(Boolean).join('.') || ref.widget).trim();
36727
+ const tab = [...(ref.nestedPath || [])]
36728
+ .reverse()
36729
+ .find((segment) => segment.kind === 'tab');
36730
+ return String(tab?.id ||
36731
+ ref.nestedPath
36732
+ ?.map((segment) => segment.key || segment.id)
36733
+ .filter(Boolean)
36734
+ .join('.') ||
36735
+ ref.widget).trim();
35771
36736
  }
35772
36737
  resolveRecordSurfaceLabel(ref, targetWidget, targetDefinition) {
35773
36738
  const tabLabel = this.resolveRecordSurfaceTabLabel(ref, targetWidget);
@@ -35776,29 +36741,33 @@ class DynamicWidgetPageComponent {
35776
36741
  const toolbarTitle = this.stringOrNull(targetDefinition?.inputs?.['config']?.['toolbar']?.['title']);
35777
36742
  if (toolbarTitle)
35778
36743
  return toolbarTitle;
35779
- const tab = [...(ref.nestedPath || [])].reverse().find((segment) => segment.kind === 'tab');
36744
+ const tab = [...(ref.nestedPath || [])]
36745
+ .reverse()
36746
+ .find((segment) => segment.kind === 'tab');
35780
36747
  return this.humanizeRecordSurfaceLabel(tab?.id || ref.widget);
35781
36748
  }
35782
36749
  resolveRuntimeSurfaceWidgetKey(targetRef, targetDefinition) {
35783
- return this.stringOrNull(targetDefinition?.inputs?.['componentInstanceId'])
35784
- || this.stringOrNull(targetDefinition?.inputs?.['tableId'])
35785
- || targetRef.widget;
36750
+ return (this.stringOrNull(targetDefinition?.inputs?.['componentInstanceId']) ||
36751
+ this.stringOrNull(targetDefinition?.inputs?.['tableId']) ||
36752
+ targetRef.widget);
35786
36753
  }
35787
36754
  resolveRecordSurfaceTabLabel(ref, targetWidget) {
35788
- const tab = [...(ref.nestedPath || [])].reverse().find((segment) => segment.kind === 'tab');
36755
+ const tab = [...(ref.nestedPath || [])]
36756
+ .reverse()
36757
+ .find((segment) => segment.kind === 'tab');
35789
36758
  if (!tab)
35790
36759
  return null;
35791
36760
  const tabs = targetWidget?.definition.inputs?.['config']?.['tabs'];
35792
36761
  if (!Array.isArray(tabs))
35793
36762
  return null;
35794
- const match = tabs.find((candidate) => this.isRecord(candidate)
35795
- && (this.stringOrNull(candidate['id']) === this.stringOrNull(tab.id)
35796
- || candidate['index'] === tab.index));
36763
+ const match = tabs.find((candidate) => this.isRecord(candidate) &&
36764
+ (this.stringOrNull(candidate['id']) === this.stringOrNull(tab.id) ||
36765
+ candidate['index'] === tab.index));
35797
36766
  if (!this.isRecord(match))
35798
36767
  return null;
35799
- return this.stringOrNull(match['textLabel'])
35800
- || this.stringOrNull(match['label'])
35801
- || this.stringOrNull(match['title']);
36768
+ return (this.stringOrNull(match['textLabel']) ||
36769
+ this.stringOrNull(match['label']) ||
36770
+ this.stringOrNull(match['title']));
35802
36771
  }
35803
36772
  humanizeRecordSurfaceLabel(value) {
35804
36773
  const raw = String(value || '').trim();
@@ -35827,11 +36796,15 @@ class DynamicWidgetPageComponent {
35827
36796
  .slice(0, 120);
35828
36797
  }
35829
36798
  resolveRecordSurfaceChildWidgetKey(path) {
35830
- const widget = [...(path || [])].reverse().find((segment) => segment.kind === 'widget');
36799
+ const widget = [...(path || [])]
36800
+ .reverse()
36801
+ .find((segment) => segment.kind === 'widget');
35831
36802
  return widget?.key;
35832
36803
  }
35833
36804
  recordSurfaceSourceKey(widget, nestedPath) {
35834
- const signature = nestedPath?.length ? this.recordSurfaceNestedPathSignature(nestedPath) : '';
36805
+ const signature = nestedPath?.length
36806
+ ? this.recordSurfaceNestedPathSignature(nestedPath)
36807
+ : '';
35835
36808
  return `${widget}::${signature}`;
35836
36809
  }
35837
36810
  recordSurfaceNestedPathSignature(path) {
@@ -35840,7 +36813,9 @@ class DynamicWidgetPageComponent {
35840
36813
  parseRecordSurfaceNestedPathSignature(signature) {
35841
36814
  try {
35842
36815
  const parsed = JSON.parse(decodeURIComponent(signature));
35843
- return Array.isArray(parsed) ? parsed : [];
36816
+ return Array.isArray(parsed)
36817
+ ? parsed
36818
+ : [];
35844
36819
  }
35845
36820
  catch {
35846
36821
  return [];
@@ -35857,8 +36832,12 @@ class DynamicWidgetPageComponent {
35857
36832
  if (evt?.output !== 'recordSurfaceOpen')
35858
36833
  return false;
35859
36834
  const payload = this.isRecord(evt.payload) ? evt.payload : null;
35860
- const surface = this.isRecord(payload?.['surface']) ? payload['surface'] : null;
35861
- const target = this.isRecord(surface?.['target']) ? surface['target'] : null;
36835
+ const surface = this.isRecord(payload?.['surface'])
36836
+ ? payload['surface']
36837
+ : null;
36838
+ const target = this.isRecord(surface?.['target'])
36839
+ ? surface['target']
36840
+ : null;
35862
36841
  const widgetKey = this.stringOrNull(target?.['widget']);
35863
36842
  const nestedPath = Array.isArray(target?.['nestedPath'])
35864
36843
  ? target['nestedPath']
@@ -35913,7 +36892,9 @@ class DynamicWidgetPageComponent {
35913
36892
  return true;
35914
36893
  }
35915
36894
  applyRecordSurfaceSourceState(page, fromKey, evt, surface, payload) {
35916
- const source = this.isRecord(surface?.['source']) ? surface['source'] : null;
36895
+ const source = this.isRecord(surface?.['source'])
36896
+ ? surface['source']
36897
+ : null;
35917
36898
  const selectedRow = payload?.['selectedRow'];
35918
36899
  if (!source || selectedRow == null) {
35919
36900
  return { page };
@@ -35956,14 +36937,18 @@ class DynamicWidgetPageComponent {
35956
36937
  }
35957
36938
  findRecordSurfaceTabIndex(config, segment) {
35958
36939
  const collection = segment.kind === 'nav'
35959
- ? (this.isRecord(config['nav']) && Array.isArray(config['nav']['links']) ? config['nav']['links'] : [])
35960
- : (Array.isArray(config['tabs']) ? config['tabs'] : []);
36940
+ ? this.isRecord(config['nav']) && Array.isArray(config['nav']['links'])
36941
+ ? config['nav']['links']
36942
+ : []
36943
+ : Array.isArray(config['tabs'])
36944
+ ? config['tabs']
36945
+ : [];
35961
36946
  const id = this.stringOrNull(segment.id);
35962
36947
  const key = this.stringOrNull(segment.key);
35963
36948
  if (id || key) {
35964
36949
  const match = collection.findIndex((item) => {
35965
36950
  const record = this.isRecord(item) ? item : {};
35966
- return (!!id && record['id'] === id) || (!!key && record['key'] === key);
36951
+ return ((!!id && record['id'] === id) || (!!key && record['key'] === key));
35967
36952
  });
35968
36953
  if (match >= 0)
35969
36954
  return match;
@@ -35975,7 +36960,7 @@ class DynamicWidgetPageComponent {
35975
36960
  return true;
35976
36961
  }
35977
36962
  const bindingOrder = widget.definition.bindingOrder;
35978
- return Array.isArray(bindingOrder) && bindingOrder.includes('selectedIndex');
36963
+ return (Array.isArray(bindingOrder) && bindingOrder.includes('selectedIndex'));
35979
36964
  }
35980
36965
  reportStateDiagnostics(diagnostics) {
35981
36966
  if (!diagnostics?.length)
@@ -36068,18 +37053,18 @@ class DynamicWidgetPageComponent {
36068
37053
  this.applyPageUpdate({ ...page, widgets, state }, true, runtime, false, true);
36069
37054
  }
36070
37055
  matchesRuntimeSourceRef(endpoint, sourceRef) {
36071
- return endpoint.kind === 'component-port'
36072
- && endpoint.ref.widget === sourceRef.widget
36073
- && endpoint.ref.port === sourceRef.port
36074
- && endpoint.ref.direction === sourceRef.direction
36075
- && this.areNestedPathsEqual(endpoint.ref.nestedPath, sourceRef.nestedPath);
37056
+ return (endpoint.kind === 'component-port' &&
37057
+ endpoint.ref.widget === sourceRef.widget &&
37058
+ endpoint.ref.port === sourceRef.port &&
37059
+ endpoint.ref.direction === sourceRef.direction &&
37060
+ this.areNestedPathsEqual(endpoint.ref.nestedPath, sourceRef.nestedPath));
36076
37061
  }
36077
37062
  matchesLegacyWidgetEventSource(endpoint, ownerWidgetKey) {
36078
- return endpoint.kind === 'component-port'
36079
- && endpoint.ref.widget === ownerWidgetKey
36080
- && endpoint.ref.port === 'widgetEvent'
36081
- && endpoint.ref.direction === 'output'
36082
- && !endpoint.ref.nestedPath?.length;
37063
+ return (endpoint.kind === 'component-port' &&
37064
+ endpoint.ref.widget === ownerWidgetKey &&
37065
+ endpoint.ref.port === 'widgetEvent' &&
37066
+ endpoint.ref.direction === 'output' &&
37067
+ !endpoint.ref.nestedPath?.length);
36083
37068
  }
36084
37069
  areNestedPathsEqual(left, right) {
36085
37070
  return JSON.stringify(left || []) === JSON.stringify(right || []);
@@ -36216,8 +37201,8 @@ class DynamicWidgetPageComponent {
36216
37201
  pageStateEffective: this.cloneStateValues(runtime.effectiveValues),
36217
37202
  };
36218
37203
  return this.cloneWidgets(widgets).map((widget) => {
36219
- const runtimeEnrichedWidget = this.enrichRuntimeWidgetInputs(widget, runtime);
36220
- if (!widget.shell) {
37204
+ const runtimeEnrichedWidget = this.localizeRuntimeProjection(this.enrichRuntimeWidgetInputs(widget, runtime));
37205
+ if (!runtimeEnrichedWidget.shell) {
36221
37206
  return runtimeEnrichedWidget;
36222
37207
  }
36223
37208
  const widgetTemplateContext = {
@@ -36231,10 +37216,17 @@ class DynamicWidgetPageComponent {
36231
37216
  };
36232
37217
  return {
36233
37218
  ...runtimeEnrichedWidget,
36234
- shell: this.resolveTemplate(widget.shell, widgetTemplateContext),
37219
+ shell: this.resolveTemplate(runtimeEnrichedWidget.shell, widgetTemplateContext),
36235
37220
  };
36236
37221
  });
36237
37222
  }
37223
+ localizeRuntimeProjection(value) {
37224
+ return resolvePraxisI18nDocument(value, {
37225
+ i18n: this.i18n,
37226
+ locale: this.pageIdentity?.locale,
37227
+ config: this.pageDefinition?.i18n,
37228
+ });
37229
+ }
36238
37230
  enrichRuntimeWidgetInputs(widget, runtime) {
36239
37231
  if (widget.definition?.id !== 'praxis-rich-content') {
36240
37232
  return widget;
@@ -36262,7 +37254,8 @@ class DynamicWidgetPageComponent {
36262
37254
  return;
36263
37255
  }
36264
37256
  if (this.globalActions.has(actionId)) {
36265
- void this.globalActions.execute(actionId, payload, {
37257
+ void this.globalActions
37258
+ .execute(actionId, payload, {
36266
37259
  sourceId: widgetKey,
36267
37260
  widgetKey,
36268
37261
  payload: {
@@ -36284,7 +37277,8 @@ class DynamicWidgetPageComponent {
36284
37277
  origin: 'dynamic-page.rich-content',
36285
37278
  componentId: 'praxis-dynamic-page',
36286
37279
  },
36287
- }).then((result) => {
37280
+ })
37281
+ .then((result) => {
36288
37282
  if (!result?.success) {
36289
37283
  this.emitRichContentCustomAction(widgetKey, actionId, payload);
36290
37284
  }
@@ -36434,8 +37428,7 @@ class DynamicWidgetPageComponent {
36434
37428
  });
36435
37429
  }
36436
37430
  shouldRenderWidgetContextOverlay(widget) {
36437
- return (this.enableCustomization &&
36438
- !this.hasVisibleWidgetShellHeader(widget));
37431
+ return (this.enableCustomization && !this.hasVisibleWidgetShellHeader(widget));
36439
37432
  }
36440
37433
  widgetShellForRender(widget) {
36441
37434
  if (!this.shouldProjectWidgetHeaderActions(widget)) {
@@ -36473,12 +37466,13 @@ class DynamicWidgetPageComponent {
36473
37466
  if (shellTitle)
36474
37467
  return shellTitle;
36475
37468
  const componentId = widget.definition?.id || '';
36476
- const metadata = componentId ? this.componentMetadata?.get(componentId) : undefined;
37469
+ const metadata = componentId
37470
+ ? this.componentMetadata?.get(componentId)
37471
+ : undefined;
36477
37472
  return metadata?.friendlyName || componentId || widget.key;
36478
37473
  }
36479
37474
  shouldProjectWidgetHeaderActions(widget) {
36480
- return (this.enableCustomization &&
36481
- this.hasVisibleWidgetShellHeader(widget));
37475
+ return this.enableCustomization && this.hasVisibleWidgetShellHeader(widget);
36482
37476
  }
36483
37477
  hasVisibleWidgetShellHeader(widget) {
36484
37478
  const shell = widget.shell;
@@ -36496,8 +37490,8 @@ class DynamicWidgetPageComponent {
36496
37490
  return (shell.actions || []).some((action) => this.isVisibleShellAction(action));
36497
37491
  }
36498
37492
  hasVisibleWindowActions(shell) {
36499
- return ((shell.windowActions?.collapsible !== false ||
36500
- shell.windowActions?.fullscreen !== false) ||
37493
+ return (shell.windowActions?.collapsible !== false ||
37494
+ shell.windowActions?.fullscreen !== false ||
36501
37495
  (shell.actions || []).some((action) => this.isVisibleShellAction(action) &&
36502
37496
  (action.placement || 'header') === 'window'));
36503
37497
  }
@@ -36844,10 +37838,10 @@ class DynamicWidgetPageComponent {
36844
37838
  }
36845
37839
  }
36846
37840
  isConfigEditorContextResult(value) {
36847
- return !!value &&
37841
+ return (!!value &&
36848
37842
  typeof value === 'object' &&
36849
37843
  !Array.isArray(value) &&
36850
- ('context' in value || 'diagnostics' in value);
37844
+ ('context' in value || 'diagnostics' in value));
36851
37845
  }
36852
37846
  materializeRuntimeInputsForWidget(page, key) {
36853
37847
  const normalizedKey = String(key || '').trim();
@@ -36860,8 +37854,7 @@ class DynamicWidgetPageComponent {
36860
37854
  }
36861
37855
  const inputNames = this.componentMetadata
36862
37856
  ?.get(widget.definition?.id || '')
36863
- ?.inputs
36864
- ?.map((input) => input.name)
37857
+ ?.inputs?.map((input) => input.name)
36865
37858
  ?.filter((name) => typeof name === 'string' && !!name.trim()) || [];
36866
37859
  if (!inputNames.length) {
36867
37860
  return page;
@@ -36892,10 +37885,10 @@ class DynamicWidgetPageComponent {
36892
37885
  if (typeof loader?.dispatchAction !== 'function') {
36893
37886
  return false;
36894
37887
  }
36895
- return loader?.dispatchAction({
37888
+ return (loader?.dispatchAction({
36896
37889
  id: 'component-settings',
36897
37890
  command: 'component-settings',
36898
- }) === true;
37891
+ }) === true);
36899
37892
  }
36900
37893
  applyWidgetComponentInputs(key, result, persist) {
36901
37894
  if (!result || typeof result !== 'object' || Array.isArray(result))
@@ -37008,7 +38001,9 @@ class DynamicWidgetPageComponent {
37008
38001
  const groupingOverrides = variant.groupingOverrides?.map((override) => ({
37009
38002
  ...override,
37010
38003
  ...(override.widgetKeys
37011
- ? { widgetKeys: override.widgetKeys.filter((key) => key !== widgetKey) }
38004
+ ? {
38005
+ widgetKeys: override.widgetKeys.filter((key) => key !== widgetKey),
38006
+ }
37012
38007
  : {}),
37013
38008
  ...(override.tabs
37014
38009
  ? {
@@ -37021,7 +38016,14 @@ class DynamicWidgetPageComponent {
37021
38016
  }));
37022
38017
  deviceLayouts[device] = {
37023
38018
  ...variant,
37024
- ...(variant.canvas ? { canvas: { ...variant.canvas, ...(canvasItems ? { items: canvasItems } : {}) } } : {}),
38019
+ ...(variant.canvas
38020
+ ? {
38021
+ canvas: {
38022
+ ...variant.canvas,
38023
+ ...(canvasItems ? { items: canvasItems } : {}),
38024
+ },
38025
+ }
38026
+ : {}),
37025
38027
  ...(widgetOverrides ? { widgetOverrides } : {}),
37026
38028
  ...(groupingOverrides ? { groupingOverrides } : {}),
37027
38029
  };
@@ -37031,11 +38033,11 @@ class DynamicWidgetPageComponent {
37031
38033
  return next;
37032
38034
  }
37033
38035
  linkReferencesWidget(link, widgetKey) {
37034
- return this.endpointReferencesWidget(link.from, widgetKey)
37035
- || this.endpointReferencesWidget(link.to, widgetKey);
38036
+ return (this.endpointReferencesWidget(link.from, widgetKey) ||
38037
+ this.endpointReferencesWidget(link.to, widgetKey));
37036
38038
  }
37037
38039
  endpointReferencesWidget(endpoint, widgetKey) {
37038
- return endpoint.kind === 'component-port' && endpoint.ref.widget === widgetKey;
38040
+ return (endpoint.kind === 'component-port' && endpoint.ref.widget === widgetKey);
37039
38041
  }
37040
38042
  openPageSettings() {
37041
38043
  if (!this.settingsPanel)
@@ -37398,7 +38400,7 @@ class DynamicWidgetPageComponent {
37398
38400
  }
37399
38401
  applyResponsivePresentation(pageDefinition, widgets, runtime) {
37400
38402
  const runtimeWidgets = this.projectRuntimeCompositionStateInputs(widgets);
37401
- const effective = this.resolveEffectivePresentation(pageDefinition, runtimeWidgets);
38403
+ const effective = this.resolveEffectivePresentation(pageDefinition, runtimeWidgets, runtime);
37402
38404
  if (effective.canvas) {
37403
38405
  this.applyCanvasLayout(effective.canvas, effective.layout, effective.grouping);
37404
38406
  }
@@ -37413,7 +38415,7 @@ class DynamicWidgetPageComponent {
37413
38415
  grouping: effective.grouping,
37414
38416
  });
37415
38417
  this.renderedGroups.set(effective.groups);
37416
- this.widgets.set(this.resolveShellTemplates(effective.widgets, runtime));
38418
+ this.widgets.set(effective.widgets);
37417
38419
  }
37418
38420
  projectPersistentCompositionStateInputs(widgets, state, now) {
37419
38421
  if (!this.compositionDefinition) {
@@ -37445,23 +38447,24 @@ class DynamicWidgetPageComponent {
37445
38447
  now: snapshot.generatedAt,
37446
38448
  }).widgets;
37447
38449
  }
37448
- resolveEffectivePresentation(pageDefinition, widgets) {
38450
+ resolveEffectivePresentation(pageDefinition, widgets, runtime) {
37449
38451
  const variant = this.resolveDeviceVariant(pageDefinition?.deviceLayouts);
37450
38452
  const layout = this.mergeLayout(pageDefinition?.layout, variant?.layout);
37451
- const grouping = this.applyGroupingOverrides(pageDefinition?.grouping, variant?.groupingOverrides);
38453
+ const grouping = this.localizeRuntimeProjection(this.applyGroupingOverrides(pageDefinition?.grouping, variant?.groupingOverrides));
37452
38454
  const baseWidgets = this.applyWidgetLayoutOverrides(this.applyEditShellActions(widgets), variant?.widgetOverrides);
37453
38455
  const canvas = this.resolveCanvas(pageDefinition?.canvas, variant?.canvas);
37454
38456
  const widgetsWithOverrides = canvas
37455
38457
  ? this.applyCanvasLayoutToWidgets(baseWidgets, canvas)
37456
38458
  : baseWidgets;
38459
+ const renderedWidgets = this.resolveShellTemplates(widgetsWithOverrides, runtime);
37457
38460
  const groups = canvas
37458
38461
  ? []
37459
- : this.buildRenderedGroups(grouping, widgetsWithOverrides, pageDefinition?.slotAssignments);
38462
+ : this.buildRenderedGroups(grouping, renderedWidgets, pageDefinition?.slotAssignments);
37460
38463
  return {
37461
38464
  layout,
37462
38465
  canvas,
37463
38466
  grouping,
37464
- widgets: widgetsWithOverrides,
38467
+ widgets: renderedWidgets,
37465
38468
  groups,
37466
38469
  };
37467
38470
  }
@@ -37534,9 +38537,9 @@ class DynamicWidgetPageComponent {
37534
38537
  if (!normalizedWidgetKey) {
37535
38538
  return false;
37536
38539
  }
37537
- return !!this.ensurePageDefinition().composition?.links?.some((link) => link.from.kind === 'component-port'
37538
- && link.from.ref.widget === normalizedWidgetKey
37539
- && link.from.ref.direction === 'output');
38540
+ return !!this.ensurePageDefinition().composition?.links?.some((link) => link.from.kind === 'component-port' &&
38541
+ link.from.ref.widget === normalizedWidgetKey &&
38542
+ link.from.ref.direction === 'output');
37540
38543
  }
37541
38544
  selectWidget(widgetKey) {
37542
38545
  if (!this.enableCustomization)
@@ -38289,7 +39292,9 @@ class DynamicWidgetPageComponent {
38289
39292
  const seen = new Set();
38290
39293
  for (const reference of references || []) {
38291
39294
  const directWidget = widgetMap.get(reference);
38292
- const candidates = directWidget ? [directWidget] : slotWidgetMap.get(reference) || [];
39295
+ const candidates = directWidget
39296
+ ? [directWidget]
39297
+ : slotWidgetMap.get(reference) || [];
38293
39298
  for (const widget of candidates) {
38294
39299
  if (seen.has(widget.key))
38295
39300
  continue;
@@ -38474,7 +39479,7 @@ class DynamicWidgetPageComponent {
38474
39479
  [attr.data-density]="pageThemeDensity"
38475
39480
  [attr.data-motion]="pageThemeMotion"
38476
39481
  [ngStyle]="pageThemeTokenStyle"
38477
- >
39482
+ >
38478
39483
  @if (enableCustomization && showPageSettingsButton) {
38479
39484
  <button
38480
39485
  class="pdx-page-settings"
@@ -38566,7 +39571,9 @@ class DynamicWidgetPageComponent {
38566
39571
  [showAssistant]="showWidgetAssistantButton"
38567
39572
  [assistantLabel]="widgetAssistantLabel()"
38568
39573
  [assistantTooltip]="widgetAssistantTooltip()"
38569
- [showComponentSettings]="canOpenWidgetComponentSettings(w.key)"
39574
+ [showComponentSettings]="
39575
+ canOpenWidgetComponentSettings(w.key)
39576
+ "
38570
39577
  [componentSettingsLabel]="componentSettingsLabel()"
38571
39578
  [componentSettingsTooltip]="componentSettingsTooltip()"
38572
39579
  [showShellSettings]="canOpenWidgetShellSettings()"
@@ -38639,7 +39646,9 @@ class DynamicWidgetPageComponent {
38639
39646
  <div
38640
39647
  class="pdx-widget"
38641
39648
  [attr.data-widget-key]="w.key"
38642
- [class.pdx-widget--interactive]="enableCustomization"
39649
+ [class.pdx-widget--interactive]="
39650
+ enableCustomization
39651
+ "
38643
39652
  [class.pdx-widget--selected]="
38644
39653
  enableCustomization && isWidgetSelected(w.key)
38645
39654
  "
@@ -38669,22 +39678,34 @@ class DynamicWidgetPageComponent {
38669
39678
  </praxis-widget-shell>
38670
39679
  @if (shouldRenderWidgetContextOverlay(w)) {
38671
39680
  <praxis-dynamic-widget-context-toolbar
38672
- [toolbarLabel]="widgetContextToolbarLabel(w.key)"
39681
+ [toolbarLabel]="
39682
+ widgetContextToolbarLabel(w.key)
39683
+ "
38673
39684
  [contextLabel]="widgetContextLabel(w)"
38674
39685
  [contextTooltip]="widgetContextTooltip(w)"
38675
39686
  [showAssistant]="showWidgetAssistantButton"
38676
39687
  [assistantLabel]="widgetAssistantLabel()"
38677
39688
  [assistantTooltip]="widgetAssistantTooltip()"
38678
- [showComponentSettings]="canOpenWidgetComponentSettings(w.key)"
38679
- [componentSettingsLabel]="componentSettingsLabel()"
38680
- [componentSettingsTooltip]="componentSettingsTooltip()"
38681
- [showShellSettings]="canOpenWidgetShellSettings()"
39689
+ [showComponentSettings]="
39690
+ canOpenWidgetComponentSettings(w.key)
39691
+ "
39692
+ [componentSettingsLabel]="
39693
+ componentSettingsLabel()
39694
+ "
39695
+ [componentSettingsTooltip]="
39696
+ componentSettingsTooltip()
39697
+ "
39698
+ [showShellSettings]="
39699
+ canOpenWidgetShellSettings()
39700
+ "
38682
39701
  [shellSettingsLabel]="widgetSettingsLabel()"
38683
39702
  [shellSettingsTooltip]="widgetSettingsTooltip()"
38684
39703
  [moreActionsLabel]="moreWidgetActionsLabel()"
38685
39704
  [removeLabel]="widgetRemoveLabel()"
38686
39705
  (assistant)="requestWidgetAssistant(w.key)"
38687
- (componentSettings)="openWidgetComponentSettings(w.key)"
39706
+ (componentSettings)="
39707
+ openWidgetComponentSettings(w.key)
39708
+ "
38688
39709
  (shellSettings)="openWidgetShellSettings(w.key)"
38689
39710
  (remove)="confirmAndRemoveWidget(w.key)"
38690
39711
  />
@@ -38740,16 +39761,22 @@ class DynamicWidgetPageComponent {
38740
39761
  [showAssistant]="showWidgetAssistantButton"
38741
39762
  [assistantLabel]="widgetAssistantLabel()"
38742
39763
  [assistantTooltip]="widgetAssistantTooltip()"
38743
- [showComponentSettings]="canOpenWidgetComponentSettings(w.key)"
39764
+ [showComponentSettings]="
39765
+ canOpenWidgetComponentSettings(w.key)
39766
+ "
38744
39767
  [componentSettingsLabel]="componentSettingsLabel()"
38745
- [componentSettingsTooltip]="componentSettingsTooltip()"
39768
+ [componentSettingsTooltip]="
39769
+ componentSettingsTooltip()
39770
+ "
38746
39771
  [showShellSettings]="canOpenWidgetShellSettings()"
38747
39772
  [shellSettingsLabel]="widgetSettingsLabel()"
38748
39773
  [shellSettingsTooltip]="widgetSettingsTooltip()"
38749
39774
  [moreActionsLabel]="moreWidgetActionsLabel()"
38750
39775
  [removeLabel]="widgetRemoveLabel()"
38751
39776
  (assistant)="requestWidgetAssistant(w.key)"
38752
- (componentSettings)="openWidgetComponentSettings(w.key)"
39777
+ (componentSettings)="
39778
+ openWidgetComponentSettings(w.key)
39779
+ "
38753
39780
  (shellSettings)="openWidgetShellSettings(w.key)"
38754
39781
  (remove)="confirmAndRemoveWidget(w.key)"
38755
39782
  />
@@ -38799,7 +39826,9 @@ class DynamicWidgetPageComponent {
38799
39826
  [showAssistant]="showWidgetAssistantButton"
38800
39827
  [assistantLabel]="widgetAssistantLabel()"
38801
39828
  [assistantTooltip]="widgetAssistantTooltip()"
38802
- [showComponentSettings]="canOpenWidgetComponentSettings(w.key)"
39829
+ [showComponentSettings]="
39830
+ canOpenWidgetComponentSettings(w.key)
39831
+ "
38803
39832
  [componentSettingsLabel]="componentSettingsLabel()"
38804
39833
  [componentSettingsTooltip]="componentSettingsTooltip()"
38805
39834
  [showShellSettings]="canOpenWidgetShellSettings()"
@@ -38843,7 +39872,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
38843
39872
  [attr.data-density]="pageThemeDensity"
38844
39873
  [attr.data-motion]="pageThemeMotion"
38845
39874
  [ngStyle]="pageThemeTokenStyle"
38846
- >
39875
+ >
38847
39876
  @if (enableCustomization && showPageSettingsButton) {
38848
39877
  <button
38849
39878
  class="pdx-page-settings"
@@ -38935,7 +39964,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
38935
39964
  [showAssistant]="showWidgetAssistantButton"
38936
39965
  [assistantLabel]="widgetAssistantLabel()"
38937
39966
  [assistantTooltip]="widgetAssistantTooltip()"
38938
- [showComponentSettings]="canOpenWidgetComponentSettings(w.key)"
39967
+ [showComponentSettings]="
39968
+ canOpenWidgetComponentSettings(w.key)
39969
+ "
38939
39970
  [componentSettingsLabel]="componentSettingsLabel()"
38940
39971
  [componentSettingsTooltip]="componentSettingsTooltip()"
38941
39972
  [showShellSettings]="canOpenWidgetShellSettings()"
@@ -39008,7 +40039,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
39008
40039
  <div
39009
40040
  class="pdx-widget"
39010
40041
  [attr.data-widget-key]="w.key"
39011
- [class.pdx-widget--interactive]="enableCustomization"
40042
+ [class.pdx-widget--interactive]="
40043
+ enableCustomization
40044
+ "
39012
40045
  [class.pdx-widget--selected]="
39013
40046
  enableCustomization && isWidgetSelected(w.key)
39014
40047
  "
@@ -39038,22 +40071,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
39038
40071
  </praxis-widget-shell>
39039
40072
  @if (shouldRenderWidgetContextOverlay(w)) {
39040
40073
  <praxis-dynamic-widget-context-toolbar
39041
- [toolbarLabel]="widgetContextToolbarLabel(w.key)"
40074
+ [toolbarLabel]="
40075
+ widgetContextToolbarLabel(w.key)
40076
+ "
39042
40077
  [contextLabel]="widgetContextLabel(w)"
39043
40078
  [contextTooltip]="widgetContextTooltip(w)"
39044
40079
  [showAssistant]="showWidgetAssistantButton"
39045
40080
  [assistantLabel]="widgetAssistantLabel()"
39046
40081
  [assistantTooltip]="widgetAssistantTooltip()"
39047
- [showComponentSettings]="canOpenWidgetComponentSettings(w.key)"
39048
- [componentSettingsLabel]="componentSettingsLabel()"
39049
- [componentSettingsTooltip]="componentSettingsTooltip()"
39050
- [showShellSettings]="canOpenWidgetShellSettings()"
40082
+ [showComponentSettings]="
40083
+ canOpenWidgetComponentSettings(w.key)
40084
+ "
40085
+ [componentSettingsLabel]="
40086
+ componentSettingsLabel()
40087
+ "
40088
+ [componentSettingsTooltip]="
40089
+ componentSettingsTooltip()
40090
+ "
40091
+ [showShellSettings]="
40092
+ canOpenWidgetShellSettings()
40093
+ "
39051
40094
  [shellSettingsLabel]="widgetSettingsLabel()"
39052
40095
  [shellSettingsTooltip]="widgetSettingsTooltip()"
39053
40096
  [moreActionsLabel]="moreWidgetActionsLabel()"
39054
40097
  [removeLabel]="widgetRemoveLabel()"
39055
40098
  (assistant)="requestWidgetAssistant(w.key)"
39056
- (componentSettings)="openWidgetComponentSettings(w.key)"
40099
+ (componentSettings)="
40100
+ openWidgetComponentSettings(w.key)
40101
+ "
39057
40102
  (shellSettings)="openWidgetShellSettings(w.key)"
39058
40103
  (remove)="confirmAndRemoveWidget(w.key)"
39059
40104
  />
@@ -39109,16 +40154,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
39109
40154
  [showAssistant]="showWidgetAssistantButton"
39110
40155
  [assistantLabel]="widgetAssistantLabel()"
39111
40156
  [assistantTooltip]="widgetAssistantTooltip()"
39112
- [showComponentSettings]="canOpenWidgetComponentSettings(w.key)"
40157
+ [showComponentSettings]="
40158
+ canOpenWidgetComponentSettings(w.key)
40159
+ "
39113
40160
  [componentSettingsLabel]="componentSettingsLabel()"
39114
- [componentSettingsTooltip]="componentSettingsTooltip()"
40161
+ [componentSettingsTooltip]="
40162
+ componentSettingsTooltip()
40163
+ "
39115
40164
  [showShellSettings]="canOpenWidgetShellSettings()"
39116
40165
  [shellSettingsLabel]="widgetSettingsLabel()"
39117
40166
  [shellSettingsTooltip]="widgetSettingsTooltip()"
39118
40167
  [moreActionsLabel]="moreWidgetActionsLabel()"
39119
40168
  [removeLabel]="widgetRemoveLabel()"
39120
40169
  (assistant)="requestWidgetAssistant(w.key)"
39121
- (componentSettings)="openWidgetComponentSettings(w.key)"
40170
+ (componentSettings)="
40171
+ openWidgetComponentSettings(w.key)
40172
+ "
39122
40173
  (shellSettings)="openWidgetShellSettings(w.key)"
39123
40174
  (remove)="confirmAndRemoveWidget(w.key)"
39124
40175
  />
@@ -39168,7 +40219,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
39168
40219
  [showAssistant]="showWidgetAssistantButton"
39169
40220
  [assistantLabel]="widgetAssistantLabel()"
39170
40221
  [assistantTooltip]="widgetAssistantTooltip()"
39171
- [showComponentSettings]="canOpenWidgetComponentSettings(w.key)"
40222
+ [showComponentSettings]="
40223
+ canOpenWidgetComponentSettings(w.key)
40224
+ "
39172
40225
  [componentSettingsLabel]="componentSettingsLabel()"
39173
40226
  [componentSettingsTooltip]="componentSettingsTooltip()"
39174
40227
  [showShellSettings]="canOpenWidgetShellSettings()"
@@ -39254,21 +40307,73 @@ const PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA = {
39254
40307
  description: 'Página dinâmica com widgets e composition.links em layout responsivo, incluindo mediação runtime para rich-content hospedado.',
39255
40308
  icon: 'dashboard',
39256
40309
  inputs: [
39257
- { name: 'page', type: 'WidgetPageDefinition', description: 'Definição da página (widgets, layout e composition.links).' },
39258
- { name: 'context', type: 'Record<string, any>', description: 'Contexto adicional compartilhado entre widgets.' },
39259
- { name: 'strictValidation', type: 'boolean', description: 'Habilita validação estrita de inputs.' },
39260
- { name: 'enableCustomization', type: 'boolean', description: 'Habilita affordances de edição na página.' },
39261
- { name: 'showPageSettingsButton', type: 'boolean', description: 'Exibe botão de configuração da página.' },
39262
- { name: 'shellEditorComponent', type: 'Type<any>', description: 'Override do editor de shell dos widgets.' },
39263
- { name: 'pageEditorComponent', type: 'Type<any>', description: 'Override do editor de configuração da página.' },
39264
- { name: 'autoPersist', type: 'boolean', description: 'Ativa persistência automática (load/save) da página.' },
39265
- { name: 'pageIdentity', type: 'PageIdentity', description: 'Identidade de persistência (tenant/usuário/rota/locale).' },
39266
- { name: 'componentInstanceId', type: 'string', description: 'Identificador opcional para múltiplas instâncias na mesma rota.' },
40310
+ {
40311
+ name: 'page',
40312
+ type: 'WidgetPageDefinition',
40313
+ description: 'Definição da página (widgets, layout, i18n de negócio e composition.links).',
40314
+ },
40315
+ {
40316
+ name: 'context',
40317
+ type: 'Record<string, any>',
40318
+ description: 'Contexto adicional compartilhado entre widgets.',
40319
+ },
40320
+ {
40321
+ name: 'strictValidation',
40322
+ type: 'boolean',
40323
+ description: 'Habilita validação estrita de inputs.',
40324
+ },
40325
+ {
40326
+ name: 'enableCustomization',
40327
+ type: 'boolean',
40328
+ description: 'Habilita affordances de edição na página.',
40329
+ },
40330
+ {
40331
+ name: 'showPageSettingsButton',
40332
+ type: 'boolean',
40333
+ description: 'Exibe botão de configuração da página.',
40334
+ },
40335
+ {
40336
+ name: 'shellEditorComponent',
40337
+ type: 'Type<any>',
40338
+ description: 'Override do editor de shell dos widgets.',
40339
+ },
40340
+ {
40341
+ name: 'pageEditorComponent',
40342
+ type: 'Type<any>',
40343
+ description: 'Override do editor de configuração da página.',
40344
+ },
40345
+ {
40346
+ name: 'autoPersist',
40347
+ type: 'boolean',
40348
+ description: 'Ativa persistência automática (load/save) da página.',
40349
+ },
40350
+ {
40351
+ name: 'pageIdentity',
40352
+ type: 'PageIdentity',
40353
+ description: 'Identidade de persistência (tenant/usuário/rota/locale).',
40354
+ },
40355
+ {
40356
+ name: 'componentInstanceId',
40357
+ type: 'string',
40358
+ description: 'Identificador opcional para múltiplas instâncias na mesma rota.',
40359
+ },
39267
40360
  ],
39268
40361
  outputs: [
39269
- { name: 'pageChange', type: 'WidgetPageDefinition', description: 'Emitido ao alterar a definição da página.' },
39270
- { name: 'widgetEvent', type: 'WidgetEventEnvelope', description: 'Reemite eventos dos widgets filhos com ownerWidgetKey para integrações do host.' },
39271
- { name: 'widgetDiagnosticsChange', type: 'Record<string, WidgetResolutionDiagnostic>', description: 'Emitido quando o runtime detecta widgets resolvidos ou falhos durante o carregamento dinâmico.' },
40362
+ {
40363
+ name: 'pageChange',
40364
+ type: 'WidgetPageDefinition',
40365
+ description: 'Emitido ao alterar a definição da página.',
40366
+ },
40367
+ {
40368
+ name: 'widgetEvent',
40369
+ type: 'WidgetEventEnvelope',
40370
+ description: 'Reemite eventos dos widgets filhos com ownerWidgetKey para integrações do host.',
40371
+ },
40372
+ {
40373
+ name: 'widgetDiagnosticsChange',
40374
+ type: 'Record<string, WidgetResolutionDiagnostic>',
40375
+ description: 'Emitido quando o runtime detecta widgets resolvidos ou falhos durante o carregamento dinâmico.',
40376
+ },
39272
40377
  ],
39273
40378
  tags: ['widget', 'page', 'dynamic', 'layout'],
39274
40379
  lib: '@praxisui/core',
@@ -41750,4 +42855,4 @@ function provideHookWhitelist(allowed) {
41750
42855
  * Generated bundle index. Do not edit.
41751
42856
  */
41752
42857
 
41753
- export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, COMPONENT_METADATA_REGISTRY_I18N_CONFIG, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, SurfaceOutletRegistryService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDateRangeShortcutPreset, resolveDateRangeShortcutPresets, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };
42858
+ export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, COMPONENT_METADATA_REGISTRY_I18N_CONFIG, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, SurfaceOutletRegistryService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDateRangeShortcutPreset, resolveDateRangeShortcutPresets, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };