@praxisui/core 8.0.0-beta.11 → 8.0.0-beta.12

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.
@@ -7447,7 +7447,10 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
7447
7447
  if (!parsed || !Array.isArray(rawDays)) {
7448
7448
  return false;
7449
7449
  }
7450
- const normalized = rawDays.map((item) => Number(item)).filter(Number.isFinite);
7450
+ const normalized = rawDays
7451
+ .map((item) => Number(item))
7452
+ .filter(Number.isFinite)
7453
+ .map((item) => item === 0 ? 7 : item);
7451
7454
  if (!normalized.length) {
7452
7455
  return false;
7453
7456
  }
@@ -9421,6 +9424,439 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
9421
9424
  args: [{ providedIn: 'root' }]
9422
9425
  }] });
9423
9426
 
9427
+ const PRAXIS_EXPORT_FORMULA_PREFIXES = ['=', '+', '-', '@', '\t', '\r'];
9428
+ const PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY = {
9429
+ escapeFormulaValues: true,
9430
+ formulaPrefixes: PRAXIS_EXPORT_FORMULA_PREFIXES,
9431
+ formulaEscapePrefix: "'",
9432
+ };
9433
+ function resolvePraxisExportScope(request) {
9434
+ if (request.scope !== 'auto') {
9435
+ return request.scope;
9436
+ }
9437
+ const selection = request.selection;
9438
+ const hasSelectedItems = !!selection?.selectedItems?.length;
9439
+ const hasSelectedKeys = !!selection?.selectedKeys?.length;
9440
+ const hasAllMatchingSelection = selection?.allMatchingSelected === true;
9441
+ if (hasSelectedItems || hasSelectedKeys || hasAllMatchingSelection) {
9442
+ return 'selected';
9443
+ }
9444
+ return request.filters || request.query ? 'filtered' : 'currentPage';
9445
+ }
9446
+ function resolvePraxisCollectionExportItems(request) {
9447
+ const scope = resolvePraxisExportScope(request);
9448
+ const loadedItems = request.loadedItems ?? [];
9449
+ if (scope === 'selected') {
9450
+ const selectedItems = request.selection?.selectedItems;
9451
+ if (selectedItems?.length) {
9452
+ return selectedItems;
9453
+ }
9454
+ const keyField = request.selection?.keyField;
9455
+ const selectedKeys = request.selection?.selectedKeys;
9456
+ if (!keyField || !selectedKeys?.length) {
9457
+ return [];
9458
+ }
9459
+ const selectedKeySet = new Set(selectedKeys);
9460
+ return loadedItems.filter((item) => selectedKeySet.has(readPraxisExportValue(item, keyField)));
9461
+ }
9462
+ return loadedItems;
9463
+ }
9464
+ function resolvePraxisExportFields(request) {
9465
+ const configuredFields = request.fields?.filter((field) => field.exportable !== false && field.visible !== false);
9466
+ if (configuredFields?.length) {
9467
+ return configuredFields;
9468
+ }
9469
+ const sample = resolvePraxisCollectionExportItems(request)[0];
9470
+ if (!sample || typeof sample !== 'object') {
9471
+ return [];
9472
+ }
9473
+ return Object.keys(sample).map((key) => ({
9474
+ key,
9475
+ label: key,
9476
+ valuePath: key,
9477
+ }));
9478
+ }
9479
+ function readPraxisExportValue(item, path) {
9480
+ if (!item || !path) {
9481
+ return undefined;
9482
+ }
9483
+ return path.split('.').reduce((value, segment) => {
9484
+ if (!value || typeof value !== 'object') {
9485
+ return undefined;
9486
+ }
9487
+ return value[segment];
9488
+ }, item);
9489
+ }
9490
+ function escapePraxisExportCell(value, policy = PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY) {
9491
+ if (value === null || value === undefined) {
9492
+ return '';
9493
+ }
9494
+ const text = value instanceof Date ? value.toISOString() : String(value);
9495
+ if (!policy.escapeFormulaValues || !text) {
9496
+ return text;
9497
+ }
9498
+ return startsWithPraxisFormula(text, policy.formulaPrefixes)
9499
+ ? `${policy.formulaEscapePrefix}${text}`
9500
+ : text;
9501
+ }
9502
+ function serializePraxisCollectionToCsv(request, policy = PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY) {
9503
+ const fields = resolvePraxisExportFields(request);
9504
+ const items = resolvePraxisCollectionExportItems(request);
9505
+ const rows = [];
9506
+ if (request.includeHeaders !== false) {
9507
+ rows.push(fields.map((field) => quoteCsvCell(field.label ?? field.key)).join(','));
9508
+ }
9509
+ for (const item of applyPraxisExportLimit(items, request.maxRows)) {
9510
+ const cells = fields.map((field) => {
9511
+ const rawValue = field.valueGetter
9512
+ ? field.valueGetter(item)
9513
+ : readPraxisExportValue(item, field.valuePath ?? field.key);
9514
+ const formattedValue = request.applyFormatting !== false && field.formatter
9515
+ ? field.formatter(rawValue, item)
9516
+ : rawValue;
9517
+ return quoteCsvCell(escapePraxisExportCell(formattedValue, policy));
9518
+ });
9519
+ rows.push(cells.join(','));
9520
+ }
9521
+ return rows.join('\r\n');
9522
+ }
9523
+ function serializePraxisCollectionToJson(request) {
9524
+ const fields = resolvePraxisExportFields(request);
9525
+ const items = applyPraxisExportLimit(resolvePraxisCollectionExportItems(request), request.maxRows);
9526
+ const rows = items.map((item) => fields.reduce((row, field) => {
9527
+ const rawValue = field.valueGetter
9528
+ ? field.valueGetter(item)
9529
+ : readPraxisExportValue(item, field.valuePath ?? field.key);
9530
+ row[field.key] = request.applyFormatting !== false && field.formatter
9531
+ ? field.formatter(rawValue, item)
9532
+ : rawValue;
9533
+ return row;
9534
+ }, {}));
9535
+ return JSON.stringify(rows, null, 2);
9536
+ }
9537
+ function hasPraxisCollectionExportArtifact(result) {
9538
+ if (!result) {
9539
+ return false;
9540
+ }
9541
+ if (result.status === 'deferred') {
9542
+ return true;
9543
+ }
9544
+ if (typeof result.downloadUrl === 'string' && result.downloadUrl.trim()) {
9545
+ return true;
9546
+ }
9547
+ return result.content !== undefined && result.content !== null;
9548
+ }
9549
+ function assertPraxisCollectionExportArtifact(result) {
9550
+ if (!hasPraxisCollectionExportArtifact(result)) {
9551
+ throw new Error('Collection export completed without content, downloadUrl, or deferred status.');
9552
+ }
9553
+ }
9554
+ function applyPraxisExportLimit(items, maxRows) {
9555
+ if (!maxRows || maxRows <= 0 || items.length <= maxRows) {
9556
+ return items;
9557
+ }
9558
+ return items.slice(0, maxRows);
9559
+ }
9560
+ function quoteCsvCell(value) {
9561
+ return `"${value.replace(/"/g, '""')}"`;
9562
+ }
9563
+ function startsWithPraxisFormula(text, formulaPrefixes) {
9564
+ let index = 0;
9565
+ while (index < text.length && /\s/.test(text.charAt(index))) {
9566
+ index += 1;
9567
+ }
9568
+ if (index >= text.length) {
9569
+ return false;
9570
+ }
9571
+ const candidate = text.slice(index);
9572
+ return formulaPrefixes.some((prefix) => candidate.startsWith(prefix));
9573
+ }
9574
+
9575
+ const PRAXIS_COLLECTION_EXPORT_PROVIDER = new InjectionToken('PRAXIS_COLLECTION_EXPORT_PROVIDER');
9576
+ const PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS = new InjectionToken('PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS', {
9577
+ providedIn: 'root',
9578
+ factory: () => ({}),
9579
+ });
9580
+ const PRAXIS_EXPORT_SECURITY_POLICY = new InjectionToken('PRAXIS_EXPORT_SECURITY_POLICY', {
9581
+ providedIn: 'root',
9582
+ factory: () => PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY,
9583
+ });
9584
+ function providePraxisCollectionExportProvider(provider) {
9585
+ return {
9586
+ provide: PRAXIS_COLLECTION_EXPORT_PROVIDER,
9587
+ useValue: provider,
9588
+ };
9589
+ }
9590
+
9591
+ class PraxisCollectionExportService {
9592
+ provider;
9593
+ securityPolicy;
9594
+ constructor(provider, securityPolicy) {
9595
+ this.provider = provider;
9596
+ this.securityPolicy = securityPolicy;
9597
+ }
9598
+ async exportCollection(request) {
9599
+ if (this.provider) {
9600
+ return this.provider.exportCollection(request);
9601
+ }
9602
+ return this.exportLocalCollection(request);
9603
+ }
9604
+ exportLocalCollection(request) {
9605
+ const scope = resolvePraxisExportScope(request);
9606
+ const requiresRemoteProvider = !!request.resourcePath && (scope === 'filtered' || scope === 'all');
9607
+ if (requiresRemoteProvider) {
9608
+ throw new Error(`PraxisCollectionExportService requires a collection export provider for remote "${scope}" exports.`);
9609
+ }
9610
+ const items = resolvePraxisCollectionExportItems(request);
9611
+ const rowCount = request.maxRows && request.maxRows > 0
9612
+ ? Math.min(items.length, request.maxRows)
9613
+ : items.length;
9614
+ if (request.format === 'csv') {
9615
+ return {
9616
+ status: 'completed',
9617
+ format: request.format,
9618
+ scope,
9619
+ fileName: request.fileName,
9620
+ mimeType: 'text/csv;charset=utf-8',
9621
+ content: serializePraxisCollectionToCsv(request, this.securityPolicy),
9622
+ rowCount,
9623
+ };
9624
+ }
9625
+ if (request.format === 'json') {
9626
+ return {
9627
+ status: 'completed',
9628
+ format: request.format,
9629
+ scope,
9630
+ fileName: request.fileName,
9631
+ mimeType: 'application/json;charset=utf-8',
9632
+ content: serializePraxisCollectionToJson(request),
9633
+ rowCount,
9634
+ };
9635
+ }
9636
+ throw new Error(`PraxisCollectionExportService requires a collection export provider for "${request.format}" exports.`);
9637
+ }
9638
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisCollectionExportService, deps: [{ token: PRAXIS_COLLECTION_EXPORT_PROVIDER, optional: true }, { token: PRAXIS_EXPORT_SECURITY_POLICY }], target: i0.ɵɵFactoryTarget.Injectable });
9639
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisCollectionExportService, providedIn: 'root' });
9640
+ }
9641
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisCollectionExportService, decorators: [{
9642
+ type: Injectable,
9643
+ args: [{
9644
+ providedIn: 'root',
9645
+ }]
9646
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
9647
+ type: Optional
9648
+ }, {
9649
+ type: Inject,
9650
+ args: [PRAXIS_COLLECTION_EXPORT_PROVIDER]
9651
+ }] }, { type: undefined, decorators: [{
9652
+ type: Inject,
9653
+ args: [PRAXIS_EXPORT_SECURITY_POLICY]
9654
+ }] }] });
9655
+
9656
+ class PraxisHttpCollectionExportProvider {
9657
+ http;
9658
+ apiUrlConfig;
9659
+ options;
9660
+ constructor(http, apiUrlConfig, options) {
9661
+ this.http = http;
9662
+ this.apiUrlConfig = apiUrlConfig;
9663
+ this.options = options;
9664
+ }
9665
+ async exportCollection(request) {
9666
+ const url = this.resolveEndpoint(request);
9667
+ const body = this.buildRequestBody(request);
9668
+ const response = await firstValueFrom(this.http.post(url, body, {
9669
+ headers: this.buildHeaders(),
9670
+ observe: 'response',
9671
+ responseType: 'blob',
9672
+ withCredentials: this.options?.withCredentials,
9673
+ }));
9674
+ return this.normalizeResponse(response, request);
9675
+ }
9676
+ resolveEndpoint(request) {
9677
+ const configuredEndpoint = this.options?.endpoint;
9678
+ if (typeof configuredEndpoint === 'function') {
9679
+ return this.resolveUrl(configuredEndpoint(request));
9680
+ }
9681
+ if (configuredEndpoint) {
9682
+ return this.resolveUrl(configuredEndpoint);
9683
+ }
9684
+ const resourcePath = request.resourcePath?.trim();
9685
+ if (!resourcePath) {
9686
+ throw new Error('PraxisHttpCollectionExportProvider requires request.resourcePath or an explicit endpoint option.');
9687
+ }
9688
+ return this.resolveUrl(`${resourcePath.replace(/\/+$/, '')}/export`);
9689
+ }
9690
+ resolveUrl(pathOrUrl) {
9691
+ const value = pathOrUrl.trim();
9692
+ if (/^https?:\/\//i.test(value)) {
9693
+ return value;
9694
+ }
9695
+ const base = this.resolveApiBaseUrl();
9696
+ const path = this.normalizePathForBase(value, base);
9697
+ return base ? `${base}/${path}` : `/${path}`;
9698
+ }
9699
+ normalizePathForBase(pathOrUrl, base) {
9700
+ const path = pathOrUrl.replace(/^\/+/, '');
9701
+ const baseLastSegment = base
9702
+ .replace(/\/+$/, '')
9703
+ .split('/')
9704
+ .filter(Boolean)
9705
+ .pop();
9706
+ if (baseLastSegment && path === baseLastSegment) {
9707
+ return '';
9708
+ }
9709
+ const duplicatedPrefix = baseLastSegment ? `${baseLastSegment}/` : '';
9710
+ return duplicatedPrefix && path.startsWith(duplicatedPrefix)
9711
+ ? path.slice(duplicatedPrefix.length)
9712
+ : path;
9713
+ }
9714
+ resolveApiBaseUrl() {
9715
+ const key = this.options?.apiUrlKey || 'default';
9716
+ const entry = this.apiUrlConfig?.[key] || this.apiUrlConfig?.['default'];
9717
+ return buildApiUrl(entry || {}).replace(/\/+$/, '');
9718
+ }
9719
+ buildHeaders() {
9720
+ const key = this.options?.apiUrlKey || 'default';
9721
+ const entry = this.apiUrlConfig?.[key] || this.apiUrlConfig?.['default'];
9722
+ let headers = buildHeaders(entry || {});
9723
+ for (const [name, value] of Object.entries(this.options?.headers || {})) {
9724
+ headers = (headers || new HttpHeaders()).set(name, value);
9725
+ }
9726
+ return headers;
9727
+ }
9728
+ buildRequestBody(request) {
9729
+ const effectiveScope = resolvePraxisExportScope(request);
9730
+ const includeLoadedItems = this.options?.includeLoadedItems === true ||
9731
+ !request.resourcePath ||
9732
+ effectiveScope === 'currentPage' ||
9733
+ effectiveScope === 'selected';
9734
+ return {
9735
+ ...request,
9736
+ scope: effectiveScope,
9737
+ loadedItems: includeLoadedItems ? request.loadedItems : undefined,
9738
+ metadata: {
9739
+ ...request.metadata,
9740
+ configuredScope: request.scope,
9741
+ effectiveScope,
9742
+ },
9743
+ };
9744
+ }
9745
+ async normalizeResponse(response, request) {
9746
+ const blob = response.body || new Blob();
9747
+ const contentType = response.headers.get('content-type') || blob.type || undefined;
9748
+ if (contentType?.includes('application/json')) {
9749
+ const text = await blob.text();
9750
+ const parsed = JSON.parse(text || '{}');
9751
+ const exportHeaders = this.normalizeExportHeaders(response);
9752
+ return {
9753
+ ...parsed,
9754
+ format: parsed.format || request.format,
9755
+ scope: parsed.scope || resolvePraxisExportScope(request),
9756
+ fileName: parsed.fileName || this.resolveFileName(response, request),
9757
+ rowCount: parsed.rowCount ?? exportHeaders.rowCount,
9758
+ warnings: this.mergeWarnings(parsed.warnings, exportHeaders.warnings),
9759
+ metadata: {
9760
+ ...exportHeaders.metadata,
9761
+ ...parsed.metadata,
9762
+ },
9763
+ };
9764
+ }
9765
+ const exportHeaders = this.normalizeExportHeaders(response);
9766
+ return {
9767
+ status: 'completed',
9768
+ format: request.format,
9769
+ scope: resolvePraxisExportScope(request),
9770
+ fileName: this.resolveFileName(response, request),
9771
+ mimeType: contentType,
9772
+ content: blob,
9773
+ rowCount: exportHeaders.rowCount,
9774
+ warnings: exportHeaders.warnings,
9775
+ metadata: {
9776
+ httpStatus: response.status,
9777
+ ...exportHeaders.metadata,
9778
+ },
9779
+ };
9780
+ }
9781
+ normalizeExportHeaders(response) {
9782
+ const rowCount = this.readNumberHeader(response, 'X-Export-Row-Count');
9783
+ const truncated = this.readBooleanHeader(response, 'X-Export-Truncated');
9784
+ const maxRows = this.readNumberHeader(response, 'X-Export-Max-Rows');
9785
+ const candidateRows = this.readNumberHeader(response, 'X-Export-Candidate-Row-Count');
9786
+ const warnings = this.readWarningHeader(response);
9787
+ const metadata = {};
9788
+ if (truncated !== undefined) {
9789
+ metadata['truncated'] = truncated;
9790
+ }
9791
+ if (maxRows !== undefined) {
9792
+ metadata['maxRows'] = maxRows;
9793
+ }
9794
+ if (candidateRows !== undefined) {
9795
+ metadata['candidateRows'] = candidateRows;
9796
+ }
9797
+ return { rowCount, warnings, metadata };
9798
+ }
9799
+ readNumberHeader(response, headerName) {
9800
+ const value = response.headers.get(headerName);
9801
+ if (!value) {
9802
+ return undefined;
9803
+ }
9804
+ const parsed = Number(value);
9805
+ return Number.isFinite(parsed) ? parsed : undefined;
9806
+ }
9807
+ readBooleanHeader(response, headerName) {
9808
+ const value = response.headers.get(headerName);
9809
+ if (value === null) {
9810
+ return undefined;
9811
+ }
9812
+ return value.toLowerCase() === 'true';
9813
+ }
9814
+ readWarningHeader(response) {
9815
+ const value = response.headers.get('X-Export-Warnings');
9816
+ if (!value) {
9817
+ return [];
9818
+ }
9819
+ return value
9820
+ .split('|')
9821
+ .map((warning) => warning.trim())
9822
+ .filter(Boolean);
9823
+ }
9824
+ mergeWarnings(parsedWarnings, headerWarnings) {
9825
+ const warnings = [
9826
+ ...(parsedWarnings || []),
9827
+ ...headerWarnings,
9828
+ ];
9829
+ return warnings.length ? warnings : undefined;
9830
+ }
9831
+ resolveFileName(response, request) {
9832
+ const disposition = response.headers.get('content-disposition') || '';
9833
+ const utf8Match = disposition.match(/filename\*=UTF-8''([^;]+)/i);
9834
+ if (utf8Match?.[1]) {
9835
+ return decodeURIComponent(utf8Match[1].trim().replace(/^"|"$/g, ''));
9836
+ }
9837
+ const asciiMatch = disposition.match(/filename="?([^";]+)"?/i);
9838
+ if (asciiMatch?.[1]) {
9839
+ return asciiMatch[1].trim();
9840
+ }
9841
+ return request.fileName;
9842
+ }
9843
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisHttpCollectionExportProvider, deps: [{ token: i1.HttpClient }, { token: API_URL, optional: true }, { token: PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
9844
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisHttpCollectionExportProvider });
9845
+ }
9846
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisHttpCollectionExportProvider, decorators: [{
9847
+ type: Injectable
9848
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
9849
+ type: Optional
9850
+ }, {
9851
+ type: Inject,
9852
+ args: [API_URL]
9853
+ }] }, { type: undefined, decorators: [{
9854
+ type: Optional
9855
+ }, {
9856
+ type: Inject,
9857
+ args: [PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS]
9858
+ }] }] });
9859
+
9424
9860
  const FIELD_SELECTOR_REGISTRY_BASE = new InjectionToken('FIELD_SELECTOR_REGISTRY_BASE');
9425
9861
  const FIELD_SELECTOR_REGISTRY_OVERRIDES = new InjectionToken('FIELD_SELECTOR_REGISTRY_OVERRIDES');
9426
9862
  const FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS = new InjectionToken('FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS');
@@ -12967,6 +13403,17 @@ const STEPPER_CONFIG_EDITOR = new InjectionToken('STEPPER_CONFIG_EDITOR');
12967
13403
  const DYNAMIC_PAGE_SHELL_EDITOR = new InjectionToken('DYNAMIC_PAGE_SHELL_EDITOR');
12968
13404
  const DYNAMIC_PAGE_CONFIG_EDITOR = new InjectionToken('DYNAMIC_PAGE_CONFIG_EDITOR');
12969
13405
 
13406
+ function providePraxisHttpCollectionExportProvider(options = {}) {
13407
+ return [
13408
+ { provide: PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, useValue: options },
13409
+ PraxisHttpCollectionExportProvider,
13410
+ {
13411
+ provide: PRAXIS_COLLECTION_EXPORT_PROVIDER,
13412
+ useExisting: PraxisHttpCollectionExportProvider,
13413
+ },
13414
+ ];
13415
+ }
13416
+
12970
13417
  const RESOURCE_DISCOVERY_I18N_NAMESPACE = 'resourceDiscovery';
12971
13418
  const RESOURCE_AVAILABILITY_REASON_KEY_BY_CODE = {
12972
13419
  'resource-state-blocked': 'availability.reason.resource-state-blocked',
@@ -13256,6 +13703,99 @@ function createEmptyRichContentDocument() {
13256
13703
  };
13257
13704
  }
13258
13705
 
13706
+ function normalizeItemId(kind, value, index) {
13707
+ const candidate = typeof value === 'string' ? value.trim() : '';
13708
+ if (candidate)
13709
+ return candidate;
13710
+ return `${kind}-${index + 1}`;
13711
+ }
13712
+ function fieldItemId(fieldName, index) {
13713
+ const slug = fieldName
13714
+ .trim()
13715
+ .toLowerCase()
13716
+ .replace(/[^a-z0-9_-]+/g, '-')
13717
+ .replace(/^-+|-+$/g, '');
13718
+ return `field-${slug || 'unnamed'}-${index + 1}`;
13719
+ }
13720
+ function getLegacyFieldName(value) {
13721
+ if (typeof value === 'string') {
13722
+ const trimmed = value.trim();
13723
+ return trimmed || null;
13724
+ }
13725
+ if (value && typeof value === 'object') {
13726
+ const name = value.name;
13727
+ if (typeof name === 'string') {
13728
+ const trimmed = name.trim();
13729
+ return trimmed || null;
13730
+ }
13731
+ }
13732
+ return null;
13733
+ }
13734
+ function createFieldLayoutItem(fieldName, index = 0) {
13735
+ return {
13736
+ kind: 'field',
13737
+ id: fieldItemId(fieldName, index),
13738
+ fieldName,
13739
+ };
13740
+ }
13741
+ function isFormLayoutItem(value) {
13742
+ if (!value || typeof value !== 'object')
13743
+ return false;
13744
+ const item = value;
13745
+ if (item.kind === 'field') {
13746
+ return typeof item.fieldName === 'string';
13747
+ }
13748
+ if (item.kind === 'richContent') {
13749
+ const document = item.document;
13750
+ return !!document && typeof document === 'object';
13751
+ }
13752
+ return false;
13753
+ }
13754
+ function normalizeFormLayoutItems(column) {
13755
+ const rawItems = column?.items;
13756
+ if (Array.isArray(rawItems)) {
13757
+ return rawItems
13758
+ .map((rawItem, index) => {
13759
+ if (!isFormLayoutItem(rawItem))
13760
+ return null;
13761
+ if (rawItem.kind === 'field') {
13762
+ const fieldName = rawItem.fieldName.trim();
13763
+ if (!fieldName)
13764
+ return null;
13765
+ return {
13766
+ ...rawItem,
13767
+ id: normalizeItemId('field', rawItem.id, index),
13768
+ fieldName,
13769
+ };
13770
+ }
13771
+ return {
13772
+ ...rawItem,
13773
+ id: normalizeItemId('richContent', rawItem.id, index),
13774
+ };
13775
+ })
13776
+ .filter((item) => item !== null);
13777
+ }
13778
+ const rawFields = column?.fields;
13779
+ if (!Array.isArray(rawFields))
13780
+ return [];
13781
+ return rawFields
13782
+ .map((field, index) => {
13783
+ const fieldName = getLegacyFieldName(field);
13784
+ return fieldName ? createFieldLayoutItem(fieldName, index) : null;
13785
+ })
13786
+ .filter((item) => item !== null);
13787
+ }
13788
+ function getFormLayoutFieldNames(items) {
13789
+ if (!Array.isArray(items))
13790
+ return [];
13791
+ return items
13792
+ .filter((item) => item.kind === 'field')
13793
+ .map((item) => item.fieldName);
13794
+ }
13795
+ function getFormColumnFieldNames(column) {
13796
+ return getFormLayoutFieldNames(normalizeFormLayoutItems(column));
13797
+ }
13798
+
13259
13799
  function defaultGenerateId(kind, used) {
13260
13800
  // determinístico + compacto, evitando Math.random (facilita tests/replays)
13261
13801
  let seq = 1;
@@ -13309,12 +13849,13 @@ function ensureIds(config, options = {}) {
13309
13849
  const rowId = takeOrGenerate('row', row.id, used, keepExistingUnique, generateId);
13310
13850
  const safeColumns = (row.columns ?? []).map((col) => {
13311
13851
  const colId = takeOrGenerate('col', col.id, used, keepExistingUnique, generateId);
13312
- // garantir fields como array
13313
- const fields = Array.isArray(col.fields) ? col.fields : [];
13852
+ const items = normalizeFormLayoutItems(col);
13853
+ const fields = getFormLayoutFieldNames(items);
13314
13854
  return {
13315
13855
  ...col,
13316
13856
  id: colId,
13317
13857
  fields,
13858
+ items,
13318
13859
  };
13319
13860
  });
13320
13861
  return {
@@ -13612,7 +14153,7 @@ function getReferencedFieldMetadata(config, allFieldMetadata) {
13612
14153
  config.sections.forEach((section) => {
13613
14154
  section.rows.forEach((row) => {
13614
14155
  row.columns.forEach((column) => {
13615
- column.fields.forEach((fieldName) => {
14156
+ getFormColumnFieldNames(column).forEach((fieldName) => {
13616
14157
  referencedFieldNames.add(fieldName);
13617
14158
  });
13618
14159
  });
@@ -18717,6 +19258,16 @@ function getFieldMetadataCapabilities() {
18717
19258
  */
18718
19259
  const ENUMS = {
18719
19260
  layoutOrientation: ['vertical', 'columns'],
19261
+ canvasMode: ['grid'],
19262
+ canvasAutoRows: ['fixed', 'content'],
19263
+ canvasCollisionPolicy: ['block', 'swap'],
19264
+ groupingKind: ['section', 'tabs', 'hero', 'rail'],
19265
+ groupingLayout: ['stack', 'grid', 'row'],
19266
+ heroEmphasis: ['high', 'medium'],
19267
+ railSide: ['left', 'right'],
19268
+ deviceKind: ['desktop', 'tablet', 'mobile'],
19269
+ stateMergeStrategy: ['replace', 'merge', 'append', 'remove-keys'],
19270
+ derivedStateComputeKind: ['json-logic', 'template', 'operator', 'transformer'],
18720
19271
  shellKind: ['dashboard-card', 'none'],
18721
19272
  actionVariant: ['icon', 'text', 'outlined'],
18722
19273
  actionPlacement: ['header', 'window'],
@@ -18724,6 +19275,9 @@ const ENUMS = {
18724
19275
  const CAPS = [
18725
19276
  { path: 'page', category: 'page', valueKind: 'object', description: 'Definicao da pagina dinamica.' },
18726
19277
  { path: 'page.context', category: 'context', valueKind: 'object', description: 'Contexto compartilhado entre widgets.' },
19278
+ { path: 'page.layoutPreset', category: 'layout', valueKind: 'string', description: 'ID canonico opcional do preset estrutural da pagina.' },
19279
+ { path: 'page.layoutPresetOptions', category: 'layout', valueKind: 'object', description: 'Opcoes especificas do preset estrutural consumidas por builders e runtimes futuros.' },
19280
+ { path: 'page.themePreset', category: 'appearance', valueKind: 'string', description: 'ID opcional do preset de tema para shell, graficos, densidade e defaults visuais.' },
18727
19281
  { path: 'page.layout', category: 'layout', valueKind: 'object', description: 'Layout base da pagina.' },
18728
19282
  { path: 'page.layout.orientation', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.layoutOrientation, description: 'Orientacao do grid (vertical/columns).' },
18729
19283
  { path: 'page.layout.columns', category: 'layout', valueKind: 'number', description: 'Numero de colunas (quando orientation=columns).' },
@@ -18733,6 +19287,26 @@ const CAPS = [
18733
19287
  { path: 'page.layout.breakpoints.md', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint md.' },
18734
19288
  { path: 'page.layout.breakpoints.lg', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint lg.' },
18735
19289
  { path: 'page.layout.breakpoints.xl', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint xl.' },
19290
+ { path: 'page.canvas', category: 'layout', valueKind: 'object', description: 'Canvas espacial canonico da pagina quando houver geometria explicita.' },
19291
+ { path: 'page.canvas.mode', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.canvasMode, description: 'Modo canonico do canvas. Valor atual: grid.' },
19292
+ { path: 'page.canvas.columns', category: 'layout', valueKind: 'number', description: 'Numero de colunas do canvas espacial.' },
19293
+ { path: 'page.canvas.rowUnit', category: 'layout', valueKind: 'string', description: 'Altura base das linhas do canvas, como 80px.' },
19294
+ { path: 'page.canvas.gap', category: 'layout', valueKind: 'string', description: 'Espacamento entre itens do canvas.' },
19295
+ { path: 'page.canvas.autoRows', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.canvasAutoRows, description: 'Politica de linhas automaticas do canvas.' },
19296
+ { path: 'page.canvas.collisionPolicy', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.canvasCollisionPolicy, description: 'Politica de colisao do canvas espacial.' },
19297
+ { path: 'page.canvas.items', category: 'layout', valueKind: 'object', description: 'Mapa canonico de geometria por widget key.' },
19298
+ { path: 'page.canvas.items.<widgetKey>.col', category: 'layout', valueKind: 'number', description: 'Coluna inicial do widget no canvas.' },
19299
+ { path: 'page.canvas.items.<widgetKey>.row', category: 'layout', valueKind: 'number', description: 'Linha inicial do widget no canvas.' },
19300
+ { path: 'page.canvas.items.<widgetKey>.colSpan', category: 'layout', valueKind: 'number', description: 'Quantidade de colunas ocupadas pelo widget.' },
19301
+ { path: 'page.canvas.items.<widgetKey>.rowSpan', category: 'layout', valueKind: 'number', description: 'Quantidade de linhas ocupadas pelo widget.' },
19302
+ { path: 'page.canvas.items.<widgetKey>.zIndex', category: 'layout', valueKind: 'number', description: 'Camada opcional do item no canvas.' },
19303
+ { path: 'page.canvas.items.<widgetKey>.constraints', category: 'layout', valueKind: 'object', description: 'Restricoes opcionais de posicao e tamanho do item no canvas.' },
19304
+ { path: 'page.canvas.items.<widgetKey>.constraints.minColSpan', category: 'layout', valueKind: 'number', description: 'Span minimo de colunas permitido.' },
19305
+ { path: 'page.canvas.items.<widgetKey>.constraints.minRowSpan', category: 'layout', valueKind: 'number', description: 'Span minimo de linhas permitido.' },
19306
+ { path: 'page.canvas.items.<widgetKey>.constraints.maxColSpan', category: 'layout', valueKind: 'number', description: 'Span maximo de colunas permitido.' },
19307
+ { path: 'page.canvas.items.<widgetKey>.constraints.maxRowSpan', category: 'layout', valueKind: 'number', description: 'Span maximo de linhas permitido.' },
19308
+ { path: 'page.canvas.items.<widgetKey>.constraints.lockPosition', category: 'layout', valueKind: 'boolean', description: 'Bloqueia alteracao de posicao do item no canvas.' },
19309
+ { path: 'page.canvas.items.<widgetKey>.constraints.lockSize', category: 'layout', valueKind: 'boolean', description: 'Bloqueia alteracao de tamanho do item no canvas.' },
18736
19310
  { path: 'page.widgets', category: 'widgets', valueKind: 'array', description: 'Lista de widgets renderizados.' },
18737
19311
  { path: 'page.widgets[].key', category: 'widgets', valueKind: 'string', description: 'Identificador unico do widget.' },
18738
19312
  { path: 'page.widgets[].className', category: 'widgets', valueKind: 'string', description: 'Classe CSS opcional do widget.' },
@@ -18752,30 +19326,107 @@ const CAPS = [
18752
19326
  { path: 'page.widgets[].shell.actions[].variant', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.actionVariant, description: 'Estilo visual da acao.' },
18753
19327
  { path: 'page.widgets[].shell.actions[].placement', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.actionPlacement, description: 'Posicionamento da acao.' },
18754
19328
  { path: 'page.widgets[].shell.actions[].emit', category: 'shell', valueKind: 'string', description: 'Evento emitido ao acionar a acao.' },
19329
+ { path: 'page.state', category: 'state', valueKind: 'object', description: 'Estado declarativo opcional compartilhado por widgets e composicao.' },
19330
+ { path: 'page.state.values', category: 'state', valueKind: 'object', description: 'Valores primarios mutaveis escritos por widgets, defaults ou host.' },
19331
+ { path: 'page.state.schema', category: 'state', valueKind: 'object', description: 'Descritores dos paths primarios de estado.' },
19332
+ { path: 'page.state.schema.<token>.type', category: 'state', valueKind: 'string', description: 'Tipo semantico opcional do path de estado.' },
19333
+ { path: 'page.state.schema.<token>.initial', category: 'state', valueKind: 'object', description: 'Valor inicial usado quando page.state.values omite o path.' },
19334
+ { path: 'page.state.schema.<token>.persist', category: 'state', valueKind: 'boolean', description: 'Indica se o path primario deve ser persistido com a pagina.' },
19335
+ { path: 'page.state.schema.<token>.mergeStrategy', category: 'state', valueKind: 'enum', allowedValues: ENUMS.stateMergeStrategy, description: 'Como escritas de widget/estado combinam com o valor atual.' },
19336
+ { path: 'page.state.schema.<token>.description', category: 'state', valueKind: 'string', description: 'Descricao opcional do path para builders e catalogos AI.' },
19337
+ { path: 'page.state.schema.<token>.tags', category: 'state', valueKind: 'array', description: 'Tags opcionais para busca e governanca do estado.' },
19338
+ { path: 'page.state.derived', category: 'state', valueKind: 'object', description: 'Descritores de estado derivado recomputado pelo runtime.' },
19339
+ { path: 'page.state.derived.<token>.dependsOn', category: 'state', valueKind: 'array', description: 'Paths de estado que alimentam o valor derivado.' },
19340
+ { path: 'page.state.derived.<token>.compute', category: 'state', valueKind: 'object', description: 'Descritor de computacao do estado derivado.' },
19341
+ { path: 'page.state.derived.<token>.compute.kind', category: 'state', valueKind: 'enum', allowedValues: ENUMS.derivedStateComputeKind, description: 'Tipo de computacao do estado derivado.' },
19342
+ { path: 'page.state.derived.<token>.compute.expression', category: 'state', valueKind: 'expression', description: 'Expressao Json Logic para compute.kind=json-logic.' },
19343
+ { path: 'page.state.derived.<token>.compute.value', category: 'state', valueKind: 'object', description: 'Valor template para compute.kind=template.' },
19344
+ { path: 'page.state.derived.<token>.compute.operator', category: 'state', valueKind: 'string', description: 'Operador para compute.kind=operator.' },
19345
+ { path: 'page.state.derived.<token>.compute.options', category: 'state', valueKind: 'object', description: 'Opcoes do operador ou transformer.' },
19346
+ { path: 'page.state.derived.<token>.compute.transformerId', category: 'state', valueKind: 'string', description: 'Identificador do transformer para compute.kind=transformer.' },
19347
+ { path: 'page.state.derived.<token>.description', category: 'state', valueKind: 'string', description: 'Descricao opcional do estado derivado.' },
19348
+ { path: 'page.state.derived.<token>.cache', category: 'state', valueKind: 'boolean', description: 'Permite cache futuro do valor derivado.' },
18755
19349
  { path: 'page.composition', category: 'connections', valueKind: 'object', description: 'Envelope canonico da composicao persistida.' },
18756
19350
  { path: 'page.composition.version', category: 'connections', valueKind: 'string', description: 'Versao do envelope de composicao.' },
18757
19351
  { path: 'page.composition.links', category: 'connections', valueKind: 'array', description: 'Links canonicos entre widgets e estado.' },
18758
19352
  { path: 'page.composition.links[].id', category: 'connections', valueKind: 'string', description: 'Identificador estavel do link.' },
18759
19353
  { path: 'page.composition.links[].from', category: 'connections', valueKind: 'object', description: 'Endpoint de origem do link.' },
19354
+ { path: 'page.composition.links[].from.kind', category: 'connections', valueKind: 'string', description: 'Tipo do endpoint de origem, como component-port ou state.' },
19355
+ { path: 'page.composition.links[].from.ref', category: 'connections', valueKind: 'object', description: 'Referencia estruturada do endpoint de origem.' },
19356
+ { path: 'page.composition.links[].from.ref.widget', category: 'connections', valueKind: 'string', description: 'Widget top-level dono do endpoint de origem.' },
19357
+ { path: 'page.composition.links[].from.ref.port', category: 'connections', valueKind: 'string', description: 'Porta de origem do componente.' },
19358
+ { path: 'page.composition.links[].from.ref.direction', category: 'connections', valueKind: 'string', description: 'Direcao da porta de origem.' },
19359
+ { path: 'page.composition.links[].from.ref.nestedPath', category: 'connections', valueKind: 'array', description: 'NestedPath canonico para porta de componente filho de origem.' },
19360
+ { path: 'page.composition.links[].from.ref.nestedPath[].kind', category: 'connections', valueKind: 'string', description: 'Tipo do segmento nested de origem.' },
19361
+ { path: 'page.composition.links[].from.ref.nestedPath[].id', category: 'connections', valueKind: 'string', description: 'Identificador estrutural do segmento nested de origem.' },
19362
+ { path: 'page.composition.links[].from.ref.nestedPath[].key', category: 'connections', valueKind: 'string', description: 'Chave estavel do widget filho no segmento terminal de origem.', critical: true },
19363
+ { path: 'page.composition.links[].from.ref.nestedPath[].index', category: 'connections', valueKind: 'number', description: 'Indice auxiliar para diagnostico visual; nao use como identidade primaria.' },
19364
+ { path: 'page.composition.links[].from.ref.nestedPath[].componentType', category: 'connections', valueKind: 'string', description: 'Tipo do componente real do widget filho de origem.' },
18760
19365
  { path: 'page.composition.links[].to', category: 'connections', valueKind: 'object', description: 'Endpoint de destino do link.' },
19366
+ { path: 'page.composition.links[].to.kind', category: 'connections', valueKind: 'string', description: 'Tipo do endpoint de destino, como component-port ou state.' },
19367
+ { path: 'page.composition.links[].to.ref', category: 'connections', valueKind: 'object', description: 'Referencia estruturada do endpoint de destino.' },
19368
+ { path: 'page.composition.links[].to.ref.widget', category: 'connections', valueKind: 'string', description: 'Widget top-level dono do endpoint de destino.' },
19369
+ { path: 'page.composition.links[].to.ref.port', category: 'connections', valueKind: 'string', description: 'Porta de destino do componente.' },
19370
+ { path: 'page.composition.links[].to.ref.direction', category: 'connections', valueKind: 'string', description: 'Direcao da porta de destino.' },
19371
+ { path: 'page.composition.links[].to.ref.nestedPath', category: 'connections', valueKind: 'array', description: 'NestedPath canonico para porta de componente filho de destino.' },
19372
+ { path: 'page.composition.links[].to.ref.nestedPath[].kind', category: 'connections', valueKind: 'string', description: 'Tipo do segmento nested de destino.' },
19373
+ { path: 'page.composition.links[].to.ref.nestedPath[].id', category: 'connections', valueKind: 'string', description: 'Identificador estrutural do segmento nested de destino.' },
19374
+ { path: 'page.composition.links[].to.ref.nestedPath[].key', category: 'connections', valueKind: 'string', description: 'Chave estavel do widget filho no segmento terminal de destino.', critical: true },
19375
+ { path: 'page.composition.links[].to.ref.nestedPath[].index', category: 'connections', valueKind: 'number', description: 'Indice auxiliar para diagnostico visual; nao use como identidade primaria.' },
19376
+ { path: 'page.composition.links[].to.ref.nestedPath[].componentType', category: 'connections', valueKind: 'string', description: 'Tipo do componente real do widget filho de destino.' },
18761
19377
  { path: 'page.composition.links[].intent', category: 'connections', valueKind: 'string', description: 'Intencao semantica do link.' },
18762
19378
  { path: 'page.composition.links[].transform', category: 'connections', valueKind: 'object', description: 'Pipeline de transformacao do link.' },
18763
19379
  { path: 'page.composition.links[].condition', category: 'connections', valueKind: 'expression', description: 'Guarda semantica opcional do link, expressa como um unico AST Json Logic canonico.' },
18764
19380
  { path: 'page.composition.links[].policy', category: 'connections', valueKind: 'object', description: 'Politicas operacionais opcionais do link, como debounce, distinct e missing-value.' },
18765
19381
  { path: 'page.composition.links[].metadata', category: 'connections', valueKind: 'object', description: 'Metadados opcionais do link.' },
19382
+ { path: 'page.grouping', category: 'layout', valueKind: 'array', description: 'Modelo semantico opcional de secoes, abas, areas hero e rails.' },
19383
+ { path: 'page.grouping[].kind', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.groupingKind, description: 'Tipo do agrupamento semantico.' },
19384
+ { path: 'page.grouping[].id', category: 'layout', valueKind: 'string', description: 'Identificador estavel do agrupamento.' },
19385
+ { path: 'page.grouping[].label', category: 'layout', valueKind: 'string', description: 'Rotulo opcional do agrupamento.' },
19386
+ { path: 'page.grouping[].widgetKeys', category: 'layout', valueKind: 'array', description: 'Widgets pertencentes ao agrupamento section, hero ou rail.' },
19387
+ { path: 'page.grouping[].layout', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.groupingLayout, description: 'Layout opcional para agrupamento section.' },
19388
+ { path: 'page.grouping[].tabs', category: 'layout', valueKind: 'array', description: 'Abas do agrupamento kind=tabs.' },
19389
+ { path: 'page.grouping[].tabs[].id', category: 'layout', valueKind: 'string', description: 'Identificador estavel da aba.' },
19390
+ { path: 'page.grouping[].tabs[].label', category: 'layout', valueKind: 'string', description: 'Rotulo da aba.' },
19391
+ { path: 'page.grouping[].tabs[].widgetKeys', category: 'layout', valueKind: 'array', description: 'Widgets renderizados dentro da aba.' },
19392
+ { path: 'page.grouping[].emphasis', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.heroEmphasis, description: 'Enfase opcional para agrupamento hero.' },
19393
+ { path: 'page.grouping[].side', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.railSide, description: 'Lado do rail quando kind=rail.' },
19394
+ { path: 'page.slotAssignments', category: 'layout', valueKind: 'object', description: 'Mapa canonico de widget key para slot semantico de preset.' },
19395
+ { path: 'page.deviceLayouts', category: 'layout', valueKind: 'object', description: 'Variantes opcionais de layout por dispositivo.' },
19396
+ { path: 'page.deviceLayouts.desktop', category: 'layout', valueKind: 'object', description: 'Overrides de layout para desktop.' },
19397
+ { path: 'page.deviceLayouts.tablet', category: 'layout', valueKind: 'object', description: 'Overrides de layout para tablet.' },
19398
+ { path: 'page.deviceLayouts.mobile', category: 'layout', valueKind: 'object', description: 'Overrides de layout para mobile.' },
19399
+ { path: 'page.deviceLayouts.desktop.layout', category: 'layout', valueKind: 'object', description: 'Override de WidgetPageLayout para desktop.' },
19400
+ { path: 'page.deviceLayouts.desktop.canvas', category: 'layout', valueKind: 'object', description: 'Override de canvas para desktop.' },
19401
+ { path: 'page.deviceLayouts.desktop.groupingOverrides', category: 'layout', valueKind: 'array', description: 'Overrides de agrupamentos para desktop.' },
19402
+ { path: 'page.deviceLayouts.desktop.widgetOverrides', category: 'layout', valueKind: 'object', description: 'Overrides por widget key para desktop.' },
19403
+ { path: 'page.deviceLayouts.desktop.widgetOverrides.<widgetKey>.hidden', category: 'layout', valueKind: 'boolean', description: 'Oculta o widget em desktop.' },
19404
+ { path: 'page.deviceLayouts.tablet.layout', category: 'layout', valueKind: 'object', description: 'Override de WidgetPageLayout para tablet.' },
19405
+ { path: 'page.deviceLayouts.tablet.canvas', category: 'layout', valueKind: 'object', description: 'Override de canvas para tablet.' },
19406
+ { path: 'page.deviceLayouts.tablet.groupingOverrides', category: 'layout', valueKind: 'array', description: 'Overrides de agrupamentos para tablet.' },
19407
+ { path: 'page.deviceLayouts.tablet.widgetOverrides', category: 'layout', valueKind: 'object', description: 'Overrides por widget key para tablet.' },
19408
+ { path: 'page.deviceLayouts.tablet.widgetOverrides.<widgetKey>.hidden', category: 'layout', valueKind: 'boolean', description: 'Oculta o widget em tablet.' },
19409
+ { path: 'page.deviceLayouts.mobile.layout', category: 'layout', valueKind: 'object', description: 'Override de WidgetPageLayout para mobile.' },
19410
+ { path: 'page.deviceLayouts.mobile.canvas', category: 'layout', valueKind: 'object', description: 'Override de canvas para mobile.' },
19411
+ { path: 'page.deviceLayouts.mobile.groupingOverrides', category: 'layout', valueKind: 'array', description: 'Overrides de agrupamentos para mobile.' },
19412
+ { path: 'page.deviceLayouts.mobile.widgetOverrides', category: 'layout', valueKind: 'object', description: 'Overrides por widget key para mobile.' },
19413
+ { path: 'page.deviceLayouts.mobile.widgetOverrides.<widgetKey>.hidden', category: 'layout', valueKind: 'boolean', description: 'Oculta o widget em mobile.' },
18766
19414
  ];
18767
19415
  const DYNAMIC_PAGE_AI_CAPABILITIES = {
18768
- version: 'v1.0',
19416
+ version: 'v1.1',
18769
19417
  enums: ENUMS,
18770
19418
  targets: ['praxis-dynamic-page'],
18771
19419
  notes: [
18772
- 'Este catalogo e especifico para o componente praxis-dynamic-page.',
18773
- 'Widgets e page.composition.links sao arrays; o adapter faz merge por key estavel.',
19420
+ 'Este catalogo e especifico para o runtime praxis-dynamic-page; operacoes de authoring/mutacao pertencem ao manifesto do praxis-page-builder.',
19421
+ 'WidgetPageDefinition e o contrato canonico persistido: widgets, composition.links, state, context, layout, canvas, presets, grouping, slotAssignments, deviceLayouts e themePreset.',
19422
+ 'Widgets e page.composition.links sao arrays; ferramentas de patch legadas fazem merge por key estavel e id estavel.',
19423
+ 'page.canvas.items e um mapa por widget key; nao modele canvas.items como array.',
18774
19424
  'Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; nao trate ambos como a mesma "expression".',
18775
19425
  'Para remocao/replace, use flags {_remove:true} ou {_replace:true} no item.',
18776
19426
  'Para renomear um link, inclua {_beforeKey:"link-id-anterior"} no item.',
18777
19427
  'Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmacao.',
18778
19428
  'Use ids estaveis para links e keys estaveis para widgets.',
19429
+ 'Nested component ports usam endpoint component-port com nestedPath; o owner em ref.widget continua sendo o widget top-level.',
18779
19430
  'Objetivo: compor widgets e relacionamentos canonicos (ex.: master-detail).',
18780
19431
  'Link tipico de master-detail: component-port(table.rowClick) -> component-port(form.resourceId) com transform map payload.row.id.',
18781
19432
  ],
@@ -18792,6 +19443,75 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
18792
19443
  { value: 'columns', label: 'Colunas' },
18793
19444
  ],
18794
19445
  },
19446
+ 'page.canvas.mode': {
19447
+ mode: 'enum',
19448
+ options: [
19449
+ { value: 'grid', label: 'Grid' },
19450
+ ],
19451
+ },
19452
+ 'page.canvas.autoRows': {
19453
+ mode: 'enum',
19454
+ options: [
19455
+ { value: 'fixed', label: 'Linhas fixas' },
19456
+ { value: 'content', label: 'Conteudo' },
19457
+ ],
19458
+ },
19459
+ 'page.canvas.collisionPolicy': {
19460
+ mode: 'enum',
19461
+ options: [
19462
+ { value: 'block', label: 'Bloquear colisao' },
19463
+ { value: 'swap', label: 'Trocar posicao' },
19464
+ ],
19465
+ },
19466
+ 'page.grouping[].kind': {
19467
+ mode: 'enum',
19468
+ options: [
19469
+ { value: 'section', label: 'Secao' },
19470
+ { value: 'tabs', label: 'Abas' },
19471
+ { value: 'hero', label: 'Hero' },
19472
+ { value: 'rail', label: 'Rail' },
19473
+ ],
19474
+ },
19475
+ 'page.grouping[].layout': {
19476
+ mode: 'enum',
19477
+ options: [
19478
+ { value: 'stack', label: 'Empilhado' },
19479
+ { value: 'grid', label: 'Grid' },
19480
+ { value: 'row', label: 'Linha' },
19481
+ ],
19482
+ },
19483
+ 'page.grouping[].emphasis': {
19484
+ mode: 'enum',
19485
+ options: [
19486
+ { value: 'high', label: 'Alta' },
19487
+ { value: 'medium', label: 'Media' },
19488
+ ],
19489
+ },
19490
+ 'page.grouping[].side': {
19491
+ mode: 'enum',
19492
+ options: [
19493
+ { value: 'left', label: 'Esquerda' },
19494
+ { value: 'right', label: 'Direita' },
19495
+ ],
19496
+ },
19497
+ 'page.state.schema.<token>.mergeStrategy': {
19498
+ mode: 'enum',
19499
+ options: [
19500
+ { value: 'replace', label: 'Substituir' },
19501
+ { value: 'merge', label: 'Mesclar' },
19502
+ { value: 'append', label: 'Acrescentar' },
19503
+ { value: 'remove-keys', label: 'Remover chaves' },
19504
+ ],
19505
+ },
19506
+ 'page.state.derived.<token>.compute.kind': {
19507
+ mode: 'enum',
19508
+ options: [
19509
+ { value: 'json-logic', label: 'Json Logic' },
19510
+ { value: 'template', label: 'Template' },
19511
+ { value: 'operator', label: 'Operador' },
19512
+ { value: 'transformer', label: 'Transformer' },
19513
+ ],
19514
+ },
18795
19515
  'page.widgets[].shell.kind': {
18796
19516
  mode: 'enum',
18797
19517
  options: [
@@ -19336,7 +20056,10 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
19336
20056
  'page.composition.links[]': ['id'],
19337
20057
  },
19338
20058
  hints: [
19339
- 'praxis-dynamic-page e um host de composicao: cria widgets, conecta ports canonicos e mantem relacoes em page.composition.links.',
20059
+ 'praxis-dynamic-page e runtime de composicao: consome WidgetPageDefinition, renderiza widgets e mantem relacoes em page.composition.links.',
20060
+ 'Mutacoes agentic de pagina pertencem ao manifesto do praxis-page-builder; use este context pack como descoberta/runtime guidance.',
20061
+ 'WidgetPageDefinition inclui widgets, composition.links, state, context, layout, canvas, layoutPreset, layoutPresetOptions, grouping, slotAssignments, deviceLayouts e themePreset.',
20062
+ 'page.canvas.items e um mapa por widget key, nao um array; cada entrada guarda col, row, colSpan, rowSpan, zIndex e constraints opcionais.',
19340
20063
  'Widgets e composition.links sao arrays; o patching deve fazer merge por key (widgets) e por id (links).',
19341
20064
  'Preferir mudancas incrementais: alterar/estender em vez de substituir toda a pagina.',
19342
20065
  'Para remover um item, envie {_remove: true} junto ao widget/link.',
@@ -28983,4 +29706,4 @@ function provideHookWhitelist(allowed) {
28983
29706
  * Generated bundle index. Do not edit.
28984
29707
  */
28985
29708
 
28986
- export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, 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, 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_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, 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_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisLayerScaleCss, buildSchemaId, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isGlobalActionRef, isInlineFilterControlType, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormMetadata, normalizeGlobalActionRef, normalizePath, normalizePraxisDataQueryContext, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisDynamicPageMetadata, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveValuePresentation, resolveValuePresentationLocale, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withMessage, withPraxisHttpLoading };
29709
+ export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, 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, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_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_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisLayerScaleCss, buildSchemaId, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef, normalizePath, normalizePraxisDataQueryContext, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveValuePresentation, resolveValuePresentationLocale, serializePraxisCollectionToCsv, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withMessage, withPraxisHttpLoading };