@praxisui/core 9.0.0-beta.71 → 9.0.0-beta.73

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.
@@ -4697,7 +4697,9 @@ class GenericCrudService {
4697
4697
  catch { }
4698
4698
  const entryToCache = { schema: body, schemaHash, meta: { version: '2.0.0', name: (schemaTypeParam === 'request' ? 'Filter/Request Schema' : 'Schema'), createdAt: nowIso2, updatedAt: nowIso2, resourcePath: this.resourcePath, idField: idFieldFromBody2, schemaId, apiOrigin: origin } };
4699
4699
  this._schemaCache.set(schemaId, entryToCache);
4700
- this.updateLastResourceMetadataFromSchema(body);
4700
+ if (schemaTypeParam === 'response') {
4701
+ this.updateLastResourceMetadataFromSchema(body);
4702
+ }
4701
4703
  return of(this.schemaNormalizer.normalizeSchema(body));
4702
4704
  }),
4703
4705
  // Angular HttpClient may surface 304 as error; also handle status 0 (CORS/network) by reusing cache
@@ -4708,7 +4710,9 @@ class GenericCrudService {
4708
4710
  try {
4709
4711
  const cachedHash = cached.schemaHash || '';
4710
4712
  this._lastSchemaInfo = { schemaId, schemaHash: cachedHash };
4711
- this.updateLastResourceMetadataFromSchema(cached.schema);
4713
+ if (schemaTypeParam === 'response') {
4714
+ this.updateLastResourceMetadataFromSchema(cached.schema);
4715
+ }
4712
4716
  }
4713
4717
  catch { }
4714
4718
  return of(this.schemaNormalizer.normalizeSchema(cached.schema));
@@ -4732,7 +4736,9 @@ class GenericCrudService {
4732
4736
  const now = new Date().toISOString();
4733
4737
  const entry = { schema: fresh, schemaHash: '', meta: { version: '2.0.0', name: (schemaTypeParam === 'request' ? 'Filter/Request Schema' : 'Schema'), createdAt: now, updatedAt: now, resourcePath: this.resourcePath, schemaId, apiOrigin: origin } };
4734
4738
  this._schemaCache.set(schemaId, entry);
4735
- this.updateLastResourceMetadataFromSchema(fresh);
4739
+ if (schemaTypeParam === 'response') {
4740
+ this.updateLastResourceMetadataFromSchema(fresh);
4741
+ }
4736
4742
  }), map((fresh) => this.schemaNormalizer.normalizeSchema(fresh)), catchError(this.handleError));
4737
4743
  }));
4738
4744
  }
@@ -6778,6 +6784,102 @@ const PRAXIS_I18N_CONFIG = new InjectionToken('PRAXIS_I18N_CONFIG', {
6778
6784
  });
6779
6785
  const PRAXIS_I18N_TRANSLATOR = new InjectionToken('PRAXIS_I18N_TRANSLATOR');
6780
6786
 
