@praxisui/core 9.0.62 → 9.0.64

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';
@@ -3012,6 +3012,9 @@ class SchemaNormalizerService {
3012
3012
  return [];
3013
3013
  }
3014
3014
  const properties = schema.properties ?? {};
3015
+ const requiredNames = new Set(Array.isArray(schema.required)
3016
+ ? schema.required.filter((name) => typeof name === 'string')
3017
+ : []);
3015
3018
  const fields = [];
3016
3019
  for (const [name, prop] of Object.entries(properties)) {
3017
3020
  const ui = prop &&
@@ -3128,6 +3131,11 @@ class SchemaNormalizerService {
3128
3131
  field.viewOnlyStyle = String(ui.viewOnlyStyle);
3129
3132
  }
3130
3133
  Object.assign(field, this.parseValidators(ui, name));
3134
+ // Required membership belongs to the canonical object schema. UI hints
3135
+ // can add validation but cannot make a required request field optional.
3136
+ if (requiredNames.has(name)) {
3137
+ field.required = true;
3138
+ }
3131
3139
  const condDisplay = this.parseJsonLogicExpression(ui.conditionalDisplay, name, 'x-ui.conditionalDisplay');
3132
3140
  if (condDisplay !== undefined) {
3133
3141
  field.conditionalDisplay = condDisplay;
@@ -3419,6 +3427,9 @@ function provideGlobalConfig(partial) {
3419
3427
  return { provide: GLOBAL_CONFIG, useValue: partial, multi: true };
3420
3428
  }
3421
3429
 
3430
+ function supportsConfigDocuments(storage) {
3431
+ return typeof storage.loadConfigDocument === 'function';
3432
+ }
3422
3433
  class LocalStorageConfigService {
3423
3434
  loadConfig(key) {
3424
3435
  try {
@@ -3522,6 +3533,14 @@ class DeferredAsyncConfigStorage {
3522
3533
  return this.delegate.clearConfig(key);
3523
3534
  return defer(() => from(this.gate()).pipe(switchMap(() => this.delegate.clearConfig(key))));
3524
3535
  }
3536
+ loadConfigDocument(key) {
3537
+ const load = () => supportsConfigDocuments(this.delegate)
3538
+ ? this.delegate.loadConfigDocument(key)
3539
+ : this.delegate.loadConfig(key).pipe(map((payload) => payload == null ? null : { payload }));
3540
+ if (!this.gate)
3541
+ return load();
3542
+ return defer(() => from(this.gate()).pipe(switchMap(load)));
3543
+ }
3525
3544
  }
3526
3545
  const ASYNC_CONFIG_STORAGE = new InjectionToken('ASYNC_CONFIG_STORAGE', {
3527
3546
  providedIn: 'root',
@@ -3670,6 +3689,29 @@ class ApiConfigStorage {
3670
3689
  }
3671
3690
  return this.executeLoadConfigRequest(key, true);
3672
3691
  }
3692
+ loadConfigDocument(key) {
3693
+ const cached = this.cache.get(key);
3694
+ const etag = cached?.readEtag ?? cached?.writeEtag;
3695
+ const { type, id } = this.resolveKey(key);
3696
+ const params = this.buildParams(type, id, cached?.scope);
3697
+ const headers = this.buildHeaders(etag ? { 'If-None-Match': this.formatEtag(etag) } : {});
3698
+ return this.http
3699
+ .get(this.baseUrl, { observe: 'response', headers, params })
3700
+ .pipe(map((resp) => this.cacheResponseDocument(key, resp.body, resp.headers.get('ETag'))), catchError((err) => {
3701
+ if (err.status === 304 && cached?.document) {
3702
+ return of(cached.document);
3703
+ }
3704
+ if (err.status === 404) {
3705
+ return of(null);
3706
+ }
3707
+ if (this.shouldLogLoadError(key, err)) {
3708
+ console.warn('[ApiConfigStorage] document load error', err);
3709
+ }
3710
+ return this.shouldPropagateLoadError(key, err)
3711
+ ? throwError(() => err)
3712
+ : of(null);
3713
+ }));
3714
+ }
3673
3715
  executeLoadConfigRequest(key, establishAvailability) {
3674
3716
  const cached = this.cache.get(key);
3675
3717
  const etag = cached?.readEtag ?? cached?.writeEtag;
@@ -3700,11 +3742,13 @@ class ApiConfigStorage {
3700
3742
  const readEtag = this.resolveReadEtag(responseEtag, body?.etag);
3701
3743
  const writeEtag = this.resolveWriteEtag(responseEtag, body?.etag);
3702
3744
  if (readEtag || writeEtag) {
3745
+ const document = this.toConfigDocument(body, responseEtag);
3703
3746
  this.cache.set(key, {
3704
3747
  readEtag,
3705
3748
  writeEtag,
3706
3749
  payload: body?.payload,
3707
3750
  scope: this.resolveResponseScope(body?.scope),
3751
+ document,
3708
3752
  });
3709
3753
  }
3710
3754
  releaseProbe?.();
@@ -3735,11 +3779,13 @@ class ApiConfigStorage {
3735
3779
  const readEtag = this.resolveReadEtag(responseEtag, body?.etag);
3736
3780
  const writeEtag = this.resolveWriteEtag(responseEtag, body?.etag);
3737
3781
  if (readEtag || writeEtag) {
3782
+ const document = this.toConfigDocument(body, responseEtag);
3738
3783
  this.cache.set(key, {
3739
3784
  readEtag,
3740
3785
  writeEtag,
3741
3786
  payload: body?.payload,
3742
3787
  scope: this.resolveResponseScope(body?.scope),
3788
+ document,
3743
3789
  });
3744
3790
  }
3745
3791
  return body?.payload ?? null;
@@ -3778,6 +3824,7 @@ class ApiConfigStorage {
3778
3824
  writeEtag: this.resolveWriteEtag(responseEtag, body?.etag),
3779
3825
  payload,
3780
3826
  scope: this.resolveResponseScope(body?.scope) ?? cached?.scope,
3827
+ document: this.toConfigDocument({ ...body, payload }, responseEtag),
3781
3828
  });
3782
3829
  }), catchError((err) => {
3783
3830
  if (this.shouldLogSaveError(key, err)) {
@@ -3859,6 +3906,36 @@ class ApiConfigStorage {
3859
3906
  }
3860
3907
  return new HttpHeaders(merged);
3861
3908
  }
3909
+ cacheResponseDocument(key, body, responseEtag) {
3910
+ const document = this.toConfigDocument(body, responseEtag);
3911
+ this.cache.set(key, {
3912
+ readEtag: this.resolveReadEtag(responseEtag, body?.etag),
3913
+ writeEtag: this.resolveWriteEtag(responseEtag, body?.etag),
3914
+ payload: document.payload,
3915
+ scope: this.resolveResponseScope(document.scope),
3916
+ document,
3917
+ });
3918
+ return document;
3919
+ }
3920
+ toConfigDocument(body, responseEtag) {
3921
+ const strongEtag = this.resolveWriteEtag(responseEtag, body?.etag);
3922
+ return {
3923
+ ...(typeof body?.componentType === 'string' ? { componentType: body.componentType } : {}),
3924
+ ...(typeof body?.componentId === 'string' ? { componentId: body.componentId } : {}),
3925
+ ...(typeof body?.environment === 'string' ? { environment: body.environment } : {}),
3926
+ ...(typeof body?.scope === 'string' ? { scope: body.scope } : {}),
3927
+ ...(typeof body?.version === 'number' ? { version: body.version } : {}),
3928
+ ...(strongEtag ? { etag: strongEtag } : {}),
3929
+ payload: body?.payload,
3930
+ authoringSource: this.isRecord(body?.authoringSource)
3931
+ ? body.authoringSource
3932
+ : null,
3933
+ tags: this.isRecord(body?.tags) ? body.tags : null,
3934
+ };
3935
+ }
3936
+ isRecord(value) {
3937
+ return !!value && typeof value === 'object' && !Array.isArray(value);
3938
+ }
3862
3939
  buildParams(componentType, componentId, resolvedScope) {
3863
3940
  const params = {
3864
3941
  componentType,
@@ -6239,6 +6316,19 @@ function createDefaultTableConfig() {
6239
6316
  // enabled: false
6240
6317
  // } // Property doesn't exist in InteractionConfig
6241
6318
  },
6319
+ loading: {
6320
+ type: 'skeleton',
6321
+ position: 'replace',
6322
+ text: 'Carregando dados...',
6323
+ showForQuickOperations: false,
6324
+ delay: 0,
6325
+ requestTimeoutMs: 30000,
6326
+ allowCancel: true,
6327
+ skeleton: {
6328
+ rows: 3,
6329
+ animated: true,
6330
+ },
6331
+ },
6242
6332
  resizing: {
6243
6333
  enabled: false,
6244
6334
  autoFit: true,
@@ -7159,6 +7249,152 @@ function isTextualControlType(value) {
7159
7249
  ].includes(value);
7160
7250
  }
7161
7251
 
7252
+ /**
7253
+ * Produces the same structural canonical form used by praxis-config-starter:
7254
+ * object keys are sorted, object properties with null/undefined values are
7255
+ * omitted, and array order is preserved.
7256
+ */
7257
+ function canonicalJsonStringify(value) {
7258
+ return JSON.stringify(canonicalizeJson(value));
7259
+ }
7260
+ function canonicalJsonSha256(value) {
7261
+ return textSha256(canonicalJsonStringify(value));
7262
+ }
7263
+ function textSha256(value) {
7264
+ return sha256Hex(encodeUtf8(value));
7265
+ }
7266
+ function canonicalizeJson(value) {
7267
+ if (Array.isArray(value)) {
7268
+ return value.map((item) => item === undefined ? null : canonicalizeJson(item));
7269
+ }
7270
+ if (value && typeof value === 'object') {
7271
+ return Object.keys(value)
7272
+ .sort()
7273
+ .reduce((result, key) => {
7274
+ const item = value[key];
7275
+ if (item !== null && item !== undefined) {
7276
+ result[key] = canonicalizeJson(item);
7277
+ }
7278
+ return result;
7279
+ }, {});
7280
+ }
7281
+ if (typeof value === 'number' && !Number.isFinite(value)) {
7282
+ throw new TypeError('Canonical JSON does not support non-finite numbers.');
7283
+ }
7284
+ return value;
7285
+ }
7286
+ function encodeUtf8(value) {
7287
+ if (typeof TextEncoder !== 'undefined') {
7288
+ return new TextEncoder().encode(value);
7289
+ }
7290
+ const bytes = [];
7291
+ for (const symbol of value) {
7292
+ const codePoint = symbol.codePointAt(0);
7293
+ if (codePoint <= 0x7f)
7294
+ bytes.push(codePoint);
7295
+ else if (codePoint <= 0x7ff) {
7296
+ bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f));
7297
+ }
7298
+ else if (codePoint <= 0xffff) {
7299
+ bytes.push(0xe0 | (codePoint >> 12), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));
7300
+ }
7301
+ else {
7302
+ bytes.push(0xf0 | (codePoint >> 18), 0x80 | ((codePoint >> 12) & 0x3f), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));
7303
+ }
7304
+ }
7305
+ return Uint8Array.from(bytes);
7306
+ }
7307
+ function sha256Hex(message) {
7308
+ const constants = [
7309
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
7310
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
7311
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
7312
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
7313
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
7314
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
7315
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
7316
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
7317
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
7318
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
7319
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
7320
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
7321
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
7322
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
7323
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
7324
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
7325
+ ];
7326
+ const hash = [
7327
+ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
7328
+ 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
7329
+ ];
7330
+ const length = message.length;
7331
+ const bitLenHi = Math.floor((length * 8) / 0x100000000);
7332
+ const bitLenLo = (length * 8) >>> 0;
7333
+ const withOne = length + 1;
7334
+ const mod = withOne % 64;
7335
+ const padLen = mod <= 56 ? 56 - mod : 56 + 64 - mod;
7336
+ const total = length + 1 + padLen + 8;
7337
+ const padded = new Uint8Array(total);
7338
+ padded.set(message);
7339
+ padded[length] = 0x80;
7340
+ padded[total - 8] = (bitLenHi >>> 24) & 0xff;
7341
+ padded[total - 7] = (bitLenHi >>> 16) & 0xff;
7342
+ padded[total - 6] = (bitLenHi >>> 8) & 0xff;
7343
+ padded[total - 5] = bitLenHi & 0xff;
7344
+ padded[total - 4] = (bitLenLo >>> 24) & 0xff;
7345
+ padded[total - 3] = (bitLenLo >>> 16) & 0xff;
7346
+ padded[total - 2] = (bitLenLo >>> 8) & 0xff;
7347
+ padded[total - 1] = bitLenLo & 0xff;
7348
+ const words = new Array(64);
7349
+ for (let offset = 0; offset < total; offset += 64) {
7350
+ for (let i = 0; i < 16; i += 1) {
7351
+ const index = offset + i * 4;
7352
+ words[i] = ((padded[index] << 24)
7353
+ | (padded[index + 1] << 16)
7354
+ | (padded[index + 2] << 8)
7355
+ | padded[index + 3]) >>> 0;
7356
+ }
7357
+ for (let i = 16; i < 64; i += 1) {
7358
+ const s0 = rotateRight(words[i - 15], 7)
7359
+ ^ rotateRight(words[i - 15], 18)
7360
+ ^ (words[i - 15] >>> 3);
7361
+ const s1 = rotateRight(words[i - 2], 17)
7362
+ ^ rotateRight(words[i - 2], 19)
7363
+ ^ (words[i - 2] >>> 10);
7364
+ words[i] = (words[i - 16] + s0 + words[i - 7] + s1) >>> 0;
7365
+ }
7366
+ let [a, b, c, d, e, f, g, h] = hash;
7367
+ for (let i = 0; i < 64; i += 1) {
7368
+ const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);
7369
+ const choice = (e & f) ^ (~e & g);
7370
+ const temp1 = (h + s1 + choice + constants[i] + words[i]) >>> 0;
7371
+ const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);
7372
+ const majority = (a & b) ^ (a & c) ^ (b & c);
7373
+ const temp2 = (s0 + majority) >>> 0;
7374
+ h = g;
7375
+ g = f;
7376
+ f = e;
7377
+ e = (d + temp1) >>> 0;
7378
+ d = c;
7379
+ c = b;
7380
+ b = a;
7381
+ a = (temp1 + temp2) >>> 0;
7382
+ }
7383
+ hash[0] = (hash[0] + a) >>> 0;
7384
+ hash[1] = (hash[1] + b) >>> 0;
7385
+ hash[2] = (hash[2] + c) >>> 0;
7386
+ hash[3] = (hash[3] + d) >>> 0;
7387
+ hash[4] = (hash[4] + e) >>> 0;
7388
+ hash[5] = (hash[5] + f) >>> 0;
7389
+ hash[6] = (hash[6] + g) >>> 0;
7390
+ hash[7] = (hash[7] + h) >>> 0;
7391
+ }
7392
+ return hash.map((part) => part.toString(16).padStart(8, '0')).join('');
7393
+ }
7394
+ function rotateRight(value, amount) {
7395
+ return (value >>> amount) | (value << (32 - amount));
7396
+ }
7397
+
7162
7398
  const PRAXIS_I18N_CONFIG = new InjectionToken('PRAXIS_I18N_CONFIG', {
7163
7399
  factory: () => ({}),
7164
7400
  });
@@ -12753,7 +12989,7 @@ class ComponentKeyService {
12753
12989
  hashIfNeeded(base, readable) {
12754
12990
  if (base.length <= 255)
12755
12991
  return base;
12756
- const hash = sha256Hex(encodeUtf8(base));
12992
+ const hash = textSha256(base);
12757
12993
  const rk = this.shortSegment(readable.routeKey);
12758
12994
  const ct = this.shortSegment(readable.componentType);
12759
12995
  const id = this.shortSegment(readable.componentId);
@@ -12778,111 +13014,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12778
13014
  type: Injectable,
12779
13015
  args: [{ providedIn: 'root' }]
12780
13016
  }] });
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
13017
 
12887
13018
  function defaultTelemetryTransport() {
12888
13019
  return {
@@ -14617,8 +14748,8 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
14617
14748
  namespaces: {
14618
14749
  [RELATED_RESOURCE_OUTLET_I18N_NAMESPACE]: {
14619
14750
  'pt-BR': {
14620
- 'state.idle.title': 'Recurso relacionado não selecionado',
14621
- 'state.idle.description': 'Selecione uma surface relacionada para carregar os dados.',
14751
+ 'state.idle.title': 'Selecione um registro',
14752
+ 'state.idle.description': 'Escolha um registro principal para carregar os dados relacionados.',
14622
14753
  'state.resolving.title': 'Resolvendo recurso relacionado',
14623
14754
  'state.resolving.description': 'Validando metadados e permissões da relação.',
14624
14755
  'state.loading.title': 'Carregando recurso relacionado',
@@ -14688,8 +14819,8 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
14688
14819
  '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
14820
  },
14690
14821
  'en-US': {
14691
- 'state.idle.title': 'Related resource not selected',
14692
- 'state.idle.description': 'Select a related surface to load its data.',
14822
+ 'state.idle.title': 'Select a record',
14823
+ 'state.idle.description': 'Choose a primary record to load its related data.',
14693
14824
  'state.resolving.title': 'Resolving related resource',
14694
14825
  'state.resolving.description': 'Validating relation metadata and permissions.',
14695
14826
  'state.loading.title': 'Loading related resource',
@@ -14798,7 +14929,7 @@ class RelatedResourceSurfaceResolverService {
14798
14929
  const parentResourceId = this.resolveParentResourceId(request, relatedResource);
14799
14930
  if (parentResourceId == null || parentResourceId === '') {
14800
14931
  return {
14801
- state: 'not-found',
14932
+ state: request.parentRecord ? 'not-found' : 'idle',
14802
14933
  reason: 'parent-resource-id-not-resolved',
14803
14934
  surface,
14804
14935
  relatedResource,
@@ -16300,6 +16431,7 @@ class ResourceActionOpenAdapterService {
16300
16431
  payload.widget.inputs['initialValue'] = this.clone(options.initialValue);
16301
16432
  }
16302
16433
  this.applyInteractionPresentation(payload, action);
16434
+ this.applyActionPresentation(payload, action);
16303
16435
  if (action.scope === 'ITEM') {
16304
16436
  if (options.resourceId != null) {
16305
16437
  payload.widget.inputs['resourceId'] = options.resourceId;
@@ -16317,6 +16449,28 @@ class ResourceActionOpenAdapterService {
16317
16449
  this.applyExecutionInputs(payload, action, options);
16318
16450
  return payload;
16319
16451
  }
16452
+ applyActionPresentation(payload, action) {
16453
+ const submitLabel = String(action.title ?? '').trim();
16454
+ if (!submitLabel) {
16455
+ return;
16456
+ }
16457
+ const inputs = payload.widget.inputs || (payload.widget.inputs = {});
16458
+ inputs['actions'] = {
16459
+ showSaveButton: true,
16460
+ showCancelButton: false,
16461
+ showResetButton: false,
16462
+ submit: {
16463
+ id: 'submit',
16464
+ type: 'submit',
16465
+ visible: true,
16466
+ label: submitLabel,
16467
+ },
16468
+ };
16469
+ const bindingOrder = Array.isArray(payload.widget.bindingOrder)
16470
+ ? payload.widget.bindingOrder.filter((input) => input !== 'actions')
16471
+ : [];
16472
+ payload.widget.bindingOrder = [...bindingOrder, 'actions'];
16473
+ }
16320
16474
  applyInteractionPresentation(payload, action) {
16321
16475
  const requiresFormConfirmation = action.execution?.interaction.mode === 'FORM'
16322
16476
  && action.execution.interaction.confirmationRequired;
@@ -16915,6 +17069,7 @@ class SurfaceOpenMaterializerService {
16915
17069
  return Object.fromEntries(Object.entries(inputs).filter(([key]) => supported.has(key)));
16916
17070
  }
16917
17071
  buildLocalTableConfig(fields, data, payload, childOperations = this.resolveRelatedChildOperations(payload)) {
17072
+ const previousConfig = this.objectRecord(payload.widget?.inputs?.['config']);
16918
17073
  const schemaColumns = fields
16919
17074
  .filter((field) => !field.hidden && !field.tableHidden && !!field.name)
16920
17075
  .map((field) => ({
@@ -16924,11 +17079,11 @@ class SurfaceOpenMaterializerService {
16924
17079
  sortable: field.sortable !== false,
16925
17080
  type: field.type,
16926
17081
  }));
17082
+ const projectedSchemaColumns = this.materializeSchemaColumnProjection(schemaColumns, previousConfig['columnProjection']);
16927
17083
  const fallbackColumns = schemaColumns.length
16928
17084
  ? []
16929
17085
  : this.inferColumnsFromData(data);
16930
17086
  const relatedActions = this.buildRelatedCrudActions(payload, childOperations);
16931
- const previousConfig = this.objectRecord(payload.widget?.inputs?.['config']);
16932
17087
  const previousToolbar = this.objectRecord(previousConfig['toolbar']);
16933
17088
  const relatedActionIds = new Set(relatedActions.map((action) => String(action['id'])));
16934
17089
  const previousToolbarActions = Array.isArray(previousToolbar['actions'])
@@ -16951,11 +17106,13 @@ class SurfaceOpenMaterializerService {
16951
17106
  const previousColumns = Array.isArray(previousConfig['columns'])
16952
17107
  ? previousConfig['columns']
16953
17108
  : [];
17109
+ const materializedBaseConfig = { ...previousConfig };
17110
+ delete materializedBaseConfig['columnProjection'];
16954
17111
  const generatedConfig = {
16955
17112
  columns: previousColumns.length
16956
17113
  ? previousColumns
16957
- : schemaColumns.length
16958
- ? schemaColumns
17114
+ : projectedSchemaColumns.length
17115
+ ? projectedSchemaColumns
16959
17116
  : fallbackColumns,
16960
17117
  toolbar: toolbarActions.length
16961
17118
  ? {
@@ -16982,7 +17139,7 @@ class SurfaceOpenMaterializerService {
16982
17139
  },
16983
17140
  };
16984
17141
  return {
16985
- ...previousConfig,
17142
+ ...materializedBaseConfig,
16986
17143
  ...generatedConfig,
16987
17144
  behavior: {
16988
17145
  ...generatedConfig.behavior,
@@ -16999,6 +17156,36 @@ class SurfaceOpenMaterializerService {
16999
17156
  },
17000
17157
  };
17001
17158
  }
17159
+ /**
17160
+ * Consumes the remote schema projection before an item surface becomes a local-data table.
17161
+ * The transient materialized table must not retain `columnProjection`: that contract belongs to
17162
+ * remote schema resolution and has already been reduced here to concrete columns.
17163
+ */
17164
+ materializeSchemaColumnProjection(schemaColumns, rawProjection) {
17165
+ const projection = this.objectRecord(rawProjection);
17166
+ if (projection['source'] !== 'schema') {
17167
+ return schemaColumns;
17168
+ }
17169
+ const byField = new Map(schemaColumns.map((column) => [String(column['field'] || ''), column]));
17170
+ const include = Array.isArray(projection['include'])
17171
+ ? projection['include'].filter((field) => (typeof field === 'string' && byField.has(field)))
17172
+ : schemaColumns.map((column) => String(column['field'] || ''));
17173
+ const overrides = this.objectRecord(projection['overrides']);
17174
+ const projected = include.map((field) => ({
17175
+ ...byField.get(field),
17176
+ ...this.objectRecord(overrides[field]),
17177
+ field,
17178
+ }));
17179
+ const additions = Array.isArray(projection['additions'])
17180
+ ? projection['additions']
17181
+ .filter((column) => {
17182
+ const candidate = this.objectRecord(column);
17183
+ return typeof candidate['field'] === 'string' && !!candidate['field'];
17184
+ })
17185
+ .map((column) => ({ ...this.objectRecord(column) }))
17186
+ : [];
17187
+ return [...projected, ...additions];
17188
+ }
17002
17189
  objectRecord(value) {
17003
17190
  return value && typeof value === 'object' && !Array.isArray(value)
17004
17191
  ? value
@@ -25472,7 +25659,8 @@ function groupFields(fields) {
25472
25659
  }
25473
25660
  function createSection(groupKey, groupFields, sectionIndex, policy, options) {
25474
25661
  const title = groupKey === 'default'
25475
- ? options.defaultSectionTitle || 'Informacoes'
25662
+ ? options.defaultSectionTitle
25663
+ ?? (policy.preset === 'groupedCommand' ? '' : 'Informacoes')
25476
25664
  : groupKey;
25477
25665
  const sectionId = stableSectionId(groupKey);
25478
25666
  const presentationRole = resolvePresentationRole(groupKey, groupFields, options.presentationRoleMap);
@@ -32186,6 +32374,7 @@ const MUTABLE_INITIAL_BINDING_INPUTS = new Set(['enableCustomization']);
32186
32374
  class DynamicWidgetLoaderDirective {
32187
32375
  vcRef = inject(ViewContainerRef);
32188
32376
  registry = inject(ComponentMetadataRegistry);
32377
+ injector = inject(Injector);
32189
32378
  widget;
32190
32379
  ownerWidgetKey = null;
32191
32380
  context = null;
@@ -32195,12 +32384,16 @@ class DynamicWidgetLoaderDirective {
32195
32384
  autoWireOutputs = false;
32196
32385
  widgetEvent = new EventEmitter();
32197
32386
  widgetDiagnostic = new EventEmitter();
32387
+ /** Transient actions contributed by the live child component to its shell. */
32388
+ contributedShellActions = signal([], ...(ngDevMode ? [{ debugName: "contributedShellActions" }] : /* istanbul ignore next */ []));
32198
32389
  compRef;
32199
32390
  currentId;
32200
32391
  currentUsesInitialBindings = false;
32201
32392
  currentInitialBindingSignature = null;
32202
32393
  boundInputValues = {};
32203
32394
  outputSubs = [];
32395
+ shellActionContributionEffect;
32396
+ shellActionContributor;
32204
32397
  destroyed = false;
32205
32398
  /** Dispatch a shell action to the inner widget instance when supported. */
32206
32399
  dispatchAction(action) {
@@ -32371,6 +32564,7 @@ class DynamicWidgetLoaderDirective {
32371
32564
  this.vcRef.clear();
32372
32565
  try {
32373
32566
  this.compRef = this.vcRef.createComponent(cmp);
32567
+ this.bindShellActionContributor(this.compRef.instance);
32374
32568
  if (useInitialBindings) {
32375
32569
  this.bindInputs(this.compRef, id, inputs, bindingOrder, metaForInputs);
32376
32570
  }
@@ -32388,6 +32582,7 @@ class DynamicWidgetLoaderDirective {
32388
32582
  }
32389
32583
  }
32390
32584
  destroyCurrent() {
32585
+ this.releaseShellActionContributor();
32391
32586
  this.outputSubs.forEach((u) => u());
32392
32587
  this.outputSubs = [];
32393
32588
  if (this.compRef) {
@@ -32400,6 +32595,27 @@ class DynamicWidgetLoaderDirective {
32400
32595
  }
32401
32596
  this.vcRef.clear();
32402
32597
  }
32598
+ bindShellActionContributor(instance) {
32599
+ const candidate = instance;
32600
+ if (!candidate || typeof candidate.widgetShellActions !== 'function') {
32601
+ this.contributedShellActions.set([]);
32602
+ return;
32603
+ }
32604
+ const contributor = candidate;
32605
+ this.shellActionContributor = contributor;
32606
+ contributor.setWidgetShellActionHostActive?.(true);
32607
+ this.shellActionContributionEffect = effect(() => {
32608
+ const actions = contributor.widgetShellActions();
32609
+ this.contributedShellActions.set(Array.isArray(actions) ? actions.map((action) => ({ ...action })) : []);
32610
+ }, { ...(ngDevMode ? { debugName: "shellActionContributionEffect" } : /* istanbul ignore next */ {}), injector: this.injector });
32611
+ }
32612
+ releaseShellActionContributor() {
32613
+ this.shellActionContributionEffect?.destroy();
32614
+ this.shellActionContributionEffect = undefined;
32615
+ this.shellActionContributor?.setWidgetShellActionHostActive?.(false);
32616
+ this.shellActionContributor = undefined;
32617
+ this.contributedShellActions.set([]);
32618
+ }
32403
32619
  cloneValue(value) {
32404
32620
  if (value == null || typeof value !== 'object') {
32405
32621
  return value;
@@ -33131,7 +33347,7 @@ class WidgetShellComponent {
33131
33347
  action = new EventEmitter();
33132
33348
  dragSurfacePointerDown = new EventEmitter();
33133
33349
  dragSurfaceKeydown = new EventEmitter();
33134
- loader;
33350
+ loader = contentChild(DynamicWidgetLoaderDirective, ...(ngDevMode ? [{ debugName: "loader" }] : /* istanbul ignore next */ []));
33135
33351
  shellText(value, fallback = '') {
33136
33352
  return this.i18n.resolve(value, fallback);
33137
33353
  }
@@ -33180,7 +33396,7 @@ class WidgetShellComponent {
33180
33396
  this.windowActions.length);
33181
33397
  }
33182
33398
  get headerActions() {
33183
- return (this.shell?.actions || []).filter((a) => this.isVisible(a) && (a.placement || 'header') === 'header');
33399
+ return this.mergedActions.filter((a) => this.isVisible(a) && (a.placement || 'header') === 'header');
33184
33400
  }
33185
33401
  get visibleHeaderActions() {
33186
33402
  const max = this.maxHeaderActions;
@@ -33194,7 +33410,7 @@ class WidgetShellComponent {
33194
33410
  return 3;
33195
33411
  }
33196
33412
  get windowActions() {
33197
- const custom = (this.shell?.actions || []).filter((a) => this.isVisible(a) && (a.placement || 'header') === 'window');
33413
+ const custom = this.mergedActions.filter((a) => this.isVisible(a) && (a.placement || 'header') === 'window');
33198
33414
  const builtins = this.buildWindowActions(custom);
33199
33415
  return [...builtins, ...custom];
33200
33416
  }
@@ -33221,8 +33437,34 @@ class WidgetShellComponent {
33221
33437
  pressed: action.pressed,
33222
33438
  action,
33223
33439
  };
33224
- this.loader?.dispatchAction(event);
33225
- this.action.emit(event);
33440
+ const loader = this.loader();
33441
+ const runtimeContributed = loader
33442
+ ?.contributedShellActions()
33443
+ .some((candidate) => candidate.id === action.id) ?? false;
33444
+ const handledByWidget = loader?.dispatchAction(event) ?? false;
33445
+ // Runtime-contributed controls are presentation affordances owned by the
33446
+ // live widget. Once handled there, they must not escape as authored page
33447
+ // actions or enter the composition event/persistence pipeline.
33448
+ if (!runtimeContributed || !handledByWidget) {
33449
+ this.action.emit(event);
33450
+ }
33451
+ }
33452
+ get mergedActions() {
33453
+ const authored = this.shell?.actions || [];
33454
+ const contributed = this.loader()?.contributedShellActions() || [];
33455
+ if (!contributed.length) {
33456
+ return authored;
33457
+ }
33458
+ const contributedById = new Map(contributed.map((action) => [action.id, action]));
33459
+ const merged = authored.map((action) => {
33460
+ const runtimeAction = contributedById.get(action.id);
33461
+ if (!runtimeAction) {
33462
+ return action;
33463
+ }
33464
+ contributedById.delete(action.id);
33465
+ return { ...action, ...runtimeAction };
33466
+ });
33467
+ return [...merged, ...contributedById.values()];
33226
33468
  }
33227
33469
  onHeaderPointerDown(event) {
33228
33470
  if (!this.dragSurfaceInteractive ||
@@ -33356,7 +33598,7 @@ class WidgetShellComponent {
33356
33598
  return this.i18n.t(key, undefined, fallback, WIDGET_SHELL_I18N_NAMESPACE);
33357
33599
  }
33358
33600
  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: `
33601
+ 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
33602
  <section
33361
33603
  class="pdx-shell"
33362
33604
  [class.no-shell]="!shellEnabled"
@@ -33416,7 +33658,7 @@ class WidgetShellComponent {
33416
33658
  </div>
33417
33659
  </div>
33418
33660
  <div class="pdx-shell-actions">
33419
- @if (!expanded && !fullscreen) {
33661
+ @if (!collapsed || expanded || fullscreen) {
33420
33662
  @for (action of visibleHeaderActions; track action.id) {
33421
33663
  <ng-container>
33422
33664
  @if (action.variant !== 'icon') {
@@ -33437,6 +33679,10 @@ class WidgetShellComponent {
33437
33679
  [attr.aria-pressed]="
33438
33680
  action.pressed == null ? null : action.pressed
33439
33681
  "
33682
+ [attr.aria-controls]="action.ariaControls || null"
33683
+ [attr.aria-expanded]="
33684
+ action.ariaExpanded == null ? null : action.ariaExpanded
33685
+ "
33440
33686
  (click)="onAction(action, $event)"
33441
33687
  >
33442
33688
  @if (displayActionIcon(action); as actionIcon) {
@@ -33464,6 +33710,10 @@ class WidgetShellComponent {
33464
33710
  actionText(action.tooltip, action.id)
33465
33711
  )
33466
33712
  "
33713
+ [attr.aria-controls]="action.ariaControls || null"
33714
+ [attr.aria-expanded]="
33715
+ action.ariaExpanded == null ? null : action.ariaExpanded
33716
+ "
33467
33717
  type="button"
33468
33718
  (click)="onAction(action, $event)"
33469
33719
  ></button>
@@ -33518,6 +33768,10 @@ class WidgetShellComponent {
33518
33768
  [attr.aria-pressed]="
33519
33769
  action.pressed == null ? null : action.pressed
33520
33770
  "
33771
+ [attr.aria-controls]="action.ariaControls || null"
33772
+ [attr.aria-expanded]="
33773
+ action.ariaExpanded == null ? null : action.ariaExpanded
33774
+ "
33521
33775
  (click)="onAction(action, $event)"
33522
33776
  >
33523
33777
  @if (displayActionIcon(action); as actionIcon) {
@@ -33608,7 +33862,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33608
33862
  </div>
33609
33863
  </div>
33610
33864
  <div class="pdx-shell-actions">
33611
- @if (!expanded && !fullscreen) {
33865
+ @if (!collapsed || expanded || fullscreen) {
33612
33866
  @for (action of visibleHeaderActions; track action.id) {
33613
33867
  <ng-container>
33614
33868
  @if (action.variant !== 'icon') {
@@ -33629,6 +33883,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33629
33883
  [attr.aria-pressed]="
33630
33884
  action.pressed == null ? null : action.pressed
33631
33885
  "
33886
+ [attr.aria-controls]="action.ariaControls || null"
33887
+ [attr.aria-expanded]="
33888
+ action.ariaExpanded == null ? null : action.ariaExpanded
33889
+ "
33632
33890
  (click)="onAction(action, $event)"
33633
33891
  >
33634
33892
  @if (displayActionIcon(action); as actionIcon) {
@@ -33656,6 +33914,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33656
33914
  actionText(action.tooltip, action.id)
33657
33915
  )
33658
33916
  "
33917
+ [attr.aria-controls]="action.ariaControls || null"
33918
+ [attr.aria-expanded]="
33919
+ action.ariaExpanded == null ? null : action.ariaExpanded
33920
+ "
33659
33921
  type="button"
33660
33922
  (click)="onAction(action, $event)"
33661
33923
  ></button>
@@ -33710,6 +33972,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33710
33972
  [attr.aria-pressed]="
33711
33973
  action.pressed == null ? null : action.pressed
33712
33974
  "
33975
+ [attr.aria-controls]="action.ariaControls || null"
33976
+ [attr.aria-expanded]="
33977
+ action.ariaExpanded == null ? null : action.ariaExpanded
33978
+ "
33713
33979
  (click)="onAction(action, $event)"
33714
33980
  >
33715
33981
  @if (displayActionIcon(action); as actionIcon) {
@@ -33746,10 +34012,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33746
34012
  type: Output
33747
34013
  }], dragSurfaceKeydown: [{
33748
34014
  type: Output
33749
- }], loader: [{
33750
- type: ContentChild,
33751
- args: [DynamicWidgetLoaderDirective]
33752
- }] } });
34015
+ }], loader: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DynamicWidgetLoaderDirective), { isSignal: true }] }] } });
33753
34016
 
33754
34017
  class PraxisResourceIdentityComponent {
33755
34018
  identity = null;
@@ -44171,6 +44434,7 @@ class PraxisRelatedResourceOutletComponent {
44171
44434
  const surfaceId = this.surfaceId();
44172
44435
  const catalog = this.surfaceCatalog();
44173
44436
  const discoverySource = this.discoverySource() || this.parentLinks();
44437
+ const parentRecord = this.parentRecord();
44174
44438
  const parentResourcePath = this.parentResourcePath();
44175
44439
  const parentResourceId = this.parentResourceId();
44176
44440
  const apiEndpointKey = this.apiEndpointKey();
@@ -44181,6 +44445,14 @@ class PraxisRelatedResourceOutletComponent {
44181
44445
  this.resetDiscoveryState();
44182
44446
  return;
44183
44447
  }
44448
+ if (this.trim(parentResourcePath)
44449
+ && (parentResourceId == null || parentResourceId === '')
44450
+ && !parentRecord) {
44451
+ this.discoveredSurface.set(null);
44452
+ this.discoveryState.set('idle');
44453
+ this.discoveryStateReason.set('parent-resource-id-not-resolved');
44454
+ return;
44455
+ }
44184
44456
  if (catalog) {
44185
44457
  this.applyCatalogSurface(surfaceId, catalog);
44186
44458
  return;
@@ -44229,6 +44501,14 @@ class PraxisRelatedResourceOutletComponent {
44229
44501
  const resolution = this.resolution();
44230
44502
  const payload = resolution.state === 'ready' ? resolution.payload : null;
44231
44503
  const requestKey = this.buildMaterializationRequestKey(resolution);
44504
+ // Composition state updates can re-create structurally equal input objects.
44505
+ // Keep the mounted child widget when its effective materialization contract
44506
+ // did not change; destroying it here also destroys transient table state such
44507
+ // as the selection that may have triggered the composition update itself.
44508
+ if (requestKey === this.materializationRequestKey
44509
+ && this.materializedPayload() != null) {
44510
+ return;
44511
+ }
44232
44512
  this.materializationRequestKey = requestKey;
44233
44513
  this.materializedPayload.set(null);
44234
44514
  if (!payload) {
@@ -44357,10 +44637,7 @@ class PraxisRelatedResourceOutletComponent {
44357
44637
  buildMaterializationRequestKey(resolution) {
44358
44638
  return JSON.stringify({
44359
44639
  state: resolution.state,
44360
- surfaceId: resolution.surface?.id ?? null,
44361
- parentResourceId: resolution.parentResourceId ?? null,
44362
- childResourcePath: resolution.childResourcePath ?? null,
44363
- queryContext: resolution.queryContext ?? null,
44640
+ payload: resolution.payload ?? null,
44364
44641
  mode: this.mode(),
44365
44642
  });
44366
44643
  }
@@ -46119,7 +46396,7 @@ class EmptyStateCardComponent {
46119
46396
  </div>
46120
46397
  </mat-card-content>
46121
46398
  </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"] }] });
46399
+ `, 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
46400
  }
46124
46401
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EmptyStateCardComponent, decorators: [{
46125
46402
  type: Component,
@@ -46170,7 +46447,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
46170
46447
  </div>
46171
46448
  </mat-card-content>
46172
46449
  </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"] }]
46450
+ `, 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
46451
  }], propDecorators: { icon: [{
46175
46452
  type: Input
46176
46453
  }], title: [{
@@ -47209,4 +47486,4 @@ function provideHookWhitelist(allowed) {
47209
47486
  * Generated bundle index. Do not edit.
47210
47487
  */
47211
47488
 
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 };
47489
+ 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 };