@praxisui/core 9.0.5-rc.9 → 9.0.6

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.
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { Component, InjectionToken, Injectable, inject, Inject, Optional, makeEnvironmentProviders, APP_INITIALIZER, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, ErrorHandler, Input, Directive, input, booleanAttribute, ChangeDetectionStrategy, EventEmitter, Output, SecurityContext, ViewContainerRef, SimpleChange, ContentChild, HostBinding, HostListener, ViewChildren, ViewChild, Injector, output, effect } from '@angular/core';
3
3
  import * as i1 from '@angular/common/http';
4
4
  import { HttpHeaders, HttpClient, HttpParams, HttpResponse, HttpContextToken, HTTP_INTERCEPTORS, withInterceptors } from '@angular/common/http';
5
- import { of, defer, throwError, from, EMPTY, BehaviorSubject, firstValueFrom, Subject, finalize as finalize$1, shareReplay as shareReplay$1, map as map$1, switchMap as switchMap$1, catchError as catchError$1 } from 'rxjs';
5
+ import { of, defer, throwError, from, EMPTY, BehaviorSubject, firstValueFrom, Subject, finalize as finalize$1, shareReplay as shareReplay$1, map as map$1, switchMap as switchMap$1, catchError as catchError$1, forkJoin } from 'rxjs';
6
6
  import { switchMap, take, map, catchError, concatMap, tap, shareReplay, takeUntil, toArray, finalize } from 'rxjs/operators';
7
7
  import * as i1$3 from '@angular/common';
8
8
  import { Location, DOCUMENT, CommonModule } from '@angular/common';
@@ -807,7 +807,7 @@ function resolveControlTypeAlias(value, fallback = FieldControlType.INPUT) {
807
807
  }
808
808
 
