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

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.
@@ -127,6 +127,25 @@ function buildSchemaId(params) {
127
127
  parts.push(`origin:${params.apiOrigin}`);
128
128
  return parts.join('|');
129
129
  }
130
+ /**
131
+ * Produces a deterministic, storage-safe segment for places that impose short
132
+ * identifier limits. This must not replace the semantic schemaId stored in
133
+ * payloads or metadata.
134
+ */
135
+ function buildSchemaIdStorageKeySegment(schemaId) {
136
+ const normalized = String(schemaId || '').trim();
137
+ if (!normalized)
138
+ return '';
139
+ return `schema-${fnv1a32Base36(normalized)}-${normalized.length.toString(36)}`;
140
+ }
141
+ function fnv1a32Base36(value) {
142
+ let hash = 0x811c9dc5;
143
+ for (let i = 0; i < value.length; i++) {
144
+ hash ^= value.charCodeAt(i);
145
+ hash = Math.imul(hash, 0x01000193) >>> 0;
146
+ }
147
+ return hash.toString(36).padStart(7, '0');
148
+ }
130
149
 
131
150
  function hash(input) {
132
151
  let h = 0;
@@ -5351,6 +5370,26 @@ class SurfaceBindingRuntimeService {
5351
5370
  }
5352
5371
  return resolvedWidget;
5353
5372
  }