6787
+ const COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE = 'componentMetadataRegistry';
6788
+ const COMPONENT_METADATA_REGISTRY_I18N_CONFIG = {
6789
+ namespaces: {
6790
+ [COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE]: {
6791
+ 'pt-BR': {
6792
+ 'inputs.resourceId.label': 'ID do recurso',
6793
+ 'inputs.resourceId.description': 'Identificador único do recurso atual (ex.: payload.id).',
6794
+ 'inputs.resourcePath.label': 'Caminho do recurso',
6795
+ 'inputs.resourcePath.description': 'Endpoint/base ou caminho do recurso (ex.: human-resources/funcionarios).',
6796
+ 'inputs.formId.label': 'Formulário',
6797
+ 'inputs.formId.description': 'Identificador do formulário a ser exibido/atualizado.',
6798
+ 'inputs.tableId.label': 'Tabela',
6799
+ 'inputs.tableId.description': 'Identificador da tabela a ser exibida/atualizada.',
6800
+ 'inputs.config.label': 'Configuração',
6801
+ 'inputs.config.description': 'Objeto de configuração declarativo para o componente.',
6802
+ 'inputs.mode.label': 'Modo',
6803
+ 'inputs.mode.description': 'Modo de operação (ex.: view, edit, create).',
6804
+ 'inputs.filterCriteria.label': 'Filtro',
6805
+ 'inputs.filterCriteria.description': 'Critérios de filtro (JSON/expressão) aplicados a dados/listas.',
6806
+ 'inputs.bindingOrder.label': 'Ordem de binding',
6807
+ 'inputs.bindingOrder.description': 'Ordem de avaliação/atribuição das entradas do componente.',
6808
+ 'inputs.instanceId.label': 'ID da instância',
6809
+ 'inputs.instanceId.description': 'Identificador estável da instância do widget para telemetria, testes e correlação.',
6810
+ 'inputs.analyticsId.label': 'ID de analytics',
6811
+ 'inputs.analyticsId.description': 'Identificador lógico usado para telemetria e análise agregada do widget.',
6812
+ 'inputs.ariaLabel.label': 'Rótulo acessível',
6813
+ 'inputs.ariaLabel.description': 'Rótulo acessível aplicado ao bloco editorial quando necessário.',
6814
+ 'inputs.contentFormat.label': 'Formato do conteúdo',
6815
+ 'inputs.contentFormat.description': 'Formato editorial permitido para renderização do conteúdo (ex.: plain, markdown).',
6816
+ 'inputs.links.label': 'Links',
6817
+ 'inputs.links.description': 'Lista de links editoriais com política explícita de navegação e segurança.',
6818
+ 'outputs.rowClick.label': 'Clique na linha',
6819
+ 'outputs.rowClick.description': 'Emitido ao clicar/selecionar uma linha na tabela.',
6820
+ 'outputs.widgetEvent.label': 'Evento do widget',
6821
+ 'outputs.widgetEvent.description': 'Eventos internos reemitidos com contexto do container.',
6822
+ 'outputs.submit.label': 'Enviar',
6823
+ 'outputs.submit.description': 'Emitido quando o formulário é enviado.',
6824
+ 'outputs.valueChange.label': 'Mudança de valor',
6825
+ 'outputs.valueChange.description': 'Emitido quando o valor é alterado.',
6826
+ 'outputs.selectionChange.label': 'Mudança de seleção',
6827
+ 'outputs.selectionChange.description': 'Alterações na seleção de itens/linhas.',
6828
+ 'outputs.loaded.label': 'Carregado',
6829
+ 'outputs.loaded.description': 'Sinaliza conclusão de carregamento inicial.',
6830
+ 'outputs.error.label': 'Erro',
6831
+ 'outputs.error.description': 'Erros durante operações/ações.',
6832
+ 'outputs.change.label': 'Alteração',
6833
+ 'outputs.change.description': 'Eventos genéricos de alteração.',
6834
+ },
6835
+ 'en-US': {
6836
+ 'inputs.resourceId.label': 'Resource ID',
6837
+ 'inputs.resourceId.description': 'Unique identifier of the current resource (for example, payload.id).',
6838
+ 'inputs.resourcePath.label': 'Resource path',
6839
+ 'inputs.resourcePath.description': 'Endpoint/base or resource path (for example, human-resources/funcionarios).',
6840
+ 'inputs.formId.label': 'Form',
6841
+ 'inputs.formId.description': 'Identifier of the form to display or update.',
6842
+ 'inputs.tableId.label': 'Table',
6843
+ 'inputs.tableId.description': 'Identifier of the table to display or update.',
6844
+ 'inputs.config.label': 'Configuration',
6845
+ 'inputs.config.description': 'Declarative configuration object for the component.',
6846
+ 'inputs.mode.label': 'Mode',
6847
+ 'inputs.mode.description': 'Operation mode (for example, view, edit, create).',
6848
+ 'inputs.filterCriteria.label': 'Filter',
6849
+ 'inputs.filterCriteria.description': 'Filter criteria (JSON/expression) applied to data or lists.',
6850
+ 'inputs.bindingOrder.label': 'Binding order',
6851
+ 'inputs.bindingOrder.description': 'Evaluation/assignment order for component inputs.',
6852
+ 'inputs.instanceId.label': 'Instance ID',
6853
+ 'inputs.instanceId.description': 'Stable widget instance identifier for telemetry, tests and correlation.',
6854
+ 'inputs.analyticsId.label': 'Analytics ID',
6855
+ 'inputs.analyticsId.description': 'Logical identifier used for telemetry and aggregate widget analysis.',
6856
+ 'inputs.ariaLabel.label': 'Accessible label',
6857
+ 'inputs.ariaLabel.description': 'Accessible label applied to the editorial block when needed.',
6858
+ 'inputs.contentFormat.label': 'Content format',
6859
+ 'inputs.contentFormat.description': 'Allowed editorial format for rendering content (for example, plain, markdown).',
6860
+ 'inputs.links.label': 'Links',
6861
+ 'inputs.links.description': 'List of editorial links with explicit navigation and security policy.',
6862
+ 'outputs.rowClick.label': 'Row click',
6863
+ 'outputs.rowClick.description': 'Emitted when a table row is clicked or selected.',
6864
+ 'outputs.widgetEvent.label': 'Widget event',
6865
+ 'outputs.widgetEvent.description': 'Internal events re-emitted with container context.',
6866
+ 'outputs.submit.label': 'Submit',
6867
+ 'outputs.submit.description': 'Emitted when the form is submitted.',
6868
+ 'outputs.valueChange.label': 'Value change',
6869
+ 'outputs.valueChange.description': 'Emitted when the value changes.',
6870
+ 'outputs.selectionChange.label': 'Selection change',
6871
+ 'outputs.selectionChange.description': 'Changes in item or row selection.',
6872
+ 'outputs.loaded.label': 'Loaded',
6873
+ 'outputs.loaded.description': 'Signals completion of initial loading.',
6874
+ 'outputs.error.label': 'Error',
6875
+ 'outputs.error.description': 'Errors during operations/actions.',
6876
+ 'outputs.change.label': 'Change',
6877
+ 'outputs.change.description': 'Generic change events.',
6878
+ },
6879
+ },
6880
+ },
6881
+ };
6882
+
6781
6883
  function interpolatePraxisTranslation(template, params) {
6782
6884
  if (!template || !params)
6783
6885
  return template;
@@ -6938,7 +7040,7 @@ class PraxisI18nService {
6938
7040
  : this.configs
6939
7041
  ? [this.configs]
6940
7042
  : [];
6941
- return mergePraxisI18nConfigs(globalI18n, ...cfgs);
7043
+ return mergePraxisI18nConfigs(COMPONENT_METADATA_REGISTRY_I18N_CONFIG, globalI18n, ...cfgs);
6942
7044
  }
6943
7045
  lookup(key, locale, namespace) {
6944
7046
  const cfg = this.getConfig();
@@ -7024,40 +7126,44 @@ class ComponentMetadataRegistry {
7024
7126
  /** Register a component metadata entry. */
7025
7127
  register(meta) {
7026
7128
  const normalized = this.normalizeMeta(meta);
7129
+ this.assertCanRegisterMetadata(normalized);
7027
7130
  this.rawMetadataMap.set(normalized.id, meta);
7028
7131
  this.metadataMap.set(normalized.id, normalized);
7029
7132
  const legacyControlType = normalized.componentType ? this.normalizeComponentType(normalized.componentType) : undefined;
7030
- if (legacyControlType && !this.legacyControlTypeIndex.has(legacyControlType)) {
7133
+ if (legacyControlType) {
7031
7134
  this.legacyControlTypeIndex.set(legacyControlType, normalized.id);
7032
7135
  }
7033
7136
  }
7034
7137
  /** Register an editorial descriptor that can later be resolved by controlType or metadata id. */
7035
7138
  registerEditorial(meta) {
7036
7139
  const normalized = this.normalizeEditorialDescriptor(meta);
7140
+ this.assertCanRegisterEditorialMetadata(normalized);
7037
7141
  this.editorialMetadataMap.set(normalized.componentMetaId, normalized);
7038
7142
  this.editorialControlTypeIndex.set(this.normalizeComponentType(normalized.controlType), normalized.componentMetaId);
7039
7143
  }
7040
7144
  /** Retrieve metadata by its unique id. */
7041
7145
  get(id) {
7042
- return this.metadataMap.get(this.normalizeComponentType(id));
7146
+ const meta = this.metadataMap.get(this.normalizeComponentType(id));
7147
+ return meta ? this.cloneComponentDocMeta(meta) : undefined;
7043
7148
  }
7044
7149
  /** Retrieve an editorial descriptor by its id or controlType. */
7045
7150
  getEditorial(idOrControlType) {
7046
7151
  const normalized = this.normalizeComponentType(idOrControlType);
7047
7152
  const direct = this.editorialMetadataMap.get(normalized);
7048
7153
  if (direct) {
7049
- return direct;
7154
+ return this.cloneEditorialDescriptor(direct);
7050
7155
  }
7051
7156
  const resolvedId = this.editorialControlTypeIndex.get(normalized);
7052
- return resolvedId ? this.editorialMetadataMap.get(resolvedId) : undefined;
7157
+ const meta = resolvedId ? this.editorialMetadataMap.get(resolvedId) : undefined;
7158
+ return meta ? this.cloneEditorialDescriptor(meta) : undefined;
7053
7159
  }
7054
7160
  /** List all registered metadata entries. */
7055
7161
  getAll() {
7056
- return Array.from(this.metadataMap.values());
7162
+ return Array.from(this.metadataMap.values()).map((meta) => this.cloneComponentDocMeta(meta));
7057
7163
  }
7058
7164
  /** List all registered editorial descriptors. */
7059
7165
  getAllEditorial() {
7060
- return Array.from(this.editorialMetadataMap.values());
7166
+ return Array.from(this.editorialMetadataMap.values()).map((meta) => this.cloneEditorialDescriptor(meta));
7061
7167
  }
7062
7168
  /**
7063
7169
  * Resolve metadata editorial already localized for a component id, controlType or raw metadata.
@@ -7083,34 +7189,34 @@ class ComponentMetadataRegistry {
7083
7189
  normalizeMeta(meta) {
7084
7190
  const normalizedId = this.normalizeComponentType(meta.id);
7085
7191
  const inputDefaults = {
7086
- resourceId: { label: 'ID do recurso', description: 'Identificador ?nico do recurso atual (ex.: payload.id).' },
7087
- resourcePath: { label: 'Caminho do recurso', description: 'Endpoint/base ou caminho do recurso (ex.: human-resources/funcionarios).' },
7088
- formId: { label: 'Formul?rio', description: 'Identificador do formul?rio a ser exibido/atualizado.' },
7089
- tableId: { label: 'Tabela', description: 'Identificador da tabela a ser exibida/atualizada.' },
7090
- config: { label: 'Configura??o', description: 'Objeto de configura??o declarativo para o componente.' },
7091
- mode: { label: 'Modo', description: 'Modo de opera??o (ex.: view, edit, create).' },
7092
- filterCriteria: { label: 'Filtro', description: 'Crit?rios de filtro (JSON/express?o) aplicados a dados/listas.' },
7093
- bindingOrder: { label: 'Ordem de Binding', description: 'Ordem de avalia??o/atribui??o das entradas do componente.' },
7192
+ resourceId: this.defaultCopy('inputs.resourceId', 'ID do recurso', 'Identificador único do recurso atual (ex.: payload.id).'),
7193
+ resourcePath: this.defaultCopy('inputs.resourcePath', 'Caminho do recurso', 'Endpoint/base ou caminho do recurso (ex.: human-resources/funcionarios).'),
7194
+ formId: this.defaultCopy('inputs.formId', 'Formulário', 'Identificador do formulário a ser exibido/atualizado.'),
7195
+ tableId: this.defaultCopy('inputs.tableId', 'Tabela', 'Identificador da tabela a ser exibida/atualizada.'),
7196
+ config: this.defaultCopy('inputs.config', 'Configuração', 'Objeto de configuração declarativo para o componente.'),
7197
+ mode: this.defaultCopy('inputs.mode', 'Modo', 'Modo de operação (ex.: view, edit, create).'),
7198
+ filterCriteria: this.defaultCopy('inputs.filterCriteria', 'Filtro', 'Critérios de filtro (JSON/expressão) aplicados a dados/listas.'),
7199
+ bindingOrder: this.defaultCopy('inputs.bindingOrder', 'Ordem de binding', 'Ordem de avaliação/atribuição das entradas do componente.'),
7094
7200
  };
7095
7201
  const editorialInputDefaults = {
7096
- instanceId: { label: 'Instance ID', description: 'Identificador est?vel da inst?ncia do widget para telemetria, testes e correla??o.' },
7097
- analyticsId: { label: 'Analytics ID', description: 'Identificador l?gico usado para telemetria e an?lise agregada do widget.' },
7098
- ariaLabel: { label: 'Aria Label', description: 'R?tulo acess?vel aplicado ao bloco editorial quando necess?rio.' },
7099
- contentFormat: { label: 'Formato do conte?do', description: 'Formato editorial permitido para renderiza??o do conte?do (ex.: plain, markdown).' },
7100
- links: { label: 'Links', description: 'Lista de links editoriais com pol?tica expl?cita de navega??o e seguran?a.' },
7202
+ instanceId: this.defaultCopy('inputs.instanceId', 'ID da instância', 'Identificador estável da instância do widget para telemetria, testes e correlação.'),
7203
+ analyticsId: this.defaultCopy('inputs.analyticsId', 'ID de analytics', 'Identificador lógico usado para telemetria e análise agregada do widget.'),
7204
+ ariaLabel: this.defaultCopy('inputs.ariaLabel', 'Rótulo acessível', 'Rótulo acessível aplicado ao bloco editorial quando necessário.'),
7205
+ contentFormat: this.defaultCopy('inputs.contentFormat', 'Formato do conteúdo', 'Formato editorial permitido para renderização do conteúdo (ex.: plain, markdown).'),
7206
+ links: this.defaultCopy('inputs.links', 'Links', 'Lista de links editoriais com política explícita de navegação e segurança.'),
7101
7207
  };
7102
7208
  const effectiveInputDefaults = isEditorialComponentMeta(meta)
7103
7209
  ? { ...inputDefaults, ...editorialInputDefaults }
7104
7210
  : inputDefaults;
7105
7211
  const outputDefaults = {
7106
- rowClick: { label: 'Clique na linha', description: 'Emitido ao clicar/selecionar uma linha na tabela.' },
7107
- widgetEvent: { label: 'Evento do widget', description: 'Eventos internos reemitidos com contexto do container.' },
7108
- submit: { label: 'Enviar', description: 'Emitido quando o formul?rio ? enviado.' },
7109
- valueChange: { label: 'Mudan?a de valor', description: 'Emitido quando o valor ? alterado.' },
7110
- selectionChange: { label: 'Mudan?a de sele??o', description: 'Altera??es na sele??o de itens/linhas.' },
7111
- loaded: { label: 'Carregado', description: 'Sinaliza conclus?o de carregamento inicial.' },
7112
- error: { label: 'Erro', description: 'Erros durante opera??es/a??es.' },
7113
- change: { label: 'Altera??o', description: 'Eventos gen?ricos de altera??o.' },
7212
+ rowClick: this.defaultCopy('outputs.rowClick', 'Clique na linha', 'Emitido ao clicar/selecionar uma linha na tabela.'),
7213
+ widgetEvent: this.defaultCopy('outputs.widgetEvent', 'Evento do widget', 'Eventos internos reemitidos com contexto do container.'),
7214
+ submit: this.defaultCopy('outputs.submit', 'Enviar', 'Emitido quando o formulário é enviado.'),
7215
+ valueChange: this.defaultCopy('outputs.valueChange', 'Mudança de valor', 'Emitido quando o valor é alterado.'),
7216
+ selectionChange: this.defaultCopy('outputs.selectionChange', 'Mudança de seleção', 'Alterações na seleção de itens/linhas.'),
7217
+ loaded: this.defaultCopy('outputs.loaded', 'Carregado', 'Sinaliza conclusão de carregamento inicial.'),
7218
+ error: this.defaultCopy('outputs.error', 'Erro', 'Erros durante operações/ações.'),
7219
+ change: this.defaultCopy('outputs.change', 'Alteração', 'Eventos genéricos de alteração.'),
7114
7220
  };
7115
7221
  const normInputs = (meta.inputs || []).map((inp) => {
7116
7222
  const d = effectiveInputDefaults[inp.name];
@@ -7118,8 +7224,8 @@ class ComponentMetadataRegistry {
7118
7224
  return inp;
7119
7225
  return {
7120
7226
  ...inp,
7121
- label: inp.label || d.label,
7122
- description: inp.description || d.description,
7227
+ label: inp.label || this.resolveDefaultCopy(d.label),
7228
+ description: inp.description || this.resolveDefaultCopy(d.description),
7123
7229
  };
7124
7230
  });
7125
7231
  const normOutputs = (meta.outputs || []).map((out) => {
@@ -7128,8 +7234,8 @@ class ComponentMetadataRegistry {
7128
7234
  return out;
7129
7235
  return {
7130
7236
  ...out,
7131
- label: out.label || d.label,
7132
- description: out.description || d.description,
7237
+ label: out.label || this.resolveDefaultCopy(d.label),
7238
+ description: out.description || this.resolveDefaultCopy(d.description),
7133
7239
  };
7134
7240
  });
7135
7241
  const normPorts = meta.ports?.map((port) => this.clonePortContract(port));
@@ -7158,6 +7264,29 @@ class ComponentMetadataRegistry {
7158
7264
  tags: meta.tags?.slice(),
7159
7265
  };
7160
7266
  }
7267
+ assertCanRegisterMetadata(meta) {
7268
+ if (this.metadataMap.has(meta.id)) {
7269
+ throw new Error(`Component metadata id collision: ${meta.id}`);
7270
+ }
7271
+ const legacyControlType = meta.componentType ? this.normalizeComponentType(meta.componentType) : undefined;
7272
+ if (!legacyControlType) {
7273
+ return;
7274
+ }
7275
+ const existingId = this.legacyControlTypeIndex.get(legacyControlType);
7276
+ if (existingId && existingId !== meta.id) {
7277
+ throw new Error(`Component metadata legacy componentType collision: ${legacyControlType}`);
7278
+ }
7279
+ }
7280
+ assertCanRegisterEditorialMetadata(meta) {
7281
+ if (this.editorialMetadataMap.has(meta.componentMetaId)) {
7282
+ throw new Error(`Component editorial metadata id collision: ${meta.componentMetaId}`);
7283
+ }
7284
+ const controlType = this.normalizeComponentType(meta.controlType);
7285
+ const existingId = this.editorialControlTypeIndex.get(controlType);
7286
+ if (existingId && existingId !== meta.componentMetaId) {
7287
+ throw new Error(`Component editorial controlType collision: ${controlType}`);
7288
+ }
7289
+ }
7161
7290
  resolveEditorialDescriptor(meta, options) {
7162
7291
  return {
7163
7292
  controlType: meta.controlType,
@@ -7236,6 +7365,31 @@ class ComponentMetadataRegistry {
7236
7365
  const resolved = this.resolveTextValue(value, undefined, options);
7237
7366
  return resolved || undefined;
7238
7367
  }
7368
+ defaultCopy(keyPrefix, label, description) {
7369
+ return {
7370
+ label: {
7371
+ key: `${keyPrefix}.label`,
7372
+ text: label,
7373
+ },
7374
+ ...(description
7375
+ ? {
7376
+ description: {
7377
+ key: `${keyPrefix}.description`,
7378
+ text: description,
7379
+ },
7380
+ }
7381
+ : {}),
7382
+ };
7383
+ }
7384
+ resolveDefaultCopy(value) {
7385
+ if (!value) {
7386
+ return undefined;
7387
+ }
7388
+ if (!this.i18n) {
7389
+ return typeof value === 'string' ? value : value.text ?? value.key ?? '';
7390
+ }
7391
+ return this.i18n.resolve(value, undefined, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE);
7392
+ }
7239
7393
  isEditorialDescriptor(value) {
7240
7394
  return 'controlType' in value && 'componentMetaId' in value;
7241
7395
  }
@@ -7256,9 +7410,61 @@ class ComponentMetadataRegistry {
7256
7410
  ...(port.schema ? { schema: { ...port.schema } } : {}),
7257
7411
  ...(compatibility ? { compatibility } : {}),
7258
7412
  ...(port.exposure ? { exposure: { ...port.exposure } } : {}),
7259
- ...(port.examples ? { examples: port.examples.slice() } : {}),
7413
+ ...(port.examples ? { examples: this.cloneValue(port.examples) } : {}),
7414
+ };
7415
+ }
7416
+ cloneComponentDocMeta(meta) {
7417
+ return {
7418
+ ...meta,
7419
+ inputs: meta.inputs?.map((input) => ({
7420
+ ...input,
7421
+ ...(input.default !== undefined ? { default: this.cloneValue(input.default) } : {}),
7422
+ })),
7423
+ outputs: meta.outputs?.map((output) => ({ ...output })),
7424
+ actions: meta.actions?.map((action) => ({
7425
+ ...action,
7426
+ ...(action.payloadSchema ? { payloadSchema: this.cloneValue(action.payloadSchema) } : {}),
7427
+ })),
7428
+ commands: meta.commands?.map((command) => ({
7429
+ ...command,
7430
+ ...(command.payloadSchema ? { payloadSchema: this.cloneValue(command.payloadSchema) } : {}),
7431
+ })),
7432
+ ports: meta.ports?.map((port) => this.clonePortContract(port)),
7433
+ configEditor: meta.configEditor ? { ...meta.configEditor } : undefined,
7434
+ authoringManifestRef: meta.authoringManifestRef ? { ...meta.authoringManifestRef } : undefined,
7435
+ tags: meta.tags?.slice(),
7436
+ insertionPresets: meta.insertionPresets?.map((preset) => ({
7437
+ ...preset,
7438
+ ...(preset.inputs ? { inputs: this.cloneValue(preset.inputs) } : {}),
7439
+ })),
7440
+ layoutHints: meta.layoutHints ? { ...meta.layoutHints } : undefined,
7441
+ };
7442
+ }
7443
+ cloneEditorialDescriptor(meta) {
7444
+ return {
7445
+ ...meta,
7446
+ tags: meta.tags?.slice(),
7447
+ inputs: meta.inputs?.map((input) => ({
7448
+ ...input,
7449
+ ...(input.default !== undefined ? { default: this.cloneValue(input.default) } : {}),
7450
+ })),
7451
+ outputs: meta.outputs?.map((output) => ({
7452
+ ...output,
7453
+ ...(output.default !== undefined ? { default: this.cloneValue(output.default) } : {}),
7454
+ })),
7260
7455
  };
7261
7456
  }
7457
+ cloneValue(value) {
7458
+ if (value == null || typeof value !== 'object') {
7459
+ return value;
7460
+ }
7461
+ try {
7462
+ return structuredClone(value);
7463
+ }
7464
+ catch {
7465
+ return JSON.parse(JSON.stringify(value));
7466
+ }
7467
+ }
7262
7468
  normalizeComponentType(type) {
7263
7469
  return this.componentTypeAliases[type] ?? type;
7264
7470
  }
@@ -13178,8 +13384,11 @@ class DomainCatalogService {
13178
13384
  const params = new HttpParams()
13179
13385
  .set('serviceKey', options.serviceKey || DEFAULT_SERVICE_KEY)
13180
13386
  .set('limit', String(options.limit ?? DEFAULT_RELEASE_LIMIT));
13387
+ const scopedParams = options.resourceKey
13388
+ ? params.set('resourceKey', options.resourceKey)
13389
+ : params;
13181
13390
  return this.http.get(this.discovery.resolveHref(RELEASES_HREF, options), {
13182
- params,
13391
+ params: scopedParams,
13183
13392
  headers: this.resolveHeaders(options),
13184
13393
  });
13185
13394
  }
@@ -13202,7 +13411,8 @@ class DomainCatalogService {
13202
13411
  return this.listReleases(options).pipe(map$1((releases) => releases.find((release) => this.releaseMatchesResource(release, resourceKey)) ?? null));
13203
13412
  }
13204
13413
  getGovernanceContext(options) {
13205
- return this.findLatestReleaseForResource(options.resourceKey, options).pipe(switchMap$1((release) => {
13414
+ const { limit: itemLimit, ...releaseOptions } = options;
13415
+ return this.findLatestReleaseForResource(options.resourceKey, releaseOptions).pipe(switchMap$1((release) => {
13206
13416
  if (!release?.releaseKey) {
13207
13417
  return of({
13208
13418
  resourceKey: options.resourceKey,
@@ -13215,7 +13425,7 @@ class DomainCatalogService {
13215
13425
  ...options,
13216
13426
  type: 'governance',
13217
13427
  query: options.query,
13218
- limit: options.limit ?? DEFAULT_ITEM_LIMIT,
13428
+ limit: itemLimit ?? DEFAULT_ITEM_LIMIT,
13219
13429
  }).pipe(map$1((items) => ({
13220
13430
  resourceKey: options.resourceKey,
13221
13431
  query: options.query,
@@ -14292,6 +14502,10 @@ class RelatedResourceSurfaceResolverService {
14292
14502
  tableId: request.tableId || this.buildStableTableId(surface, relatedResource, parentResourceId),
14293
14503
  config: this.buildTableConfig(surface, relatedResource, request),
14294
14504
  queryContext,
14505
+ enableCustomization: request.enableCustomization === true,
14506
+ ...(this.trim(request.authoringCapability)
14507
+ ? { authoringCapability: this.trim(request.authoringCapability) }
14508
+ : {}),
14295
14509
  };
14296
14510
  payload.context = {
14297
14511
  ...(payload.context || {}),
@@ -14319,6 +14533,8 @@ class RelatedResourceSurfaceResolverService {
14319
14533
  const hasTableConfig = !!tableConfig && typeof tableConfig === 'object' && !Array.isArray(tableConfig);
14320
14534
  const hasEmptyState = !!emptyState && typeof emptyState === 'object' && !Array.isArray(emptyState);
14321
14535
  const base = hasTableConfig ? tableConfig : {};
14536
+ const toolbar = this.objectValue(base['toolbar']);
14537
+ const columnsVisibility = this.objectValue(toolbar['columnsVisibility']);
14322
14538
  const behavior = this.objectValue(base['behavior']);
14323
14539
  const currentEmptyState = this.objectValue(behavior['emptyState']);
14324
14540
  const hasCurrentEmptyState = Object.keys(currentEmptyState).length > 0;
@@ -14335,6 +14551,13 @@ class RelatedResourceSurfaceResolverService {
14335
14551
  }
14336
14552
  return {
14337
14553
  ...base,
14554
+ toolbar: {
14555
+ ...toolbar,
14556
+ columnsVisibility: {
14557
+ enabled: false,
14558
+ ...columnsVisibility,
14559
+ },
14560
+ },
14338
14561
  behavior: {
14339
14562
  ...behavior,
14340
14563
  emptyState: resolvedEmptyState,
@@ -14726,6 +14949,7 @@ class SurfaceOpenMaterializerService {
14726
14949
  'metadata',
14727
14950
  'context',
14728
14951
  'enableCustomization',
14952
+ 'authoringCapability',
14729
14953
  ],
14730
14954
  outputs: {
14731
14955
  afterOpen: 'emit',
@@ -14771,7 +14995,8 @@ class SurfaceOpenMaterializerService {
14771
14995
  relatedResourceCrud: true,
14772
14996
  },
14773
14997
  },
14774
- enableCustomization: previousInputs['enableCustomization'] ?? true,
14998
+ enableCustomization: previousInputs['enableCustomization'] ?? false,
14999
+ authoringCapability: previousInputs['authoringCapability'] ?? undefined,
14775
15000
  },
14776
15001
  },
14777
15002
  context: this.mergeMaterializationContext(payload, {
@@ -14801,6 +15026,7 @@ class SurfaceOpenMaterializerService {
14801
15026
  'data',
14802
15027
  'config',
14803
15028
  'enableCustomization',
15029
+ 'authoringCapability',
14804
15030
  ],
14805
15031
  outputs: {
14806
15032
  rowClick: 'emit',
@@ -14819,7 +15045,7 @@ class SurfaceOpenMaterializerService {
14819
15045
  icon: payload.icon,
14820
15046
  data,
14821
15047
  config: this.buildLocalTableConfig(fields, data, payload),
14822
- enableCustomization: previousInputs['enableCustomization'] ?? true,
15048
+ enableCustomization: previousInputs['enableCustomization'] ?? false,
14823
15049
  },
14824
15050
  },
14825
15051
  context: this.mergeMaterializationContext(payload, {
@@ -14884,6 +15110,7 @@ class SurfaceOpenMaterializerService {
14884
15110
  'subtitle',
14885
15111
  'icon',
14886
15112
  'enableCustomization',
15113
+ 'authoringCapability',
14887
15114
  'dense',
14888
15115
  'horizontalScroll',
14889
15116
  'autoDelete',
@@ -17179,6 +17406,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17179
17406
  type: Optional
17180
17407
  }] }] });
17181
17408
 
17409
+ const PRAXIS_THEME_SURFACE_DEFAULTS = {
17410
+ surface: 'var(--md-sys-color-surface)',
17411
+ surfaceRaised: 'var(--md-sys-color-surface-container)',
17412
+ surfaceOverlay: 'var(--md-sys-color-surface-container-high)',
17413
+ onSurface: 'var(--md-sys-color-on-surface)',
17414
+ onSurfaceMuted: 'var(--md-sys-color-on-surface-variant)',
17415
+ outline: 'var(--md-sys-color-outline-variant)',
17416
+ outlineStrong: 'var(--md-sys-color-outline)',
17417
+ focusOutline: 'var(--md-sys-color-primary)',
17418
+ elevation: 'var(--md-sys-elevation-level2, 0 8px 24px rgb(0 0 0 / 0.12))',
17419
+ };
17420
+ const PRAXIS_THEME_SURFACE_VARS = {
17421
+ surface: '--praxis-theme-surface',
17422
+ surfaceRaised: '--praxis-theme-surface-raised',
17423
+ surfaceOverlay: '--praxis-theme-surface-overlay',
17424
+ onSurface: '--praxis-theme-on-surface',
17425
+ onSurfaceMuted: '--praxis-theme-on-surface-muted',
17426
+ outline: '--praxis-theme-outline',
17427
+ outlineStrong: '--praxis-theme-outline-strong',
17428
+ focusOutline: '--praxis-theme-focus-outline',
17429
+ elevation: '--praxis-theme-elevation',
17430
+ };
17431
+ function buildPraxisThemeSurfaceCss(tokens = {}) {
17432
+ const resolved = { ...PRAXIS_THEME_SURFACE_DEFAULTS, ...tokens };
17433
+ return `
17434
+ :root {
17435
+ ${PRAXIS_THEME_SURFACE_VARS.surface}: ${resolved.surface};
17436
+ ${PRAXIS_THEME_SURFACE_VARS.surfaceRaised}: ${resolved.surfaceRaised};
17437
+ ${PRAXIS_THEME_SURFACE_VARS.surfaceOverlay}: ${resolved.surfaceOverlay};
17438
+ ${PRAXIS_THEME_SURFACE_VARS.onSurface}: ${resolved.onSurface};
17439
+ ${PRAXIS_THEME_SURFACE_VARS.onSurfaceMuted}: ${resolved.onSurfaceMuted};
17440
+ ${PRAXIS_THEME_SURFACE_VARS.outline}: ${resolved.outline};
17441
+ ${PRAXIS_THEME_SURFACE_VARS.outlineStrong}: ${resolved.outlineStrong};
17442
+ ${PRAXIS_THEME_SURFACE_VARS.focusOutline}: ${resolved.focusOutline};
17443
+ ${PRAXIS_THEME_SURFACE_VARS.elevation}: ${resolved.elevation};
17444
+ }
17445
+ `;
17446
+ }
17447
+
17182
17448
  /** Set the current tenant for GlobalConfigService at app boot. */
17183
17449
  function provideGlobalConfigTenant(tenantId) {
17184
17450
  return {
@@ -22615,6 +22881,159 @@ function words(input) {
22615
22881
  return separated ? separated.split(/\s+/) : [];
22616
22882
  }
22617
22883
 
22884
+ const ISO_DATE_ONLY_RE = /^\d{4}-\d{2}-\d{2}$/;
22885
+ function isProgrammaticDateRangePreset(value) {
22886
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
22887
+ return false;
22888
+ }
22889
+ const candidate = value;
22890
+ return (typeof candidate.id === 'string' &&
22891
+ typeof candidate.label === 'string' &&
22892
+ typeof candidate.calculateRange === 'function');
22893
+ }
22894
+ function isStaticDateRangePreset(value) {
22895
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
22896
+ return false;
22897
+ }
22898
+ const candidate = value;
22899
+ return (typeof candidate.id === 'string' &&
22900
+ typeof candidate.label === 'string' &&
22901
+ typeof candidate.startDate === 'string' &&
22902
+ typeof candidate.endDate === 'string' &&
22903
+ typeof candidate.calculateRange !== 'function');
22904
+ }
22905
+ function staticDateRangePresetToPreset(preset, opts = {}) {
22906
+ return {
22907
+ id: preset.id,
22908
+ label: preset.label,
22909
+ icon: preset.icon,
22910
+ description: preset.description,
22911
+ order: preset.order,
22912
+ category: 'custom',
22913
+ calculateRange: () => resolveStaticDateRangePresetValue(preset, opts),
22914
+ };
22915
+ }
22916
+ function resolveDateRangeShortcutPreset(shortcut, builtins, opts = {}) {
22917
+ if (typeof shortcut === 'string') {
22918
+ return builtins[shortcut] ?? null;
22919
+ }
22920
+ if (isProgrammaticDateRangePreset(shortcut)) {
22921
+ return shortcut;
22922
+ }
22923
+ if (isStaticDateRangePreset(shortcut)) {
22924
+ return staticDateRangePresetToPreset(shortcut, opts);
22925
+ }
22926
+ return null;
22927
+ }
22928
+ function resolveDateRangeShortcutPresets(shortcuts, builtins, opts = {}) {
22929
+ const resolved = [];
22930
+ for (const shortcut of shortcuts) {
22931
+ const preset = resolveDateRangeShortcutPreset(shortcut, builtins, opts);
22932
+ if (preset) {
22933
+ resolved.push(preset);
22934
+ }
22935
+ }
22936
+ return resolved;
22937
+ }
22938
+ function resolveStaticDateRangePresetValue(preset, opts) {
22939
+ const timezone = isValidTimeZone(preset.timeZone)
22940
+ ? preset.timeZone
22941
+ : opts.timezone;
22942
+ const invalidValue = () => ({
22943
+ startDate: null,
22944
+ endDate: null,
22945
+ preset: preset.id,
22946
+ label: preset.label,
22947
+ timezone,
22948
+ });
22949
+ if (preset.timeZone && !isValidTimeZone(preset.timeZone)) {
22950
+ return invalidValue();
22951
+ }
22952
+ if (!isStaticPresetEffective(preset, opts.referenceDate ?? opts.now ?? new Date(), timezone)) {
22953
+ return invalidValue();
22954
+ }
22955
+ const start = dateOnlyBoundary(preset.startDate, 'start', timezone);
22956
+ const end = dateOnlyBoundary(preset.endDate, 'end', timezone);
22957
+ if (!start || !end || start > end) {
22958
+ return invalidValue();
22959
+ }
22960
+ let value = {
22961
+ startDate: normalizeStart(start, timezone),
22962
+ endDate: normalizeEnd(end, timezone),
22963
+ preset: preset.id,
22964
+ label: preset.label,
22965
+ timezone,
22966
+ };
22967
+ value = clampRange(value, opts.minDate ?? null, opts.maxDate ?? null, timezone);
22968
+ if (!value.startDate || !value.endDate || value.startDate > value.endDate) {
22969
+ return invalidValue();
22970
+ }
22971
+ if (!isRangeValidForFilter(value, opts.dateFilter, opts.strictFilter ?? true)) {
22972
+ return invalidValue();
22973
+ }
22974
+ return value;
22975
+ }
22976
+ function isStaticPresetEffective(preset, referenceDate, timezone) {
22977
+ const reference = normalizeStart(referenceDate, timezone);
22978
+ const effectiveFrom = preset.effectiveFrom
22979
+ ? dateOnlyBoundary(preset.effectiveFrom, 'start', timezone)
22980
+ : null;
22981
+ const effectiveTo = preset.effectiveTo
22982
+ ? dateOnlyBoundary(preset.effectiveTo, 'end', timezone)
22983
+ : null;
22984
+ if (preset.effectiveFrom && !effectiveFrom) {
22985
+ return false;
22986
+ }
22987
+ if (preset.effectiveTo && !effectiveTo) {
22988
+ return false;
22989
+ }
22990
+ if (effectiveFrom && reference < effectiveFrom) {
22991
+ return false;
22992
+ }
22993
+ if (effectiveTo && reference > effectiveTo) {
22994
+ return false;
22995
+ }
22996
+ return true;
22997
+ }
22998
+ function parseDateOnlyParts(value) {
22999
+ if (!ISO_DATE_ONLY_RE.test(value)) {
23000
+ return null;
23001
+ }
23002
+ const [year, month, day] = value.split('-').map(Number);
23003
+ const date = new Date(Date.UTC(year, month - 1, day));
23004
+ if (date.getUTCFullYear() !== year ||
23005
+ date.getUTCMonth() !== month - 1 ||
23006
+ date.getUTCDate() !== day) {
23007
+ return null;
23008
+ }
23009
+ return { year, monthIndex: month - 1, day };
23010
+ }
23011
+ function dateOnlyBoundary(value, which, timezone) {
23012
+ const parts = parseDateOnlyParts(value);
23013
+ if (!parts) {
23014
+ return null;
23015
+ }
23016
+ if (timezone) {
23017
+ return datePartsToTimeZoneBoundary(parts, which, timezone);
23018
+ }
23019
+ const h = which === 'start' ? 0 : 23;
23020
+ const min = which === 'start' ? 0 : 59;
23021
+ const s = which === 'start' ? 0 : 59;
23022
+ const ms = which === 'start' ? 0 : 999;
23023
+ return new Date(parts.year, parts.monthIndex, parts.day, h, min, s, ms);
23024
+ }
23025
+ function isValidTimeZone(timeZone) {
23026
+ if (!timeZone) {
23027
+ return false;
23028
+ }
23029
+ try {
23030
+ new Intl.DateTimeFormat('en-US', { timeZone }).format(new Date());
23031
+ return true;
23032
+ }
23033
+ catch {
23034
+ return false;
23035
+ }
23036
+ }
22618
23037
  /** Normalize a date to start of day (00:00:00.000) respecting timezone if provided. */
22619
23038
  function normalizeStart(date, timezone) {
22620
23039
  return normalizeAtBoundary(date, 'start', timezone);
@@ -22626,7 +23045,6 @@ function normalizeEnd(date, timezone) {
22626
23045
  function normalizeAtBoundary(date, which, timezone) {
22627
23046
  const d = new Date(date);
22628
23047
  if (timezone) {
22629
- // Build from local parts interpreted in the target timezone using Intl
22630
23048
  const parts = new Intl.DateTimeFormat('en-CA', {
22631
23049
  timeZone: timezone,
22632
23050
  year: 'numeric',
@@ -22639,17 +23057,11 @@ function normalizeAtBoundary(date, which, timezone) {
22639
23057
  acc[p.type] = p.value;
22640
23058
  return acc;
22641
23059
  }, {});
22642
- const y = Number(parts.year);
22643
- const m = Number(parts.month) - 1;
22644
- const day = Number(parts.day);
22645
- const h = which === 'start' ? 0 : 23;
22646
- const min = which === 'start' ? 0 : 59;
22647
- const s = which === 'start' ? 0 : 59;
22648
- const ms = which === 'start' ? 0 : 999;
22649
- // Construct as if in local time then shift using the timezone offset at that instant
22650
- const local = new Date(y, m, day, h, min, s, ms);
22651
- const tzOffset = getTimeZoneOffsetMs(timezone, local);
22652
- return new Date(local.getTime() - tzOffset + local.getTimezoneOffset() * 60_000);
23060
+ return datePartsToTimeZoneBoundary({
23061
+ year: Number(parts.year),
23062
+ monthIndex: Number(parts.month) - 1,
23063
+ day: Number(parts.day),
23064
+ }, which, timezone);
22653
23065
  }
22654
23066
  if (which === 'start') {
22655
23067
  d.setHours(0, 0, 0, 0);
@@ -22659,8 +23071,16 @@ function normalizeAtBoundary(date, which, timezone) {
22659
23071
  }
22660
23072
  return d;
22661
23073
  }
23074
+ function datePartsToTimeZoneBoundary(parts, which, timezone) {
23075
+ const h = which === 'start' ? 0 : 23;
23076
+ const min = which === 'start' ? 0 : 59;
23077
+ const s = which === 'start' ? 0 : 59;
23078
+ const ms = which === 'start' ? 0 : 999;
23079
+ const utcBoundary = new Date(Date.UTC(parts.year, parts.monthIndex, parts.day, h, min, s, ms));
23080
+ const tzOffset = getTimeZoneOffsetMs(timezone, utcBoundary);
23081
+ return new Date(utcBoundary.getTime() - tzOffset);
23082
+ }
22662
23083
  function getTimeZoneOffsetMs(timeZone, date) {
22663
- // Approximate the offset between target timezone and UTC in ms at given date
22664
23084
  const f = new Intl.DateTimeFormat('en-US', {
22665
23085
  timeZone,
22666
23086
  hour12: false,
@@ -22673,8 +23093,8 @@ function getTimeZoneOffsetMs(timeZone, date) {
22673
23093
  });
22674
23094
  const parts = f.formatToParts(date);
22675
23095
  const get = (t) => Number(parts.find((p) => p.type === t)?.value || 0);
22676
- const asLocal = new Date(get('year'), get('month') - 1, get('day'), get('hour'), get('minute'), get('second'));
22677
- return asLocal.getTime() - Date.UTC(get('year'), get('month') - 1, get('day'), get('hour'), get('minute'), get('second'));
23096
+ const zonedWallClockAsUtc = Date.UTC(get('year'), get('month') - 1, get('day'), get('hour'), get('minute'), get('second'), date.getUTCMilliseconds());
23097
+ return zonedWallClockAsUtc - date.getTime();
22678
23098
  }
22679
23099
  function clampRange(range, minDate, maxDate, timezone) {
22680
23100
  let { startDate, endDate } = range;
@@ -37780,6 +38200,8 @@ class PraxisRelatedResourceOutletComponent {
37780
38200
  icon = input(null, ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
37781
38201
  tableId = input(null, ...(ngDevMode ? [{ debugName: "tableId" }] : /* istanbul ignore next */ []));
37782
38202
  tableConfig = input(null, ...(ngDevMode ? [{ debugName: "tableConfig" }] : /* istanbul ignore next */ []));
38203
+ enableCustomization = input(false, ...(ngDevMode ? [{ debugName: "enableCustomization" }] : /* istanbul ignore next */ []));
38204
+ authoringCapability = input(null, ...(ngDevMode ? [{ debugName: "authoringCapability" }] : /* istanbul ignore next */ []));
37783
38205
  emptyState = input(null, ...(ngDevMode ? [{ debugName: "emptyState" }] : /* istanbul ignore next */ []));
37784
38206
  queryContext = input(null, ...(ngDevMode ? [{ debugName: "queryContext" }] : /* istanbul ignore next */ []));
37785
38207
  mode = input('inline', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
@@ -37815,6 +38237,8 @@ class PraxisRelatedResourceOutletComponent {
37815
38237
  icon: this.icon(),
37816
38238
  tableId: this.tableId(),
37817
38239
  tableConfig: this.tableConfig(),
38240
+ enableCustomization: this.enableCustomization(),
38241
+ authoringCapability: this.authoringCapability(),
37818
38242
  emptyState: this.emptyState(),
37819
38243
  queryContext: this.queryContext(),
37820
38244
  apiEndpointKey: this.apiEndpointKey(),
@@ -38062,7 +38486,7 @@ class PraxisRelatedResourceOutletComponent {
38062
38486
  return typeof value === 'string' ? value.trim() : '';
38063
38487
  }
38064
38488
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRelatedResourceOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
38065
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisRelatedResourceOutletComponent, isStandalone: true, selector: "praxis-related-resource-outlet", inputs: { surface: { classPropertyName: "surface", publicName: "surface", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: false, transformFunction: null }, surfaceCatalog: { classPropertyName: "surfaceCatalog", publicName: "surfaceCatalog", isSignal: true, isRequired: false, transformFunction: null }, discoverySource: { classPropertyName: "discoverySource", publicName: "discoverySource", isSignal: true, isRequired: false, transformFunction: null }, parentLinks: { classPropertyName: "parentLinks", publicName: "parentLinks", isSignal: true, isRequired: false, transformFunction: null }, apiEndpointKey: { classPropertyName: "apiEndpointKey", publicName: "apiEndpointKey", isSignal: true, isRequired: false, transformFunction: null }, apiUrlEntry: { classPropertyName: "apiUrlEntry", publicName: "apiUrlEntry", isSignal: true, isRequired: false, transformFunction: null }, parentRecord: { classPropertyName: "parentRecord", publicName: "parentRecord", isSignal: true, isRequired: false, transformFunction: null }, parentResourceId: { classPropertyName: "parentResourceId", publicName: "parentResourceId", isSignal: true, isRequired: false, transformFunction: null }, parentResourcePath: { classPropertyName: "parentResourcePath", publicName: "parentResourcePath", isSignal: true, isRequired: false, transformFunction: null }, presentation: { classPropertyName: "presentation", publicName: "presentation", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, tableId: { classPropertyName: "tableId", publicName: "tableId", isSignal: true, isRequired: false, transformFunction: null }, tableConfig: { classPropertyName: "tableConfig", publicName: "tableConfig", isSignal: true, isRequired: false, transformFunction: null }, emptyState: { classPropertyName: "emptyState", publicName: "emptyState", isSignal: true, isRequired: false, transformFunction: null }, queryContext: { classPropertyName: "queryContext", publicName: "queryContext", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, stateReason: { classPropertyName: "stateReason", publicName: "stateReason", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, strictValidation: { classPropertyName: "strictValidation", publicName: "strictValidation", isSignal: true, isRequired: false, transformFunction: null }, ownerWidgetKey: { classPropertyName: "ownerWidgetKey", publicName: "ownerWidgetKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { surfaceOpen: "surfaceOpen", widgetEvent: "widgetEvent", resourceEvent: "resourceEvent" }, host: { attributes: { "data-praxis-related-resource-outlet": "core" }, properties: { "attr.data-state": "renderResolution().state" } }, providers: [providePraxisI18nConfig(RELATED_RESOURCE_OUTLET_I18N_CONFIG)], ngImport: i0, template: `
38489
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisRelatedResourceOutletComponent, isStandalone: true, selector: "praxis-related-resource-outlet", inputs: { surface: { classPropertyName: "surface", publicName: "surface", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: false, transformFunction: null }, surfaceCatalog: { classPropertyName: "surfaceCatalog", publicName: "surfaceCatalog", isSignal: true, isRequired: false, transformFunction: null }, discoverySource: { classPropertyName: "discoverySource", publicName: "discoverySource", isSignal: true, isRequired: false, transformFunction: null }, parentLinks: { classPropertyName: "parentLinks", publicName: "parentLinks", isSignal: true, isRequired: false, transformFunction: null }, apiEndpointKey: { classPropertyName: "apiEndpointKey", publicName: "apiEndpointKey", isSignal: true, isRequired: false, transformFunction: null }, apiUrlEntry: { classPropertyName: "apiUrlEntry", publicName: "apiUrlEntry", isSignal: true, isRequired: false, transformFunction: null }, parentRecord: { classPropertyName: "parentRecord", publicName: "parentRecord", isSignal: true, isRequired: false, transformFunction: null }, parentResourceId: { classPropertyName: "parentResourceId", publicName: "parentResourceId", isSignal: true, isRequired: false, transformFunction: null }, parentResourcePath: { classPropertyName: "parentResourcePath", publicName: "parentResourcePath", isSignal: true, isRequired: false, transformFunction: null }, presentation: { classPropertyName: "presentation", publicName: "presentation", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, tableId: { classPropertyName: "tableId", publicName: "tableId", isSignal: true, isRequired: false, transformFunction: null }, tableConfig: { classPropertyName: "tableConfig", publicName: "tableConfig", isSignal: true, isRequired: false, transformFunction: null }, enableCustomization: { classPropertyName: "enableCustomization", publicName: "enableCustomization", isSignal: true, isRequired: false, transformFunction: null }, authoringCapability: { classPropertyName: "authoringCapability", publicName: "authoringCapability", isSignal: true, isRequired: false, transformFunction: null }, emptyState: { classPropertyName: "emptyState", publicName: "emptyState", isSignal: true, isRequired: false, transformFunction: null }, queryContext: { classPropertyName: "queryContext", publicName: "queryContext", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, stateReason: { classPropertyName: "stateReason", publicName: "stateReason", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, strictValidation: { classPropertyName: "strictValidation", publicName: "strictValidation", isSignal: true, isRequired: false, transformFunction: null }, ownerWidgetKey: { classPropertyName: "ownerWidgetKey", publicName: "ownerWidgetKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { surfaceOpen: "surfaceOpen", widgetEvent: "widgetEvent", resourceEvent: "resourceEvent" }, host: { attributes: { "data-praxis-related-resource-outlet": "core" }, properties: { "attr.data-state": "renderResolution().state" } }, providers: [providePraxisI18nConfig(RELATED_RESOURCE_OUTLET_I18N_CONFIG)], ngImport: i0, template: `
38066
38490
  <section class="pdx-related-outlet" [class.pdx-related-outlet--compact]="compact()">
38067
38491
  @if (renderResolution().state === 'ready' && mode() === 'inline' && renderResolution().payload?.widget) {
38068
38492
  <ng-container
@@ -38153,7 +38577,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
38153
38577
  }
38154
38578
  </section>
38155
38579
  `, styles: [":host{display:block;min-width:0}.pdx-related-outlet{display:block;min-width:0;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__state{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--pdx-related-outlet-gap, 12px);min-height:var(--pdx-related-outlet-min-height, 64px);padding:var(--pdx-related-outlet-padding, 12px);border:1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, .16));border-radius:var(--pdx-related-outlet-radius, 8px);background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface, transparent))}.pdx-related-outlet--compact .pdx-related-outlet__state{min-height:var(--pdx-related-outlet-compact-min-height, 48px);padding:var(--pdx-related-outlet-compact-padding, 8px 10px)}.pdx-related-outlet__state--ready{border-color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__icon{display:inline-grid;place-items:center;width:32px;height:32px;color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__state--busy .pdx-related-outlet__icon{color:var(--md-sys-color-secondary, currentColor)}.pdx-related-outlet__copy{display:grid;gap:2px;min-width:0}.pdx-related-outlet__copy h3,.pdx-related-outlet__copy p{margin:0}.pdx-related-outlet__copy h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.25rem system-ui);color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__copy p{font:var(--md-sys-typescale-body-small, 400 .82rem/1.15rem system-ui);color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:600px){.pdx-related-outlet__state{grid-template-columns:auto minmax(0,1fr)}.pdx-related-outlet__state button{grid-column:1 / -1;justify-self:start}}\n"] }]
38156
- }], ctorParameters: () => [], propDecorators: { surface: [{ type: i0.Input, args: [{ isSignal: true, alias: "surface", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: false }] }], surfaceCatalog: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceCatalog", required: false }] }], discoverySource: [{ type: i0.Input, args: [{ isSignal: true, alias: "discoverySource", required: false }] }], parentLinks: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentLinks", required: false }] }], apiEndpointKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiEndpointKey", required: false }] }], apiUrlEntry: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiUrlEntry", required: false }] }], parentRecord: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentRecord", required: false }] }], parentResourceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentResourceId", required: false }] }], parentResourcePath: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentResourcePath", required: false }] }], presentation: [{ type: i0.Input, args: [{ isSignal: true, alias: "presentation", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], tableId: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableId", required: false }] }], tableConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableConfig", required: false }] }], emptyState: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyState", required: false }] }], queryContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "queryContext", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], stateReason: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateReason", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], strictValidation: [{ type: i0.Input, args: [{ isSignal: true, alias: "strictValidation", required: false }] }], ownerWidgetKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "ownerWidgetKey", required: false }] }], surfaceOpen: [{ type: i0.Output, args: ["surfaceOpen"] }], widgetEvent: [{ type: i0.Output, args: ["widgetEvent"] }], resourceEvent: [{ type: i0.Output, args: ["resourceEvent"] }] } });
38580
+ }], ctorParameters: () => [], propDecorators: { surface: [{ type: i0.Input, args: [{ isSignal: true, alias: "surface", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: false }] }], surfaceCatalog: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceCatalog", required: false }] }], discoverySource: [{ type: i0.Input, args: [{ isSignal: true, alias: "discoverySource", required: false }] }], parentLinks: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentLinks", required: false }] }], apiEndpointKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiEndpointKey", required: false }] }], apiUrlEntry: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiUrlEntry", required: false }] }], parentRecord: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentRecord", required: false }] }], parentResourceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentResourceId", required: false }] }], parentResourcePath: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentResourcePath", required: false }] }], presentation: [{ type: i0.Input, args: [{ isSignal: true, alias: "presentation", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], tableId: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableId", required: false }] }], tableConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableConfig", required: false }] }], enableCustomization: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableCustomization", required: false }] }], authoringCapability: [{ type: i0.Input, args: [{ isSignal: true, alias: "authoringCapability", required: false }] }], emptyState: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyState", required: false }] }], queryContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "queryContext", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], stateReason: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateReason", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], strictValidation: [{ type: i0.Input, args: [{ isSignal: true, alias: "strictValidation", required: false }] }], ownerWidgetKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "ownerWidgetKey", required: false }] }], surfaceOpen: [{ type: i0.Output, args: ["surfaceOpen"] }], widgetEvent: [{ type: i0.Output, args: ["widgetEvent"] }], resourceEvent: [{ type: i0.Output, args: ["resourceEvent"] }] } });
38157
38581
 
38158
38582
  const PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA = {
38159
38583
  id: 'praxis-related-resource-outlet',
@@ -38176,6 +38600,8 @@ const PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA = {
38176
38600
  { name: 'queryContext', type: 'RelatedResourceQueryContext | null', description: 'QueryContext base mesclado com o filtro canônico da relação filha.' },
38177
38601
  { name: 'tableConfig', type: 'Record<string, unknown> | null', description: 'Configuracao parcial da tabela filha materializada, mesclada ao preset canonico.' },
38178
38602
  { name: 'emptyState', type: 'Record<string, unknown> | null', description: 'Override opcional para behavior.emptyState da tabela filha. Quando omitido, o outlet deriva texto, icone, layout e ação create a partir de surface.relatedResource e dos metadados da surface.' },
38603
+ { name: 'enableCustomization', type: 'boolean', description: 'Opt-in explicito para authoring governado da tabela filha.', default: false },
38604
+ { name: 'authoringCapability', type: 'string | null', description: 'Capability publica do EnterpriseRuntimeContext exigida quando o authoring da tabela filha estiver habilitado.' },
38179
38605
  { name: 'mode', type: "'inline' | 'open-action'", description: 'Renderiza a tabela filha inline ou emite payload para abertura host-mediated.', default: 'inline' },
38180
38606
  { name: 'state', type: 'RelatedResourceResolutionState | null', description: 'Override de estado para hosts/outlets que estejam carregando discovery remoto.' },
38181
38607
  { name: 'compact', type: 'boolean', description: 'Reduz densidade visual dos estados não materializados.', default: false },
@@ -38263,7 +38689,7 @@ class EmptyStateCardComponent {
38263
38689
  </div>
38264
38690
  </mat-card-content>
38265
38691
  </mat-card>
38266
- `, isInline: true, styles: [".empty-card{display:block;margin:var(--pdx-empty-state-margin, 12px);border-color:var(--pdx-empty-state-border-color, var(--md-sys-color-outline-variant));border-radius:var(--pdx-empty-state-radius, 8px);background:var(--pdx-empty-state-bg, var(--md-sys-color-surface));color:var(--pdx-empty-state-fg, var(--md-sys-color-on-surface));--empty-icon-color: var(--pdx-empty-state-icon-color, var(--md-sys-color-on-surface-variant))}.empty-card.empty-inline,.empty-card.variant-inline{margin:var(--pdx-empty-state-inline-margin, 8px 0)}.empty-card.variant-panel{margin:var(--pdx-empty-state-panel-margin, 0)}.empty-card.variant-transparent{margin:var(--pdx-empty-state-transparent-margin, 0);border-color:transparent;background:transparent;box-shadow:none}.content{display:flex;align-items:center;gap:var(--pdx-empty-state-gap, 12px)}.align-center .content{flex-direction:column;justify-content:center;text-align:center}.icon{display:inline-grid;place-items:center;flex:0 0 auto;font-size:var(--pdx-empty-state-icon-size, 32px);width:var(--pdx-empty-state-icon-box-size, 32px);height:var(--pdx-empty-state-icon-box-size, 32px);color:var(--empty-icon-color)}.icon-circle .icon,.icon-soft .icon{width:var(--pdx-empty-state-icon-container-size, 44px);height:var(--pdx-empty-state-icon-container-size, 44px);border-radius:var(--pdx-empty-state-icon-container-radius, 999px);font-size:var(--pdx-empty-state-icon-container-icon-size, 22px)}.icon-circle .icon{border:1px solid var(--pdx-empty-state-icon-container-border-color, color-mix(in srgb, var(--empty-icon-color) 24%, transparent));background:var(--pdx-empty-state-icon-container-bg, color-mix(in srgb, var(--empty-icon-color) 10%, transparent))}.icon-soft .icon{background:var(--pdx-empty-state-icon-container-bg, color-mix(in srgb, var(--empty-icon-color) 10%, transparent))}.texts{display:grid;gap:var(--pdx-empty-state-text-gap, 4px)}.align-center .texts{justify-items:center}.title{margin:0;font-family:var(--pdx-empty-state-title-font-family, var(--md-sys-typescale-title-small-font-family, inherit));font-size:var(--pdx-empty-state-title-font-size, 16px);font-weight:var(--pdx-empty-state-title-font-weight, 600);line-height:var(--pdx-empty-state-title-line-height, 1.3);color:var(--pdx-empty-state-title-color, var(--md-sys-color-on-surface))}.desc{margin:0;max-width:var(--pdx-empty-state-description-max-width, none);font-family:var(--pdx-empty-state-description-font-family, var(--md-sys-typescale-body-medium-font-family, inherit));font-size:var(--pdx-empty-state-description-font-size, inherit);line-height:var(--pdx-empty-state-description-line-height, 1.4);color:var(--pdx-empty-state-description-color, var(--md-sys-color-on-surface-variant))}.actions{display:flex;justify-content:var(--pdx-empty-state-actions-justify, flex-start);gap:var(--pdx-empty-state-actions-gap, 8px);margin-top:var(--pdx-empty-state-actions-margin-top, 12px);flex-wrap:wrap}.align-center .actions{justify-content:var(--pdx-empty-state-actions-justify, center)}.density-compact .content{gap:var(--pdx-empty-state-compact-gap, 8px)}.density-compact .icon{font-size:var(--pdx-empty-state-compact-icon-size, 24px);width:var(--pdx-empty-state-compact-icon-box-size, 24px);height:var(--pdx-empty-state-compact-icon-box-size, 24px)}.density-compact.icon-circle .icon,.density-compact.icon-soft .icon{width:var(--pdx-empty-state-compact-icon-container-size, 36px);height:var(--pdx-empty-state-compact-icon-container-size, 36px);font-size:var(--pdx-empty-state-compact-icon-container-icon-size, 20px)}.empty-card.tone-primary{--empty-icon-color: var(--md-sys-color-primary)}.empty-card.tone-secondary{--empty-icon-color: var(--md-sys-color-secondary)}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i2$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i2$1.MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
38692
+ `, isInline: true, styles: [".empty-card{display:block;margin:var(--pdx-empty-state-margin, 12px);border-color:var(--pdx-empty-state-border-color, var(--md-sys-color-outline-variant));border-radius:var(--pdx-empty-state-radius, 8px);background:var(--pdx-empty-state-bg, var(--md-sys-color-surface));color:var(--pdx-empty-state-fg, var(--md-sys-color-on-surface));--empty-icon-color: var(--pdx-empty-state-icon-color, var(--md-sys-color-on-surface-variant))}.empty-card.empty-inline,.empty-card.variant-inline{margin:var(--pdx-empty-state-inline-margin, 8px 0)}.empty-card.variant-panel{margin:var(--pdx-empty-state-panel-margin, 0)}.empty-card.variant-transparent{margin:var(--pdx-empty-state-transparent-margin, 0);border-color:transparent;background:transparent;box-shadow:none}.content{display:flex;align-items:center;gap:var(--pdx-empty-state-gap, 12px)}.align-center .content{flex-direction:column;justify-content:center;text-align:center}.icon{display:inline-grid;place-items:center;flex:0 0 auto;font-size:var(--pdx-empty-state-icon-size, 32px);width:var(--pdx-empty-state-icon-box-size, 32px);height:var(--pdx-empty-state-icon-box-size, 32px);color:var(--empty-icon-color)}.icon-circle .icon,.icon-soft .icon{width:var(--pdx-empty-state-icon-container-size, 44px);height:var(--pdx-empty-state-icon-container-size, 44px);border-radius:var(--pdx-empty-state-icon-container-radius, 999px);font-size:var(--pdx-empty-state-icon-container-icon-size, 22px)}.icon-circle .icon{border:1px solid var(--pdx-empty-state-icon-container-border-color, color-mix(in srgb, var(--empty-icon-color) 24%, transparent));background:var(--pdx-empty-state-icon-container-bg, color-mix(in srgb, var(--empty-icon-color) 10%, transparent))}.icon-soft .icon{background:var(--pdx-empty-state-icon-container-bg, color-mix(in srgb, var(--empty-icon-color) 10%, transparent))}.texts{display:grid;gap:var(--pdx-empty-state-text-gap, 4px)}.align-center .texts{justify-items:center}.title{margin:0;font-family:var(--pdx-empty-state-title-font-family, var(--md-sys-typescale-title-small-font-family, inherit));font-size:var(--pdx-empty-state-title-font-size, 16px);font-weight:var(--pdx-empty-state-title-font-weight, 600);line-height:var(--pdx-empty-state-title-line-height, 1.3);color:var(--pdx-empty-state-title-color, var(--md-sys-color-on-surface))}.desc{margin:0;max-width:var(--pdx-empty-state-description-max-width, none);font-family:var(--pdx-empty-state-description-font-family, var(--md-sys-typescale-body-medium-font-family, inherit));font-size:var(--pdx-empty-state-description-font-size, inherit);line-height:var(--pdx-empty-state-description-line-height, 1.4);color:var(--pdx-empty-state-description-color, var(--md-sys-color-on-surface-variant))}.actions{display:flex;justify-content:var(--pdx-empty-state-actions-justify, flex-start);gap:var(--pdx-empty-state-actions-gap, 8px);margin-top:var(--pdx-empty-state-actions-margin-top, 12px);flex-wrap:wrap}.actions .mat-mdc-button-base{height:var(--pdx-empty-state-action-height, auto);min-height:var(--pdx-empty-state-action-height, auto)}.align-center .actions{justify-content:var(--pdx-empty-state-actions-justify, center)}.density-compact .content{gap:var(--pdx-empty-state-compact-gap, 8px)}.density-compact .icon{font-size:var(--pdx-empty-state-compact-icon-size, 24px);width:var(--pdx-empty-state-compact-icon-box-size, 24px);height:var(--pdx-empty-state-compact-icon-box-size, 24px)}.density-compact.icon-circle .icon,.density-compact.icon-soft .icon{width:var(--pdx-empty-state-compact-icon-container-size, 36px);height:var(--pdx-empty-state-compact-icon-container-size, 36px);font-size:var(--pdx-empty-state-compact-icon-container-icon-size, 20px)}.empty-card.tone-primary{--empty-icon-color: var(--md-sys-color-primary)}.empty-card.tone-secondary{--empty-icon-color: var(--md-sys-color-secondary)}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i2$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i2$1.MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
38267
38693
  }
38268
38694
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EmptyStateCardComponent, decorators: [{
38269
38695
  type: Component,
@@ -38314,7 +38740,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
38314
38740
  </div>
38315
38741
  </mat-card-content>
38316
38742
  </mat-card>
38317
- `, styles: [".empty-card{display:block;margin:var(--pdx-empty-state-margin, 12px);border-color:var(--pdx-empty-state-border-color, var(--md-sys-color-outline-variant));border-radius:var(--pdx-empty-state-radius, 8px);background:var(--pdx-empty-state-bg, var(--md-sys-color-surface));color:var(--pdx-empty-state-fg, var(--md-sys-color-on-surface));--empty-icon-color: var(--pdx-empty-state-icon-color, var(--md-sys-color-on-surface-variant))}.empty-card.empty-inline,.empty-card.variant-inline{margin:var(--pdx-empty-state-inline-margin, 8px 0)}.empty-card.variant-panel{margin:var(--pdx-empty-state-panel-margin, 0)}.empty-card.variant-transparent{margin:var(--pdx-empty-state-transparent-margin, 0);border-color:transparent;background:transparent;box-shadow:none}.content{display:flex;align-items:center;gap:var(--pdx-empty-state-gap, 12px)}.align-center .content{flex-direction:column;justify-content:center;text-align:center}.icon{display:inline-grid;place-items:center;flex:0 0 auto;font-size:var(--pdx-empty-state-icon-size, 32px);width:var(--pdx-empty-state-icon-box-size, 32px);height:var(--pdx-empty-state-icon-box-size, 32px);color:var(--empty-icon-color)}.icon-circle .icon,.icon-soft .icon{width:var(--pdx-empty-state-icon-container-size, 44px);height:var(--pdx-empty-state-icon-container-size, 44px);border-radius:var(--pdx-empty-state-icon-container-radius, 999px);font-size:var(--pdx-empty-state-icon-container-icon-size, 22px)}.icon-circle .icon{border:1px solid var(--pdx-empty-state-icon-container-border-color, color-mix(in srgb, var(--empty-icon-color) 24%, transparent));background:var(--pdx-empty-state-icon-container-bg, color-mix(in srgb, var(--empty-icon-color) 10%, transparent))}.icon-soft .icon{background:var(--pdx-empty-state-icon-container-bg, color-mix(in srgb, var(--empty-icon-color) 10%, transparent))}.texts{display:grid;gap:var(--pdx-empty-state-text-gap, 4px)}.align-center .texts{justify-items:center}.title{margin:0;font-family:var(--pdx-empty-state-title-font-family, var(--md-sys-typescale-title-small-font-family, inherit));font-size:var(--pdx-empty-state-title-font-size, 16px);font-weight:var(--pdx-empty-state-title-font-weight, 600);line-height:var(--pdx-empty-state-title-line-height, 1.3);color:var(--pdx-empty-state-title-color, var(--md-sys-color-on-surface))}.desc{margin:0;max-width:var(--pdx-empty-state-description-max-width, none);font-family:var(--pdx-empty-state-description-font-family, var(--md-sys-typescale-body-medium-font-family, inherit));font-size:var(--pdx-empty-state-description-font-size, inherit);line-height:var(--pdx-empty-state-description-line-height, 1.4);color:var(--pdx-empty-state-description-color, var(--md-sys-color-on-surface-variant))}.actions{display:flex;justify-content:var(--pdx-empty-state-actions-justify, flex-start);gap:var(--pdx-empty-state-actions-gap, 8px);margin-top:var(--pdx-empty-state-actions-margin-top, 12px);flex-wrap:wrap}.align-center .actions{justify-content:var(--pdx-empty-state-actions-justify, center)}.density-compact .content{gap:var(--pdx-empty-state-compact-gap, 8px)}.density-compact .icon{font-size:var(--pdx-empty-state-compact-icon-size, 24px);width:var(--pdx-empty-state-compact-icon-box-size, 24px);height:var(--pdx-empty-state-compact-icon-box-size, 24px)}.density-compact.icon-circle .icon,.density-compact.icon-soft .icon{width:var(--pdx-empty-state-compact-icon-container-size, 36px);height:var(--pdx-empty-state-compact-icon-container-size, 36px);font-size:var(--pdx-empty-state-compact-icon-container-icon-size, 20px)}.empty-card.tone-primary{--empty-icon-color: var(--md-sys-color-primary)}.empty-card.tone-secondary{--empty-icon-color: var(--md-sys-color-secondary)}\n"] }]
38743
+ `, styles: [".empty-card{display:block;margin:var(--pdx-empty-state-margin, 12px);border-color:var(--pdx-empty-state-border-color, var(--md-sys-color-outline-variant));border-radius:var(--pdx-empty-state-radius, 8px);background:var(--pdx-empty-state-bg, var(--md-sys-color-surface));color:var(--pdx-empty-state-fg, var(--md-sys-color-on-surface));--empty-icon-color: var(--pdx-empty-state-icon-color, var(--md-sys-color-on-surface-variant))}.empty-card.empty-inline,.empty-card.variant-inline{margin:var(--pdx-empty-state-inline-margin, 8px 0)}.empty-card.variant-panel{margin:var(--pdx-empty-state-panel-margin, 0)}.empty-card.variant-transparent{margin:var(--pdx-empty-state-transparent-margin, 0);border-color:transparent;background:transparent;box-shadow:none}.content{display:flex;align-items:center;gap:var(--pdx-empty-state-gap, 12px)}.align-center .content{flex-direction:column;justify-content:center;text-align:center}.icon{display:inline-grid;place-items:center;flex:0 0 auto;font-size:var(--pdx-empty-state-icon-size, 32px);width:var(--pdx-empty-state-icon-box-size, 32px);height:var(--pdx-empty-state-icon-box-size, 32px);color:var(--empty-icon-color)}.icon-circle .icon,.icon-soft .icon{width:var(--pdx-empty-state-icon-container-size, 44px);height:var(--pdx-empty-state-icon-container-size, 44px);border-radius:var(--pdx-empty-state-icon-container-radius, 999px);font-size:var(--pdx-empty-state-icon-container-icon-size, 22px)}.icon-circle .icon{border:1px solid var(--pdx-empty-state-icon-container-border-color, color-mix(in srgb, var(--empty-icon-color) 24%, transparent));background:var(--pdx-empty-state-icon-container-bg, color-mix(in srgb, var(--empty-icon-color) 10%, transparent))}.icon-soft .icon{background:var(--pdx-empty-state-icon-container-bg, color-mix(in srgb, var(--empty-icon-color) 10%, transparent))}.texts{display:grid;gap:var(--pdx-empty-state-text-gap, 4px)}.align-center .texts{justify-items:center}.title{margin:0;font-family:var(--pdx-empty-state-title-font-family, var(--md-sys-typescale-title-small-font-family, inherit));font-size:var(--pdx-empty-state-title-font-size, 16px);font-weight:var(--pdx-empty-state-title-font-weight, 600);line-height:var(--pdx-empty-state-title-line-height, 1.3);color:var(--pdx-empty-state-title-color, var(--md-sys-color-on-surface))}.desc{margin:0;max-width:var(--pdx-empty-state-description-max-width, none);font-family:var(--pdx-empty-state-description-font-family, var(--md-sys-typescale-body-medium-font-family, inherit));font-size:var(--pdx-empty-state-description-font-size, inherit);line-height:var(--pdx-empty-state-description-line-height, 1.4);color:var(--pdx-empty-state-description-color, var(--md-sys-color-on-surface-variant))}.actions{display:flex;justify-content:var(--pdx-empty-state-actions-justify, flex-start);gap:var(--pdx-empty-state-actions-gap, 8px);margin-top:var(--pdx-empty-state-actions-margin-top, 12px);flex-wrap:wrap}.actions .mat-mdc-button-base{height:var(--pdx-empty-state-action-height, auto);min-height:var(--pdx-empty-state-action-height, auto)}.align-center .actions{justify-content:var(--pdx-empty-state-actions-justify, center)}.density-compact .content{gap:var(--pdx-empty-state-compact-gap, 8px)}.density-compact .icon{font-size:var(--pdx-empty-state-compact-icon-size, 24px);width:var(--pdx-empty-state-compact-icon-box-size, 24px);height:var(--pdx-empty-state-compact-icon-box-size, 24px)}.density-compact.icon-circle .icon,.density-compact.icon-soft .icon{width:var(--pdx-empty-state-compact-icon-container-size, 36px);height:var(--pdx-empty-state-compact-icon-container-size, 36px);font-size:var(--pdx-empty-state-compact-icon-container-icon-size, 20px)}.empty-card.tone-primary{--empty-icon-color: var(--md-sys-color-primary)}.empty-card.tone-secondary{--empty-icon-color: var(--md-sys-color-secondary)}\n"] }]
38318
38744
  }], propDecorators: { icon: [{
38319
38745
  type: Input
38320
38746
  }], title: [{
@@ -39687,4 +40113,4 @@ function provideHookWhitelist(allowed) {
39687
40113
  * Generated bundle index. Do not edit.
39688
40114
  */
39689
40115
 
39690
- 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, 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_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, 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, 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, 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, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, 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, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };
40116
+ 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_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, 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, 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, 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, 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, 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 };