@praxisui/core 9.0.5-rc.3 → 9.0.5-rc.30

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, 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) {
@@ -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))
@@ -13805,6 +13816,7 @@ class ResourceDiscoveryService {
13805
13816
  http = inject(HttpClient);
13806
13817
  schemaNormalizer = inject(SchemaNormalizerService);
13807
13818
  apiUrlConfig = inject(API_URL);
13819
+ surfaceCatalogInFlightByHref = new Map();
13808
13820
  getLinks(source, rel) {
13809
13821
  const candidate = this.extractLinks(source)?.[rel];
13810
13822
  if (!candidate) {
@@ -13826,11 +13838,30 @@ class ResourceDiscoveryService {
13826
13838
  return this.fetchJson(this.requireLinkHref(source, rel, options), options);
13827
13839
  }
13828
13840
  getSurfaces(source, options) {
13829
- return this.followLink(source, 'surfaces', options);
13841
+ const href = this.requireLinkHref(source, 'surfaces', options);
13842
+ const existing = this.surfaceCatalogInFlightByHref.get(href);
13843
+ if (existing) {
13844
+ return existing;
13845
+ }
13846
+ let request;
13847
+ request = this.fetchJson(href, options).pipe(finalize$1(() => {
13848
+ if (this.surfaceCatalogInFlightByHref.get(href) === request) {
13849
+ this.surfaceCatalogInFlightByHref.delete(href);
13850
+ }
13851
+ }), shareReplay$1({ bufferSize: 1, refCount: true }));
13852
+ this.surfaceCatalogInFlightByHref.set(href, request);
13853
+ return request;
13830
13854
  }
13831
13855
  getActions(source, options) {
13832
13856
  return this.followLink(source, 'actions', options);
13833
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
+ }
13834
13865
  getCapabilities(source, options) {
13835
13866
  return this.followLink(source, 'capabilities', options);
13836
13867
  }
@@ -14149,7 +14180,7 @@ const SURFACE_OPEN_PRESETS = [
14149
14180
  * Invalid roles are omitted and a completely empty context resolves to `null`.
14150
14181
  */
14151
14182
  function normalizeSurfaceOperationContext(value) {
14152
- if (!isRecord$2(value))
14183
+ if (!isRecord$4(value))
14153
14184
  return null;
14154
14185
  const taskScope = normalizeResourceRef(value['taskScope']);
14155
14186
  const subject = normalizeResourceRef(value['subject']);
@@ -14163,7 +14194,7 @@ function normalizeSurfaceOperationContext(value) {
14163
14194
  };
14164
14195
  }
14165
14196
  function normalizeResourceRef(value) {
14166
- if (!isRecord$2(value))
14197
+ if (!isRecord$4(value))
14167
14198
  return undefined;
14168
14199
  const resourceKey = normalizeText(value['resourceKey']);
14169
14200
  const resourceId = normalizeResourceId(value['resourceId']);
@@ -14177,7 +14208,7 @@ function normalizeResourceRef(value) {
14177
14208
  };
14178
14209
  }
14179
14210
  function normalizeRelationship(value) {
14180
- if (!isRecord$2(value))
14211
+ if (!isRecord$4(value))
14181
14212
  return undefined;
14182
14213
  const surfaceId = normalizeText(value['surfaceId']);
14183
14214
  const childResourceKey = normalizeText(value['childResourceKey']);
@@ -14191,7 +14222,7 @@ function normalizeRelationship(value) {
14191
14222
  };
14192
14223
  }
14193
14224
  function normalizeIdentity(value) {
14194
- if (!isRecord$2(value) || !Array.isArray(value['metadata']))
14225
+ if (!isRecord$4(value) || !Array.isArray(value['metadata']))
14195
14226
  return undefined;
14196
14227
  const key = normalizeIdentityPart(value['key']);
14197
14228
  const title = normalizeIdentityPart(value['title']);
@@ -14214,7 +14245,7 @@ function normalizeIdentity(value) {
14214
14245
  };
14215
14246
  }
14216
14247
  function normalizeIdentityPart(value) {
14217
- if (!isRecord$2(value))
14248
+ if (!isRecord$4(value))
14218
14249
  return undefined;
14219
14250
  const field = normalizeText(value['field']);
14220
14251
  const partValue = normalizeDisplayValue(value['value']);
@@ -14237,11 +14268,11 @@ function normalizeDisplayValue(value) {
14237
14268
  return typeof value === 'boolean' ? value : undefined;
14238
14269
  }
14239
14270
  function cloneJsonRecord(value) {
14240
- if (!isRecord$2(value))
14271
+ if (!isRecord$4(value))
14241
14272
  return undefined;
14242
14273
  try {
14243
14274
  const cloned = JSON.parse(JSON.stringify(value));
14244
- return isRecord$2(cloned) ? cloned : undefined;
14275
+ return isRecord$4(cloned) ? cloned : undefined;
14245
14276
  }
14246
14277
  catch {
14247
14278
  return undefined;
@@ -14261,7 +14292,7 @@ function normalizeText(value) {
14261
14292
  const normalized = value.trim();
14262
14293
  return normalized || undefined;
14263
14294
  }
14264
- function isRecord$2(value) {
14295
+ function isRecord$4(value) {
14265
14296
  return !!value && typeof value === 'object' && !Array.isArray(value);
14266
14297
  }
14267
14298
 
@@ -14286,9 +14317,13 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
14286
14317
  'state.error.description': 'Ocorreu um erro ao preparar a superfície relacionada.',
14287
14318
  'emptyState.related.title': 'Sem registros em {label}',
14288
14319
  'emptyState.related.description': 'Esta coleção relacionada não possui registros para o contexto selecionado.',
14289
- 'emptyState.related.descriptionWithAction': 'Use a ação principal para adicionar um registro relacionado quando houver informações para registrar.',
14290
- 'emptyState.related.action.create': 'Adicionar registro',
14291
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.',
14292
14327
  'status.ready': 'Recurso relacionado pronto',
14293
14328
  },
14294
14329
  'en-US': {
@@ -14308,9 +14343,13 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
14308
14343
  'state.error.description': 'An error occurred while preparing the related surface.',
14309
14344
  'emptyState.related.title': 'No records in {label}',
14310
14345
  'emptyState.related.description': 'This related collection has no records for the selected context.',
14311
- 'emptyState.related.descriptionWithAction': 'Use the primary action to add a related record when there is information to capture.',
14312
- 'emptyState.related.action.create': 'Add record',
14313
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.',
14314
14353
  'status.ready': 'Related resource ready',
14315
14354
  },
14316
14355
  },
@@ -14485,32 +14524,15 @@ class RelatedResourceSurfaceResolverService {
14485
14524
  const label = this.trim(request.title)
14486
14525
  || this.trim(surface.title)
14487
14526
  || this.humanizeResourceKey(relatedResource.childResourceKey);
14488
- const canCreate = relatedResource.childOperations.includes('CREATE');
14489
- const descriptionKey = canCreate
14490
- ? 'emptyState.related.descriptionWithAction'
14491
- : 'emptyState.related.description';
14492
- const actions = canCreate
14493
- ? [
14494
- {
14495
- label: this.t('emptyState.related.action.create', 'Adicionar registro'),
14496
- action: 'create',
14497
- icon: 'add',
14498
- primary: true,
14499
- },
14500
- ]
14501
- : [];
14502
14527
  return {
14503
14528
  title: this.t('emptyState.related.title', 'Sem registros em {label}', { label }),
14504
- message: this.t(descriptionKey, canCreate
14505
- ? 'Use a ação principal para adicionar um registro relacionado quando houver informações para registrar.'
14506
- : '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 }),
14507
14530
  icon: this.trim(request.icon) || 'hub',
14508
14531
  tone: 'neutral',
14509
14532
  variant: 'inline',
14510
14533
  density: 'compact',
14511
14534
  alignment: 'center',
14512
14535
  iconContainer: 'soft',
14513
- actions,
14514
14536
  };
14515
14537
  }
14516
14538
  objectValue(value) {
@@ -15222,6 +15244,10 @@ const INTAKE_HREF = '/api/praxis/config/domain-rules/intake';
15222
15244
  const SIMULATIONS_HREF = '/api/praxis/config/domain-rules/simulations';
15223
15245
  const PUBLICATIONS_HREF = '/api/praxis/config/domain-rules/publications';
15224
15246
  const MATERIALIZATIONS_HREF = '/api/praxis/config/domain-rules/materializations';
15247
+ const SNAPSHOTS_HREF = '/api/praxis/config/domain-rules/snapshots';
15248
+ const ROLLOUT_POLICIES_HREF = `${SNAPSHOTS_HREF}/rollout-policies`;
15249
+ const ROLLOUTS_HREF = `${SNAPSHOTS_HREF}/rollouts`;
15250
+ const WORKSPACES_HREF = '/api/praxis/config/domain-rules/workspaces';
15225
15251
  class DomainRuleService {
15226
15252
  http = inject(HttpClient);
15227
15253
  discovery = inject(ResourceDiscoveryService);
@@ -15237,12 +15263,86 @@ class DomainRuleService {
15237
15263
  headers: this.resolveHeaders(options),
15238
15264
  });
15239
15265
  }
15266
+ getDefinitionCapabilities(options = {}) {
15267
+ return this.http.get(this.discovery.resolveHref(`${DEFINITIONS_HREF}/capabilities`, options), { headers: this.resolveHeaders(options) });
15268
+ }
15240
15269
  transitionDefinitionStatus(definitionId, request, options = {}) {
15241
15270
  return this.http.patch(this.discovery.resolveHref(`${DEFINITIONS_HREF}/${encodeURIComponent(definitionId)}/status`, options), request, { headers: this.resolveHeaders(options) });
15242
15271
  }
15243
15272
  getDefinitionTimeline(definitionId, options = {}) {
15244
15273
  return this.http.get(this.discovery.resolveHref(`${DEFINITIONS_HREF}/${encodeURIComponent(definitionId)}/timeline`, options), { headers: this.resolveHeaders(options) });
15245
15274
  }
15275
+ createChangeWorkspace(request, options = {}) {
15276
+ return this.http.post(this.discovery.resolveHref(WORKSPACES_HREF, options), request, { headers: this.resolveHeaders(options) });
15277
+ }
15278
+ listChangeWorkspaces(options = {}) {
15279
+ return this.http.get(this.discovery.resolveHref(WORKSPACES_HREF, options), { headers: this.resolveHeaders(options) });
15280
+ }
15281
+ getChangeWorkspace(workspaceId, options = {}) {
15282
+ return this.http.get(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}`, options), { headers: this.resolveHeaders(options) });
15283
+ }
15284
+ getChangeWorkspaceCapabilities(workspaceId, options = {}) {
15285
+ return this.http.get(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/capabilities`, options), { headers: this.resolveHeaders(options) });
15286
+ }
15287
+ getDefinition(definitionId, options = {}) {
15288
+ return this.http.get(this.discovery.resolveHref(`${DEFINITIONS_HREF}/${encodeURIComponent(definitionId)}`, options), { headers: this.resolveHeaders(options) });
15289
+ }
15290
+ updateChangeWorkspaceDraft(workspaceId, request, etag, options = {}) {
15291
+ const headers = (this.resolveHeaders(options) ?? new HttpHeaders())
15292
+ .set('If-Match', this.strongEntityTag(etag));
15293
+ return this.http.put(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/draft`, options), request, { headers });
15294
+ }
15295
+ createTestScenario(workspaceId, request, options = {}) {
15296
+ return this.http.post(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/scenarios`, options), request, { headers: this.resolveHeaders(options) });
15297
+ }
15298
+ listTestScenarios(workspaceId, options = {}) {
15299
+ return this.http.get(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/scenarios`, options), { headers: this.resolveHeaders(options) });
15300
+ }
15301
+ listTestRuns(workspaceId, options = {}) {
15302
+ return this.http.get(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/test-runs`, options), { headers: this.resolveHeaders(options) });
15303
+ }
15304
+ submitChangeWorkspace(workspaceId, etag, options = {}) {
15305
+ const headers = (this.resolveHeaders(options) ?? new HttpHeaders())
15306
+ .set('If-Match', this.strongEntityTag(etag));
15307
+ return this.http.post(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/submit`, options), null, { headers });
15308
+ }
15309
+ reviewChangeWorkspace(workspaceId, request, etag, options = {}) {
15310
+ const headers = (this.resolveHeaders(options) ?? new HttpHeaders())
15311
+ .set('If-Match', this.strongEntityTag(etag));
15312
+ return this.http.post(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/reviews`, options), request, { headers });
15313
+ }
15314
+ listChangeWorkspaceReviews(workspaceId, options = {}) {
15315
+ return this.http.get(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/reviews`, options), { headers: this.resolveHeaders(options) });
15316
+ }
15317
+ promoteChangeWorkspace(workspaceId, etag, options = {}) {
15318
+ const headers = (this.resolveHeaders(options) ?? new HttpHeaders())
15319
+ .set('If-Match', this.strongEntityTag(etag));
15320
+ return this.http.post(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/promote`, options), null, { headers });
15321
+ }
15322
+ inspectChangeWorkspaceLifecycle(workspaceId, ruleSetKey = null, options = {}) {
15323
+ return this.getChangeWorkspace(workspaceId, options).pipe(switchMap$1((workspace) => forkJoin({
15324
+ workspace: of(workspace),
15325
+ promotedDefinition: workspace.promotedDefinitionId
15326
+ ? this.getDefinition(workspace.promotedDefinitionId, options)
15327
+ : of(null),
15328
+ testRuns: this.listTestRuns(workspaceId, options),
15329
+ reviews: this.listChangeWorkspaceReviews(workspaceId, options),
15330
+ materializations: workspace.promotedDefinitionId
15331
+ ? this.listMaterializations({ ruleDefinitionId: workspace.promotedDefinitionId }, options)
15332
+ : of([]),
15333
+ snapshotHeadStatus: ruleSetKey
15334
+ ? this.getSnapshotHeadStatus(ruleSetKey, options)
15335
+ : of(null),
15336
+ snapshotVersions: ruleSetKey
15337
+ ? this.listSnapshotVersions(ruleSetKey, 50, options)
15338
+ : of([]),
15339
+ })));
15340
+ }
15341
+ updateTestScenario(workspaceId, scenarioId, request, etag, options = {}) {
15342
+ const headers = (this.resolveHeaders(options) ?? new HttpHeaders())
15343
+ .set('If-Match', this.strongEntityTag(etag));
15344
+ return this.http.put(this.discovery.resolveHref(`${WORKSPACES_HREF}/${encodeURIComponent(workspaceId)}/scenarios/${encodeURIComponent(scenarioId)}`, options), request, { headers });
15345
+ }
15246
15346
  simulate(request, options = {}) {
15247
15347
  return this.http.post(this.discovery.resolveHref(SIMULATIONS_HREF, options), request, { headers: this.resolveHeaders(options) });
15248
15348
  }
@@ -15261,6 +15361,100 @@ class DomainRuleService {
15261
15361
  transitionMaterializationStatus(materializationId, request, options = {}) {
15262
15362
  return this.http.patch(this.discovery.resolveHref(`${MATERIALIZATIONS_HREF}/${encodeURIComponent(materializationId)}/status`, options), request, { headers: this.resolveHeaders(options) });
15263
15363
  }
15364
+ listSnapshotVersions(ruleSetKey, limit = 50, options = {}) {
15365
+ return this.http.get(this.discovery.resolveHref(SNAPSHOTS_HREF, options), {
15366
+ params: new HttpParams()
15367
+ .set('ruleSetKey', ruleSetKey)
15368
+ .set('limit', String(limit)),
15369
+ headers: this.resolveHeaders(options),
15370
+ });
15371
+ }
15372
+ getSnapshotHeadStatus(ruleSetKey, options = {}) {
15373
+ return this.http.get(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/head/status`, options), {
15374
+ params: new HttpParams().set('ruleSetKey', ruleSetKey),
15375
+ headers: this.resolveHeaders(options),
15376
+ });
15377
+ }
15378
+ getSnapshotHead(ruleSetKey, options = {}) {
15379
+ return this.http.get(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/head`, options), {
15380
+ params: new HttpParams().set('ruleSetKey', ruleSetKey),
15381
+ headers: this.resolveHeaders(options),
15382
+ });
15383
+ }
15384
+ getSnapshotExecutionSummary(snapshotKey, options = {}) {
15385
+ return this.http.get(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/${encodeURIComponent(snapshotKey)}/execution-summary`, options), { headers: this.resolveHeaders(options) });
15386
+ }
15387
+ getSnapshotHostStatusSummary(ruleSetKey, options = {}) {
15388
+ return this.http.get(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/head/host-status-summary`, options), {
15389
+ params: new HttpParams().set('ruleSetKey', ruleSetKey),
15390
+ headers: this.resolveHeaders(options),
15391
+ });
15392
+ }
15393
+ getRolloutPolicyCatalog(ruleSetKey, options = {}) {
15394
+ return this.http.get(this.discovery.resolveHref(ROLLOUT_POLICIES_HREF, options), {
15395
+ params: new HttpParams().set('ruleSetKey', ruleSetKey),
15396
+ headers: this.resolveHeaders(options),
15397
+ });
15398
+ }
15399
+ getRolloutPolicyTimeline(ruleSetKey, options = {}) {
15400
+ return this.http.get(this.discovery.resolveHref(`${ROLLOUT_POLICIES_HREF}/timeline`, options), {
15401
+ params: new HttpParams().set('ruleSetKey', ruleSetKey),
15402
+ headers: this.resolveHeaders(options),
15403
+ });
15404
+ }
15405
+ createRolloutPolicy(request, options = {}) {
15406
+ return this.http.post(this.discovery.resolveHref(ROLLOUT_POLICIES_HREF, options), request, { headers: this.resolveHeaders(options) });
15407
+ }
15408
+ approveRolloutPolicy(policyId, options = {}) {
15409
+ return this.http.post(this.discovery.resolveHref(`${ROLLOUT_POLICIES_HREF}/${encodeURIComponent(policyId)}/approve`, options), null, { headers: this.resolveHeaders(options) });
15410
+ }
15411
+ activateRolloutPolicy(policyId, policyHeadEtag, options = {}) {
15412
+ const resolved = this.resolveHeaders(options) ?? new HttpHeaders();
15413
+ return this.http.post(this.discovery.resolveHref(`${ROLLOUT_POLICIES_HREF}/${encodeURIComponent(policyId)}/activate`, options), null, { headers: resolved.set('If-Match', this.strongEntityTag(policyHeadEtag)) });
15414
+ }
15415
+ getRolloutCatalog(ruleSetKey, options = {}) {
15416
+ return this.http.get(this.discovery.resolveHref(ROLLOUTS_HREF, options), {
15417
+ params: new HttpParams().set('ruleSetKey', ruleSetKey),
15418
+ headers: this.resolveHeaders(options),
15419
+ });
15420
+ }
15421
+ getRolloutReadiness(rolloutId, options = {}) {
15422
+ return this.http.get(this.discovery.resolveHref(`${ROLLOUTS_HREF}/${encodeURIComponent(rolloutId)}/readiness`, options), { headers: this.resolveHeaders(options) });
15423
+ }
15424
+ createRollout(request, headEtag, options = {}) {
15425
+ const resolved = this.resolveHeaders(options) ?? new HttpHeaders();
15426
+ return this.http.post(this.discovery.resolveHref(ROLLOUTS_HREF, options), request, { headers: resolved.set('If-Match', this.strongEntityTag(headEtag)) });
15427
+ }
15428
+ cancelRollout(rolloutId, options = {}) {
15429
+ return this.http.post(this.discovery.resolveHref(`${ROLLOUTS_HREF}/${encodeURIComponent(rolloutId)}/cancel`, options), null, { headers: this.resolveHeaders(options) });
15430
+ }
15431
+ activateSnapshotCandidate(snapshotKey, headEtag, rolloutId, options = {}) {
15432
+ let resolved = this.resolveHeaders(options) ?? new HttpHeaders();
15433
+ resolved = resolved.set('If-Match', this.strongEntityTag(headEtag));
15434
+ resolved = resolved.set('X-Rule-Rollout-ID', rolloutId);
15435
+ return this.http.post(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/${encodeURIComponent(snapshotKey)}/activate`, options), null, { headers: resolved });
15436
+ }
15437
+ prepareSnapshotComposition(request, options = {}) {
15438
+ return this.http.post(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/composition-manifest`, options), request, { headers: this.resolveHeaders(options) });
15439
+ }
15440
+ approveSnapshotComposition(request, options = {}) {
15441
+ return this.http.post(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/composition-approvals`, options), request, { headers: this.resolveHeaders(options) });
15442
+ }
15443
+ publishSnapshot(request, currentHeadEtag, options = {}) {
15444
+ let headers = this.resolveHeaders(options) ?? new HttpHeaders();
15445
+ headers = currentHeadEtag
15446
+ ? headers.set('If-Match', this.strongEntityTag(currentHeadEtag))
15447
+ : headers.set('If-None-Match', '*');
15448
+ return this.http.post(this.discovery.resolveHref(SNAPSHOTS_HREF, options), request, { headers });
15449
+ }
15450
+ activateSnapshot(snapshotKey, headEtag, options = {}) {
15451
+ const resolved = this.resolveHeaders(options) ?? new HttpHeaders();
15452
+ return this.http.post(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/${encodeURIComponent(snapshotKey)}/activate`, options), null, { headers: resolved.set('If-Match', this.strongEntityTag(headEtag)) });
15453
+ }
15454
+ rollbackSnapshot(snapshotKey, headEtag, options = {}) {
15455
+ const resolved = this.resolveHeaders(options) ?? new HttpHeaders();
15456
+ return this.http.post(this.discovery.resolveHref(`${SNAPSHOTS_HREF}/${encodeURIComponent(snapshotKey)}/rollback`, options), null, { headers: resolved.set('If-Match', this.strongEntityTag(headEtag)) });
15457
+ }
15264
15458
  buildParams(filters) {
15265
15459
  let params = new HttpParams();
15266
15460
  Object.entries(filters).forEach(([key, value]) => {
@@ -15270,6 +15464,15 @@ class DomainRuleService {
15270
15464
  });
15271
15465
  return params;
15272
15466
  }
15467
+ strongEntityTag(value) {
15468
+ const trimmed = value.trim();
15469
+ if (/^"[^"\r\n]*"$/.test(trimmed))
15470
+ return trimmed;
15471
+ if (!trimmed || /["\r\n,]/.test(trimmed) || /^W\//i.test(trimmed)) {
15472
+ throw new Error('The mutable-head ETag is not a valid strong entity tag.');
15473
+ }
15474
+ return `"${trimmed}"`;
15475
+ }
15273
15476
  resolveHeaders(options) {
15274
15477
  if (options.headers instanceof HttpHeaders) {
15275
15478
  return options.headers;
@@ -15739,6 +15942,16 @@ class ResourceActionOpenAdapterService {
15739
15942
  ];
15740
15943
  return;
15741
15944
  }
15945
+ const targetResourceKey = String(execution.preconditions.resourceVersionTargetResourceKey ?? '').trim();
15946
+ const targetIdField = String(execution.preconditions.resourceVersionTargetIdField ?? '').trim();
15947
+ if (targetResourceKey || targetIdField) {
15948
+ if (!targetResourceKey || !targetIdField) {
15949
+ throw new Error(`ResourceActionOpenAdapterService requires both resourceVersionTargetResourceKey and resourceVersionTargetIdField for action "${action.id}".`);
15950
+ }
15951
+ inputs['submitResourceVersionTargetResourceKey'] = targetResourceKey;
15952
+ inputs['submitResourceVersionTargetIdField'] = targetIdField;
15953
+ return;
15954
+ }
15742
15955
  if (execution.preconditions.resourceVersion === 'REQUIRED') {
15743
15956
  throw new Error(`ResourceActionOpenAdapterService requires resourceVersion or resourceVersionBindingPath for action "${action.id}".`);
15744
15957
  }
@@ -15806,6 +16019,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
15806
16019
 
15807
16020
  class SurfaceOpenMaterializerService {
15808
16021
  discovery = inject(ResourceDiscoveryService);
16022
+ i18n = inject(PraxisI18nService);
15809
16023
  async materialize(payload, context) {
15810
16024
  if (this.shouldPreserveRelatedRemoteTable(payload)) {
15811
16025
  return payload;
@@ -16267,11 +16481,13 @@ class SurfaceOpenMaterializerService {
16267
16481
  return !relatedActionIds.has(String(record['id'] || record['action'] || ''));
16268
16482
  })
16269
16483
  : [];
16484
+ const previousRelatedActionPresentation = new Map((Array.isArray(previousToolbar['actions']) ? previousToolbar['actions'] : [])
16485
+ .map((action) => this.objectRecord(action))
16486
+ .filter((action) => relatedActionIds.has(String(action['id'] || '')))
16487
+ .map((action) => [String(action['id']), action]));
16270
16488
  const toolbarActions = [
16271
16489
  ...previousToolbarActions,
16272
- ...relatedActions.map((action) => action['action'] === 'create'
16273
- ? { ...action, appearance: 'filled' }
16274
- : action),
16490
+ ...relatedActions.map((action) => this.mergeRelatedActionPresentation(action, previousRelatedActionPresentation.get(String(action['id'])))),
16275
16491
  ];
16276
16492
  const previousAi = this.objectRecord(previousConfig['ai']);
16277
16493
  const previousAssistant = this.objectRecord(previousAi['assistant']);
@@ -16332,6 +16548,31 @@ class SurfaceOpenMaterializerService {
16332
16548
  ? value
16333
16549
  : {};
16334
16550
  }
16551
+ mergeRelatedActionPresentation(canonical, authored) {
16552
+ if (!authored)
16553
+ return canonical;
16554
+ const presentation = {};
16555
+ for (const key of ['label', 'tooltip', 'icon']) {
16556
+ if (typeof authored[key] === 'string')
16557
+ presentation[key] = authored[key];
16558
+ }
16559
+ if (['primary', 'accent', 'warn'].includes(String(authored['color']))) {
16560
+ presentation['color'] = authored['color'];
16561
+ }
16562
+ if (['filled', 'outlined', 'elevated', 'text', 'tonal'].includes(String(authored['appearance']))) {
16563
+ presentation['appearance'] = authored['appearance'];
16564
+ }
16565
+ if (['button', 'icon', 'fab'].includes(String(authored['type']))) {
16566
+ presentation['type'] = authored['type'];
16567
+ }
16568
+ if (['start', 'end'].includes(String(authored['position']))) {
16569
+ presentation['position'] = authored['position'];
16570
+ }
16571
+ if (typeof authored['order'] === 'number' && Number.isFinite(authored['order'])) {
16572
+ presentation['order'] = authored['order'];
16573
+ }
16574
+ return { ...canonical, ...presentation };
16575
+ }
16335
16576
  buildRelatedCrudActions(payload, operations, paths) {
16336
16577
  const noun = this.resolveRelatedActionNoun(payload);
16337
16578
  const formIdPrefix = this.stableSurfaceId(payload);
@@ -16341,7 +16582,7 @@ class SurfaceOpenMaterializerService {
16341
16582
  actions.push({
16342
16583
  id: 'create',
16343
16584
  action: 'create',
16344
- label: `Adicionar ${noun}`,
16585
+ label: this.relatedActionText('create', noun),
16345
16586
  tooltip: this.resolveRelatedActionDescription(payload, 'create', noun),
16346
16587
  formId: `${formIdPrefix}.create`,
16347
16588
  icon: 'add',
@@ -16358,7 +16599,7 @@ class SurfaceOpenMaterializerService {
16358
16599
  actions.push({
16359
16600
  id: 'edit',
16360
16601
  action: 'edit',
16361
- label: `Editar ${noun}`,
16602
+ label: this.relatedActionText('edit', noun),
16362
16603
  tooltip: this.resolveRelatedActionDescription(payload, 'edit', noun),
16363
16604
  formId: `${formIdPrefix}.edit`,
16364
16605
  icon: 'edit',
@@ -16378,7 +16619,7 @@ class SurfaceOpenMaterializerService {
16378
16619
  actions.push({
16379
16620
  id: 'delete',
16380
16621
  action: 'delete',
16381
- label: `Remover ${noun}`,
16622
+ label: this.relatedActionText('delete', noun),
16382
16623
  tooltip: this.resolveRelatedActionDescription(payload, 'delete', noun),
16383
16624
  formId: `${formIdPrefix}.delete`,
16384
16625
  icon: 'delete',
@@ -16397,6 +16638,13 @@ class SurfaceOpenMaterializerService {
16397
16638
  }
16398
16639
  return actions;
16399
16640
  }
16641
+ relatedActionText(operation, noun) {
16642
+ const english = this.i18n.getLocale().toLowerCase().startsWith('en');
16643
+ const fallback = english
16644
+ ? `${operation === 'create' ? 'Add' : operation === 'edit' ? 'Edit' : 'Remove'} ${noun}`
16645
+ : `${operation === 'create' ? 'Adicionar' : operation === 'edit' ? 'Editar' : 'Remover'} ${noun}`;
16646
+ return this.i18n.t(`action.${operation}.label`, { noun }, fallback, RELATED_RESOURCE_OUTLET_I18N_NAMESPACE);
16647
+ }
16400
16648
  buildRelatedCommandFormConfig() {
16401
16649
  return {
16402
16650
  metadata: {
@@ -16579,11 +16827,19 @@ class SurfaceOpenMaterializerService {
16579
16827
  || '').trim();
16580
16828
  if (surfaceDescription)
16581
16829
  return surfaceDescription;
16582
- if (action === 'create')
16583
- return `Adicione ${noun} ao contexto selecionado.`;
16584
- if (action === 'edit')
16585
- return `Atualize os dados de ${noun} no contexto selecionado.`;
16586
- return `Remova ${noun} do contexto selecionado.`;
16830
+ const english = this.i18n.getLocale().toLowerCase().startsWith('en');
16831
+ const fallback = english
16832
+ ? action === 'create'
16833
+ ? `Add ${noun} to the selected context.`
16834
+ : action === 'edit'
16835
+ ? `Update ${noun} data in the selected context.`
16836
+ : `Remove ${noun} from the selected context.`
16837
+ : action === 'create'
16838
+ ? `Adicione ${noun} ao contexto selecionado.`
16839
+ : action === 'edit'
16840
+ ? `Atualize os dados de ${noun} no contexto selecionado.`
16841
+ : `Remova ${noun} do contexto selecionado.`;
16842
+ return this.i18n.t(`action.${action}.tooltip`, { noun }, fallback, RELATED_RESOURCE_OUTLET_I18N_NAMESPACE);
16587
16843
  }
16588
16844
  inferColumnsFromData(data) {
16589
16845
  const first = data.find((item) => item && typeof item === 'object' && !Array.isArray(item));
@@ -17840,7 +18096,7 @@ function normalizeUnknownError(rawError) {
17840
18096
  if (typeof candidate === 'string') {
17841
18097
  return normalizeFromParts('Error', candidate);
17842
18098
  }
17843
- if (isRecord$1(candidate)) {
18099
+ if (isRecord$3(candidate)) {
17844
18100
  const name = toText(candidate['name'], 'Error');
17845
18101
  const message = toText(candidate['message'], safeStringify(candidate));
17846
18102
  const stack = toStack(candidate['stack']);
@@ -17859,7 +18115,7 @@ function extractErrorCandidate(data) {
17859
18115
  if (data instanceof Error || typeof data === 'string') {
17860
18116
  return data;
17861
18117
  }
17862
- if (!isRecord$1(data)) {
18118
+ if (!isRecord$3(data)) {
17863
18119
  return undefined;
17864
18120
  }
17865
18121
  if ('error' in data) {
@@ -17877,7 +18133,7 @@ function extractErrorCandidate(data) {
17877
18133
  return undefined;
17878
18134
  }
17879
18135
  function unwrapRejection(error) {
17880
- if (!isRecord$1(error)) {
18136
+ if (!isRecord$3(error)) {
17881
18137
  return error;
17882
18138
  }
17883
18139
  if ('rejection' in error) {
@@ -17937,7 +18193,7 @@ function safeStringify(value) {
17937
18193
  return UNKNOWN_ERROR_MESSAGE;
17938
18194
  }
17939
18195
  }
17940
- function isRecord$1(value) {
18196
+ function isRecord$3(value) {
17941
18197
  return !!value && typeof value === 'object';
17942
18198
  }
17943
18199
 
@@ -18897,6 +19153,54 @@ function buildPraxisCollectionSearchCss(tokens = {}) {
18897
19153
  `;
18898
19154
  }
18899
19155
 
19156
+ const PRAXIS_ACTION_CONTROL_DEFAULTS = {
19157
+ height: '40px',
19158
+ compactHeight: '36px',
19159
+ spaciousHeight: '44px',
19160
+ radius: '8px',
19161
+ paddingInline: '12px',
19162
+ gap: '8px',
19163
+ iconSize: '18px',
19164
+ fontSize: 'var(--md-sys-typescale-label-large-size, 0.875rem)',
19165
+ lineHeight: 'var(--md-sys-typescale-label-large-line-height, 1.25rem)',
19166
+ fontWeight: 'var(--md-sys-typescale-label-large-weight, 500)',
19167
+ focusRing: 'color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent)',
19168
+ disabledOpacity: '0.62',
19169
+ };
19170
+ const PRAXIS_ACTION_CONTROL_VARS = {
19171
+ height: '--praxis-action-control-height',
19172
+ compactHeight: '--praxis-action-control-compact-height',
19173
+ spaciousHeight: '--praxis-action-control-spacious-height',
19174
+ radius: '--praxis-action-control-radius',
19175
+ paddingInline: '--praxis-action-control-padding-inline',
19176
+ gap: '--praxis-action-control-gap',
19177
+ iconSize: '--praxis-action-control-icon-size',
19178
+ fontSize: '--praxis-action-control-font-size',
19179
+ lineHeight: '--praxis-action-control-line-height',
19180
+ fontWeight: '--praxis-action-control-font-weight',
19181
+ focusRing: '--praxis-action-control-focus-ring',
19182
+ disabledOpacity: '--praxis-action-control-disabled-opacity',
19183
+ };
19184
+ function buildPraxisActionControlCss(tokens = {}) {
19185
+ const resolved = { ...PRAXIS_ACTION_CONTROL_DEFAULTS, ...tokens };
19186
+ return `
19187
+ :root {
19188
+ ${PRAXIS_ACTION_CONTROL_VARS.height}: ${resolved.height};
19189
+ ${PRAXIS_ACTION_CONTROL_VARS.compactHeight}: ${resolved.compactHeight};
19190
+ ${PRAXIS_ACTION_CONTROL_VARS.spaciousHeight}: ${resolved.spaciousHeight};
19191
+ ${PRAXIS_ACTION_CONTROL_VARS.radius}: ${resolved.radius};
19192
+ ${PRAXIS_ACTION_CONTROL_VARS.paddingInline}: ${resolved.paddingInline};
19193
+ ${PRAXIS_ACTION_CONTROL_VARS.gap}: ${resolved.gap};
19194
+ ${PRAXIS_ACTION_CONTROL_VARS.iconSize}: ${resolved.iconSize};
19195
+ ${PRAXIS_ACTION_CONTROL_VARS.fontSize}: ${resolved.fontSize};
19196
+ ${PRAXIS_ACTION_CONTROL_VARS.lineHeight}: ${resolved.lineHeight};
19197
+ ${PRAXIS_ACTION_CONTROL_VARS.fontWeight}: ${resolved.fontWeight};
19198
+ ${PRAXIS_ACTION_CONTROL_VARS.focusRing}: ${resolved.focusRing};
19199
+ ${PRAXIS_ACTION_CONTROL_VARS.disabledOpacity}: ${resolved.disabledOpacity};
19200
+ }
19201
+ `;
19202
+ }
19203
+
18900
19204
  /** Set the current tenant for GlobalConfigService at app boot. */
18901
19205
  function provideGlobalConfigTenant(tenantId) {
18902
19206
  return {
@@ -20864,6 +21168,227 @@ function convertFormLayoutToConfig(formLayout) {
20864
21168
  return ensureIds({ sections });
20865
21169
  }
20866
21170
 
21171
+ const MAX_REACTIVE_DETERMINATION_BINDINGS = 64;
21172
+ /** Strictly normalizes the closed x-ui.reactiveDeterminations projection. */
21173
+ function normalizeReactiveDeterminations(value) {
21174
+ if (!Array.isArray(value))
21175
+ return [];
21176
+ const normalized = value
21177
+ .map((candidate) => normalizeReactiveDetermination(candidate))
21178
+ .filter((candidate) => candidate !== null);
21179
+ const idCounts = new Map();
21180
+ normalized.forEach((candidate) => idCounts.set(candidate.id, (idCounts.get(candidate.id) ?? 0) + 1));
21181
+ if (normalized.some((candidate) => idCounts.get(candidate.id) !== 1))
21182
+ return [];
21183
+ if (hasCrossDefinitionOutputOverlap(normalized) || hasDependencyCycle(normalized))
21184
+ return [];
21185
+ return normalized;
21186
+ }
21187
+ function normalizeReactiveDetermination(value) {
21188
+ if (!isRecord$2(value) ||
21189
+ !hasOnlyKeys(value, ['id', 'trigger', 'scope', 'capability', 'inputs', 'outputs', 'provenance'])) {
21190
+ return null;
21191
+ }
21192
+ const id = stableId(value['id']);
21193
+ const trigger = normalizeTrigger(value['trigger']);
21194
+ const scope = normalizeScope(value['scope']);
21195
+ const capability = normalizeCapability(value['capability']);
21196
+ const inputs = normalizeInputs(value['inputs']);
21197
+ const outputs = normalizeOutputs(value['outputs']);
21198
+ const provenance = normalizeProvenance(value['provenance']);
21199
+ const inputFieldPaths = new Set(inputs.map((binding) => binding.fieldPath));
21200
+ const outputFieldPaths = new Set(outputs.map((binding) => binding.fieldPath));
21201
+ if (!id ||
21202
+ !trigger ||
21203
+ !scope ||
21204
+ !capability ||
21205
+ !inputs.length ||
21206
+ !outputs.length ||
21207
+ !provenance ||
21208
+ inputs.length + outputs.length > MAX_REACTIVE_DETERMINATION_BINDINGS ||
21209
+ trigger.sourcePaths.length > inputs.length ||
21210
+ trigger.sourcePaths.some((sourcePath) => !inputFieldPaths.has(sourcePath)) ||
21211
+ [...outputFieldPaths].some((outputPath) => [...inputFieldPaths].some((inputPath) => jsonPointersOverlap(inputPath, outputPath)))) {
21212
+ return null;
21213
+ }
21214
+ return { id, trigger, scope, capability, inputs, outputs, provenance };
21215
+ }
21216
+ function hasCrossDefinitionOutputOverlap(definitions) {
21217
+ for (let leftIndex = 0; leftIndex < definitions.length; leftIndex += 1) {
21218
+ for (let rightIndex = leftIndex + 1; rightIndex < definitions.length; rightIndex += 1) {
21219
+ if (definitions[leftIndex].outputs.some((left) => definitions[rightIndex].outputs.some((right) => jsonPointersOverlap(left.fieldPath, right.fieldPath))))
21220
+ return true;
21221
+ }
21222
+ }
21223
+ return false;
21224
+ }
21225
+ function hasDependencyCycle(definitions) {
21226
+ const dependencies = definitions.map((consumer) => definitions
21227
+ .map((producer, producerIndex) => ({ producer, producerIndex }))
21228
+ .filter(({ producer }) => producer !== consumer && producer.outputs.some((output) => consumer.inputs.some((input) => jsonPointersOverlap(output.fieldPath, input.fieldPath))))
21229
+ .map(({ producerIndex }) => producerIndex));
21230
+ const state = new Array(definitions.length).fill(0);
21231
+ const visit = (index) => {
21232
+ if (state[index] === 1)
21233
+ return true;
21234
+ if (state[index] === 2)
21235
+ return false;
21236
+ state[index] = 1;
21237
+ if (dependencies[index].some(visit))
21238
+ return true;
21239
+ state[index] = 2;
21240
+ return false;
21241
+ };
21242
+ return definitions.some((_definition, index) => visit(index));
21243
+ }
21244
+ function normalizeTrigger(value) {
21245
+ if (!isRecord$2(value) || !hasOnlyKeys(value, ['mode', 'sourcePaths']))
21246
+ return null;
21247
+ const sourcePaths = pointerArray(value['sourcePaths'], MAX_REACTIVE_DETERMINATION_BINDINGS);
21248
+ if (value['mode'] !== 'on-change' || !sourcePaths.length)
21249
+ return null;
21250
+ return { mode: 'on-change', sourcePaths };
21251
+ }
21252
+ function normalizeScope(value) {
21253
+ if (!isRecord$2(value) || !hasOnlyKeys(value, ['schemaOperationId', 'formMode']))
21254
+ return null;
21255
+ const schemaOperationId = stableId(value['schemaOperationId']);
21256
+ const formMode = value['formMode'];
21257
+ if (!schemaOperationId || (formMode !== 'create' && formMode !== 'edit'))
21258
+ return null;
21259
+ return { schemaOperationId, formMode };
21260
+ }
21261
+ function normalizeCapability(value) {
21262
+ if (!isRecord$2(value) ||
21263
+ !hasOnlyKeys(value, ['operationId', 'method', 'href', 'requestSchemaUrl', 'responseSchemaUrl'])) {
21264
+ return null;
21265
+ }
21266
+ const operationId = stableId(value['operationId']);
21267
+ const href = nonBlank(value['href']);
21268
+ const requestSchemaUrl = nonBlank(value['requestSchemaUrl']);
21269
+ const responseSchemaUrl = nonBlank(value['responseSchemaUrl']);
21270
+ if (!operationId ||
21271
+ value['method'] !== 'POST' ||
21272
+ !href ||
21273
+ !isSafeRelativeOperationPath(href) ||
21274
+ !requestSchemaUrl?.startsWith('/schemas/filtered?') ||
21275
+ !responseSchemaUrl?.startsWith('/schemas/filtered?')) {
21276
+ return null;
21277
+ }
21278
+ return { operationId, method: 'POST', href, requestSchemaUrl, responseSchemaUrl };
21279
+ }
21280
+ function normalizeInputs(value) {
21281
+ if (!Array.isArray(value) || value.length > MAX_REACTIVE_DETERMINATION_BINDINGS)
21282
+ return [];
21283
+ const result = [];
21284
+ const fieldPaths = new Set();
21285
+ const requestPaths = new Set();
21286
+ for (const candidate of value) {
21287
+ if (!isRecord$2(candidate) || !hasOnlyKeys(candidate, ['fieldPath', 'requestPath']))
21288
+ return [];
21289
+ const fieldPath = jsonPointer(candidate['fieldPath']);
21290
+ const requestPath = jsonPointer(candidate['requestPath']);
21291
+ if (!fieldPath ||
21292
+ !requestPath ||
21293
+ [...fieldPaths].some((current) => jsonPointersOverlap(current, fieldPath)) ||
21294
+ [...requestPaths].some((current) => jsonPointersOverlap(current, requestPath)))
21295
+ return [];
21296
+ fieldPaths.add(fieldPath);
21297
+ requestPaths.add(requestPath);
21298
+ result.push({ fieldPath, requestPath });
21299
+ }
21300
+ return result;
21301
+ }
21302
+ function normalizeOutputs(value) {
21303
+ if (!Array.isArray(value) || value.length > MAX_REACTIVE_DETERMINATION_BINDINGS)
21304
+ return [];
21305
+ const result = [];
21306
+ const responsePaths = new Set();
21307
+ const fieldPaths = new Set();
21308
+ for (const candidate of value) {
21309
+ if (!isRecord$2(candidate) || !hasOnlyKeys(candidate, ['responsePath', 'fieldPath']))
21310
+ return [];
21311
+ const responsePath = jsonPointer(candidate['responsePath']);
21312
+ const fieldPath = jsonPointer(candidate['fieldPath']);
21313
+ if (!responsePath ||
21314
+ !fieldPath ||
21315
+ [...responsePaths].some((current) => jsonPointersOverlap(current, responsePath)) ||
21316
+ [...fieldPaths].some((current) => jsonPointersOverlap(current, fieldPath)))
21317
+ return [];
21318
+ responsePaths.add(responsePath);
21319
+ fieldPaths.add(fieldPath);
21320
+ result.push({ responsePath, fieldPath });
21321
+ }
21322
+ return result;
21323
+ }
21324
+ function normalizeProvenance(value) {
21325
+ if (!isRecord$2(value) || !hasOnlyKeys(value, ['kind', 'source', 'version']))
21326
+ return null;
21327
+ const kind = value['kind'];
21328
+ const source = stableId(value['source']);
21329
+ const version = value['version'] === undefined ? undefined : nonBlank(value['version']);
21330
+ if ((kind !== 'platform' && kind !== 'host') || !source || (value['version'] !== undefined && !version)) {
21331
+ return null;
21332
+ }
21333
+ if (version && version.length > 64)
21334
+ return null;
21335
+ return { kind, source, ...(version ? { version } : {}) };
21336
+ }
21337
+ function pointerArray(value, maxItems) {
21338
+ if (!Array.isArray(value) || value.length > maxItems)
21339
+ return [];
21340
+ const pointers = value.map(jsonPointer);
21341
+ if (pointers.some((pointer) => !pointer))
21342
+ return [];
21343
+ const uniquePointers = new Set(pointers);
21344
+ return uniquePointers.size === pointers.length ? [...uniquePointers] : [];
21345
+ }
21346
+ function jsonPointer(value) {
21347
+ const pointer = nonBlank(value);
21348
+ return pointer && /^\/(?!\/)(?:[^/~]|~[01])+(?:\/(?:[^/~]|~[01])+)*$/.test(pointer)
21349
+ ? pointer
21350
+ : null;
21351
+ }
21352
+ function jsonPointersOverlap(left, right) {
21353
+ const leftSegments = decodeJsonPointerSegments(left);
21354
+ const rightSegments = decodeJsonPointerSegments(right);
21355
+ const prefixLength = Math.min(leftSegments.length, rightSegments.length);
21356
+ for (let index = 0; index < prefixLength; index += 1) {
21357
+ if (leftSegments[index] !== rightSegments[index])
21358
+ return false;
21359
+ }
21360
+ return true;
21361
+ }
21362
+ function decodeJsonPointerSegments(pointer) {
21363
+ return pointer.slice(1).split('/').map((segment) => segment.replace(/~1/g, '/').replace(/~0/g, '~'));
21364
+ }
21365
+ function stableId(value) {
21366
+ const id = nonBlank(value);
21367
+ return id && /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(id) ? id : null;
21368
+ }
21369
+ function isSafeRelativeOperationPath(path) {
21370
+ if (!path.startsWith('/') || path.startsWith('//') || path.includes('\\') || path.includes('?') ||
21371
+ path.includes('#') || path.includes('{') || path.includes('}') ||
21372
+ /[\u0000-\u001f\u007f]/.test(path) || /%(?:2f|5c)/i.test(path))
21373
+ return false;
21374
+ try {
21375
+ return new URL(path, 'https://praxis.invalid').origin === 'https://praxis.invalid';
21376
+ }
21377
+ catch {
21378
+ return false;
21379
+ }
21380
+ }
21381
+ function nonBlank(value) {
21382
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
21383
+ }
21384
+ function isRecord$2(value) {
21385
+ return !!value && typeof value === 'object' && !Array.isArray(value);
21386
+ }
21387
+ function hasOnlyKeys(value, allowed) {
21388
+ const allowedSet = new Set(allowed);
21389
+ return Object.keys(value).every((key) => allowedSet.has(key));
21390
+ }
21391
+
20867
21392
  /**
20868
21393
  * Materializes a concrete FormConfig from a reusable editorial template.
20869
21394
  *
@@ -23685,6 +24210,25 @@ function markerColorForEvent$1(eventType) {
23685
24210
  return 'neutral';
23686
24211
  }
23687
24212
 
24213
+ /** Narrows an unknown HTTP error body without relying on human-readable message parsing. */
24214
+ function isDomainRuleSnapshotProblemResponse(value) {
24215
+ if (!isRecord$1(value) || typeof value['code'] !== 'string' || typeof value['message'] !== 'string') {
24216
+ return false;
24217
+ }
24218
+ const blockers = value['blockers'];
24219
+ return Array.isArray(blockers) && blockers.every(isDomainRuleSnapshotBlocker);
24220
+ }
24221
+ function isDomainRuleSnapshotBlocker(value) {
24222
+ return isRecord$1(value)
24223
+ && typeof value['code'] === 'string'
24224
+ && typeof value['stage'] === 'string'
24225
+ && (value['definitionId'] === null || typeof value['definitionId'] === 'string')
24226
+ && typeof value['message'] === 'string';
24227
+ }
24228
+ function isRecord$1(value) {
24229
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
24230
+ }
24231
+
23688
24232
  const DEFAULT_TITLE = 'Governed decision timeline';
23689
24233
  const DEFAULT_EMPTY_TEXT = 'No safe timeline events published for this decision.';
23690
24234
  function domainRuleTimelineToRichContentDocument(timeline, options = {}) {
@@ -41724,7 +42268,7 @@ class PraxisRelatedResourceOutletComponent {
41724
42268
  const discovery = this.injector.get(ResourceDiscoveryService);
41725
42269
  const catalog$ = discoverySource
41726
42270
  ? discovery.getSurfaces(discoverySource, options)
41727
- : discovery.fetchJson(href, options);
42271
+ : discovery.getSurfaces({ surfaces: { href: href } }, options);
41728
42272
  this.discoverySubscription = catalog$.subscribe({
41729
42273
  next: (response) => {
41730
42274
  if (this.discoveryRequestKey !== requestKey) {
@@ -42109,7 +42653,7 @@ const PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA = {
42109
42653
  { name: 'icon', type: 'string | null', description: 'Ícone opcional da superfície relacionada.' },
42110
42654
  { name: 'queryContext', type: 'RelatedResourceQueryContext | null', description: 'QueryContext base mesclado com o filtro canônico da relação filha.' },
42111
42655
  { name: 'tableId', type: 'string | null', description: 'Identidade estável da tabela filha para persistência, observabilidade e testes.' },
42112
- { name: 'tableConfig', type: 'Record<string, unknown> | null', description: 'Configuracao parcial da tabela filha materializada, mesclada ao preset canonico.' },
42656
+ { 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.' },
42113
42657
  { 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.' },
42114
42658
  { name: 'enableCustomization', type: 'boolean', description: 'Opt-in explicito para authoring governado da tabela filha.', default: false },
42115
42659
  { name: 'authoringCapability', type: 'string | null', description: 'Capability publica do EnterpriseRuntimeContext exigida quando o authoring da tabela filha estiver habilitado.' },
@@ -42185,7 +42729,7 @@ class EmptyStateCardComponent {
42185
42729
  </div>
42186
42730
  <div class="actions">
42187
42731
  @if (primaryAction) {
42188
- <button mat-flat-button color="primary" (click)="primaryAction.action()">
42732
+ <button type="button" mat-flat-button color="primary" (click)="primaryAction.action()">
42189
42733
  @if (primaryAction.icon) {
42190
42734
  <mat-icon [fontIcon]="primaryAction.icon"></mat-icon>
42191
42735
  }
@@ -42193,7 +42737,7 @@ class EmptyStateCardComponent {
42193
42737
  </button>
42194
42738
  }
42195
42739
  @for (a of secondaryActions; track a) {
42196
- <button mat-stroked-button [color]="a.color" (click)="a.action()">
42740
+ <button type="button" mat-stroked-button [color]="a.color" (click)="a.action()">
42197
42741
  @if (a.icon) {
42198
42742
  <mat-icon [fontIcon]="a.icon"></mat-icon>
42199
42743
  }
@@ -42203,7 +42747,7 @@ class EmptyStateCardComponent {
42203
42747
  </div>
42204
42748
  </mat-card-content>
42205
42749
  </mat-card>
42206
- `, 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"] }] });
42750
+ `, 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"] }] });
42207
42751
  }
42208
42752
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EmptyStateCardComponent, decorators: [{
42209
42753
  type: Component,
@@ -42236,7 +42780,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
42236
42780
  </div>
42237
42781
  <div class="actions">
42238
42782
  @if (primaryAction) {
42239
- <button mat-flat-button color="primary" (click)="primaryAction.action()">
42783
+ <button type="button" mat-flat-button color="primary" (click)="primaryAction.action()">
42240
42784
  @if (primaryAction.icon) {
42241
42785
  <mat-icon [fontIcon]="primaryAction.icon"></mat-icon>
42242
42786
  }
@@ -42244,7 +42788,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
42244
42788
  </button>
42245
42789
  }
42246
42790
  @for (a of secondaryActions; track a) {
42247
- <button mat-stroked-button [color]="a.color" (click)="a.action()">
42791
+ <button type="button" mat-stroked-button [color]="a.color" (click)="a.action()">
42248
42792
  @if (a.icon) {
42249
42793
  <mat-icon [fontIcon]="a.icon"></mat-icon>
42250
42794
  }
@@ -42254,7 +42798,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
42254
42798
  </div>
42255
42799
  </mat-card-content>
42256
42800
  </mat-card>
42257
- `, 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"] }]
42801
+ `, 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"] }]
42258
42802
  }], propDecorators: { icon: [{
42259
42803
  type: Input
42260
42804
  }], title: [{
@@ -43636,4 +44180,4 @@ function provideHookWhitelist(allowed) {
43636
44180
  * Generated bundle index. Do not edit.
43637
44181
  */
43638
44182
 
43639
- 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 };
44183
+ 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 };