5373
+ resolveSurfacePayload(surfacePayload, actionContext, explicitContext) {
5374
+ const context = this.buildContext(surfacePayload, actionContext, explicitContext);
5375
+ let resolvedPayload = this.resolveTemplate(this.clone(surfacePayload), context);
5376
+ for (const binding of surfacePayload.bindings || []) {
5377
+ const rawTargetPath = String(binding?.to || '').trim();
5378
+ if (!rawTargetPath)
5379
+ continue;
5380
+ const value = this.resolveBindingValue(binding, context);
5381
+ if (rawTargetPath.startsWith('widget.')) {
5382
+ resolvedPayload = {
5383
+ ...resolvedPayload,
5384
+ widget: this.setValueAtPath(resolvedPayload.widget, this.normalizeWidgetTargetPath(rawTargetPath), value),
5385
+ };
5386
+ }
5387
+ else {
5388
+ resolvedPayload = this.setValueAtPath(resolvedPayload, rawTargetPath, value);
5389
+ }
5390
+ }
5391
+ return resolvedPayload;
5392
+ }
5354
5393
  extractByPath(obj, path) {
5355
5394
  if (!path)
5356
5395
  return obj;
@@ -5442,6 +5481,9 @@ class SurfaceBindingRuntimeService {
5442
5481
  return '';
5443
5482
  return path.startsWith('widget.') ? path.slice('widget.'.length) : path;
5444
5483
  }
5484
+ normalizeWidgetTargetPath(rawPath) {
5485
+ return this.normalizeTargetPath(rawPath);
5486
+ }
5445
5487
  tokenizePath(path) {
5446
5488
  const tokens = [];
5447
5489
  let buffer = '';
@@ -5925,9 +5967,14 @@ class GlobalActionService {
5925
5967
  const payload = normalized.payloadExpr
5926
5968
  ? this.resolvePayloadExpr(normalized.payloadExpr, context)
5927
5969
  : normalized.payload;
5970
+ const contextPayload = normalized.payloadExpr
5971
+ ? payload
5972
+ : (context && Object.prototype.hasOwnProperty.call(context, 'payload')
5973
+ ? context.payload
5974
+ : payload);
5928
5975
  return this.execute(normalized.actionId, payload, {
5929
5976
  ...context,
5930
- payload,
5977
+ payload: contextPayload,
5931
5978
  meta: {
5932
5979
  ...(context?.meta || {}),
5933
5980
  ...(normalized.meta ? { actionRef: normalized.meta } : {}),
@@ -6029,8 +6076,8 @@ class GlobalActionService {
6029
6076
  if (!surfacePayload?.widget?.id) {
6030
6077
  return { success: false, error: 'surface.open requires widget.id' };
6031
6078
  }
6032
- const resolvedWidget = this.surfaceBindingRuntime.resolveWidget(surfacePayload.widget, surfacePayload.bindings, surfacePayload, context, surfacePayload.context);
6033
- const data = await this.surface.open({ ...surfacePayload, widget: resolvedWidget }, context);
6079
+ const resolvedPayload = this.surfaceBindingRuntime.resolveSurfacePayload(surfacePayload, context, surfacePayload.context);
6080
+ const data = await this.surface.open(resolvedPayload, context);
6034
6081
  return { success: true, data };
6035
6082
  });
6036
6083
  this.register('toast.success', async (payload) => {
@@ -7447,7 +7494,10 @@ const DEFAULT_JSON_LOGIC_OPERATORS = [
7447
7494
  if (!parsed || !Array.isArray(rawDays)) {
7448
7495
  return false;
7449
7496
  }
7450
- const normalized = rawDays.map((item) => Number(item)).filter(Number.isFinite);
7497
+ const normalized = rawDays
7498
+ .map((item) => Number(item))
7499
+ .filter(Number.isFinite)
7500
+ .map((item) => item === 0 ? 7 : item);
7451
7501
  if (!normalized.length) {
7452
7502
  return false;
7453
7503
  }
@@ -9421,6 +9471,439 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
9421
9471
  args: [{ providedIn: 'root' }]
9422
9472
  }] });
9423
9473
 
9474
+ const PRAXIS_EXPORT_FORMULA_PREFIXES = ['=', '+', '-', '@', '\t', '\r'];
9475
+ const PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY = {
9476
+ escapeFormulaValues: true,
9477
+ formulaPrefixes: PRAXIS_EXPORT_FORMULA_PREFIXES,
9478
+ formulaEscapePrefix: "'",
9479
+ };
9480
+ function resolvePraxisExportScope(request) {
9481
+ if (request.scope !== 'auto') {
9482
+ return request.scope;
9483
+ }
9484
+ const selection = request.selection;
9485
+ const hasSelectedItems = !!selection?.selectedItems?.length;
9486
+ const hasSelectedKeys = !!selection?.selectedKeys?.length;
9487
+ const hasAllMatchingSelection = selection?.allMatchingSelected === true;
9488
+ if (hasSelectedItems || hasSelectedKeys || hasAllMatchingSelection) {
9489
+ return 'selected';
9490
+ }
9491
+ return request.filters || request.query ? 'filtered' : 'currentPage';
9492
+ }
9493
+ function resolvePraxisCollectionExportItems(request) {
9494
+ const scope = resolvePraxisExportScope(request);
9495
+ const loadedItems = request.loadedItems ?? [];
9496
+ if (scope === 'selected') {
9497
+ const selectedItems = request.selection?.selectedItems;
9498
+ if (selectedItems?.length) {
9499
+ return selectedItems;
9500
+ }
9501
+ const keyField = request.selection?.keyField;
9502
+ const selectedKeys = request.selection?.selectedKeys;
9503
+ if (!keyField || !selectedKeys?.length) {
9504
+ return [];
9505
+ }
9506
+ const selectedKeySet = new Set(selectedKeys);
9507
+ return loadedItems.filter((item) => selectedKeySet.has(readPraxisExportValue(item, keyField)));
9508
+ }
9509
+ return loadedItems;
9510
+ }
9511
+ function resolvePraxisExportFields(request) {
9512
+ const configuredFields = request.fields?.filter((field) => field.exportable !== false && field.visible !== false);
9513
+ if (configuredFields?.length) {
9514
+ return configuredFields;
9515
+ }
9516
+ const sample = resolvePraxisCollectionExportItems(request)[0];
9517
+ if (!sample || typeof sample !== 'object') {
9518
+ return [];
9519
+ }
9520
+ return Object.keys(sample).map((key) => ({
9521
+ key,
9522
+ label: key,
9523
+ valuePath: key,
9524
+ }));
9525
+ }
9526
+ function readPraxisExportValue(item, path) {
9527
+ if (!item || !path) {
9528
+ return undefined;
9529
+ }
9530
+ return path.split('.').reduce((value, segment) => {
9531
+ if (!value || typeof value !== 'object') {
9532
+ return undefined;
9533
+ }
9534
+ return value[segment];
9535
+ }, item);
9536
+ }
9537
+ function escapePraxisExportCell(value, policy = PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY) {
9538
+ if (value === null || value === undefined) {
9539
+ return '';
9540
+ }
9541
+ const text = value instanceof Date ? value.toISOString() : String(value);
9542
+ if (!policy.escapeFormulaValues || !text) {
9543
+ return text;
9544
+ }
9545
+ return startsWithPraxisFormula(text, policy.formulaPrefixes)
9546
+ ? `${policy.formulaEscapePrefix}${text}`
9547
+ : text;
9548
+ }
9549
+ function serializePraxisCollectionToCsv(request, policy = PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY) {
9550
+ const fields = resolvePraxisExportFields(request);
9551
+ const items = resolvePraxisCollectionExportItems(request);
9552
+ const rows = [];
9553
+ if (request.includeHeaders !== false) {
9554
+ rows.push(fields.map((field) => quoteCsvCell(field.label ?? field.key)).join(','));
9555
+ }
9556
+ for (const item of applyPraxisExportLimit(items, request.maxRows)) {
9557
+ const cells = fields.map((field) => {
9558
+ const rawValue = field.valueGetter
9559
+ ? field.valueGetter(item)
9560
+ : readPraxisExportValue(item, field.valuePath ?? field.key);
9561
+ const formattedValue = request.applyFormatting !== false && field.formatter
9562
+ ? field.formatter(rawValue, item)
9563
+ : rawValue;
9564
+ return quoteCsvCell(escapePraxisExportCell(formattedValue, policy));
9565
+ });
9566
+ rows.push(cells.join(','));
9567
+ }
9568
+ return rows.join('\r\n');
9569
+ }
9570
+ function serializePraxisCollectionToJson(request) {
9571
+ const fields = resolvePraxisExportFields(request);
9572
+ const items = applyPraxisExportLimit(resolvePraxisCollectionExportItems(request), request.maxRows);
9573
+ const rows = items.map((item) => fields.reduce((row, field) => {
9574
+ const rawValue = field.valueGetter
9575
+ ? field.valueGetter(item)
9576
+ : readPraxisExportValue(item, field.valuePath ?? field.key);
9577
+ row[field.key] = request.applyFormatting !== false && field.formatter
9578
+ ? field.formatter(rawValue, item)
9579
+ : rawValue;
9580
+ return row;
9581
+ }, {}));
9582
+ return JSON.stringify(rows, null, 2);
9583
+ }
9584
+ function hasPraxisCollectionExportArtifact(result) {
9585
+ if (!result) {
9586
+ return false;
9587
+ }
9588
+ if (result.status === 'deferred') {
9589
+ return true;
9590
+ }
9591
+ if (typeof result.downloadUrl === 'string' && result.downloadUrl.trim()) {
9592
+ return true;
9593
+ }
9594
+ return result.content !== undefined && result.content !== null;
9595
+ }
9596
+ function assertPraxisCollectionExportArtifact(result) {
9597
+ if (!hasPraxisCollectionExportArtifact(result)) {
9598
+ throw new Error('Collection export completed without content, downloadUrl, or deferred status.');
9599
+ }
9600
+ }
9601
+ function applyPraxisExportLimit(items, maxRows) {
9602
+ if (!maxRows || maxRows <= 0 || items.length <= maxRows) {
9603
+ return items;
9604
+ }
9605
+ return items.slice(0, maxRows);
9606
+ }
9607
+ function quoteCsvCell(value) {
9608
+ return `"${value.replace(/"/g, '""')}"`;
9609
+ }
9610
+ function startsWithPraxisFormula(text, formulaPrefixes) {
9611
+ let index = 0;
9612
+ while (index < text.length && /\s/.test(text.charAt(index))) {
9613
+ index += 1;
9614
+ }
9615
+ if (index >= text.length) {
9616
+ return false;
9617
+ }
9618
+ const candidate = text.slice(index);
9619
+ return formulaPrefixes.some((prefix) => candidate.startsWith(prefix));
9620
+ }
9621
+
9622
+ const PRAXIS_COLLECTION_EXPORT_PROVIDER = new InjectionToken('PRAXIS_COLLECTION_EXPORT_PROVIDER');
9623
+ const PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS = new InjectionToken('PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS', {
9624
+ providedIn: 'root',
9625
+ factory: () => ({}),
9626
+ });
9627
+ const PRAXIS_EXPORT_SECURITY_POLICY = new InjectionToken('PRAXIS_EXPORT_SECURITY_POLICY', {
9628
+ providedIn: 'root',
9629
+ factory: () => PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY,
9630
+ });
9631
+ function providePraxisCollectionExportProvider(provider) {
9632
+ return {
9633
+ provide: PRAXIS_COLLECTION_EXPORT_PROVIDER,
9634
+ useValue: provider,
9635
+ };
9636
+ }
9637
+
9638
+ class PraxisCollectionExportService {
9639
+ provider;
9640
+ securityPolicy;
9641
+ constructor(provider, securityPolicy) {
9642
+ this.provider = provider;
9643
+ this.securityPolicy = securityPolicy;
9644
+ }
9645
+ async exportCollection(request) {
9646
+ if (this.provider) {
9647
+ return this.provider.exportCollection(request);
9648
+ }
9649
+ return this.exportLocalCollection(request);
9650
+ }
9651
+ exportLocalCollection(request) {
9652
+ const scope = resolvePraxisExportScope(request);
9653
+ const requiresRemoteProvider = !!request.resourcePath && (scope === 'filtered' || scope === 'all');
9654
+ if (requiresRemoteProvider) {
9655
+ throw new Error(`PraxisCollectionExportService requires a collection export provider for remote "${scope}" exports.`);
9656
+ }
9657
+ const items = resolvePraxisCollectionExportItems(request);
9658
+ const rowCount = request.maxRows && request.maxRows > 0
9659
+ ? Math.min(items.length, request.maxRows)
9660
+ : items.length;
9661
+ if (request.format === 'csv') {
9662
+ return {
9663
+ status: 'completed',
9664
+ format: request.format,
9665
+ scope,
9666
+ fileName: request.fileName,
9667
+ mimeType: 'text/csv;charset=utf-8',
9668
+ content: serializePraxisCollectionToCsv(request, this.securityPolicy),
9669
+ rowCount,
9670
+ };
9671
+ }
9672
+ if (request.format === 'json') {
9673
+ return {
9674
+ status: 'completed',
9675
+ format: request.format,
9676
+ scope,
9677
+ fileName: request.fileName,
9678
+ mimeType: 'application/json;charset=utf-8',
9679
+ content: serializePraxisCollectionToJson(request),
9680
+ rowCount,
9681
+ };
9682
+ }
9683
+ throw new Error(`PraxisCollectionExportService requires a collection export provider for "${request.format}" exports.`);
9684
+ }
9685
+ 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 });
9686
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisCollectionExportService, providedIn: 'root' });
9687
+ }
9688
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisCollectionExportService, decorators: [{
9689
+ type: Injectable,
9690
+ args: [{
9691
+ providedIn: 'root',
9692
+ }]
9693
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
9694
+ type: Optional
9695
+ }, {
9696
+ type: Inject,
9697
+ args: [PRAXIS_COLLECTION_EXPORT_PROVIDER]
9698
+ }] }, { type: undefined, decorators: [{
9699
+ type: Inject,
9700
+ args: [PRAXIS_EXPORT_SECURITY_POLICY]
9701
+ }] }] });
9702
+
9703
+ class PraxisHttpCollectionExportProvider {
9704
+ http;
9705
+ apiUrlConfig;
9706
+ options;
9707
+ constructor(http, apiUrlConfig, options) {
9708
+ this.http = http;
9709
+ this.apiUrlConfig = apiUrlConfig;
9710
+ this.options = options;
9711
+ }
9712
+ async exportCollection(request) {
9713
+ const url = this.resolveEndpoint(request);
9714
+ const body = this.buildRequestBody(request);
9715
+ const response = await firstValueFrom(this.http.post(url, body, {
9716
+ headers: this.buildHeaders(),
9717
+ observe: 'response',
9718
+ responseType: 'blob',
9719
+ withCredentials: this.options?.withCredentials,
9720
+ }));
9721
+ return this.normalizeResponse(response, request);
9722
+ }
9723
+ resolveEndpoint(request) {
9724
+ const configuredEndpoint = this.options?.endpoint;
9725
+ if (typeof configuredEndpoint === 'function') {
9726
+ return this.resolveUrl(configuredEndpoint(request));
9727
+ }
9728
+ if (configuredEndpoint) {
9729
+ return this.resolveUrl(configuredEndpoint);
9730
+ }
9731
+ const resourcePath = request.resourcePath?.trim();
9732
+ if (!resourcePath) {
9733
+ throw new Error('PraxisHttpCollectionExportProvider requires request.resourcePath or an explicit endpoint option.');
9734
+ }
9735
+ return this.resolveUrl(`${resourcePath.replace(/\/+$/, '')}/export`);
9736
+ }
9737
+ resolveUrl(pathOrUrl) {
9738
+ const value = pathOrUrl.trim();
9739
+ if (/^https?:\/\//i.test(value)) {
9740
+ return value;
9741
+ }
9742
+ const base = this.resolveApiBaseUrl();
9743
+ const path = this.normalizePathForBase(value, base);
9744
+ return base ? `${base}/${path}` : `/${path}`;
9745
+ }
9746
+ normalizePathForBase(pathOrUrl, base) {
9747
+ const path = pathOrUrl.replace(/^\/+/, '');
9748
+ const baseLastSegment = base
9749
+ .replace(/\/+$/, '')
9750
+ .split('/')
9751
+ .filter(Boolean)
9752
+ .pop();
9753
+ if (baseLastSegment && path === baseLastSegment) {
9754
+ return '';
9755
+ }
9756
+ const duplicatedPrefix = baseLastSegment ? `${baseLastSegment}/` : '';
9757
+ return duplicatedPrefix && path.startsWith(duplicatedPrefix)
9758
+ ? path.slice(duplicatedPrefix.length)
9759
+ : path;
9760
+ }
9761
+ resolveApiBaseUrl() {
9762
+ const key = this.options?.apiUrlKey || 'default';
9763
+ const entry = this.apiUrlConfig?.[key] || this.apiUrlConfig?.['default'];
9764
+ return buildApiUrl(entry || {}).replace(/\/+$/, '');
9765
+ }
9766
+ buildHeaders() {
9767
+ const key = this.options?.apiUrlKey || 'default';
9768
+ const entry = this.apiUrlConfig?.[key] || this.apiUrlConfig?.['default'];
9769
+ let headers = buildHeaders(entry || {});
9770
+ for (const [name, value] of Object.entries(this.options?.headers || {})) {
9771
+ headers = (headers || new HttpHeaders()).set(name, value);
9772
+ }
9773
+ return headers;
9774
+ }
9775
+ buildRequestBody(request) {
9776
+ const effectiveScope = resolvePraxisExportScope(request);
9777
+ const includeLoadedItems = this.options?.includeLoadedItems === true ||
9778
+ !request.resourcePath ||
9779
+ effectiveScope === 'currentPage' ||
9780
+ effectiveScope === 'selected';
9781
+ return {
9782
+ ...request,
9783
+ scope: effectiveScope,
9784
+ loadedItems: includeLoadedItems ? request.loadedItems : undefined,
9785
+ metadata: {
9786
+ ...request.metadata,
9787
+ configuredScope: request.scope,
9788
+ effectiveScope,
9789
+ },
9790
+ };
9791
+ }
9792
+ async normalizeResponse(response, request) {
9793
+ const blob = response.body || new Blob();
9794
+ const contentType = response.headers.get('content-type') || blob.type || undefined;
9795
+ if (contentType?.includes('application/json')) {
9796
+ const text = await blob.text();
9797
+ const parsed = JSON.parse(text || '{}');
9798
+ const exportHeaders = this.normalizeExportHeaders(response);
9799
+ return {
9800
+ ...parsed,
9801
+ format: parsed.format || request.format,
9802
+ scope: parsed.scope || resolvePraxisExportScope(request),
9803
+ fileName: parsed.fileName || this.resolveFileName(response, request),
9804
+ rowCount: parsed.rowCount ?? exportHeaders.rowCount,
9805
+ warnings: this.mergeWarnings(parsed.warnings, exportHeaders.warnings),
9806
+ metadata: {
9807
+ ...exportHeaders.metadata,
9808
+ ...parsed.metadata,
9809
+ },
9810
+ };
9811
+ }
9812
+ const exportHeaders = this.normalizeExportHeaders(response);
9813
+ return {
9814
+ status: 'completed',
9815
+ format: request.format,
9816
+ scope: resolvePraxisExportScope(request),
9817
+ fileName: this.resolveFileName(response, request),
9818
+ mimeType: contentType,
9819
+ content: blob,
9820
+ rowCount: exportHeaders.rowCount,
9821
+ warnings: exportHeaders.warnings,
9822
+ metadata: {
9823
+ httpStatus: response.status,
9824
+ ...exportHeaders.metadata,
9825
+ },
9826
+ };
9827
+ }
9828
+ normalizeExportHeaders(response) {
9829
+ const rowCount = this.readNumberHeader(response, 'X-Export-Row-Count');
9830
+ const truncated = this.readBooleanHeader(response, 'X-Export-Truncated');
9831
+ const maxRows = this.readNumberHeader(response, 'X-Export-Max-Rows');
9832
+ const candidateRows = this.readNumberHeader(response, 'X-Export-Candidate-Row-Count');
9833
+ const warnings = this.readWarningHeader(response);
9834
+ const metadata = {};
9835
+ if (truncated !== undefined) {
9836
+ metadata['truncated'] = truncated;
9837
+ }
9838
+ if (maxRows !== undefined) {
9839
+ metadata['maxRows'] = maxRows;
9840
+ }
9841
+ if (candidateRows !== undefined) {
9842
+ metadata['candidateRows'] = candidateRows;
9843
+ }
9844
+ return { rowCount, warnings, metadata };
9845
+ }
9846
+ readNumberHeader(response, headerName) {
9847
+ const value = response.headers.get(headerName);
9848
+ if (!value) {
9849
+ return undefined;
9850
+ }
9851
+ const parsed = Number(value);
9852
+ return Number.isFinite(parsed) ? parsed : undefined;
9853
+ }
9854
+ readBooleanHeader(response, headerName) {
9855
+ const value = response.headers.get(headerName);
9856
+ if (value === null) {
9857
+ return undefined;
9858
+ }
9859
+ return value.toLowerCase() === 'true';
9860
+ }
9861
+ readWarningHeader(response) {
9862
+ const value = response.headers.get('X-Export-Warnings');
9863
+ if (!value) {
9864
+ return [];
9865
+ }
9866
+ return value
9867
+ .split('|')
9868
+ .map((warning) => warning.trim())
9869
+ .filter(Boolean);
9870
+ }
9871
+ mergeWarnings(parsedWarnings, headerWarnings) {
9872
+ const warnings = [
9873
+ ...(parsedWarnings || []),
9874
+ ...headerWarnings,
9875
+ ];
9876
+ return warnings.length ? warnings : undefined;
9877
+ }
9878
+ resolveFileName(response, request) {
9879
+ const disposition = response.headers.get('content-disposition') || '';
9880
+ const utf8Match = disposition.match(/filename\*=UTF-8''([^;]+)/i);
9881
+ if (utf8Match?.[1]) {
9882
+ return decodeURIComponent(utf8Match[1].trim().replace(/^"|"$/g, ''));
9883
+ }
9884
+ const asciiMatch = disposition.match(/filename="?([^";]+)"?/i);
9885
+ if (asciiMatch?.[1]) {
9886
+ return asciiMatch[1].trim();
9887
+ }
9888
+ return request.fileName;
9889
+ }
9890
+ 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 });
9891
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisHttpCollectionExportProvider });
9892
+ }
9893
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisHttpCollectionExportProvider, decorators: [{
9894
+ type: Injectable
9895
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
9896
+ type: Optional
9897
+ }, {
9898
+ type: Inject,
9899
+ args: [API_URL]
9900
+ }] }, { type: undefined, decorators: [{
9901
+ type: Optional
9902
+ }, {
9903
+ type: Inject,
9904
+ args: [PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS]
9905
+ }] }] });
9906
+
9424
9907
  const FIELD_SELECTOR_REGISTRY_BASE = new InjectionToken('FIELD_SELECTOR_REGISTRY_BASE');
9425
9908
  const FIELD_SELECTOR_REGISTRY_OVERRIDES = new InjectionToken('FIELD_SELECTOR_REGISTRY_OVERRIDES');
9426
9909
  const FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS = new InjectionToken('FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS');
@@ -12967,6 +13450,17 @@ const STEPPER_CONFIG_EDITOR = new InjectionToken('STEPPER_CONFIG_EDITOR');
12967
13450
  const DYNAMIC_PAGE_SHELL_EDITOR = new InjectionToken('DYNAMIC_PAGE_SHELL_EDITOR');
12968
13451
  const DYNAMIC_PAGE_CONFIG_EDITOR = new InjectionToken('DYNAMIC_PAGE_CONFIG_EDITOR');
12969
13452
 
13453
+ function providePraxisHttpCollectionExportProvider(options = {}) {
13454
+ return [
13455
+ { provide: PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, useValue: options },
13456
+ PraxisHttpCollectionExportProvider,
13457
+ {
13458
+ provide: PRAXIS_COLLECTION_EXPORT_PROVIDER,
13459
+ useExisting: PraxisHttpCollectionExportProvider,
13460
+ },
13461
+ ];
13462
+ }
13463
+
12970
13464
  const RESOURCE_DISCOVERY_I18N_NAMESPACE = 'resourceDiscovery';
12971
13465
  const RESOURCE_AVAILABILITY_REASON_KEY_BY_CODE = {
12972
13466
  'resource-state-blocked': 'availability.reason.resource-state-blocked',
@@ -13256,6 +13750,99 @@ function createEmptyRichContentDocument() {
13256
13750
  };
13257
13751
  }
13258
13752
 
13753
+ function normalizeItemId(kind, value, index) {
13754
+ const candidate = typeof value === 'string' ? value.trim() : '';
13755
+ if (candidate)
13756
+ return candidate;
13757
+ return `${kind}-${index + 1}`;
13758
+ }
13759
+ function fieldItemId(fieldName, index) {
13760
+ const slug = fieldName
13761
+ .trim()
13762
+ .toLowerCase()
13763
+ .replace(/[^a-z0-9_-]+/g, '-')
13764
+ .replace(/^-+|-+$/g, '');
13765
+ return `field-${slug || 'unnamed'}-${index + 1}`;
13766
+ }
13767
+ function getLegacyFieldName(value) {
13768
+ if (typeof value === 'string') {
13769
+ const trimmed = value.trim();
13770
+ return trimmed || null;
13771
+ }
13772
+ if (value && typeof value === 'object') {
13773
+ const name = value.name;
13774
+ if (typeof name === 'string') {
13775
+ const trimmed = name.trim();
13776
+ return trimmed || null;
13777
+ }
13778
+ }
13779
+ return null;
13780
+ }
13781
+ function createFieldLayoutItem(fieldName, index = 0) {
13782
+ return {
13783
+ kind: 'field',
13784
+ id: fieldItemId(fieldName, index),
13785
+ fieldName,
13786
+ };
13787
+ }
13788
+ function isFormLayoutItem(value) {
13789
+ if (!value || typeof value !== 'object')
13790
+ return false;
13791
+ const item = value;
13792
+ if (item.kind === 'field') {
13793
+ return typeof item.fieldName === 'string';
13794
+ }
13795
+ if (item.kind === 'richContent') {
13796
+ const document = item.document;
13797
+ return !!document && typeof document === 'object';
13798
+ }
13799
+ return false;
13800
+ }
13801
+ function normalizeFormLayoutItems(column) {
13802
+ const rawItems = column?.items;
13803
+ if (Array.isArray(rawItems)) {
13804
+ return rawItems
13805
+ .map((rawItem, index) => {
13806
+ if (!isFormLayoutItem(rawItem))
13807
+ return null;
13808
+ if (rawItem.kind === 'field') {
13809
+ const fieldName = rawItem.fieldName.trim();
13810
+ if (!fieldName)
13811
+ return null;
13812
+ return {
13813
+ ...rawItem,
13814
+ id: normalizeItemId('field', rawItem.id, index),
13815
+ fieldName,
13816
+ };
13817
+ }
13818
+ return {
13819
+ ...rawItem,
13820
+ id: normalizeItemId('richContent', rawItem.id, index),
13821
+ };
13822
+ })
13823
+ .filter((item) => item !== null);
13824
+ }
13825
+ const rawFields = column?.fields;
13826
+ if (!Array.isArray(rawFields))
13827
+ return [];
13828
+ return rawFields
13829
+ .map((field, index) => {
13830
+ const fieldName = getLegacyFieldName(field);
13831
+ return fieldName ? createFieldLayoutItem(fieldName, index) : null;
13832
+ })
13833
+ .filter((item) => item !== null);
13834
+ }
13835
+ function getFormLayoutFieldNames(items) {
13836
+ if (!Array.isArray(items))
13837
+ return [];
13838
+ return items
13839
+ .filter((item) => item.kind === 'field')
13840
+ .map((item) => item.fieldName);
13841
+ }
13842
+ function getFormColumnFieldNames(column) {
13843
+ return getFormLayoutFieldNames(normalizeFormLayoutItems(column));
13844
+ }
13845
+
13259
13846
  function defaultGenerateId(kind, used) {
13260
13847
  // determinístico + compacto, evitando Math.random (facilita tests/replays)
13261
13848
  let seq = 1;
@@ -13309,12 +13896,13 @@ function ensureIds(config, options = {}) {
13309
13896
  const rowId = takeOrGenerate('row', row.id, used, keepExistingUnique, generateId);
13310
13897
  const safeColumns = (row.columns ?? []).map((col) => {
13311
13898
  const colId = takeOrGenerate('col', col.id, used, keepExistingUnique, generateId);
13312
- // garantir fields como array
13313
- const fields = Array.isArray(col.fields) ? col.fields : [];
13899
+ const items = normalizeFormLayoutItems(col);
13900
+ const fields = getFormLayoutFieldNames(items);
13314
13901
  return {
13315
13902
  ...col,
13316
13903
  id: colId,
13317
13904
  fields,
13905
+ items,
13318
13906
  };
13319
13907
  });
13320
13908
  return {
@@ -13612,7 +14200,7 @@ function getReferencedFieldMetadata(config, allFieldMetadata) {
13612
14200
  config.sections.forEach((section) => {
13613
14201
  section.rows.forEach((row) => {
13614
14202
  row.columns.forEach((column) => {
13615
- column.fields.forEach((fieldName) => {
14203
+ getFormColumnFieldNames(column).forEach((fieldName) => {
13616
14204
  referencedFieldNames.add(fieldName);
13617
14205
  });
13618
14206
  });
@@ -14862,6 +15450,23 @@ const RULE_PROPERTY_SCHEMA = {
14862
15450
  { name: 'className', type: 'string', label: 'Classe CSS' },
14863
15451
  { name: 'style', type: 'object', label: 'Estilos inline' },
14864
15452
  ],
15453
+ visualBlock: [
15454
+ { name: 'visible', type: 'boolean', label: 'Visível', category: 'behavior' },
15455
+ { name: 'hidden', type: 'boolean', label: 'Oculto', category: 'behavior' },
15456
+ {
15457
+ name: 'layout',
15458
+ type: 'enum',
15459
+ label: 'Layout',
15460
+ category: 'layout',
15461
+ enumValues: [
15462
+ { value: 'block', label: 'Bloco' },
15463
+ { value: 'inline', label: 'Inline' },
15464
+ ],
15465
+ },
15466
+ { name: 'rootClassName', type: 'string', label: 'Classe raiz', category: 'appearance' },
15467
+ { name: 'className', type: 'string', label: 'Classe CSS', category: 'appearance' },
15468
+ { name: 'style', type: 'object', label: 'Estilos inline', category: 'appearance' },
15469
+ ],
14865
15470
  };
14866
15471
 
14867
15472
  const EDITORIAL_THEME_PRESETS = [
@@ -16382,7 +16987,8 @@ function normalizeTargets(rule) {
16382
16987
  : rawTargets.some((t) => t?.startsWith('action:')) ? 'action'
16383
16988
  : rawTargets.some((t) => t?.startsWith('row:')) ? 'row'
16384
16989
  : rawTargets.some((t) => t?.startsWith('column:')) ? 'column'
16385
- : 'field');
16990
+ : rawTargets.some((t) => t?.startsWith('visualBlock:')) ? 'visualBlock'
16991
+ : 'field');
16386
16992
  const targets = rawTargets.map((t) => stripPrefix(t));
16387
16993
  return { targetType, targets };
16388
16994
  }
@@ -16398,6 +17004,8 @@ function stripPrefix(value) {
16398
17004
  return value.substring('row:'.length);
16399
17005
  if (value?.startsWith('column:'))
16400
17006
  return value.substring('column:'.length);
17007
+ if (value?.startsWith('visualBlock:'))
17008
+ return value.substring('visualBlock:'.length);
16401
17009
  return value;
16402
17010
  }
16403
17011
  function isScopedSectionHeaderActionTarget(value) {
@@ -18717,6 +19325,16 @@ function getFieldMetadataCapabilities() {
18717
19325
  */
18718
19326
  const ENUMS = {
18719
19327
  layoutOrientation: ['vertical', 'columns'],
19328
+ canvasMode: ['grid'],
19329
+ canvasAutoRows: ['fixed', 'content'],
19330
+ canvasCollisionPolicy: ['block', 'swap'],
19331
+ groupingKind: ['section', 'tabs', 'hero', 'rail'],
19332
+ groupingLayout: ['stack', 'grid', 'row'],
19333
+ heroEmphasis: ['high', 'medium'],
19334
+ railSide: ['left', 'right'],
19335
+ deviceKind: ['desktop', 'tablet', 'mobile'],
19336
+ stateMergeStrategy: ['replace', 'merge', 'append', 'remove-keys'],
19337
+ derivedStateComputeKind: ['json-logic', 'template', 'operator', 'transformer'],
18720
19338
  shellKind: ['dashboard-card', 'none'],
18721
19339
  actionVariant: ['icon', 'text', 'outlined'],
18722
19340
  actionPlacement: ['header', 'window'],
@@ -18724,6 +19342,9 @@ const ENUMS = {
18724
19342
  const CAPS = [
18725
19343
  { path: 'page', category: 'page', valueKind: 'object', description: 'Definicao da pagina dinamica.' },
18726
19344
  { path: 'page.context', category: 'context', valueKind: 'object', description: 'Contexto compartilhado entre widgets.' },
19345
+ { path: 'page.layoutPreset', category: 'layout', valueKind: 'string', description: 'ID canonico opcional do preset estrutural da pagina.' },
19346
+ { path: 'page.layoutPresetOptions', category: 'layout', valueKind: 'object', description: 'Opcoes especificas do preset estrutural consumidas por builders e runtimes futuros.' },
19347
+ { path: 'page.themePreset', category: 'appearance', valueKind: 'string', description: 'ID opcional do preset de tema para shell, graficos, densidade e defaults visuais.' },
18727
19348
  { path: 'page.layout', category: 'layout', valueKind: 'object', description: 'Layout base da pagina.' },
18728
19349
  { path: 'page.layout.orientation', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.layoutOrientation, description: 'Orientacao do grid (vertical/columns).' },
18729
19350
  { path: 'page.layout.columns', category: 'layout', valueKind: 'number', description: 'Numero de colunas (quando orientation=columns).' },
@@ -18733,6 +19354,26 @@ const CAPS = [
18733
19354
  { path: 'page.layout.breakpoints.md', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint md.' },
18734
19355
  { path: 'page.layout.breakpoints.lg', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint lg.' },
18735
19356
  { path: 'page.layout.breakpoints.xl', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint xl.' },
19357
+ { path: 'page.canvas', category: 'layout', valueKind: 'object', description: 'Canvas espacial canonico da pagina quando houver geometria explicita.' },
19358
+ { path: 'page.canvas.mode', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.canvasMode, description: 'Modo canonico do canvas. Valor atual: grid.' },
19359
+ { path: 'page.canvas.columns', category: 'layout', valueKind: 'number', description: 'Numero de colunas do canvas espacial.' },
19360
+ { path: 'page.canvas.rowUnit', category: 'layout', valueKind: 'string', description: 'Altura base das linhas do canvas, como 80px.' },
19361
+ { path: 'page.canvas.gap', category: 'layout', valueKind: 'string', description: 'Espacamento entre itens do canvas.' },
19362
+ { path: 'page.canvas.autoRows', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.canvasAutoRows, description: 'Politica de linhas automaticas do canvas.' },
19363
+ { path: 'page.canvas.collisionPolicy', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.canvasCollisionPolicy, description: 'Politica de colisao do canvas espacial.' },
19364
+ { path: 'page.canvas.items', category: 'layout', valueKind: 'object', description: 'Mapa canonico de geometria por widget key.' },
19365
+ { path: 'page.canvas.items.<widgetKey>.col', category: 'layout', valueKind: 'number', description: 'Coluna inicial do widget no canvas.' },
19366
+ { path: 'page.canvas.items.<widgetKey>.row', category: 'layout', valueKind: 'number', description: 'Linha inicial do widget no canvas.' },
19367
+ { path: 'page.canvas.items.<widgetKey>.colSpan', category: 'layout', valueKind: 'number', description: 'Quantidade de colunas ocupadas pelo widget.' },
19368
+ { path: 'page.canvas.items.<widgetKey>.rowSpan', category: 'layout', valueKind: 'number', description: 'Quantidade de linhas ocupadas pelo widget.' },
19369
+ { path: 'page.canvas.items.<widgetKey>.zIndex', category: 'layout', valueKind: 'number', description: 'Camada opcional do item no canvas.' },
19370
+ { path: 'page.canvas.items.<widgetKey>.constraints', category: 'layout', valueKind: 'object', description: 'Restricoes opcionais de posicao e tamanho do item no canvas.' },
19371
+ { path: 'page.canvas.items.<widgetKey>.constraints.minColSpan', category: 'layout', valueKind: 'number', description: 'Span minimo de colunas permitido.' },
19372
+ { path: 'page.canvas.items.<widgetKey>.constraints.minRowSpan', category: 'layout', valueKind: 'number', description: 'Span minimo de linhas permitido.' },
19373
+ { path: 'page.canvas.items.<widgetKey>.constraints.maxColSpan', category: 'layout', valueKind: 'number', description: 'Span maximo de colunas permitido.' },
19374
+ { path: 'page.canvas.items.<widgetKey>.constraints.maxRowSpan', category: 'layout', valueKind: 'number', description: 'Span maximo de linhas permitido.' },
19375
+ { path: 'page.canvas.items.<widgetKey>.constraints.lockPosition', category: 'layout', valueKind: 'boolean', description: 'Bloqueia alteracao de posicao do item no canvas.' },
19376
+ { path: 'page.canvas.items.<widgetKey>.constraints.lockSize', category: 'layout', valueKind: 'boolean', description: 'Bloqueia alteracao de tamanho do item no canvas.' },
18736
19377
  { path: 'page.widgets', category: 'widgets', valueKind: 'array', description: 'Lista de widgets renderizados.' },
18737
19378
  { path: 'page.widgets[].key', category: 'widgets', valueKind: 'string', description: 'Identificador unico do widget.' },
18738
19379
  { path: 'page.widgets[].className', category: 'widgets', valueKind: 'string', description: 'Classe CSS opcional do widget.' },
@@ -18752,30 +19393,107 @@ const CAPS = [
18752
19393
  { path: 'page.widgets[].shell.actions[].variant', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.actionVariant, description: 'Estilo visual da acao.' },
18753
19394
  { path: 'page.widgets[].shell.actions[].placement', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.actionPlacement, description: 'Posicionamento da acao.' },
18754
19395
  { path: 'page.widgets[].shell.actions[].emit', category: 'shell', valueKind: 'string', description: 'Evento emitido ao acionar a acao.' },
19396
+ { path: 'page.state', category: 'state', valueKind: 'object', description: 'Estado declarativo opcional compartilhado por widgets e composicao.' },
19397
+ { path: 'page.state.values', category: 'state', valueKind: 'object', description: 'Valores primarios mutaveis escritos por widgets, defaults ou host.' },
19398
+ { path: 'page.state.schema', category: 'state', valueKind: 'object', description: 'Descritores dos paths primarios de estado.' },
19399
+ { path: 'page.state.schema.<token>.type', category: 'state', valueKind: 'string', description: 'Tipo semantico opcional do path de estado.' },
19400
+ { path: 'page.state.schema.<token>.initial', category: 'state', valueKind: 'object', description: 'Valor inicial usado quando page.state.values omite o path.' },
19401
+ { path: 'page.state.schema.<token>.persist', category: 'state', valueKind: 'boolean', description: 'Indica se o path primario deve ser persistido com a pagina.' },
19402
+ { path: 'page.state.schema.<token>.mergeStrategy', category: 'state', valueKind: 'enum', allowedValues: ENUMS.stateMergeStrategy, description: 'Como escritas de widget/estado combinam com o valor atual.' },
19403
+ { path: 'page.state.schema.<token>.description', category: 'state', valueKind: 'string', description: 'Descricao opcional do path para builders e catalogos AI.' },
19404
+ { path: 'page.state.schema.<token>.tags', category: 'state', valueKind: 'array', description: 'Tags opcionais para busca e governanca do estado.' },
19405
+ { path: 'page.state.derived', category: 'state', valueKind: 'object', description: 'Descritores de estado derivado recomputado pelo runtime.' },
19406
+ { path: 'page.state.derived.<token>.dependsOn', category: 'state', valueKind: 'array', description: 'Paths de estado que alimentam o valor derivado.' },
19407
+ { path: 'page.state.derived.<token>.compute', category: 'state', valueKind: 'object', description: 'Descritor de computacao do estado derivado.' },
19408
+ { path: 'page.state.derived.<token>.compute.kind', category: 'state', valueKind: 'enum', allowedValues: ENUMS.derivedStateComputeKind, description: 'Tipo de computacao do estado derivado.' },
19409
+ { path: 'page.state.derived.<token>.compute.expression', category: 'state', valueKind: 'expression', description: 'Expressao Json Logic para compute.kind=json-logic.' },
19410
+ { path: 'page.state.derived.<token>.compute.value', category: 'state', valueKind: 'object', description: 'Valor template para compute.kind=template.' },
19411
+ { path: 'page.state.derived.<token>.compute.operator', category: 'state', valueKind: 'string', description: 'Operador para compute.kind=operator.' },
19412
+ { path: 'page.state.derived.<token>.compute.options', category: 'state', valueKind: 'object', description: 'Opcoes do operador ou transformer.' },
19413
+ { path: 'page.state.derived.<token>.compute.transformerId', category: 'state', valueKind: 'string', description: 'Identificador do transformer para compute.kind=transformer.' },
19414
+ { path: 'page.state.derived.<token>.description', category: 'state', valueKind: 'string', description: 'Descricao opcional do estado derivado.' },
19415
+ { path: 'page.state.derived.<token>.cache', category: 'state', valueKind: 'boolean', description: 'Permite cache futuro do valor derivado.' },
18755
19416
  { path: 'page.composition', category: 'connections', valueKind: 'object', description: 'Envelope canonico da composicao persistida.' },
18756
19417
  { path: 'page.composition.version', category: 'connections', valueKind: 'string', description: 'Versao do envelope de composicao.' },
18757
19418
  { path: 'page.composition.links', category: 'connections', valueKind: 'array', description: 'Links canonicos entre widgets e estado.' },
18758
19419
  { path: 'page.composition.links[].id', category: 'connections', valueKind: 'string', description: 'Identificador estavel do link.' },
18759
19420
  { path: 'page.composition.links[].from', category: 'connections', valueKind: 'object', description: 'Endpoint de origem do link.' },
19421
+ { path: 'page.composition.links[].from.kind', category: 'connections', valueKind: 'string', description: 'Tipo do endpoint de origem, como component-port ou state.' },
19422
+ { path: 'page.composition.links[].from.ref', category: 'connections', valueKind: 'object', description: 'Referencia estruturada do endpoint de origem.' },
19423
+ { path: 'page.composition.links[].from.ref.widget', category: 'connections', valueKind: 'string', description: 'Widget top-level dono do endpoint de origem.' },
19424
+ { path: 'page.composition.links[].from.ref.port', category: 'connections', valueKind: 'string', description: 'Porta de origem do componente.' },
19425
+ { path: 'page.composition.links[].from.ref.direction', category: 'connections', valueKind: 'string', description: 'Direcao da porta de origem.' },
19426
+ { path: 'page.composition.links[].from.ref.nestedPath', category: 'connections', valueKind: 'array', description: 'NestedPath canonico para porta de componente filho de origem.' },
19427
+ { path: 'page.composition.links[].from.ref.nestedPath[].kind', category: 'connections', valueKind: 'string', description: 'Tipo do segmento nested de origem.' },
19428
+ { path: 'page.composition.links[].from.ref.nestedPath[].id', category: 'connections', valueKind: 'string', description: 'Identificador estrutural do segmento nested de origem.' },
19429
+ { 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 },
19430
+ { path: 'page.composition.links[].from.ref.nestedPath[].index', category: 'connections', valueKind: 'number', description: 'Indice auxiliar para diagnostico visual; nao use como identidade primaria.' },
19431
+ { path: 'page.composition.links[].from.ref.nestedPath[].componentType', category: 'connections', valueKind: 'string', description: 'Tipo do componente real do widget filho de origem.' },
18760
19432
  { path: 'page.composition.links[].to', category: 'connections', valueKind: 'object', description: 'Endpoint de destino do link.' },
19433
+ { path: 'page.composition.links[].to.kind', category: 'connections', valueKind: 'string', description: 'Tipo do endpoint de destino, como component-port ou state.' },
19434
+ { path: 'page.composition.links[].to.ref', category: 'connections', valueKind: 'object', description: 'Referencia estruturada do endpoint de destino.' },
19435
+ { path: 'page.composition.links[].to.ref.widget', category: 'connections', valueKind: 'string', description: 'Widget top-level dono do endpoint de destino.' },
19436
+ { path: 'page.composition.links[].to.ref.port', category: 'connections', valueKind: 'string', description: 'Porta de destino do componente.' },
19437
+ { path: 'page.composition.links[].to.ref.direction', category: 'connections', valueKind: 'string', description: 'Direcao da porta de destino.' },
19438
+ { path: 'page.composition.links[].to.ref.nestedPath', category: 'connections', valueKind: 'array', description: 'NestedPath canonico para porta de componente filho de destino.' },
19439
+ { path: 'page.composition.links[].to.ref.nestedPath[].kind', category: 'connections', valueKind: 'string', description: 'Tipo do segmento nested de destino.' },
19440
+ { path: 'page.composition.links[].to.ref.nestedPath[].id', category: 'connections', valueKind: 'string', description: 'Identificador estrutural do segmento nested de destino.' },
19441
+ { 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 },
19442
+ { path: 'page.composition.links[].to.ref.nestedPath[].index', category: 'connections', valueKind: 'number', description: 'Indice auxiliar para diagnostico visual; nao use como identidade primaria.' },
19443
+ { path: 'page.composition.links[].to.ref.nestedPath[].componentType', category: 'connections', valueKind: 'string', description: 'Tipo do componente real do widget filho de destino.' },
18761
19444
  { path: 'page.composition.links[].intent', category: 'connections', valueKind: 'string', description: 'Intencao semantica do link.' },
18762
19445
  { path: 'page.composition.links[].transform', category: 'connections', valueKind: 'object', description: 'Pipeline de transformacao do link.' },
18763
19446
  { path: 'page.composition.links[].condition', category: 'connections', valueKind: 'expression', description: 'Guarda semantica opcional do link, expressa como um unico AST Json Logic canonico.' },
18764
19447
  { path: 'page.composition.links[].policy', category: 'connections', valueKind: 'object', description: 'Politicas operacionais opcionais do link, como debounce, distinct e missing-value.' },
18765
19448
  { path: 'page.composition.links[].metadata', category: 'connections', valueKind: 'object', description: 'Metadados opcionais do link.' },
19449
+ { path: 'page.grouping', category: 'layout', valueKind: 'array', description: 'Modelo semantico opcional de secoes, abas, areas hero e rails.' },
19450
+ { path: 'page.grouping[].kind', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.groupingKind, description: 'Tipo do agrupamento semantico.' },
19451
+ { path: 'page.grouping[].id', category: 'layout', valueKind: 'string', description: 'Identificador estavel do agrupamento.' },
19452
+ { path: 'page.grouping[].label', category: 'layout', valueKind: 'string', description: 'Rotulo opcional do agrupamento.' },
19453
+ { path: 'page.grouping[].widgetKeys', category: 'layout', valueKind: 'array', description: 'Widgets pertencentes ao agrupamento section, hero ou rail.' },
19454
+ { path: 'page.grouping[].layout', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.groupingLayout, description: 'Layout opcional para agrupamento section.' },
19455
+ { path: 'page.grouping[].tabs', category: 'layout', valueKind: 'array', description: 'Abas do agrupamento kind=tabs.' },
19456
+ { path: 'page.grouping[].tabs[].id', category: 'layout', valueKind: 'string', description: 'Identificador estavel da aba.' },
19457
+ { path: 'page.grouping[].tabs[].label', category: 'layout', valueKind: 'string', description: 'Rotulo da aba.' },
19458
+ { path: 'page.grouping[].tabs[].widgetKeys', category: 'layout', valueKind: 'array', description: 'Widgets renderizados dentro da aba.' },
19459
+ { path: 'page.grouping[].emphasis', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.heroEmphasis, description: 'Enfase opcional para agrupamento hero.' },
19460
+ { path: 'page.grouping[].side', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.railSide, description: 'Lado do rail quando kind=rail.' },
19461
+ { path: 'page.slotAssignments', category: 'layout', valueKind: 'object', description: 'Mapa canonico de widget key para slot semantico de preset.' },
19462
+ { path: 'page.deviceLayouts', category: 'layout', valueKind: 'object', description: 'Variantes opcionais de layout por dispositivo.' },
19463
+ { path: 'page.deviceLayouts.desktop', category: 'layout', valueKind: 'object', description: 'Overrides de layout para desktop.' },
19464
+ { path: 'page.deviceLayouts.tablet', category: 'layout', valueKind: 'object', description: 'Overrides de layout para tablet.' },
19465
+ { path: 'page.deviceLayouts.mobile', category: 'layout', valueKind: 'object', description: 'Overrides de layout para mobile.' },
19466
+ { path: 'page.deviceLayouts.desktop.layout', category: 'layout', valueKind: 'object', description: 'Override de WidgetPageLayout para desktop.' },
19467
+ { path: 'page.deviceLayouts.desktop.canvas', category: 'layout', valueKind: 'object', description: 'Override de canvas para desktop.' },
19468
+ { path: 'page.deviceLayouts.desktop.groupingOverrides', category: 'layout', valueKind: 'array', description: 'Overrides de agrupamentos para desktop.' },
19469
+ { path: 'page.deviceLayouts.desktop.widgetOverrides', category: 'layout', valueKind: 'object', description: 'Overrides por widget key para desktop.' },
19470
+ { path: 'page.deviceLayouts.desktop.widgetOverrides.<widgetKey>.hidden', category: 'layout', valueKind: 'boolean', description: 'Oculta o widget em desktop.' },
19471
+ { path: 'page.deviceLayouts.tablet.layout', category: 'layout', valueKind: 'object', description: 'Override de WidgetPageLayout para tablet.' },
19472
+ { path: 'page.deviceLayouts.tablet.canvas', category: 'layout', valueKind: 'object', description: 'Override de canvas para tablet.' },
19473
+ { path: 'page.deviceLayouts.tablet.groupingOverrides', category: 'layout', valueKind: 'array', description: 'Overrides de agrupamentos para tablet.' },
19474
+ { path: 'page.deviceLayouts.tablet.widgetOverrides', category: 'layout', valueKind: 'object', description: 'Overrides por widget key para tablet.' },
19475
+ { path: 'page.deviceLayouts.tablet.widgetOverrides.<widgetKey>.hidden', category: 'layout', valueKind: 'boolean', description: 'Oculta o widget em tablet.' },
19476
+ { path: 'page.deviceLayouts.mobile.layout', category: 'layout', valueKind: 'object', description: 'Override de WidgetPageLayout para mobile.' },
19477
+ { path: 'page.deviceLayouts.mobile.canvas', category: 'layout', valueKind: 'object', description: 'Override de canvas para mobile.' },
19478
+ { path: 'page.deviceLayouts.mobile.groupingOverrides', category: 'layout', valueKind: 'array', description: 'Overrides de agrupamentos para mobile.' },
19479
+ { path: 'page.deviceLayouts.mobile.widgetOverrides', category: 'layout', valueKind: 'object', description: 'Overrides por widget key para mobile.' },
19480
+ { path: 'page.deviceLayouts.mobile.widgetOverrides.<widgetKey>.hidden', category: 'layout', valueKind: 'boolean', description: 'Oculta o widget em mobile.' },
18766
19481
  ];
18767
19482
  const DYNAMIC_PAGE_AI_CAPABILITIES = {
18768
- version: 'v1.0',
19483
+ version: 'v1.1',
18769
19484
  enums: ENUMS,
18770
19485
  targets: ['praxis-dynamic-page'],
18771
19486
  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.',
19487
+ 'Este catalogo e especifico para o runtime praxis-dynamic-page; operacoes de authoring/mutacao pertencem ao manifesto do praxis-page-builder.',
19488
+ 'WidgetPageDefinition e o contrato canonico persistido: widgets, composition.links, state, context, layout, canvas, presets, grouping, slotAssignments, deviceLayouts e themePreset.',
19489
+ 'Widgets e page.composition.links sao arrays; ferramentas de patch legadas fazem merge por key estavel e id estavel.',
19490
+ 'page.canvas.items e um mapa por widget key; nao modele canvas.items como array.',
18774
19491
  'Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; nao trate ambos como a mesma "expression".',
18775
19492
  'Para remocao/replace, use flags {_remove:true} ou {_replace:true} no item.',
18776
19493
  'Para renomear um link, inclua {_beforeKey:"link-id-anterior"} no item.',
18777
19494
  'Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmacao.',
18778
19495
  'Use ids estaveis para links e keys estaveis para widgets.',
19496
+ 'Nested component ports usam endpoint component-port com nestedPath; o owner em ref.widget continua sendo o widget top-level.',
18779
19497
  'Objetivo: compor widgets e relacionamentos canonicos (ex.: master-detail).',
18780
19498
  'Link tipico de master-detail: component-port(table.rowClick) -> component-port(form.resourceId) com transform map payload.row.id.',
18781
19499
  ],
@@ -18792,6 +19510,75 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
18792
19510
  { value: 'columns', label: 'Colunas' },
18793
19511
  ],
18794
19512
  },
19513
+ 'page.canvas.mode': {
19514
+ mode: 'enum',
19515
+ options: [
19516
+ { value: 'grid', label: 'Grid' },
19517
+ ],
19518
+ },
19519
+ 'page.canvas.autoRows': {
19520
+ mode: 'enum',
19521
+ options: [
19522
+ { value: 'fixed', label: 'Linhas fixas' },
19523
+ { value: 'content', label: 'Conteudo' },
19524
+ ],
19525
+ },
19526
+ 'page.canvas.collisionPolicy': {
19527
+ mode: 'enum',
19528
+ options: [
19529
+ { value: 'block', label: 'Bloquear colisao' },
19530
+ { value: 'swap', label: 'Trocar posicao' },
19531
+ ],
19532
+ },
19533
+ 'page.grouping[].kind': {
19534
+ mode: 'enum',
19535
+ options: [
19536
+ { value: 'section', label: 'Secao' },
19537
+ { value: 'tabs', label: 'Abas' },
19538
+ { value: 'hero', label: 'Hero' },
19539
+ { value: 'rail', label: 'Rail' },
19540
+ ],
19541
+ },
19542
+ 'page.grouping[].layout': {
19543
+ mode: 'enum',
19544
+ options: [
19545
+ { value: 'stack', label: 'Empilhado' },
19546
+ { value: 'grid', label: 'Grid' },
19547
+ { value: 'row', label: 'Linha' },
19548
+ ],
19549
+ },
19550
+ 'page.grouping[].emphasis': {
19551
+ mode: 'enum',
19552
+ options: [
19553
+ { value: 'high', label: 'Alta' },
19554
+ { value: 'medium', label: 'Media' },
19555
+ ],
19556
+ },
19557
+ 'page.grouping[].side': {
19558
+ mode: 'enum',
19559
+ options: [
19560
+ { value: 'left', label: 'Esquerda' },
19561
+ { value: 'right', label: 'Direita' },
19562
+ ],
19563
+ },
19564
+ 'page.state.schema.<token>.mergeStrategy': {
19565
+ mode: 'enum',
19566
+ options: [
19567
+ { value: 'replace', label: 'Substituir' },
19568
+ { value: 'merge', label: 'Mesclar' },
19569
+ { value: 'append', label: 'Acrescentar' },
19570
+ { value: 'remove-keys', label: 'Remover chaves' },
19571
+ ],
19572
+ },
19573
+ 'page.state.derived.<token>.compute.kind': {
19574
+ mode: 'enum',
19575
+ options: [
19576
+ { value: 'json-logic', label: 'Json Logic' },
19577
+ { value: 'template', label: 'Template' },
19578
+ { value: 'operator', label: 'Operador' },
19579
+ { value: 'transformer', label: 'Transformer' },
19580
+ ],
19581
+ },
18795
19582
  'page.widgets[].shell.kind': {
18796
19583
  mode: 'enum',
18797
19584
  options: [
@@ -19336,7 +20123,10 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
19336
20123
  'page.composition.links[]': ['id'],
19337
20124
  },
19338
20125
  hints: [
19339
- 'praxis-dynamic-page e um host de composicao: cria widgets, conecta ports canonicos e mantem relacoes em page.composition.links.',
20126
+ 'praxis-dynamic-page e runtime de composicao: consome WidgetPageDefinition, renderiza widgets e mantem relacoes em page.composition.links.',
20127
+ 'Mutacoes agentic de pagina pertencem ao manifesto do praxis-page-builder; use este context pack como descoberta/runtime guidance.',
20128
+ 'WidgetPageDefinition inclui widgets, composition.links, state, context, layout, canvas, layoutPreset, layoutPresetOptions, grouping, slotAssignments, deviceLayouts e themePreset.',
20129
+ 'page.canvas.items e um mapa por widget key, nao um array; cada entrada guarda col, row, colSpan, rowSpan, zIndex e constraints opcionais.',
19340
20130
  'Widgets e composition.links sao arrays; o patching deve fazer merge por key (widgets) e por id (links).',
19341
20131
  'Preferir mudancas incrementais: alterar/estender em vez de substituir toda a pagina.',
19342
20132
  'Para remover um item, envie {_remove: true} junto ao widget/link.',
@@ -28983,4 +29773,4 @@ function provideHookWhitelist(allowed) {
28983
29773
  * Generated bundle index. Do not edit.
28984
29774
  */
28985
29775
 
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 };
29776
+ 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, buildSchemaIdStorageKeySegment, 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 };