809
809
  function normalizeResourceIdentityContract(value) {
810
- if (!isRecord$3(value))
810
+ if (!isRecord$5(value))
811
811
  return null;
812
812
  const keyField = normalizeText$3(value['keyField']);
813
813
  const titleField = normalizeText$3(value['titleField']);
@@ -835,7 +835,7 @@ function normalizeResourceIdentityContract(value) {
835
835
  function resolveResourceIdentityContract(options) {
836
836
  const diagnostics = [];
837
837
  const explicit = normalizeResourceIdentityContract(options.explicitIdentity);
838
- const hasExplicitDeclaration = isRecord$3(options.explicitIdentity);
838
+ const hasExplicitDeclaration = isRecord$5(options.explicitIdentity);
839
839
  if (explicit && explicit.valid !== false) {
840
840
  return {
841
841
  contract: { ...explicit, source: 'explicit' },
@@ -963,7 +963,7 @@ function normalizeResourceIdentityDiagnostics(value) {
963
963
  if (!Array.isArray(value))
964
964
  return [];
965
965
  return value.filter((item) => {
966
- return isRecord$3(item)
966
+ return isRecord$5(item)
967
967
  && isResourceIdentityDiagnosticCode(item['code'])
968
968
  && (item['severity'] === 'info' || item['severity'] === 'warning')
969
969
  && typeof item['message'] === 'string';
@@ -992,7 +992,7 @@ function normalizeStringList(value) {
992
992
  return [];
993
993
  return [...new Set(value.map(normalizeText$3).filter((item) => !!item))];
994
994
  }
995
- function isRecord$3(value) {
995
+ function isRecord$5(value) {
996
996
  return !!value && typeof value === 'object' && !Array.isArray(value);
997
997
  }
998
998
 
@@ -2556,15 +2556,22 @@ class SchemaNormalizerService {
2556
2556
  const key = String(raw.key ?? '').trim();
2557
2557
  const kind = String(raw.kind ?? '').trim();
2558
2558
  const minSearchChars = Number(raw.minSearchChars);
2559
+ const inputFormat = String(raw.inputFormat ?? 'text').trim();
2559
2560
  if (!key ||
2560
2561
  seenKeys.has(key) ||
2561
2562
  !LOOKUP_SEARCH_STRATEGY_KINDS.has(kind) ||
2563
+ !['text', 'digits'].includes(inputFormat) ||
2562
2564
  !Number.isInteger(minSearchChars) ||
2563
2565
  minSearchChars < 1) {
2564
2566
  return undefined;
2565
2567
  }
2566
2568
  seenKeys.add(key);
2567
- return { key, kind, minSearchChars };
2569
+ return {
2570
+ key,
2571
+ kind,
2572
+ minSearchChars,
2573
+ ...(inputFormat === 'digits' ? { inputFormat } : {}),
2574
+ };
2568
2575
  })
2569
2576
  .filter((item) => !!item);
2570
2577
  if (searchStrategies.length) {
@@ -6199,7 +6206,7 @@ function createDefaultTableConfig() {
6199
6206
  },
6200
6207
  resizing: {
6201
6208
  enabled: false,
6202
- autoFit: false,
6209
+ autoFit: true,
6203
6210
  persistWidths: true,
6204
6211
  minColumnWidth: 50,
6205
6212
  maxColumnWidth: 500,
@@ -12224,8 +12231,14 @@ class ErrorMessageService {
12224
12231
  }
12225
12232
  normalizeSubmitError(error) {
12226
12233
  const status = this.numberValue(error?.status);
12227
- const payload = this.objectValue(error?.error) ?? this.objectValue(error);
12228
- const details = this.normalizeDetails(payload?.['errors']);
12234
+ const errorObject = this.objectValue(error);
12235
+ const responsePayload = this.objectValue(errorObject?.['error']);
12236
+ const payload = responsePayload
12237
+ ?? (Array.isArray(errorObject?.['errors']) ? errorObject : undefined);
12238
+ const isPublicClientError = status !== undefined && status >= 400 && status < 500;
12239
+ const details = isPublicClientError
12240
+ ? this.normalizeDetails(payload?.['errors'])
12241
+ : [];
12229
12242
  if (details.length) {
12230
12243
  return {
12231
12244
  message: this.textValue(payload?.['message']) ?? details[0].message,
@@ -12233,10 +12246,10 @@ class ErrorMessageService {
12233
12246
  };
12234
12247
  }
12235
12248
  const publicMessage = this.textValue(payload?.['message']);
12236
- if (publicMessage && status !== undefined && status >= 400 && status < 500) {
12249
+ if (publicMessage && isPublicClientError) {
12237
12250
  return { message: publicMessage, details: [] };
12238
12251
  }
12239
- return { message: this.fallbackMessage(error, status), details: [] };
12252
+ return { message: this.fallbackMessage(status), details: [] };
12240
12253
  }
12241
12254
  /**
12242
12255
  * Returns a generic message for an error returned during a form submit.
@@ -12245,7 +12258,7 @@ class ErrorMessageService {
12245
12258
  getSubmitErrorMessage(error) {
12246
12259
  return this.normalizeSubmitError(error).message;
12247
12260
  }
12248
- fallbackMessage(error, status) {
12261
+ fallbackMessage(status) {
12249
12262
  if (status === 0) {
12250
12263
  return this.tx('global.submitError.network', 'Não foi possível conectar ao servidor. Verifique sua conexão ou se o servidor está disponível.');
12251
12264
  }
@@ -12255,9 +12268,7 @@ class ErrorMessageService {
12255
12268
  if (status === 400 || status === 422) {
12256
12269
  return this.tx('global.submitError.invalidData', 'Dados inválidos ou inconsistentes. Verifique os campos e tente novamente.');
12257
12270
  }
12258
- return status === undefined
12259
- ? this.textValue(error?.message) ?? this.genericSubmitError()
12260
- : this.genericSubmitError();
12271
+ return this.genericSubmitError();
12261
12272
  }
12262
12273
  normalizeDetails(value) {
12263
12274
  if (!Array.isArray(value))
@@ -13844,6 +13855,13 @@ class ResourceDiscoveryService {
13844
13855
  getActions(source, options) {
13845
13856
  return this.followLink(source, 'actions', options);
13846
13857
  }
13858
+ getActionsByResourceKey(resourceKey, options) {
13859
+ const normalizedResourceKey = resourceKey.trim();
13860
+ if (!normalizedResourceKey) {
13861
+ throw new Error('ResourceDiscoveryService requires a resource key for action discovery.');
13862
+ }
13863
+ return this.http.get(this.resolveHref('/schemas/actions', options), { params: new HttpParams().set('resource', normalizedResourceKey) });
13864
+ }
13847
13865
  getCapabilities(source, options) {
13848
13866
  return this.followLink(source, 'capabilities', options);
13849
13867
  }
@@ -14162,7 +14180,7 @@ const SURFACE_OPEN_PRESETS = [
14162
14180
  * Invalid roles are omitted and a completely empty context resolves to `null`.
14163
14181
  */
14164
14182
  function normalizeSurfaceOperationContext(value) {
14165
- if (!isRecord$2(value))
14183
+ if (!isRecord$4(value))
14166
14184
  return null;
14167
14185
  const taskScope = normalizeResourceRef(value['taskScope']);
14168
14186
  const subject = normalizeResourceRef(value['subject']);
@@ -14176,7 +14194,7 @@ function normalizeSurfaceOperationContext(value) {
14176
14194
  };
14177
14195
  }
14178
14196
  function normalizeResourceRef(value) {
14179
- if (!isRecord$2(value))
14197
+ if (!isRecord$4(value))
14180
14198
  return undefined;
14181
14199
  const resourceKey = normalizeText(value['resourceKey']);
14182
14200
  const resourceId = normalizeResourceId(value['resourceId']);
@@ -14190,7 +14208,7 @@ function normalizeResourceRef(value) {
14190
14208
  };
14191
14209
  }
14192
14210
  function normalizeRelationship(value) {
14193
- if (!isRecord$2(value))
14211
+ if (!isRecord$4(value))
14194
14212
  return undefined;
14195
14213
  const surfaceId = normalizeText(value['surfaceId']);
14196
14214
  const childResourceKey = normalizeText(value['childResourceKey']);
@@ -14204,7 +14222,7 @@ function normalizeRelationship(value) {
14204
14222
  };
14205
14223
  }
14206
14224
  function normalizeIdentity(value) {
14207
- if (!isRecord$2(value) || !Array.isArray(value['metadata']))
14225
+ if (!isRecord$4(value) || !Array.isArray(value['metadata']))
14208
14226
  return undefined;
14209
14227
  const key = normalizeIdentityPart(value['key']);
14210
14228
  const title = normalizeIdentityPart(value['title']);
@@ -14227,7 +14245,7 @@ function normalizeIdentity(value) {
14227
14245
  };
14228
14246
  }
14229
14247
  function normalizeIdentityPart(value) {
14230
- if (!isRecord$2(value))
14248
+ if (!isRecord$4(value))
14231
14249
  return undefined;
14232
14250
  const field = normalizeText(value['field']);
14233
14251
  const partValue = normalizeDisplayValue(value['value']);
@@ -14250,11 +14268,11 @@ function normalizeDisplayValue(value) {
14250
14268
  return typeof value === 'boolean' ? value : undefined;
14251
14269
  }
14252
14270
  function cloneJsonRecord(value) {
14253
- if (!isRecord$2(value))
14271
+ if (!isRecord$4(value))
14254
14272
  return undefined;
14255
14273
  try {
14256
14274
  const cloned = JSON.parse(JSON.stringify(value));
14257
- return isRecord$2(cloned) ? cloned : undefined;
14275
+ return isRecord$4(cloned) ? cloned : undefined;
14258
14276
  }
14259
14277
  catch {
14260
14278
  return undefined;
@@ -14274,7 +14292,7 @@ function normalizeText(value) {
14274
14292
  const normalized = value.trim();
14275
14293
  return normalized || undefined;
14276
14294
  }
14277
- function isRecord$2(value) {
14295
+ function isRecord$4(value) {
14278
14296
  return !!value && typeof value === 'object' && !Array.isArray(value);
14279
14297
  }
14280
14298
 
@@ -14299,9 +14317,13 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
14299
14317
  'state.error.description': 'Ocorreu um erro ao preparar a superfície relacionada.',
14300
14318
  'emptyState.related.title': 'Sem registros em {label}',
14301
14319
  'emptyState.related.description': 'Esta coleção relacionada não possui registros para o contexto selecionado.',
14302
- 'emptyState.related.descriptionWithAction': 'Use a ação principal para adicionar um registro relacionado quando houver informações para registrar.',
14303
- 'emptyState.related.action.create': 'Adicionar registro',
14304
14320
  'action.open': 'Abrir relacionado',
14321
+ 'action.create.label': 'Adicionar {{noun}}',
14322
+ 'action.create.tooltip': 'Adicione {{noun}} ao contexto selecionado.',
14323
+ 'action.edit.label': 'Editar {{noun}}',
14324
+ 'action.edit.tooltip': 'Atualize os dados de {{noun}} no contexto selecionado.',
14325
+ 'action.delete.label': 'Remover {{noun}}',
14326
+ 'action.delete.tooltip': 'Remova {{noun}} do contexto selecionado.',
14305
14327
  'status.ready': 'Recurso relacionado pronto',
14306
14328
  },
14307
14329
  'en-US': {
@@ -14321,9 +14343,13 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
14321
14343
  'state.error.description': 'An error occurred while preparing the related surface.',
14322
14344
  'emptyState.related.title': 'No records in {label}',
14323
14345
  'emptyState.related.description': 'This related collection has no records for the selected context.',
14324
- 'emptyState.related.descriptionWithAction': 'Use the primary action to add a related record when there is information to capture.',
14325
- 'emptyState.related.action.create': 'Add record',
14326
14346
  'action.open': 'Open related',
14347
+ 'action.create.label': 'Add {{noun}}',
14348
+ 'action.create.tooltip': 'Add {{noun}} to the selected context.',
14349
+ 'action.edit.label': 'Edit {{noun}}',
14350
+ 'action.edit.tooltip': 'Update {{noun}} data in the selected context.',
14351
+ 'action.delete.label': 'Remove {{noun}}',
14352
+ 'action.delete.tooltip': 'Remove {{noun}} from the selected context.',
14327
14353
  'status.ready': 'Related resource ready',
14328
14354
  },
14329
14355
  },
@@ -14498,32 +14524,15 @@ class RelatedResourceSurfaceResolverService {
14498
14524
  const label = this.trim(request.title)
14499
14525
  || this.trim(surface.title)
14500
14526
  || this.humanizeResourceKey(relatedResource.childResourceKey);
14501
- const canCreate = relatedResource.childOperations.includes('CREATE');
14502
- const descriptionKey = canCreate
14503
- ? 'emptyState.related.descriptionWithAction'
14504
- : 'emptyState.related.description';
14505
- const actions = canCreate
14506
- ? [
14507
- {
14508
- label: this.t('emptyState.related.action.create', 'Adicionar registro'),
14509
- action: 'create',
14510
- icon: 'add',
14511
- primary: true,
14512
- },
14513
- ]
14514
- : [];
14515
14527
  return {
14516
14528
  title: this.t('emptyState.related.title', 'Sem registros em {label}', { label }),
14517
- message: this.t(descriptionKey, canCreate
14518
- ? 'Use a ação principal para adicionar um registro relacionado quando houver informações para registrar.'
14519
- : 'Esta coleção relacionada não possui registros para o contexto selecionado.', { label }),
14529
+ message: this.t('emptyState.related.description', 'Esta coleção relacionada não possui registros para o contexto selecionado.', { label }),
14520
14530
  icon: this.trim(request.icon) || 'hub',
14521
14531
  tone: 'neutral',
14522
14532
  variant: 'inline',
14523
14533
  density: 'compact',
14524
14534
  alignment: 'center',
14525
14535
  iconContainer: 'soft',
14526
- actions,
14527
14536
  };
14528
14537
  }
14529
14538
  objectValue(value) {
@@ -15231,11 +15240,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
15231
15240
  }] });
15232
15241
 
15233
15242
  const DEFINITIONS_HREF = '/api/praxis/config/domain-rules/definitions';
15243
+ const DEFINITION_CATALOG_HREF = `${DEFINITIONS_HREF}/catalog`;
15234
15244
  const INTAKE_HREF = '/api/praxis/config/domain-rules/intake';
15235
15245
  const SIMULATIONS_HREF = '/api/praxis/config/domain-rules/simulations';
15236
15246
  const PUBLICATIONS_HREF = '/api/praxis/config/domain-rules/publications';
15237
15247
  const MATERIALIZATIONS_HREF = '/api/praxis/config/domain-rules/materializations';
15238
15248
  const SNAPSHOTS_HREF = '/api/praxis/config/domain-rules/snapshots';
15249
+ const ROLLOUT_POLICIES_HREF = `${SNAPSHOTS_HREF}/rollout-policies`;
15250
+ const ROLLOUTS_HREF = `${SNAPSHOTS_HREF}/rollouts`;
15251
+ const WORKSPACES_HREF = '/api/praxis/config/domain-rules/workspaces';
15239
15252
  class DomainRuleService {
15240
15253
  http = inject(HttpClient);
15241
15254
  discovery = inject(ResourceDiscoveryService);
@@ -15251,12 +15264,95 @@ class DomainRuleService {
15251
15264
  headers: this.resolveHeaders(options),
15252
15265
  });
15253
15266
  }
15267
+ browseDefinitionCatalog(filters = {}, options = {}) {
15268
+ return this.http.get(this.discovery.resolveHref(DEFINITION_CATALOG_HREF, options), {
15269
+ params: this.buildParams(filters),
15270
+ headers: this.resolveHeaders(options),
15271
+ });
15272
+ }
15273
+ getDefinitionCapabilities(options = {}) {
15274
+ return this.http.get(this.discovery.resolveHref(`${DEFINITIONS_HREF}/capabilities`, options), { headers: this.resolveHeaders(options) });
15275
+ }
15254
15276
  transitionDefinitionStatus(definitionId, request, options = {}) {
15255
15277
  return this.http.patch(this.discovery.resolveHref(`${DEFINITIONS_HREF}/${encodeURIComponent(definitionId)}/status`, options), request, { headers: this.resolveHeaders(options) });
15256
15278
  }
15257
15279
  getDefinitionTimeline(definitionId, options = {}) {
15258
15280
  return this.http.get(this.discovery.resolveHref(`${DEFINITIONS_HREF}/${encodeURIComponent(definitionId)}/timeline`, options), { headers: this.resolveHeaders(options) });
15259
15281
  }
15282
+ createChangeWorkspace(request, options = {}) {
15283
+ return this.http.post(this.discovery.resolveHref(WORKSPACES_HREF, options), request, { headers: this.resolveHeaders(options) });
15284
+ }
15285
+ listChangeWorkspaces(options = {}) {
15286
+ return this.http.get(this.discovery.resolveHref(WORKSPACES_HREF, options), { headers: this.resolveHeaders(options) });
15287
+ }
15288
+ getChangeWorkspace(workspaceId, options = {}) {
15289
+ return this.http.get(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}`, options), { headers: this.resolveHeaders(options) });
15290
+ }
15291
+ getChangeWorkspaceCapabilities(workspaceId, options = {}) {
15292
+ return this.http.get(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/capabilities`, options), { headers: this.resolveHeaders(options) });
15293
+ }
15294
+ getDefinition(definitionId, options = {}) {
15295
+ return this.http.get(this.discovery.resolveHref(`${DEFINITIONS_HREF}/${encodeURIComponent(definitionId)}`, options), { headers: this.resolveHeaders(options) });
15296
+ }
15297
+ getDefinitionFacts(definitionId, options = {}) {
15298
+ return this.http.get(this.discovery.resolveHref(`${DEFINITIONS_HREF}/${encodeURIComponent(definitionId)}/facts`, options), { headers: this.resolveHeaders(options) });
15299
+ }
15300
+ updateChangeWorkspaceDraft(workspaceId, request, etag, options = {}) {
15301
+ const headers = (this.resolveHeaders(options) ?? new HttpHeaders())
15302
+ .set('If-Match', this.strongEntityTag(etag));
15303
+ return this.http.put(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/draft`, options), request, { headers });
15304
+ }
15305
+ createTestScenario(workspaceId, request, options = {}) {
15306
+ return this.http.post(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/scenarios`, options), request, { headers: this.resolveHeaders(options) });
15307
+ }
15308
+ listTestScenarios(workspaceId, options = {}) {
15309
+ return this.http.get(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/scenarios`, options), { headers: this.resolveHeaders(options) });
15310
+ }
15311
+ listTestRuns(workspaceId, options = {}) {
15312
+ return this.http.get(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/test-runs`, options), { headers: this.resolveHeaders(options) });
15313
+ }
15314
+ submitChangeWorkspace(workspaceId, etag, options = {}) {
15315
+ const headers = (this.resolveHeaders(options) ?? new HttpHeaders())
15316
+ .set('If-Match', this.strongEntityTag(etag));
15317
+ return this.http.post(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/submit`, options), null, { headers });
15318
+ }
15319
+ reviewChangeWorkspace(workspaceId, request, etag, options = {}) {
15320
+ const headers = (this.resolveHeaders(options) ?? new HttpHeaders())
15321
+ .set('If-Match', this.strongEntityTag(etag));
15322
+ return this.http.post(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/reviews`, options), request, { headers });
15323
+ }
15324
+ listChangeWorkspaceReviews(workspaceId, options = {}) {
15325
+ return this.http.get(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/reviews`, options), { headers: this.resolveHeaders(options) });
15326
+ }
15327
+ promoteChangeWorkspace(workspaceId, etag, options = {}) {
15328
+ const headers = (this.resolveHeaders(options) ?? new HttpHeaders())
15329
+ .set('If-Match', this.strongEntityTag(etag));
15330
+ return this.http.post(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/promote`, options), null, { headers });
15331
+ }
15332
+ inspectChangeWorkspaceLifecycle(workspaceId, ruleSetKey = null, options = {}) {
15333
+ return this.getChangeWorkspace(workspaceId, options).pipe(switchMap$1((workspace) => forkJoin({
15334
+ workspace: of(workspace),
15335
+ promotedDefinition: workspace.promotedDefinitionId
15336
+ ? this.getDefinition(workspace.promotedDefinitionId, options)
15337
+ : of(null),
15338
+ testRuns: this.listTestRuns(workspaceId, options),
15339
+ reviews: this.listChangeWorkspaceReviews(workspaceId, options),
15340
+ materializations: workspace.promotedDefinitionId
15341
+ ? this.listMaterializations({ ruleDefinitionId: workspace.promotedDefinitionId }, options)
15342
+ : of([]),
15343
+ snapshotHeadStatus: ruleSetKey
15344
+ ? this.getSnapshotHeadStatus(ruleSetKey, options)
15345
+ : of(null),
15346
+ snapshotVersions: ruleSetKey
15347
+ ? this.listSnapshotVersions(ruleSetKey, 50, options)
15348
+ : of([]),
15349
+ })));
15350
+ }
15351
+ updateTestScenario(workspaceId, scenarioId, request, etag, options = {}) {
15352
+ const headers = (this.resolveHeaders(options) ?? new HttpHeaders())
15353
+ .set('If-Match', this.strongEntityTag(etag));
15354
+ return this.http.put(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/scenarios/${encodeURIComponent(scenarioId)}`, options), request, { headers });
15355
+ }
15260
15356
  simulate(request, options = {}) {
15261
15357
  return this.http.post(this.discovery.resolveHref(SIMULATIONS_HREF, options), request, { headers: this.resolveHeaders(options) });
15262
15358
  }
@@ -15295,6 +15391,59 @@ class DomainRuleService {
15295
15391
  headers: this.resolveHeaders(options),
15296
15392
  });
15297
15393
  }
15394
+ getSnapshotExecutionSummary(snapshotKey, options = {}) {
15395
+ return this.http.get(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/${encodeURIComponent(snapshotKey)}/execution-summary`, options), { headers: this.resolveHeaders(options) });
15396
+ }
15397
+ getSnapshotHostStatusSummary(ruleSetKey, options = {}) {
15398
+ return this.http.get(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/head/host-status-summary`, options), {
15399
+ params: new HttpParams().set('ruleSetKey', ruleSetKey),
15400
+ headers: this.resolveHeaders(options),
15401
+ });
15402
+ }
15403
+ getRolloutPolicyCatalog(ruleSetKey, options = {}) {
15404
+ return this.http.get(this.discovery.resolveHref(ROLLOUT_POLICIES_HREF, options), {
15405
+ params: new HttpParams().set('ruleSetKey', ruleSetKey),
15406
+ headers: this.resolveHeaders(options),
15407
+ });
15408
+ }
15409
+ getRolloutPolicyTimeline(ruleSetKey, options = {}) {
15410
+ return this.http.get(this.discovery.resolveHref(`${ROLLOUT_POLICIES_HREF}/timeline`, options), {
15411
+ params: new HttpParams().set('ruleSetKey', ruleSetKey),
15412
+ headers: this.resolveHeaders(options),
15413
+ });
15414
+ }
15415
+ createRolloutPolicy(request, options = {}) {
15416
+ return this.http.post(this.discovery.resolveHref(ROLLOUT_POLICIES_HREF, options), request, { headers: this.resolveHeaders(options) });
15417
+ }
15418
+ approveRolloutPolicy(policyId, options = {}) {
15419
+ return this.http.post(this.discovery.resolveHref(`${ROLLOUT_POLICIES_HREF}/${encodeURIComponent(policyId)}/approve`, options), null, { headers: this.resolveHeaders(options) });
15420
+ }
15421
+ activateRolloutPolicy(policyId, policyHeadEtag, options = {}) {
15422
+ const resolved = this.resolveHeaders(options) ?? new HttpHeaders();
15423
+ return this.http.post(this.discovery.resolveHref(`${ROLLOUT_POLICIES_HREF}/${encodeURIComponent(policyId)}/activate`, options), null, { headers: resolved.set('If-Match', this.strongEntityTag(policyHeadEtag)) });
15424
+ }
15425
+ getRolloutCatalog(ruleSetKey, options = {}) {
15426
+ return this.http.get(this.discovery.resolveHref(ROLLOUTS_HREF, options), {
15427
+ params: new HttpParams().set('ruleSetKey', ruleSetKey),
15428
+ headers: this.resolveHeaders(options),
15429
+ });
15430
+ }
15431
+ getRolloutReadiness(rolloutId, options = {}) {
15432
+ return this.http.get(this.discovery.resolveHref(`${ROLLOUTS_HREF}/${encodeURIComponent(rolloutId)}/readiness`, options), { headers: this.resolveHeaders(options) });
15433
+ }
15434
+ createRollout(request, headEtag, options = {}) {
15435
+ const resolved = this.resolveHeaders(options) ?? new HttpHeaders();
15436
+ return this.http.post(this.discovery.resolveHref(ROLLOUTS_HREF, options), request, { headers: resolved.set('If-Match', this.strongEntityTag(headEtag)) });
15437
+ }
15438
+ cancelRollout(rolloutId, options = {}) {
15439
+ return this.http.post(this.discovery.resolveHref(`${ROLLOUTS_HREF}/${encodeURIComponent(rolloutId)}/cancel`, options), null, { headers: this.resolveHeaders(options) });
15440
+ }
15441
+ activateSnapshotCandidate(snapshotKey, headEtag, rolloutId, options = {}) {
15442
+ let resolved = this.resolveHeaders(options) ?? new HttpHeaders();
15443
+ resolved = resolved.set('If-Match', this.strongEntityTag(headEtag));
15444
+ resolved = resolved.set('X-Rule-Rollout-ID', rolloutId);
15445
+ return this.http.post(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/${encodeURIComponent(snapshotKey)}/activate`, options), null, { headers: resolved });
15446
+ }
15298
15447
  prepareSnapshotComposition(request, options = {}) {
15299
15448
  return this.http.post(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/composition-manifest`, options), request, { headers: this.resolveHeaders(options) });
15300
15449
  }
@@ -15803,6 +15952,16 @@ class ResourceActionOpenAdapterService {
15803
15952
  ];
15804
15953
  return;
15805
15954
  }
15955
+ const targetResourceKey = String(execution.preconditions.resourceVersionTargetResourceKey ?? '').trim();
15956
+ const targetIdField = String(execution.preconditions.resourceVersionTargetIdField ?? '').trim();
15957
+ if (targetResourceKey || targetIdField) {
15958
+ if (!targetResourceKey || !targetIdField) {
15959
+ throw new Error(`ResourceActionOpenAdapterService requires both resourceVersionTargetResourceKey and resourceVersionTargetIdField for action "${action.id}".`);
15960
+ }
15961
+ inputs['submitResourceVersionTargetResourceKey'] = targetResourceKey;
15962
+ inputs['submitResourceVersionTargetIdField'] = targetIdField;
15963
+ return;
15964
+ }
15806
15965
  if (execution.preconditions.resourceVersion === 'REQUIRED') {
15807
15966
  throw new Error(`ResourceActionOpenAdapterService requires resourceVersion or resourceVersionBindingPath for action "${action.id}".`);
15808
15967
  }
@@ -15870,6 +16029,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
15870
16029
 
15871
16030
  class SurfaceOpenMaterializerService {
15872
16031
  discovery = inject(ResourceDiscoveryService);
16032
+ i18n = inject(PraxisI18nService);
15873
16033
  async materialize(payload, context) {
15874
16034
  if (this.shouldPreserveRelatedRemoteTable(payload)) {
15875
16035
  return payload;
@@ -16331,11 +16491,13 @@ class SurfaceOpenMaterializerService {
16331
16491
  return !relatedActionIds.has(String(record['id'] || record['action'] || ''));
16332
16492
  })
16333
16493
  : [];
16494
+ const previousRelatedActionPresentation = new Map((Array.isArray(previousToolbar['actions']) ? previousToolbar['actions'] : [])
16495
+ .map((action) => this.objectRecord(action))
16496
+ .filter((action) => relatedActionIds.has(String(action['id'] || '')))
16497
+ .map((action) => [String(action['id']), action]));
16334
16498
  const toolbarActions = [
16335
16499
  ...previousToolbarActions,
16336
- ...relatedActions.map((action) => action['action'] === 'create'
16337
- ? { ...action, appearance: 'filled' }
16338
- : action),
16500
+ ...relatedActions.map((action) => this.mergeRelatedActionPresentation(action, previousRelatedActionPresentation.get(String(action['id'])))),
16339
16501
  ];
16340
16502
  const previousAi = this.objectRecord(previousConfig['ai']);
16341
16503
  const previousAssistant = this.objectRecord(previousAi['assistant']);
@@ -16396,6 +16558,31 @@ class SurfaceOpenMaterializerService {
16396
16558
  ? value
16397
16559
  : {};
16398
16560
  }
16561
+ mergeRelatedActionPresentation(canonical, authored) {
16562
+ if (!authored)
16563
+ return canonical;
16564
+ const presentation = {};
16565
+ for (const key of ['label', 'tooltip', 'icon']) {
16566
+ if (typeof authored[key] === 'string')
16567
+ presentation[key] = authored[key];
16568
+ }
16569
+ if (['primary', 'accent', 'warn'].includes(String(authored['color']))) {
16570
+ presentation['color'] = authored['color'];
16571
+ }
16572
+ if (['filled', 'outlined', 'elevated', 'text', 'tonal'].includes(String(authored['appearance']))) {
16573
+ presentation['appearance'] = authored['appearance'];
16574
+ }
16575
+ if (['button', 'icon', 'fab'].includes(String(authored['type']))) {
16576
+ presentation['type'] = authored['type'];
16577
+ }
16578
+ if (['start', 'end'].includes(String(authored['position']))) {
16579
+ presentation['position'] = authored['position'];
16580
+ }
16581
+ if (typeof authored['order'] === 'number' && Number.isFinite(authored['order'])) {
16582
+ presentation['order'] = authored['order'];
16583
+ }
16584
+ return { ...canonical, ...presentation };
16585
+ }
16399
16586
  buildRelatedCrudActions(payload, operations, paths) {
16400
16587
  const noun = this.resolveRelatedActionNoun(payload);
16401
16588
  const formIdPrefix = this.stableSurfaceId(payload);
@@ -16405,7 +16592,7 @@ class SurfaceOpenMaterializerService {
16405
16592
  actions.push({
16406
16593
  id: 'create',
16407
16594
  action: 'create',
16408
- label: `Adicionar ${noun}`,
16595
+ label: this.relatedActionText('create', noun),
16409
16596
  tooltip: this.resolveRelatedActionDescription(payload, 'create', noun),
16410
16597
  formId: `${formIdPrefix}.create`,
16411
16598
  icon: 'add',
@@ -16422,7 +16609,7 @@ class SurfaceOpenMaterializerService {
16422
16609
  actions.push({
16423
16610
  id: 'edit',
16424
16611
  action: 'edit',
16425
- label: `Editar ${noun}`,
16612
+ label: this.relatedActionText('edit', noun),
16426
16613
  tooltip: this.resolveRelatedActionDescription(payload, 'edit', noun),
16427
16614
  formId: `${formIdPrefix}.edit`,
16428
16615
  icon: 'edit',
@@ -16442,7 +16629,7 @@ class SurfaceOpenMaterializerService {
16442
16629
  actions.push({
16443
16630
  id: 'delete',
16444
16631
  action: 'delete',
16445
- label: `Remover ${noun}`,
16632
+ label: this.relatedActionText('delete', noun),
16446
16633
  tooltip: this.resolveRelatedActionDescription(payload, 'delete', noun),
16447
16634
  formId: `${formIdPrefix}.delete`,
16448
16635
  icon: 'delete',
@@ -16461,6 +16648,13 @@ class SurfaceOpenMaterializerService {
16461
16648
  }
16462
16649
  return actions;
16463
16650
  }
16651
+ relatedActionText(operation, noun) {
16652
+ const english = this.i18n.getLocale().toLowerCase().startsWith('en');
16653
+ const fallback = english
16654
+ ? `${operation === 'create' ? 'Add' : operation === 'edit' ? 'Edit' : 'Remove'} ${noun}`
16655
+ : `${operation === 'create' ? 'Adicionar' : operation === 'edit' ? 'Editar' : 'Remover'} ${noun}`;
16656
+ return this.i18n.t(`action.${operation}.label`, { noun }, fallback, RELATED_RESOURCE_OUTLET_I18N_NAMESPACE);
16657
+ }
16464
16658
  buildRelatedCommandFormConfig() {
16465
16659
  return {
16466
16660
  metadata: {
@@ -16643,11 +16837,19 @@ class SurfaceOpenMaterializerService {
16643
16837
  || '').trim();
16644
16838
  if (surfaceDescription)
16645
16839
  return surfaceDescription;
16646
- if (action === 'create')
16647
- return `Adicione ${noun} ao contexto selecionado.`;
16648
- if (action === 'edit')
16649
- return `Atualize os dados de ${noun} no contexto selecionado.`;
16650
- return `Remova ${noun} do contexto selecionado.`;
16840
+ const english = this.i18n.getLocale().toLowerCase().startsWith('en');
16841
+ const fallback = english
16842
+ ? action === 'create'
16843
+ ? `Add ${noun} to the selected context.`
16844
+ : action === 'edit'
16845
+ ? `Update ${noun} data in the selected context.`
16846
+ : `Remove ${noun} from the selected context.`
16847
+ : action === 'create'
16848
+ ? `Adicione ${noun} ao contexto selecionado.`
16849
+ : action === 'edit'
16850
+ ? `Atualize os dados de ${noun} no contexto selecionado.`
16851
+ : `Remova ${noun} do contexto selecionado.`;
16852
+ return this.i18n.t(`action.${action}.tooltip`, { noun }, fallback, RELATED_RESOURCE_OUTLET_I18N_NAMESPACE);
16651
16853
  }
16652
16854
  inferColumnsFromData(data) {
16653
16855
  const first = data.find((item) => item && typeof item === 'object' && !Array.isArray(item));
@@ -17904,7 +18106,7 @@ function normalizeUnknownError(rawError) {
17904
18106
  if (typeof candidate === 'string') {
17905
18107
  return normalizeFromParts('Error', candidate);
17906
18108
  }
17907
- if (isRecord$1(candidate)) {
18109
+ if (isRecord$3(candidate)) {
17908
18110
  const name = toText(candidate['name'], 'Error');
17909
18111
  const message = toText(candidate['message'], safeStringify(candidate));
17910
18112
  const stack = toStack(candidate['stack']);
@@ -17923,7 +18125,7 @@ function extractErrorCandidate(data) {
17923
18125
  if (data instanceof Error || typeof data === 'string') {
17924
18126
  return data;
17925
18127
  }
17926
- if (!isRecord$1(data)) {
18128
+ if (!isRecord$3(data)) {
17927
18129
  return undefined;
17928
18130
  }
17929
18131
  if ('error' in data) {
@@ -17941,7 +18143,7 @@ function extractErrorCandidate(data) {
17941
18143
  return undefined;
17942
18144
  }
17943
18145
  function unwrapRejection(error) {
17944
- if (!isRecord$1(error)) {
18146
+ if (!isRecord$3(error)) {
17945
18147
  return error;
17946
18148
  }
17947
18149
  if ('rejection' in error) {
@@ -18001,7 +18203,7 @@ function safeStringify(value) {
18001
18203
  return UNKNOWN_ERROR_MESSAGE;
18002
18204
  }
18003
18205
  }
18004
- function isRecord$1(value) {
18206
+ function isRecord$3(value) {
18005
18207
  return !!value && typeof value === 'object';
18006
18208
  }
18007
18209
 
@@ -18961,6 +19163,54 @@ function buildPraxisCollectionSearchCss(tokens = {}) {
18961
19163
  `;
18962
19164
  }
18963
19165
 
19166
+ const PRAXIS_ACTION_CONTROL_DEFAULTS = {
19167
+ height: '40px',
19168
+ compactHeight: '36px',
19169
+ spaciousHeight: '44px',
19170
+ radius: '8px',
19171
+ paddingInline: '12px',
19172
+ gap: '8px',
19173
+ iconSize: '18px',
19174
+ fontSize: 'var(--md-sys-typescale-label-large-size, 0.875rem)',
19175
+ lineHeight: 'var(--md-sys-typescale-label-large-line-height, 1.25rem)',
19176
+ fontWeight: 'var(--md-sys-typescale-label-large-weight, 500)',
19177
+ focusRing: 'color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent)',
19178
+ disabledOpacity: '0.62',
19179
+ };
19180
+ const PRAXIS_ACTION_CONTROL_VARS = {
19181
+ height: '--praxis-action-control-height',
19182
+ compactHeight: '--praxis-action-control-compact-height',
19183
+ spaciousHeight: '--praxis-action-control-spacious-height',
19184
+ radius: '--praxis-action-control-radius',
19185
+ paddingInline: '--praxis-action-control-padding-inline',
19186
+ gap: '--praxis-action-control-gap',
19187
+ iconSize: '--praxis-action-control-icon-size',
19188
+ fontSize: '--praxis-action-control-font-size',
19189
+ lineHeight: '--praxis-action-control-line-height',
19190
+ fontWeight: '--praxis-action-control-font-weight',
19191
+ focusRing: '--praxis-action-control-focus-ring',
19192
+ disabledOpacity: '--praxis-action-control-disabled-opacity',
19193
+ };
19194
+ function buildPraxisActionControlCss(tokens = {}) {
19195
+ const resolved = { ...PRAXIS_ACTION_CONTROL_DEFAULTS, ...tokens };
19196
+ return `
19197
+ :root {
19198
+ ${PRAXIS_ACTION_CONTROL_VARS.height}: ${resolved.height};
19199
+ ${PRAXIS_ACTION_CONTROL_VARS.compactHeight}: ${resolved.compactHeight};
19200
+ ${PRAXIS_ACTION_CONTROL_VARS.spaciousHeight}: ${resolved.spaciousHeight};
19201
+ ${PRAXIS_ACTION_CONTROL_VARS.radius}: ${resolved.radius};
19202
+ ${PRAXIS_ACTION_CONTROL_VARS.paddingInline}: ${resolved.paddingInline};
19203
+ ${PRAXIS_ACTION_CONTROL_VARS.gap}: ${resolved.gap};
19204
+ ${PRAXIS_ACTION_CONTROL_VARS.iconSize}: ${resolved.iconSize};
19205
+ ${PRAXIS_ACTION_CONTROL_VARS.fontSize}: ${resolved.fontSize};
19206
+ ${PRAXIS_ACTION_CONTROL_VARS.lineHeight}: ${resolved.lineHeight};
19207
+ ${PRAXIS_ACTION_CONTROL_VARS.fontWeight}: ${resolved.fontWeight};
19208
+ ${PRAXIS_ACTION_CONTROL_VARS.focusRing}: ${resolved.focusRing};
19209
+ ${PRAXIS_ACTION_CONTROL_VARS.disabledOpacity}: ${resolved.disabledOpacity};
19210
+ }
19211
+ `;
19212
+ }
19213
+
18964
19214
  /** Set the current tenant for GlobalConfigService at app boot. */
18965
19215
  function provideGlobalConfigTenant(tenantId) {
18966
19216
  return {
@@ -20928,6 +21178,231 @@ function convertFormLayoutToConfig(formLayout) {
20928
21178
  return ensureIds({ sections });
20929
21179
  }
20930
21180
 
21181
+ const MAX_REACTIVE_DETERMINATION_BINDINGS = 64;
21182
+ /** Strictly normalizes the closed x-ui.reactiveDeterminations projection. */
21183
+ function normalizeReactiveDeterminations(value) {
21184
+ if (!Array.isArray(value))
21185
+ return [];
21186
+ const candidates = value.map((candidate) => normalizeReactiveDetermination(candidate));
21187
+ // The projection is one canonical graph. Executing only the valid subset
21188
+ // could silently remove a writer, dependency or governance boundary while
21189
+ // leaving the remaining definitions apparently healthy.
21190
+ if (candidates.some((candidate) => candidate === null))
21191
+ return [];
21192
+ const normalized = candidates;
21193
+ const idCounts = new Map();
21194
+ normalized.forEach((candidate) => idCounts.set(candidate.id, (idCounts.get(candidate.id) ?? 0) + 1));
21195
+ if (normalized.some((candidate) => idCounts.get(candidate.id) !== 1))
21196
+ return [];
21197
+ if (hasCrossDefinitionOutputOverlap(normalized) || hasDependencyCycle(normalized))
21198
+ return [];
21199
+ return normalized;
21200
+ }
21201
+ function normalizeReactiveDetermination(value) {
21202
+ if (!isRecord$2(value) ||
21203
+ !hasOnlyKeys(value, ['id', 'trigger', 'scope', 'capability', 'inputs', 'outputs', 'provenance'])) {
21204
+ return null;
21205
+ }
21206
+ const id = stableId(value['id']);
21207
+ const trigger = normalizeTrigger(value['trigger']);
21208
+ const scope = normalizeScope(value['scope']);
21209
+ const capability = normalizeCapability(value['capability']);
21210
+ const inputs = normalizeInputs(value['inputs']);
21211
+ const outputs = normalizeOutputs(value['outputs']);
21212
+ const provenance = normalizeProvenance(value['provenance']);
21213
+ const inputFieldPaths = new Set(inputs.map((binding) => binding.fieldPath));
21214
+ const outputFieldPaths = new Set(outputs.map((binding) => binding.fieldPath));
21215
+ if (!id ||
21216
+ !trigger ||
21217
+ !scope ||
21218
+ !capability ||
21219
+ !inputs.length ||
21220
+ !outputs.length ||
21221
+ !provenance ||
21222
+ inputs.length + outputs.length > MAX_REACTIVE_DETERMINATION_BINDINGS ||
21223
+ trigger.sourcePaths.length > inputs.length ||
21224
+ trigger.sourcePaths.some((sourcePath) => !inputFieldPaths.has(sourcePath)) ||
21225
+ [...outputFieldPaths].some((outputPath) => [...inputFieldPaths].some((inputPath) => jsonPointersOverlap(inputPath, outputPath)))) {
21226
+ return null;
21227
+ }
21228
+ return { id, trigger, scope, capability, inputs, outputs, provenance };
21229
+ }
21230
+ function hasCrossDefinitionOutputOverlap(definitions) {
21231
+ for (let leftIndex = 0; leftIndex < definitions.length; leftIndex += 1) {
21232
+ for (let rightIndex = leftIndex + 1; rightIndex < definitions.length; rightIndex += 1) {
21233
+ if (definitions[leftIndex].outputs.some((left) => definitions[rightIndex].outputs.some((right) => jsonPointersOverlap(left.fieldPath, right.fieldPath))))
21234
+ return true;
21235
+ }
21236
+ }
21237
+ return false;
21238
+ }
21239
+ function hasDependencyCycle(definitions) {
21240
+ const dependencies = definitions.map((consumer) => definitions
21241
+ .map((producer, producerIndex) => ({ producer, producerIndex }))
21242
+ .filter(({ producer }) => producer !== consumer && producer.outputs.some((output) => consumer.inputs.some((input) => jsonPointersOverlap(output.fieldPath, input.fieldPath))))
21243
+ .map(({ producerIndex }) => producerIndex));
21244
+ const state = new Array(definitions.length).fill(0);
21245
+ const visit = (index) => {
21246
+ if (state[index] === 1)
21247
+ return true;
21248
+ if (state[index] === 2)
21249
+ return false;
21250
+ state[index] = 1;
21251
+ if (dependencies[index].some(visit))
21252
+ return true;
21253
+ state[index] = 2;
21254
+ return false;
21255
+ };
21256
+ return definitions.some((_definition, index) => visit(index));
21257
+ }
21258
+ function normalizeTrigger(value) {
21259
+ if (!isRecord$2(value) || !hasOnlyKeys(value, ['mode', 'sourcePaths']))
21260
+ return null;
21261
+ const sourcePaths = pointerArray(value['sourcePaths'], MAX_REACTIVE_DETERMINATION_BINDINGS);
21262
+ if (value['mode'] !== 'on-change' || !sourcePaths.length)
21263
+ return null;
21264
+ return { mode: 'on-change', sourcePaths };
21265
+ }
21266
+ function normalizeScope(value) {
21267
+ if (!isRecord$2(value) || !hasOnlyKeys(value, ['schemaOperationId', 'formMode']))
21268
+ return null;
21269
+ const schemaOperationId = stableId(value['schemaOperationId']);
21270
+ const formMode = value['formMode'];
21271
+ if (!schemaOperationId || (formMode !== 'create' && formMode !== 'edit'))
21272
+ return null;
21273
+ return { schemaOperationId, formMode };
21274
+ }
21275
+ function normalizeCapability(value) {
21276
+ if (!isRecord$2(value) ||
21277
+ !hasOnlyKeys(value, ['operationId', 'method', 'href', 'requestSchemaUrl', 'responseSchemaUrl'])) {
21278
+ return null;
21279
+ }
21280
+ const operationId = stableId(value['operationId']);
21281
+ const href = nonBlank(value['href']);
21282
+ const requestSchemaUrl = nonBlank(value['requestSchemaUrl']);
21283
+ const responseSchemaUrl = nonBlank(value['responseSchemaUrl']);
21284
+ if (!operationId ||
21285
+ value['method'] !== 'POST' ||
21286
+ !href ||
21287
+ !isSafeRelativeOperationPath(href) ||
21288
+ !requestSchemaUrl?.startsWith('/schemas/filtered?') ||
21289
+ !responseSchemaUrl?.startsWith('/schemas/filtered?')) {
21290
+ return null;
21291
+ }
21292
+ return { operationId, method: 'POST', href, requestSchemaUrl, responseSchemaUrl };
21293
+ }
21294
+ function normalizeInputs(value) {
21295
+ if (!Array.isArray(value) || value.length > MAX_REACTIVE_DETERMINATION_BINDINGS)
21296
+ return [];
21297
+ const result = [];
21298
+ const fieldPaths = new Set();
21299
+ const requestPaths = new Set();
21300
+ for (const candidate of value) {
21301
+ if (!isRecord$2(candidate) || !hasOnlyKeys(candidate, ['fieldPath', 'requestPath']))
21302
+ return [];
21303
+ const fieldPath = jsonPointer(candidate['fieldPath']);
21304
+ const requestPath = jsonPointer(candidate['requestPath']);
21305
+ if (!fieldPath ||
21306
+ !requestPath ||
21307
+ [...fieldPaths].some((current) => jsonPointersOverlap(current, fieldPath)) ||
21308
+ [...requestPaths].some((current) => jsonPointersOverlap(current, requestPath)))
21309
+ return [];
21310
+ fieldPaths.add(fieldPath);
21311
+ requestPaths.add(requestPath);
21312
+ result.push({ fieldPath, requestPath });
21313
+ }
21314
+ return result;
21315
+ }
21316
+ function normalizeOutputs(value) {
21317
+ if (!Array.isArray(value) || value.length > MAX_REACTIVE_DETERMINATION_BINDINGS)
21318
+ return [];
21319
+ const result = [];
21320
+ const responsePaths = new Set();
21321
+ const fieldPaths = new Set();
21322
+ for (const candidate of value) {
21323
+ if (!isRecord$2(candidate) || !hasOnlyKeys(candidate, ['responsePath', 'fieldPath']))
21324
+ return [];
21325
+ const responsePath = jsonPointer(candidate['responsePath']);
21326
+ const fieldPath = jsonPointer(candidate['fieldPath']);
21327
+ if (!responsePath ||
21328
+ !fieldPath ||
21329
+ [...responsePaths].some((current) => jsonPointersOverlap(current, responsePath)) ||
21330
+ [...fieldPaths].some((current) => jsonPointersOverlap(current, fieldPath)))
21331
+ return [];
21332
+ responsePaths.add(responsePath);
21333
+ fieldPaths.add(fieldPath);
21334
+ result.push({ responsePath, fieldPath });
21335
+ }
21336
+ return result;
21337
+ }
21338
+ function normalizeProvenance(value) {
21339
+ if (!isRecord$2(value) || !hasOnlyKeys(value, ['kind', 'source', 'version']))
21340
+ return null;
21341
+ const kind = value['kind'];
21342
+ const source = stableId(value['source']);
21343
+ const version = value['version'] === undefined ? undefined : nonBlank(value['version']);
21344
+ if ((kind !== 'platform' && kind !== 'host') || !source || (value['version'] !== undefined && !version)) {
21345
+ return null;
21346
+ }
21347
+ if (version && version.length > 64)
21348
+ return null;
21349
+ return { kind, source, ...(version ? { version } : {}) };
21350
+ }
21351
+ function pointerArray(value, maxItems) {
21352
+ if (!Array.isArray(value) || value.length > maxItems)
21353
+ return [];
21354
+ const pointers = value.map(jsonPointer);
21355
+ if (pointers.some((pointer) => !pointer))
21356
+ return [];
21357
+ const uniquePointers = new Set(pointers);
21358
+ return uniquePointers.size === pointers.length ? [...uniquePointers] : [];
21359
+ }
21360
+ function jsonPointer(value) {
21361
+ const pointer = nonBlank(value);
21362
+ return pointer && /^\/(?!\/)(?:[^/~]|~[01])+(?:\/(?:[^/~]|~[01])+)*$/.test(pointer)
21363
+ ? pointer
21364
+ : null;
21365
+ }
21366
+ function jsonPointersOverlap(left, right) {
21367
+ const leftSegments = decodeJsonPointerSegments(left);
21368
+ const rightSegments = decodeJsonPointerSegments(right);
21369
+ const prefixLength = Math.min(leftSegments.length, rightSegments.length);
21370
+ for (let index = 0; index < prefixLength; index += 1) {
21371
+ if (leftSegments[index] !== rightSegments[index])
21372
+ return false;
21373
+ }
21374
+ return true;
21375
+ }
21376
+ function decodeJsonPointerSegments(pointer) {
21377
+ return pointer.slice(1).split('/').map((segment) => segment.replace(/~1/g, '/').replace(/~0/g, '~'));
21378
+ }
21379
+ function stableId(value) {
21380
+ const id = nonBlank(value);
21381
+ return id && /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(id) ? id : null;
21382
+ }
21383
+ function isSafeRelativeOperationPath(path) {
21384
+ if (!path.startsWith('/') || path.startsWith('//') || path.includes('\\') || path.includes('?') ||
21385
+ path.includes('#') || path.includes('{') || path.includes('}') ||
21386
+ /[\u0000-\u001f\u007f]/.test(path) || /%(?:2f|5c)/i.test(path))
21387
+ return false;
21388
+ try {
21389
+ return new URL(path, 'https://praxis.invalid').origin === 'https://praxis.invalid';
21390
+ }
21391
+ catch {
21392
+ return false;
21393
+ }
21394
+ }
21395
+ function nonBlank(value) {
21396
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
21397
+ }
21398
+ function isRecord$2(value) {
21399
+ return !!value && typeof value === 'object' && !Array.isArray(value);
21400
+ }
21401
+ function hasOnlyKeys(value, allowed) {
21402
+ const allowedSet = new Set(allowed);
21403
+ return Object.keys(value).every((key) => allowedSet.has(key));
21404
+ }
21405
+
20931
21406
  /**
20932
21407
  * Materializes a concrete FormConfig from a reusable editorial template.
20933
21408
  *
@@ -23749,6 +24224,25 @@ function markerColorForEvent$1(eventType) {
23749
24224
  return 'neutral';
23750
24225
  }
23751
24226
 
24227
+ /** Narrows an unknown HTTP error body without relying on human-readable message parsing. */
24228
+ function isDomainRuleSnapshotProblemResponse(value) {
24229
+ if (!isRecord$1(value) || typeof value['code'] !== 'string' || typeof value['message'] !== 'string') {
24230
+ return false;
24231
+ }
24232
+ const blockers = value['blockers'];
24233
+ return Array.isArray(blockers) && blockers.every(isDomainRuleSnapshotBlocker);
24234
+ }
24235
+ function isDomainRuleSnapshotBlocker(value) {
24236
+ return isRecord$1(value)
24237
+ && typeof value['code'] === 'string'
24238
+ && typeof value['stage'] === 'string'
24239
+ && (value['definitionId'] === null || typeof value['definitionId'] === 'string')
24240
+ && typeof value['message'] === 'string';
24241
+ }
24242
+ function isRecord$1(value) {
24243
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
24244
+ }
24245
+
23752
24246
  const DEFAULT_TITLE = 'Governed decision timeline';
23753
24247
  const DEFAULT_EMPTY_TEXT = 'No safe timeline events published for this decision.';
23754
24248
  function domainRuleTimelineToRichContentDocument(timeline, options = {}) {
@@ -32480,10 +32974,14 @@ class PraxisResourceIdentityComponent {
32480
32974
  emptyTitle = '';
32481
32975
  density = 'comfortable';
32482
32976
  showMetadataLabels = false;
32977
+ showKey = true;
32483
32978
  showKeyLabel = false;
32484
32979
  ariaLabel = '';
32485
32980
  title() {
32486
- return String(this.identity?.title?.value ?? this.identity?.displayLabel ?? this.emptyTitle).trim();
32981
+ if (!this.identity) {
32982
+ return this.emptyTitle.trim();
32983
+ }
32984
+ return String(this.identity.title?.value ?? this.identity.displayLabel ?? '').trim();
32487
32985
  }
32488
32986
  prefix(item) {
32489
32987
  return item.presentation?.prefix ?? '';
@@ -32495,7 +32993,7 @@ class PraxisResourceIdentityComponent {
32495
32993
  return item.presentation?.presenter === 'chip' || item.presentation?.presenter === 'badge';
32496
32994
  }
32497
32995
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisResourceIdentityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32498
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisResourceIdentityComponent, isStandalone: true, selector: "praxis-resource-identity", inputs: { identity: "identity", emptyTitle: "emptyTitle", density: "density", showMetadataLabels: "showMetadataLabels", showKeyLabel: "showKeyLabel", ariaLabel: "ariaLabel" }, ngImport: i0, template: `
32996
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisResourceIdentityComponent, isStandalone: true, selector: "praxis-resource-identity", inputs: { identity: "identity", emptyTitle: "emptyTitle", density: "density", showMetadataLabels: "showMetadataLabels", showKey: "showKey", showKeyLabel: "showKeyLabel", ariaLabel: "ariaLabel" }, ngImport: i0, template: `
32499
32997
  <div
32500
32998
  class="identity"
32501
32999
  [class.identity--compact]="density === 'compact'"
@@ -32503,15 +33001,19 @@ class PraxisResourceIdentityComponent {
32503
33001
  [attr.aria-label]="ariaLabel || null"
32504
33002
  >
32505
33003
  <div class="identity__primary">
32506
- @if (identity?.key; as key) {
32507
- <span class="identity__key" [attr.title]="key.label || null">
32508
- @if (showKeyLabel && key.label) {
32509
- <span class="identity__key-label">{{ key.label }}:</span>
32510
- }
32511
- {{ prefix(key) }}{{ key.value }}{{ suffix(key) }}
32512
- </span>
33004
+ @if (showKey) {
33005
+ @if (identity?.key; as key) {
33006
+ <span class="identity__key" [attr.title]="key.label || null">
33007
+ @if (showKeyLabel && key.label) {
33008
+ <span class="identity__key-label">{{ key.label }}:</span>
33009
+ }
33010
+ {{ prefix(key) }}{{ key.value }}{{ suffix(key) }}
33011
+ </span>
33012
+ }
33013
+ }
33014
+ @if (title(); as identityTitle) {
33015
+ <span class="identity__title">{{ identityTitle }}</span>
32513
33016
  }
32514
- <span class="identity__title">{{ title() }}</span>
32515
33017
  </div>
32516
33018
  @if (identity?.metadata?.length) {
32517
33019
  <div class="identity__metadata">
@@ -32542,15 +33044,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
32542
33044
  [attr.aria-label]="ariaLabel || null"
32543
33045
  >
32544
33046
  <div class="identity__primary">
32545
- @if (identity?.key; as key) {
32546
- <span class="identity__key" [attr.title]="key.label || null">
32547
- @if (showKeyLabel && key.label) {
32548
- <span class="identity__key-label">{{ key.label }}:</span>
32549
- }
32550
- {{ prefix(key) }}{{ key.value }}{{ suffix(key) }}
32551
- </span>
33047
+ @if (showKey) {
33048
+ @if (identity?.key; as key) {
33049
+ <span class="identity__key" [attr.title]="key.label || null">
33050
+ @if (showKeyLabel && key.label) {
33051
+ <span class="identity__key-label">{{ key.label }}:</span>
33052
+ }
33053
+ {{ prefix(key) }}{{ key.value }}{{ suffix(key) }}
33054
+ </span>
33055
+ }
33056
+ }
33057
+ @if (title(); as identityTitle) {
33058
+ <span class="identity__title">{{ identityTitle }}</span>
32552
33059
  }
32553
- <span class="identity__title">{{ title() }}</span>
32554
33060
  </div>
32555
33061
  @if (identity?.metadata?.length) {
32556
33062
  <div class="identity__metadata">
@@ -32578,6 +33084,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
32578
33084
  type: Input
32579
33085
  }], showMetadataLabels: [{
32580
33086
  type: Input
33087
+ }], showKey: [{
33088
+ type: Input
32581
33089
  }], showKeyLabel: [{
32582
33090
  type: Input
32583
33091
  }], ariaLabel: [{
@@ -41546,7 +42054,7 @@ class PraxisSurfaceHostComponent {
41546
42054
  }
41547
42055
  </section>
41548
42056
  </div>
41549
- `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-surface-host{display:grid;gap:16px;min-width:0}.pdx-surface-host__header{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.pdx-surface-host__icon{font-size:20px;line-height:20px;color:var(--md-sys-color-primary, currentColor)}.pdx-surface-host__copy{display:grid;gap:4px;min-width:0}.pdx-surface-host__title,.pdx-surface-host__subtitle{margin:0}.pdx-surface-host__title{font-size:1rem;font-weight:600}.pdx-surface-host__subtitle{color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .64));font-size:.9375rem}.pdx-surface-host__body{display:grid;gap:16px;min-width:0}.pdx-surface-host__operation-context{min-width:0;padding:12px 14px;border-inline-start:3px solid var(--md-sys-color-primary, currentColor);border-radius:0 10px 10px 0;background:var(--md-sys-color-surface-container-low, transparent)}.pdx-surface-host__slot{min-width:0}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: PraxisResourceIdentityComponent, selector: "praxis-resource-identity", inputs: ["identity", "emptyTitle", "density", "showMetadataLabels", "showKeyLabel", "ariaLabel"] }] });
42057
+ `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-surface-host{display:grid;gap:16px;min-width:0}.pdx-surface-host__header{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.pdx-surface-host__icon{font-size:20px;line-height:20px;color:var(--md-sys-color-primary, currentColor)}.pdx-surface-host__copy{display:grid;gap:4px;min-width:0}.pdx-surface-host__title,.pdx-surface-host__subtitle{margin:0}.pdx-surface-host__title{font-size:1rem;font-weight:600}.pdx-surface-host__subtitle{color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .64));font-size:.9375rem}.pdx-surface-host__body{display:grid;gap:16px;min-width:0}.pdx-surface-host__operation-context{min-width:0;padding:12px 14px;border-inline-start:3px solid var(--md-sys-color-primary, currentColor);border-radius:0 10px 10px 0;background:var(--md-sys-color-surface-container-low, transparent)}.pdx-surface-host__slot{min-width:0}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: PraxisResourceIdentityComponent, selector: "praxis-resource-identity", inputs: ["identity", "emptyTitle", "density", "showMetadataLabels", "showKey", "showKeyLabel", "ariaLabel"] }] });
41550
42058
  }
41551
42059
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisSurfaceHostComponent, decorators: [{
41552
42060
  type: Component,
@@ -42173,7 +42681,7 @@ const PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA = {
42173
42681
  { name: 'icon', type: 'string | null', description: 'Ícone opcional da superfície relacionada.' },
42174
42682
  { name: 'queryContext', type: 'RelatedResourceQueryContext | null', description: 'QueryContext base mesclado com o filtro canônico da relação filha.' },
42175
42683
  { name: 'tableId', type: 'string | null', description: 'Identidade estável da tabela filha para persistência, observabilidade e testes.' },
42176
- { name: 'tableConfig', type: 'Record<string, unknown> | null', description: 'Configuracao parcial da tabela filha materializada, mesclada ao preset canonico.' },
42684
+ { name: 'tableConfig', type: 'Record<string, unknown> | null', description: 'Configuração parcial mesclada ao preset canônico. Ações CRUD com ids create, edit e delete aceitam somente overrides visuais (label, tooltip, icon, color, appearance, type, position e order); semântica, alvo, formulários, confirmação e disponibilidade permanecem governados pelo materializador.' },
42177
42685
  { 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.' },
42178
42686
  { name: 'enableCustomization', type: 'boolean', description: 'Opt-in explicito para authoring governado da tabela filha.', default: false },
42179
42687
  { name: 'authoringCapability', type: 'string | null', description: 'Capability publica do EnterpriseRuntimeContext exigida quando o authoring da tabela filha estiver habilitado.' },
@@ -42249,7 +42757,7 @@ class EmptyStateCardComponent {
42249
42757
  </div>
42250
42758
  <div class="actions">
42251
42759
  @if (primaryAction) {
42252
- <button mat-flat-button color="primary" (click)="primaryAction.action()">
42760
+ <button type="button" mat-flat-button color="primary" (click)="primaryAction.action()">
42253
42761
  @if (primaryAction.icon) {
42254
42762
  <mat-icon [fontIcon]="primaryAction.icon"></mat-icon>
42255
42763
  }
@@ -42257,7 +42765,7 @@ class EmptyStateCardComponent {
42257
42765
  </button>
42258
42766
  }
42259
42767
  @for (a of secondaryActions; track a) {
42260
- <button mat-stroked-button [color]="a.color" (click)="a.action()">
42768
+ <button type="button" mat-stroked-button [color]="a.color" (click)="a.action()">
42261
42769
  @if (a.icon) {
42262
42770
  <mat-icon [fontIcon]="a.icon"></mat-icon>
42263
42771
  }
@@ -42267,7 +42775,7 @@ class EmptyStateCardComponent {
42267
42775
  </div>
42268
42776
  </mat-card-content>
42269
42777
  </mat-card>
42270
- `, 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: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
42778
+ `, 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{width:fit-content;max-width:100%;height:var(--pdx-empty-state-action-height, var(--praxis-action-control-height, 40px));min-height:var(--pdx-empty-state-action-height, var(--praxis-action-control-height, 40px));padding-inline:var(--pdx-empty-state-action-padding-inline, var(--praxis-action-control-padding-inline, 12px));border-radius:var(--pdx-empty-state-action-radius, var(--praxis-action-control-radius, 8px));gap:var(--pdx-empty-state-action-gap, var(--praxis-action-control-gap, 8px));font-size:var(--pdx-empty-state-action-font-size, var(--praxis-action-control-font-size, .875rem));font-weight:var(--pdx-empty-state-action-font-weight, var(--praxis-action-control-font-weight, 500));line-height:var(--pdx-empty-state-action-line-height, var(--praxis-action-control-line-height, 1.25rem));white-space:nowrap}.actions .mat-mdc-button-base mat-icon{width:var(--pdx-empty-state-action-icon-size, var(--praxis-action-control-icon-size, 18px));height:var(--pdx-empty-state-action-icon-size, var(--praxis-action-control-icon-size, 18px));margin:0;font-size:var(--pdx-empty-state-action-icon-size, var(--praxis-action-control-icon-size, 18px));line-height:var(--pdx-empty-state-action-icon-size, var(--praxis-action-control-icon-size, 18px))}.actions .mat-mdc-button-base:focus-visible{outline:2px solid var(--pdx-empty-state-action-focus-ring, var(--praxis-action-control-focus-ring, var(--md-sys-color-primary)));outline-offset:2px}.actions .mat-mdc-button-base:disabled{opacity:var(--pdx-empty-state-action-disabled-opacity, var(--praxis-action-control-disabled-opacity, .62))}.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 .actions .mat-mdc-button-base{height:var(--pdx-empty-state-action-height, var(--praxis-action-control-compact-height, 36px));min-height:var(--pdx-empty-state-action-height, var(--praxis-action-control-compact-height, 36px))}.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: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
42271
42779
  }
42272
42780
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EmptyStateCardComponent, decorators: [{
42273
42781
  type: Component,
@@ -42300,7 +42808,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
42300
42808
  </div>
42301
42809
  <div class="actions">
42302
42810
  @if (primaryAction) {
42303
- <button mat-flat-button color="primary" (click)="primaryAction.action()">
42811
+ <button type="button" mat-flat-button color="primary" (click)="primaryAction.action()">
42304
42812
  @if (primaryAction.icon) {
42305
42813
  <mat-icon [fontIcon]="primaryAction.icon"></mat-icon>
42306
42814
  }
@@ -42308,7 +42816,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
42308
42816
  </button>
42309
42817
  }
42310
42818
  @for (a of secondaryActions; track a) {
42311
- <button mat-stroked-button [color]="a.color" (click)="a.action()">
42819
+ <button type="button" mat-stroked-button [color]="a.color" (click)="a.action()">
42312
42820
  @if (a.icon) {
42313
42821
  <mat-icon [fontIcon]="a.icon"></mat-icon>
42314
42822
  }
@@ -42318,7 +42826,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
42318
42826
  </div>
42319
42827
  </mat-card-content>
42320
42828
  </mat-card>
42321
- `, 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"] }]
42829
+ `, 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{width:fit-content;max-width:100%;height:var(--pdx-empty-state-action-height, var(--praxis-action-control-height, 40px));min-height:var(--pdx-empty-state-action-height, var(--praxis-action-control-height, 40px));padding-inline:var(--pdx-empty-state-action-padding-inline, var(--praxis-action-control-padding-inline, 12px));border-radius:var(--pdx-empty-state-action-radius, var(--praxis-action-control-radius, 8px));gap:var(--pdx-empty-state-action-gap, var(--praxis-action-control-gap, 8px));font-size:var(--pdx-empty-state-action-font-size, var(--praxis-action-control-font-size, .875rem));font-weight:var(--pdx-empty-state-action-font-weight, var(--praxis-action-control-font-weight, 500));line-height:var(--pdx-empty-state-action-line-height, var(--praxis-action-control-line-height, 1.25rem));white-space:nowrap}.actions .mat-mdc-button-base mat-icon{width:var(--pdx-empty-state-action-icon-size, var(--praxis-action-control-icon-size, 18px));height:var(--pdx-empty-state-action-icon-size, var(--praxis-action-control-icon-size, 18px));margin:0;font-size:var(--pdx-empty-state-action-icon-size, var(--praxis-action-control-icon-size, 18px));line-height:var(--pdx-empty-state-action-icon-size, var(--praxis-action-control-icon-size, 18px))}.actions .mat-mdc-button-base:focus-visible{outline:2px solid var(--pdx-empty-state-action-focus-ring, var(--praxis-action-control-focus-ring, var(--md-sys-color-primary)));outline-offset:2px}.actions .mat-mdc-button-base:disabled{opacity:var(--pdx-empty-state-action-disabled-opacity, var(--praxis-action-control-disabled-opacity, .62))}.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 .actions .mat-mdc-button-base{height:var(--pdx-empty-state-action-height, var(--praxis-action-control-compact-height, 36px));min-height:var(--pdx-empty-state-action-height, var(--praxis-action-control-compact-height, 36px))}.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"] }]
42322
42830
  }], propDecorators: { icon: [{
42323
42831
  type: Input
42324
42832
  }], title: [{
@@ -43700,4 +44208,4 @@ function provideHookWhitelist(allowed) {
43700
44208
  * Generated bundle index. Do not edit.
43701
44209
  */
43702
44210
 
43703
- 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_COLLECTION_SEARCH_DEFAULTS, PRAXIS_COLLECTION_SEARCH_VARS, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_DRAWER_CONTENT_DATA, SURFACE_DRAWER_REF, SURFACE_NAVIGATION_I18N_CONFIG, SURFACE_NAVIGATION_I18N_NAMESPACE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceNavigationError, 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, buildPraxisCollectionSearchCss, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, 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, normalizeSurfaceOperationContext, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, projectGroupedCommandPartialRows, 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, resolveGroupedCommandPartialRowSpans, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };
44211
+ 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_ACTION_CONTROL_DEFAULTS, PRAXIS_ACTION_CONTROL_VARS, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_COLLECTION_SEARCH_DEFAULTS, PRAXIS_COLLECTION_SEARCH_VARS, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_DRAWER_CONTENT_DATA, SURFACE_DRAWER_REF, SURFACE_NAVIGATION_I18N_CONFIG, SURFACE_NAVIGATION_I18N_NAMESPACE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceNavigationError, 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, buildPraxisActionControlCss, buildPraxisCollectionSearchCss, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, 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, normalizeReactiveDeterminations, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeSurfaceOperationContext, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, projectGroupedCommandPartialRows, 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, resolveGroupedCommandPartialRowSpans, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };