@praxisui/core 9.0.62 → 9.0.63

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.
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, InjectionToken, Injectable, inject, Inject, Optional, SkipSelf, makeEnvironmentProviders, APP_INITIALIZER, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, ErrorHandler, Input, Directive, input, booleanAttribute, ChangeDetectionStrategy, EventEmitter, Output, SecurityContext, ViewContainerRef, isSignal, SimpleChange, ContentChild, HostBinding, output, Injector, ElementRef, ChangeDetectorRef, afterNextRender, HostListener, ViewChildren, ViewChild, effect } from '@angular/core';
2
+ import { Component, InjectionToken, Injectable, inject, Inject, Optional, SkipSelf, makeEnvironmentProviders, APP_INITIALIZER, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, ErrorHandler, Input, Directive, input, booleanAttribute, ChangeDetectionStrategy, EventEmitter, Output, SecurityContext, ViewContainerRef, Injector, isSignal, effect, SimpleChange, contentChild, HostBinding, output, ElementRef, ChangeDetectorRef, afterNextRender, HostListener, ViewChildren, ViewChild } 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
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
- import { switchMap, take, map, catchError, concatMap, tap, shareReplay, takeUntil, toArray, finalize } from 'rxjs/operators';
6
+ import { switchMap, map, take, 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';
9
9
  import { Router, ActivatedRoute } from '@angular/router';
@@ -3419,6 +3419,9 @@ function provideGlobalConfig(partial) {
3419
3419
  return { provide: GLOBAL_CONFIG, useValue: partial, multi: true };
3420
3420
  }
3421
3421
 
3422
+ function supportsConfigDocuments(storage) {
3423
+ return typeof storage.loadConfigDocument === 'function';
3424
+ }
3422
3425
  class LocalStorageConfigService {
3423
3426
  loadConfig(key) {
3424
3427
  try {
@@ -3522,6 +3525,14 @@ class DeferredAsyncConfigStorage {
3522
3525
  return this.delegate.clearConfig(key);
3523
3526
  return defer(() => from(this.gate()).pipe(switchMap(() => this.delegate.clearConfig(key))));
3524
3527
  }
3528
+ loadConfigDocument(key) {
3529
+ const load = () => supportsConfigDocuments(this.delegate)
3530
+ ? this.delegate.loadConfigDocument(key)
3531
+ : this.delegate.loadConfig(key).pipe(map((payload) => payload == null ? null : { payload }));
3532
+ if (!this.gate)
3533
+ return load();
3534
+ return defer(() => from(this.gate()).pipe(switchMap(load)));
3535
+ }
3525
3536
  }
3526
3537
  const ASYNC_CONFIG_STORAGE = new InjectionToken('ASYNC_CONFIG_STORAGE', {
3527
3538
  providedIn: 'root',
@@ -3670,6 +3681,29 @@ class ApiConfigStorage {
3670
3681
  }
3671
3682
  return this.executeLoadConfigRequest(key, true);
3672
3683
  }
3684
+ loadConfigDocument(key) {
3685
+ const cached = this.cache.get(key);
3686
+ const etag = cached?.readEtag ?? cached?.writeEtag;
3687
+ const { type, id } = this.resolveKey(key);
3688
+ const params = this.buildParams(type, id, cached?.scope);
3689
+ const headers = this.buildHeaders(etag ? { 'If-None-Match': this.formatEtag(etag) } : {});
3690
+ return this.http
3691
+ .get(this.baseUrl, { observe: 'response', headers, params })
3692
+ .pipe(map((resp) => this.cacheResponseDocument(key, resp.body, resp.headers.get('ETag'))), catchError((err) => {
3693
+ if (err.status === 304 && cached?.document) {
3694
+ return of(cached.document);
3695
+ }
3696
+ if (err.status === 404) {
3697
+ return of(null);
3698
+ }
3699
+ if (this.shouldLogLoadError(key, err)) {
3700
+ console.warn('[ApiConfigStorage] document load error', err);
3701
+ }
3702
+ return this.shouldPropagateLoadError(key, err)
3703
+ ? throwError(() => err)
3704
+ : of(null);
3705
+ }));
3706
+ }
3673
3707
  executeLoadConfigRequest(key, establishAvailability) {
3674
3708
  const cached = this.cache.get(key);
3675
3709
  const etag = cached?.readEtag ?? cached?.writeEtag;
@@ -3700,11 +3734,13 @@ class ApiConfigStorage {
3700
3734
  const readEtag = this.resolveReadEtag(responseEtag, body?.etag);
3701
3735
  const writeEtag = this.resolveWriteEtag(responseEtag, body?.etag);
3702
3736
  if (readEtag || writeEtag) {
3737
+ const document = this.toConfigDocument(body, responseEtag);
3703
3738
  this.cache.set(key, {
3704
3739
  readEtag,
3705
3740
  writeEtag,
3706
3741
  payload: body?.payload,
3707
3742
  scope: this.resolveResponseScope(body?.scope),
3743
+ document,
3708
3744
  });
3709
3745
  }
3710
3746
  releaseProbe?.();
@@ -3735,11 +3771,13 @@ class ApiConfigStorage {
3735
3771
  const readEtag = this.resolveReadEtag(responseEtag, body?.etag);
3736
3772
  const writeEtag = this.resolveWriteEtag(responseEtag, body?.etag);
3737
3773
  if (readEtag || writeEtag) {
3774
+ const document = this.toConfigDocument(body, responseEtag);
3738
3775
  this.cache.set(key, {
3739
3776
  readEtag,
3740
3777
  writeEtag,
3741
3778
  payload: body?.payload,
3742
3779
  scope: this.resolveResponseScope(body?.scope),
3780
+ document,
3743
3781
  });
3744
3782
  }
3745
3783
  return body?.payload ?? null;
@@ -3778,6 +3816,7 @@ class ApiConfigStorage {
3778
3816
  writeEtag: this.resolveWriteEtag(responseEtag, body?.etag),
3779
3817
  payload,
3780
3818
  scope: this.resolveResponseScope(body?.scope) ?? cached?.scope,
3819
+ document: this.toConfigDocument({ ...body, payload }, responseEtag),
3781
3820
  });
3782
3821
  }), catchError((err) => {
3783
3822
  if (this.shouldLogSaveError(key, err)) {
@@ -3859,6 +3898,36 @@ class ApiConfigStorage {
3859
3898
  }
3860
3899
  return new HttpHeaders(merged);
3861
3900
  }
3901
+ cacheResponseDocument(key, body, responseEtag) {
3902
+ const document = this.toConfigDocument(body, responseEtag);
3903
+ this.cache.set(key, {
3904
+ readEtag: this.resolveReadEtag(responseEtag, body?.etag),
3905
+ writeEtag: this.resolveWriteEtag(responseEtag, body?.etag),
3906
+ payload: document.payload,
3907
+ scope: this.resolveResponseScope(document.scope),
3908
+ document,
3909
+ });
3910
+ return document;
3911
+ }
3912
+ toConfigDocument(body, responseEtag) {
3913
+ const strongEtag = this.resolveWriteEtag(responseEtag, body?.etag);
3914
+ return {
3915
+ ...(typeof body?.componentType === 'string' ? { componentType: body.componentType } : {}),
3916
+ ...(typeof body?.componentId === 'string' ? { componentId: body.componentId } : {}),
3917
+ ...(typeof body?.environment === 'string' ? { environment: body.environment } : {}),
3918
+ ...(typeof body?.scope === 'string' ? { scope: body.scope } : {}),
3919
+ ...(typeof body?.version === 'number' ? { version: body.version } : {}),
3920
+ ...(strongEtag ? { etag: strongEtag } : {}),
3921
+ payload: body?.payload,
3922
+ authoringSource: this.isRecord(body?.authoringSource)
3923
+ ? body.authoringSource
3924
+ : null,
3925
+ tags: this.isRecord(body?.tags) ? body.tags : null,
3926
+ };
3927
+ }
3928
+ isRecord(value) {
3929
+ return !!value && typeof value === 'object' && !Array.isArray(value);
3930
+ }
3862
3931
  buildParams(componentType, componentId, resolvedScope) {
3863
3932
  const params = {
3864
3933
  componentType,
@@ -6239,6 +6308,19 @@ function createDefaultTableConfig() {
6239
6308
  // enabled: false
6240
6309
  // } // Property doesn't exist in InteractionConfig
6241
6310
  },
6311
+ loading: {
6312
+ type: 'skeleton',
6313
+ position: 'replace',
6314
+ text: 'Carregando dados...',
6315
+ showForQuickOperations: false,
6316
+ delay: 0,
6317
+ requestTimeoutMs: 30000,
6318
+ allowCancel: true,
6319
+ skeleton: {
6320
+ rows: 3,
6321
+ animated: true,
6322
+ },
6323
+ },
6242
6324
  resizing: {
6243
6325
  enabled: false,
6244
6326
  autoFit: true,
@@ -7159,6 +7241,152 @@ function isTextualControlType(value) {
7159
7241
  ].includes(value);
7160
7242
  }
7161
7243
 
7244
+ /**
7245
+ * Produces the same structural canonical form used by praxis-config-starter:
7246
+ * object keys are sorted, object properties with null/undefined values are
7247
+ * omitted, and array order is preserved.
7248
+ */
7249
+ function canonicalJsonStringify(value) {
7250
+ return JSON.stringify(canonicalizeJson(value));
7251
+ }
7252
+ function canonicalJsonSha256(value) {
7253
+ return textSha256(canonicalJsonStringify(value));
7254
+ }
7255
+ function textSha256(value) {
7256
+ return sha256Hex(encodeUtf8(value));
7257
+ }
7258
+ function canonicalizeJson(value) {
7259
+ if (Array.isArray(value)) {
7260
+ return value.map((item) => item === undefined ? null : canonicalizeJson(item));
7261
+ }
7262
+ if (value && typeof value === 'object') {
7263
+ return Object.keys(value)
7264
+ .sort()
7265
+ .reduce((result, key) => {
7266
+ const item = value[key];
7267
+ if (item !== null && item !== undefined) {
7268
+ result[key] = canonicalizeJson(item);
7269
+ }
7270
+ return result;
7271
+ }, {});
7272
+ }
7273
+ if (typeof value === 'number' && !Number.isFinite(value)) {
7274
+ throw new TypeError('Canonical JSON does not support non-finite numbers.');
7275
+ }
7276
+ return value;
7277
+ }
7278
+ function encodeUtf8(value) {
7279
+ if (typeof TextEncoder !== 'undefined') {
7280
+ return new TextEncoder().encode(value);
7281
+ }
7282
+ const bytes = [];
7283
+ for (const symbol of value) {
7284
+ const codePoint = symbol.codePointAt(0);
7285
+ if (codePoint <= 0x7f)
7286
+ bytes.push(codePoint);
7287
+ else if (codePoint <= 0x7ff) {
7288
+ bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f));
7289
+ }
7290
+ else if (codePoint <= 0xffff) {
7291
+ bytes.push(0xe0 | (codePoint >> 12), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));
7292
+ }
7293
+ else {
7294
+ bytes.push(0xf0 | (codePoint >> 18), 0x80 | ((codePoint >> 12) & 0x3f), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));
7295
+ }
7296
+ }
7297
+ return Uint8Array.from(bytes);
7298
+ }
7299
+ function sha256Hex(message) {
7300
+ const constants = [
7301
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
7302
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
7303
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
7304
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
7305
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
7306
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
7307
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
7308
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
7309
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
7310
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
7311
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
7312
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
7313
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
7314
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
7315
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
7316
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
7317
+ ];
7318
+ const hash = [
7319
+ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
7320
+ 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
7321
+ ];
7322
+ const length = message.length;
7323
+ const bitLenHi = Math.floor((length * 8) / 0x100000000);
7324
+ const bitLenLo = (length * 8) >>> 0;
7325
+ const withOne = length + 1;
7326
+ const mod = withOne % 64;
7327
+ const padLen = mod <= 56 ? 56 - mod : 56 + 64 - mod;
7328
+ const total = length + 1 + padLen + 8;
7329
+ const padded = new Uint8Array(total);
7330
+ padded.set(message);
7331
+ padded[length] = 0x80;
7332
+ padded[total - 8] = (bitLenHi >>> 24) & 0xff;
7333
+ padded[total - 7] = (bitLenHi >>> 16) & 0xff;
7334
+ padded[total - 6] = (bitLenHi >>> 8) & 0xff;
7335
+ padded[total - 5] = bitLenHi & 0xff;
7336
+ padded[total - 4] = (bitLenLo >>> 24) & 0xff;
7337
+ padded[total - 3] = (bitLenLo >>> 16) & 0xff;
7338
+ padded[total - 2] = (bitLenLo >>> 8) & 0xff;
7339
+ padded[total - 1] = bitLenLo & 0xff;
7340
+ const words = new Array(64);
7341
+ for (let offset = 0; offset < total; offset += 64) {
7342
+ for (let i = 0; i < 16; i += 1) {
7343
+ const index = offset + i * 4;
7344
+ words[i] = ((padded[index] << 24)
7345
+ | (padded[index + 1] << 16)
7346
+ | (padded[index + 2] << 8)
7347
+ | padded[index + 3]) >>> 0;
7348
+ }
7349
+ for (let i = 16; i < 64; i += 1) {
7350
+ const s0 = rotateRight(words[i - 15], 7)
7351
+ ^ rotateRight(words[i - 15], 18)
7352
+ ^ (words[i - 15] >>> 3);
7353
+ const s1 = rotateRight(words[i - 2], 17)
7354
+ ^ rotateRight(words[i - 2], 19)
7355
+ ^ (words[i - 2] >>> 10);
7356
+ words[i] = (words[i - 16] + s0 + words[i - 7] + s1) >>> 0;
7357
+ }
7358
+ let [a, b, c, d, e, f, g, h] = hash;
7359
+ for (let i = 0; i < 64; i += 1) {
7360
+ const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);
7361
+ const choice = (e & f) ^ (~e & g);
7362
+ const temp1 = (h + s1 + choice + constants[i] + words[i]) >>> 0;
7363
+ const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);
7364
+ const majority = (a & b) ^ (a & c) ^ (b & c);
7365
+ const temp2 = (s0 + majority) >>> 0;
7366
+ h = g;
7367
+ g = f;
7368
+ f = e;
7369
+ e = (d + temp1) >>> 0;
7370
+ d = c;
7371
+ c = b;
7372
+ b = a;
7373
+ a = (temp1 + temp2) >>> 0;
7374
+ }
7375
+ hash[0] = (hash[0] + a) >>> 0;
7376
+ hash[1] = (hash[1] + b) >>> 0;
7377
+ hash[2] = (hash[2] + c) >>> 0;
7378
+ hash[3] = (hash[3] + d) >>> 0;
7379
+ hash[4] = (hash[4] + e) >>> 0;
7380
+ hash[5] = (hash[5] + f) >>> 0;
7381
+ hash[6] = (hash[6] + g) >>> 0;
7382
+ hash[7] = (hash[7] + h) >>> 0;
7383
+ }
7384
+ return hash.map((part) => part.toString(16).padStart(8, '0')).join('');
7385
+ }
7386
+ function rotateRight(value, amount) {
7387
+ return (value >>> amount) | (value << (32 - amount));
7388
+ }
7389
+
7162
7390
  const PRAXIS_I18N_CONFIG = new InjectionToken('PRAXIS_I18N_CONFIG', {
7163
7391
  factory: () => ({}),
7164
7392
  });
@@ -12753,7 +12981,7 @@ class ComponentKeyService {
12753
12981
  hashIfNeeded(base, readable) {
12754
12982
  if (base.length <= 255)
12755
12983
  return base;
12756
- const hash = sha256Hex(encodeUtf8(base));
12984
+ const hash = textSha256(base);
12757
12985
  const rk = this.shortSegment(readable.routeKey);
12758
12986
  const ct = this.shortSegment(readable.componentType);
12759
12987
  const id = this.shortSegment(readable.componentId);
@@ -12778,111 +13006,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12778
13006
  type: Injectable,
12779
13007
  args: [{ providedIn: 'root' }]
12780
13008
  }] });
12781
- function encodeUtf8(value) {
12782
- if (typeof TextEncoder !== 'undefined') {
12783
- return new TextEncoder().encode(value);
12784
- }
12785
- const out = new Uint8Array(value.length);
12786
- for (let i = 0; i < value.length; i += 1) {
12787
- out[i] = value.charCodeAt(i) & 0xff;
12788
- }
12789
- return out;
12790
- }
12791
- function sha256Hex(message) {
12792
- const K = [
12793
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
12794
- 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
12795
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
12796
- 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
12797
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
12798
- 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
12799
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
12800
- 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
12801
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
12802
- 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
12803
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
12804
- 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
12805
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
12806
- 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
12807
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
12808
- 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
12809
- ];
12810
- const H = [
12811
- 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
12812
- 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
12813
- ];
12814
- const length = message.length;
12815
- const bitLenHi = Math.floor((length * 8) / 0x100000000);
12816
- const bitLenLo = (length * 8) >>> 0;
12817
- const withOne = length + 1;
12818
- const mod = withOne % 64;
12819
- const padLen = mod <= 56 ? 56 - mod : 56 + 64 - mod;
12820
- const total = length + 1 + padLen + 8;
12821
- const padded = new Uint8Array(total);
12822
- padded.set(message);
12823
- padded[length] = 0x80;
12824
- padded[total - 8] = (bitLenHi >>> 24) & 0xff;
12825
- padded[total - 7] = (bitLenHi >>> 16) & 0xff;
12826
- padded[total - 6] = (bitLenHi >>> 8) & 0xff;
12827
- padded[total - 5] = bitLenHi & 0xff;
12828
- padded[total - 4] = (bitLenLo >>> 24) & 0xff;
12829
- padded[total - 3] = (bitLenLo >>> 16) & 0xff;
12830
- padded[total - 2] = (bitLenLo >>> 8) & 0xff;
12831
- padded[total - 1] = bitLenLo & 0xff;
12832
- const w = new Array(64);
12833
- for (let offset = 0; offset < total; offset += 64) {
12834
- for (let i = 0; i < 16; i += 1) {
12835
- const j = offset + i * 4;
12836
- w[i] =
12837
- ((padded[j] << 24) | (padded[j + 1] << 16) | (padded[j + 2] << 8) | padded[j + 3]) >>> 0;
12838
- }
12839
- for (let i = 16; i < 64; i += 1) {
12840
- const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >>> 3);
12841
- const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >>> 10);
12842
- w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;
12843
- }
12844
- let a = H[0];
12845
- let b = H[1];
12846
- let c = H[2];
12847
- let d = H[3];
12848
- let e = H[4];
12849
- let f = H[5];
12850
- let g = H[6];
12851
- let h = H[7];
12852
- for (let i = 0; i < 64; i += 1) {
12853
- const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);
12854
- const ch = (e & f) ^ (~e & g);
12855
- const temp1 = (h + s1 + ch + K[i] + w[i]) >>> 0;
12856
- const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);
12857
- const maj = (a & b) ^ (a & c) ^ (b & c);
12858
- const temp2 = (s0 + maj) >>> 0;
12859
- h = g;
12860
- g = f;
12861
- f = e;
12862
- e = (d + temp1) >>> 0;
12863
- d = c;
12864
- c = b;
12865
- b = a;
12866
- a = (temp1 + temp2) >>> 0;
12867
- }
12868
- H[0] = (H[0] + a) >>> 0;
12869
- H[1] = (H[1] + b) >>> 0;
12870
- H[2] = (H[2] + c) >>> 0;
12871
- H[3] = (H[3] + d) >>> 0;
12872
- H[4] = (H[4] + e) >>> 0;
12873
- H[5] = (H[5] + f) >>> 0;
12874
- H[6] = (H[6] + g) >>> 0;
12875
- H[7] = (H[7] + h) >>> 0;
12876
- }
12877
- let hex = '';
12878
- for (const h of H) {
12879
- hex += h.toString(16).padStart(8, '0');
12880
- }
12881
- return hex;
12882
- }
12883
- function rotr(value, amount) {
12884
- return (value >>> amount) | (value << (32 - amount));
12885
- }
12886
13009
 
12887
13010
  function defaultTelemetryTransport() {
12888
13011
  return {
@@ -14617,8 +14740,8 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
14617
14740
  namespaces: {
14618
14741
  [RELATED_RESOURCE_OUTLET_I18N_NAMESPACE]: {
14619
14742
  'pt-BR': {
14620
- 'state.idle.title': 'Recurso relacionado não selecionado',
14621
- 'state.idle.description': 'Selecione uma surface relacionada para carregar os dados.',
14743
+ 'state.idle.title': 'Selecione um registro',
14744
+ 'state.idle.description': 'Escolha um registro principal para carregar os dados relacionados.',
14622
14745
  'state.resolving.title': 'Resolvendo recurso relacionado',
14623
14746
  'state.resolving.description': 'Validando metadados e permissões da relação.',
14624
14747
  'state.loading.title': 'Carregando recurso relacionado',
@@ -14688,8 +14811,8 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
14688
14811
  'editor.boundary.description': 'Paths de recursos, vínculos com o pai, operações, filtros e a configuração da tabela filha permanecem com seus donos canônicos.',
14689
14812
  },
14690
14813
  'en-US': {
14691
- 'state.idle.title': 'Related resource not selected',
14692
- 'state.idle.description': 'Select a related surface to load its data.',
14814
+ 'state.idle.title': 'Select a record',
14815
+ 'state.idle.description': 'Choose a primary record to load its related data.',
14693
14816
  'state.resolving.title': 'Resolving related resource',
14694
14817
  'state.resolving.description': 'Validating relation metadata and permissions.',
14695
14818
  'state.loading.title': 'Loading related resource',
@@ -14798,7 +14921,7 @@ class RelatedResourceSurfaceResolverService {
14798
14921
  const parentResourceId = this.resolveParentResourceId(request, relatedResource);
14799
14922
  if (parentResourceId == null || parentResourceId === '') {
14800
14923
  return {
14801
- state: 'not-found',
14924
+ state: request.parentRecord ? 'not-found' : 'idle',
14802
14925
  reason: 'parent-resource-id-not-resolved',
14803
14926
  surface,
14804
14927
  relatedResource,
@@ -16300,6 +16423,7 @@ class ResourceActionOpenAdapterService {
16300
16423
  payload.widget.inputs['initialValue'] = this.clone(options.initialValue);
16301
16424
  }
16302
16425
  this.applyInteractionPresentation(payload, action);
16426
+ this.applyActionPresentation(payload, action);
16303
16427
  if (action.scope === 'ITEM') {
16304
16428
  if (options.resourceId != null) {
16305
16429
  payload.widget.inputs['resourceId'] = options.resourceId;
@@ -16317,6 +16441,28 @@ class ResourceActionOpenAdapterService {
16317
16441
  this.applyExecutionInputs(payload, action, options);
16318
16442
  return payload;
16319
16443
  }
16444
+ applyActionPresentation(payload, action) {
16445
+ const submitLabel = String(action.title ?? '').trim();
16446
+ if (!submitLabel) {
16447
+ return;
16448
+ }
16449
+ const inputs = payload.widget.inputs || (payload.widget.inputs = {});
16450
+ inputs['actions'] = {
16451
+ showSaveButton: true,
16452
+ showCancelButton: false,
16453
+ showResetButton: false,
16454
+ submit: {
16455
+ id: 'submit',
16456
+ type: 'submit',
16457
+ visible: true,
16458
+ label: submitLabel,
16459
+ },
16460
+ };
16461
+ const bindingOrder = Array.isArray(payload.widget.bindingOrder)
16462
+ ? payload.widget.bindingOrder.filter((input) => input !== 'actions')
16463
+ : [];
16464
+ payload.widget.bindingOrder = [...bindingOrder, 'actions'];
16465
+ }
16320
16466
  applyInteractionPresentation(payload, action) {
16321
16467
  const requiresFormConfirmation = action.execution?.interaction.mode === 'FORM'
16322
16468
  && action.execution.interaction.confirmationRequired;
@@ -16915,6 +17061,7 @@ class SurfaceOpenMaterializerService {
16915
17061
  return Object.fromEntries(Object.entries(inputs).filter(([key]) => supported.has(key)));
16916
17062
  }
16917
17063
  buildLocalTableConfig(fields, data, payload, childOperations = this.resolveRelatedChildOperations(payload)) {
17064
+ const previousConfig = this.objectRecord(payload.widget?.inputs?.['config']);
16918
17065
  const schemaColumns = fields
16919
17066
  .filter((field) => !field.hidden && !field.tableHidden && !!field.name)
16920
17067
  .map((field) => ({
@@ -16924,11 +17071,11 @@ class SurfaceOpenMaterializerService {
16924
17071
  sortable: field.sortable !== false,
16925
17072
  type: field.type,
16926
17073
  }));
17074
+ const projectedSchemaColumns = this.materializeSchemaColumnProjection(schemaColumns, previousConfig['columnProjection']);
16927
17075
  const fallbackColumns = schemaColumns.length
16928
17076
  ? []
16929
17077
  : this.inferColumnsFromData(data);
16930
17078
  const relatedActions = this.buildRelatedCrudActions(payload, childOperations);
16931
- const previousConfig = this.objectRecord(payload.widget?.inputs?.['config']);
16932
17079
  const previousToolbar = this.objectRecord(previousConfig['toolbar']);
16933
17080
  const relatedActionIds = new Set(relatedActions.map((action) => String(action['id'])));
16934
17081
  const previousToolbarActions = Array.isArray(previousToolbar['actions'])
@@ -16951,11 +17098,13 @@ class SurfaceOpenMaterializerService {
16951
17098
  const previousColumns = Array.isArray(previousConfig['columns'])
16952
17099
  ? previousConfig['columns']
16953
17100
  : [];
17101
+ const materializedBaseConfig = { ...previousConfig };
17102
+ delete materializedBaseConfig['columnProjection'];
16954
17103
  const generatedConfig = {
16955
17104
  columns: previousColumns.length
16956
17105
  ? previousColumns
16957
- : schemaColumns.length
16958
- ? schemaColumns
17106
+ : projectedSchemaColumns.length
17107
+ ? projectedSchemaColumns
16959
17108
  : fallbackColumns,
16960
17109
  toolbar: toolbarActions.length
16961
17110
  ? {
@@ -16982,7 +17131,7 @@ class SurfaceOpenMaterializerService {
16982
17131
  },
16983
17132
  };
16984
17133
  return {
16985
- ...previousConfig,
17134
+ ...materializedBaseConfig,
16986
17135
  ...generatedConfig,
16987
17136
  behavior: {
16988
17137
  ...generatedConfig.behavior,
@@ -16999,6 +17148,36 @@ class SurfaceOpenMaterializerService {
16999
17148
  },
17000
17149
  };
17001
17150
  }
17151
+ /**
17152
+ * Consumes the remote schema projection before an item surface becomes a local-data table.
17153
+ * The transient materialized table must not retain `columnProjection`: that contract belongs to
17154
+ * remote schema resolution and has already been reduced here to concrete columns.
17155
+ */
17156
+ materializeSchemaColumnProjection(schemaColumns, rawProjection) {
17157
+ const projection = this.objectRecord(rawProjection);
17158
+ if (projection['source'] !== 'schema') {
17159
+ return schemaColumns;
17160
+ }
17161
+ const byField = new Map(schemaColumns.map((column) => [String(column['field'] || ''), column]));
17162
+ const include = Array.isArray(projection['include'])
17163
+ ? projection['include'].filter((field) => (typeof field === 'string' && byField.has(field)))
17164
+ : schemaColumns.map((column) => String(column['field'] || ''));
17165
+ const overrides = this.objectRecord(projection['overrides']);
17166
+ const projected = include.map((field) => ({
17167
+ ...byField.get(field),
17168
+ ...this.objectRecord(overrides[field]),
17169
+ field,
17170
+ }));
17171
+ const additions = Array.isArray(projection['additions'])
17172
+ ? projection['additions']
17173
+ .filter((column) => {
17174
+ const candidate = this.objectRecord(column);
17175
+ return typeof candidate['field'] === 'string' && !!candidate['field'];
17176
+ })
17177
+ .map((column) => ({ ...this.objectRecord(column) }))
17178
+ : [];
17179
+ return [...projected, ...additions];
17180
+ }
17002
17181
  objectRecord(value) {
17003
17182
  return value && typeof value === 'object' && !Array.isArray(value)
17004
17183
  ? value
@@ -25472,7 +25651,8 @@ function groupFields(fields) {
25472
25651
  }
25473
25652
  function createSection(groupKey, groupFields, sectionIndex, policy, options) {
25474
25653
  const title = groupKey === 'default'
25475
- ? options.defaultSectionTitle || 'Informacoes'
25654
+ ? options.defaultSectionTitle
25655
+ ?? (policy.preset === 'groupedCommand' ? '' : 'Informacoes')
25476
25656
  : groupKey;
25477
25657
  const sectionId = stableSectionId(groupKey);
25478
25658
  const presentationRole = resolvePresentationRole(groupKey, groupFields, options.presentationRoleMap);
@@ -32186,6 +32366,7 @@ const MUTABLE_INITIAL_BINDING_INPUTS = new Set(['enableCustomization']);
32186
32366
  class DynamicWidgetLoaderDirective {
32187
32367
  vcRef = inject(ViewContainerRef);
32188
32368
  registry = inject(ComponentMetadataRegistry);
32369
+ injector = inject(Injector);
32189
32370
  widget;
32190
32371
  ownerWidgetKey = null;
32191
32372
  context = null;
@@ -32195,12 +32376,16 @@ class DynamicWidgetLoaderDirective {
32195
32376
  autoWireOutputs = false;
32196
32377
  widgetEvent = new EventEmitter();
32197
32378
  widgetDiagnostic = new EventEmitter();
32379
+ /** Transient actions contributed by the live child component to its shell. */
32380
+ contributedShellActions = signal([], ...(ngDevMode ? [{ debugName: "contributedShellActions" }] : /* istanbul ignore next */ []));
32198
32381
  compRef;
32199
32382
  currentId;
32200
32383
  currentUsesInitialBindings = false;
32201
32384
  currentInitialBindingSignature = null;
32202
32385
  boundInputValues = {};
32203
32386
  outputSubs = [];
32387
+ shellActionContributionEffect;
32388
+ shellActionContributor;
32204
32389
  destroyed = false;
32205
32390
  /** Dispatch a shell action to the inner widget instance when supported. */
32206
32391
  dispatchAction(action) {
@@ -32371,6 +32556,7 @@ class DynamicWidgetLoaderDirective {
32371
32556
  this.vcRef.clear();
32372
32557
  try {
32373
32558
  this.compRef = this.vcRef.createComponent(cmp);
32559
+ this.bindShellActionContributor(this.compRef.instance);
32374
32560
  if (useInitialBindings) {
32375
32561
  this.bindInputs(this.compRef, id, inputs, bindingOrder, metaForInputs);
32376
32562
  }
@@ -32388,6 +32574,7 @@ class DynamicWidgetLoaderDirective {
32388
32574
  }
32389
32575
  }
32390
32576
  destroyCurrent() {
32577
+ this.releaseShellActionContributor();
32391
32578
  this.outputSubs.forEach((u) => u());
32392
32579
  this.outputSubs = [];
32393
32580
  if (this.compRef) {
@@ -32400,6 +32587,27 @@ class DynamicWidgetLoaderDirective {
32400
32587
  }
32401
32588
  this.vcRef.clear();
32402
32589
  }
32590
+ bindShellActionContributor(instance) {
32591
+ const candidate = instance;
32592
+ if (!candidate || typeof candidate.widgetShellActions !== 'function') {
32593
+ this.contributedShellActions.set([]);
32594
+ return;
32595
+ }
32596
+ const contributor = candidate;
32597
+ this.shellActionContributor = contributor;
32598
+ contributor.setWidgetShellActionHostActive?.(true);
32599
+ this.shellActionContributionEffect = effect(() => {
32600
+ const actions = contributor.widgetShellActions();
32601
+ this.contributedShellActions.set(Array.isArray(actions) ? actions.map((action) => ({ ...action })) : []);
32602
+ }, { ...(ngDevMode ? { debugName: "shellActionContributionEffect" } : /* istanbul ignore next */ {}), injector: this.injector });
32603
+ }
32604
+ releaseShellActionContributor() {
32605
+ this.shellActionContributionEffect?.destroy();
32606
+ this.shellActionContributionEffect = undefined;
32607
+ this.shellActionContributor?.setWidgetShellActionHostActive?.(false);
32608
+ this.shellActionContributor = undefined;
32609
+ this.contributedShellActions.set([]);
32610
+ }
32403
32611
  cloneValue(value) {
32404
32612
  if (value == null || typeof value !== 'object') {
32405
32613
  return value;
@@ -33131,7 +33339,7 @@ class WidgetShellComponent {
33131
33339
  action = new EventEmitter();
33132
33340
  dragSurfacePointerDown = new EventEmitter();
33133
33341
  dragSurfaceKeydown = new EventEmitter();
33134
- loader;
33342
+ loader = contentChild(DynamicWidgetLoaderDirective, ...(ngDevMode ? [{ debugName: "loader" }] : /* istanbul ignore next */ []));
33135
33343
  shellText(value, fallback = '') {
33136
33344
  return this.i18n.resolve(value, fallback);
33137
33345
  }
@@ -33180,7 +33388,7 @@ class WidgetShellComponent {
33180
33388
  this.windowActions.length);
33181
33389
  }
33182
33390
  get headerActions() {
33183
- return (this.shell?.actions || []).filter((a) => this.isVisible(a) && (a.placement || 'header') === 'header');
33391
+ return this.mergedActions.filter((a) => this.isVisible(a) && (a.placement || 'header') === 'header');
33184
33392
  }
33185
33393
  get visibleHeaderActions() {
33186
33394
  const max = this.maxHeaderActions;
@@ -33194,7 +33402,7 @@ class WidgetShellComponent {
33194
33402
  return 3;
33195
33403
  }
33196
33404
  get windowActions() {
33197
- const custom = (this.shell?.actions || []).filter((a) => this.isVisible(a) && (a.placement || 'header') === 'window');
33405
+ const custom = this.mergedActions.filter((a) => this.isVisible(a) && (a.placement || 'header') === 'window');
33198
33406
  const builtins = this.buildWindowActions(custom);
33199
33407
  return [...builtins, ...custom];
33200
33408
  }
@@ -33221,8 +33429,34 @@ class WidgetShellComponent {
33221
33429
  pressed: action.pressed,
33222
33430
  action,
33223
33431
  };
33224
- this.loader?.dispatchAction(event);
33225
- this.action.emit(event);
33432
+ const loader = this.loader();
33433
+ const runtimeContributed = loader
33434
+ ?.contributedShellActions()
33435
+ .some((candidate) => candidate.id === action.id) ?? false;
33436
+ const handledByWidget = loader?.dispatchAction(event) ?? false;
33437
+ // Runtime-contributed controls are presentation affordances owned by the
33438
+ // live widget. Once handled there, they must not escape as authored page
33439
+ // actions or enter the composition event/persistence pipeline.
33440
+ if (!runtimeContributed || !handledByWidget) {
33441
+ this.action.emit(event);
33442
+ }
33443
+ }
33444
+ get mergedActions() {
33445
+ const authored = this.shell?.actions || [];
33446
+ const contributed = this.loader()?.contributedShellActions() || [];
33447
+ if (!contributed.length) {
33448
+ return authored;
33449
+ }
33450
+ const contributedById = new Map(contributed.map((action) => [action.id, action]));
33451
+ const merged = authored.map((action) => {
33452
+ const runtimeAction = contributedById.get(action.id);
33453
+ if (!runtimeAction) {
33454
+ return action;
33455
+ }
33456
+ contributedById.delete(action.id);
33457
+ return { ...action, ...runtimeAction };
33458
+ });
33459
+ return [...merged, ...contributedById.values()];
33226
33460
  }
33227
33461
  onHeaderPointerDown(event) {
33228
33462
  if (!this.dragSurfaceInteractive ||
@@ -33356,7 +33590,7 @@ class WidgetShellComponent {
33356
33590
  return this.i18n.t(key, undefined, fallback, WIDGET_SHELL_I18N_NAMESPACE);
33357
33591
  }
33358
33592
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: WidgetShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
33359
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: WidgetShellComponent, isStandalone: true, selector: "praxis-widget-shell", inputs: { shell: "shell", context: "context", dragSurfaceEnabled: "dragSurfaceEnabled", dragSurfaceLabel: "dragSurfaceLabel" }, outputs: { action: "action", dragSurfacePointerDown: "dragSurfacePointerDown", dragSurfaceKeydown: "dragSurfaceKeydown" }, host: { properties: { "class.pdx-widget-shell-collapsed": "this.hostCollapsed" } }, providers: [providePraxisI18nConfig(WIDGET_SHELL_I18N_CONFIG)], queries: [{ propertyName: "loader", first: true, predicate: DynamicWidgetLoaderDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
33593
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: WidgetShellComponent, isStandalone: true, selector: "praxis-widget-shell", inputs: { shell: "shell", context: "context", dragSurfaceEnabled: "dragSurfaceEnabled", dragSurfaceLabel: "dragSurfaceLabel" }, outputs: { action: "action", dragSurfacePointerDown: "dragSurfacePointerDown", dragSurfaceKeydown: "dragSurfaceKeydown" }, host: { properties: { "class.pdx-widget-shell-collapsed": "this.hostCollapsed" } }, providers: [providePraxisI18nConfig(WIDGET_SHELL_I18N_CONFIG)], queries: [{ propertyName: "loader", first: true, predicate: DynamicWidgetLoaderDirective, descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: `
33360
33594
  <section
33361
33595
  class="pdx-shell"
33362
33596
  [class.no-shell]="!shellEnabled"
@@ -33416,7 +33650,7 @@ class WidgetShellComponent {
33416
33650
  </div>
33417
33651
  </div>
33418
33652
  <div class="pdx-shell-actions">
33419
- @if (!expanded && !fullscreen) {
33653
+ @if (!collapsed || expanded || fullscreen) {
33420
33654
  @for (action of visibleHeaderActions; track action.id) {
33421
33655
  <ng-container>
33422
33656
  @if (action.variant !== 'icon') {
@@ -33437,6 +33671,10 @@ class WidgetShellComponent {
33437
33671
  [attr.aria-pressed]="
33438
33672
  action.pressed == null ? null : action.pressed
33439
33673
  "
33674
+ [attr.aria-controls]="action.ariaControls || null"
33675
+ [attr.aria-expanded]="
33676
+ action.ariaExpanded == null ? null : action.ariaExpanded
33677
+ "
33440
33678
  (click)="onAction(action, $event)"
33441
33679
  >
33442
33680
  @if (displayActionIcon(action); as actionIcon) {
@@ -33464,6 +33702,10 @@ class WidgetShellComponent {
33464
33702
  actionText(action.tooltip, action.id)
33465
33703
  )
33466
33704
  "
33705
+ [attr.aria-controls]="action.ariaControls || null"
33706
+ [attr.aria-expanded]="
33707
+ action.ariaExpanded == null ? null : action.ariaExpanded
33708
+ "
33467
33709
  type="button"
33468
33710
  (click)="onAction(action, $event)"
33469
33711
  ></button>
@@ -33518,6 +33760,10 @@ class WidgetShellComponent {
33518
33760
  [attr.aria-pressed]="
33519
33761
  action.pressed == null ? null : action.pressed
33520
33762
  "
33763
+ [attr.aria-controls]="action.ariaControls || null"
33764
+ [attr.aria-expanded]="
33765
+ action.ariaExpanded == null ? null : action.ariaExpanded
33766
+ "
33521
33767
  (click)="onAction(action, $event)"
33522
33768
  >
33523
33769
  @if (displayActionIcon(action); as actionIcon) {
@@ -33608,7 +33854,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33608
33854
  </div>
33609
33855
  </div>
33610
33856
  <div class="pdx-shell-actions">
33611
- @if (!expanded && !fullscreen) {
33857
+ @if (!collapsed || expanded || fullscreen) {
33612
33858
  @for (action of visibleHeaderActions; track action.id) {
33613
33859
  <ng-container>
33614
33860
  @if (action.variant !== 'icon') {
@@ -33629,6 +33875,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33629
33875
  [attr.aria-pressed]="
33630
33876
  action.pressed == null ? null : action.pressed
33631
33877
  "
33878
+ [attr.aria-controls]="action.ariaControls || null"
33879
+ [attr.aria-expanded]="
33880
+ action.ariaExpanded == null ? null : action.ariaExpanded
33881
+ "
33632
33882
  (click)="onAction(action, $event)"
33633
33883
  >
33634
33884
  @if (displayActionIcon(action); as actionIcon) {
@@ -33656,6 +33906,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33656
33906
  actionText(action.tooltip, action.id)
33657
33907
  )
33658
33908
  "
33909
+ [attr.aria-controls]="action.ariaControls || null"
33910
+ [attr.aria-expanded]="
33911
+ action.ariaExpanded == null ? null : action.ariaExpanded
33912
+ "
33659
33913
  type="button"
33660
33914
  (click)="onAction(action, $event)"
33661
33915
  ></button>
@@ -33710,6 +33964,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33710
33964
  [attr.aria-pressed]="
33711
33965
  action.pressed == null ? null : action.pressed
33712
33966
  "
33967
+ [attr.aria-controls]="action.ariaControls || null"
33968
+ [attr.aria-expanded]="
33969
+ action.ariaExpanded == null ? null : action.ariaExpanded
33970
+ "
33713
33971
  (click)="onAction(action, $event)"
33714
33972
  >
33715
33973
  @if (displayActionIcon(action); as actionIcon) {
@@ -33746,10 +34004,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33746
34004
  type: Output
33747
34005
  }], dragSurfaceKeydown: [{
33748
34006
  type: Output
33749
- }], loader: [{
33750
- type: ContentChild,
33751
- args: [DynamicWidgetLoaderDirective]
33752
- }] } });
34007
+ }], loader: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DynamicWidgetLoaderDirective), { isSignal: true }] }] } });
33753
34008
 
33754
34009
  class PraxisResourceIdentityComponent {
33755
34010
  identity = null;
@@ -44171,6 +44426,7 @@ class PraxisRelatedResourceOutletComponent {
44171
44426
  const surfaceId = this.surfaceId();
44172
44427
  const catalog = this.surfaceCatalog();
44173
44428
  const discoverySource = this.discoverySource() || this.parentLinks();
44429
+ const parentRecord = this.parentRecord();
44174
44430
  const parentResourcePath = this.parentResourcePath();
44175
44431
  const parentResourceId = this.parentResourceId();
44176
44432
  const apiEndpointKey = this.apiEndpointKey();
@@ -44181,6 +44437,14 @@ class PraxisRelatedResourceOutletComponent {
44181
44437
  this.resetDiscoveryState();
44182
44438
  return;
44183
44439
  }
44440
+ if (this.trim(parentResourcePath)
44441
+ && (parentResourceId == null || parentResourceId === '')
44442
+ && !parentRecord) {
44443
+ this.discoveredSurface.set(null);
44444
+ this.discoveryState.set('idle');
44445
+ this.discoveryStateReason.set('parent-resource-id-not-resolved');
44446
+ return;
44447
+ }
44184
44448
  if (catalog) {
44185
44449
  this.applyCatalogSurface(surfaceId, catalog);
44186
44450
  return;
@@ -44229,6 +44493,14 @@ class PraxisRelatedResourceOutletComponent {
44229
44493
  const resolution = this.resolution();
44230
44494
  const payload = resolution.state === 'ready' ? resolution.payload : null;
44231
44495
  const requestKey = this.buildMaterializationRequestKey(resolution);
44496
+ // Composition state updates can re-create structurally equal input objects.
44497
+ // Keep the mounted child widget when its effective materialization contract
44498
+ // did not change; destroying it here also destroys transient table state such
44499
+ // as the selection that may have triggered the composition update itself.
44500
+ if (requestKey === this.materializationRequestKey
44501
+ && this.materializedPayload() != null) {
44502
+ return;
44503
+ }
44232
44504
  this.materializationRequestKey = requestKey;
44233
44505
  this.materializedPayload.set(null);
44234
44506
  if (!payload) {
@@ -44357,10 +44629,7 @@ class PraxisRelatedResourceOutletComponent {
44357
44629
  buildMaterializationRequestKey(resolution) {
44358
44630
  return JSON.stringify({
44359
44631
  state: resolution.state,
44360
- surfaceId: resolution.surface?.id ?? null,
44361
- parentResourceId: resolution.parentResourceId ?? null,
44362
- childResourcePath: resolution.childResourcePath ?? null,
44363
- queryContext: resolution.queryContext ?? null,
44632
+ payload: resolution.payload ?? null,
44364
44633
  mode: this.mode(),
44365
44634
  });
44366
44635
  }
@@ -46119,7 +46388,7 @@ class EmptyStateCardComponent {
46119
46388
  </div>
46120
46389
  </mat-card-content>
46121
46390
  </mat-card>
46122
- `, 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"] }] });
46391
+ `, 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;--mat-card-elevated-container-elevation: none;--mat-card-outlined-container-elevation: none;box-shadow:none!important}.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"] }] });
46123
46392
  }
46124
46393
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EmptyStateCardComponent, decorators: [{
46125
46394
  type: Component,
@@ -46170,7 +46439,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
46170
46439
  </div>
46171
46440
  </mat-card-content>
46172
46441
  </mat-card>
46173
- `, 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"] }]
46442
+ `, 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;--mat-card-elevated-container-elevation: none;--mat-card-outlined-container-elevation: none;box-shadow:none!important}.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"] }]
46174
46443
  }], propDecorators: { icon: [{
46175
46444
  type: Input
46176
46445
  }], title: [{
@@ -47209,4 +47478,4 @@ function provideHookWhitelist(allowed) {
47209
47478
  * Generated bundle index. Do not edit.
47210
47479
  */
47211
47480
 
47212
- 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, ComponentAuthoringManifestProjectionError, ComponentKeyService, ComponentMetadataRegistry, ComponentRuntimeProfileService, CompositionRuntimeFacade, CompositionValidatorService, 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_AUTHORING_MANIFEST, 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, PraxisRelatedResourceOutletConfigEditorComponent, 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, WidgetPageCompositionFactory, 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, getGlobalActionProviderEvidence, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionProviderOperational, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, markGlobalActionProviderOperational, matchFieldValidator, materializeFormLayoutFromMetadata, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, nestedPortPathIdentity, 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, projectComponentAuthoringManifest, 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, providePraxisTelemetry, 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 };
47481
+ 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, ComponentAuthoringManifestProjectionError, ComponentKeyService, ComponentMetadataRegistry, ComponentRuntimeProfileService, CompositionRuntimeFacade, CompositionValidatorService, 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_AUTHORING_MANIFEST, 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, PraxisRelatedResourceOutletConfigEditorComponent, 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, WidgetPageCompositionFactory, 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, canonicalJsonSha256, canonicalJsonStringify, 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, getGlobalActionProviderEvidence, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionProviderOperational, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, markGlobalActionProviderOperational, matchFieldValidator, materializeFormLayoutFromMetadata, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, nestedPortPathIdentity, 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, projectComponentAuthoringManifest, 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, providePraxisTelemetry, 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, supportsConfigDocuments, supportsImplicitValuePresentation, syncWithServerMetadata, textSha256, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };