@praxisui/core 9.0.0-beta.22 → 9.0.0-beta.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, InjectionToken, Injectable, inject, Inject, Optional, makeEnvironmentProviders, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, APP_INITIALIZER, ErrorHandler, EventEmitter, Output, Input, ChangeDetectionStrategy, Directive, SecurityContext, ViewContainerRef, SimpleChange, ContentChild, HostBinding, HostListener, ViewChildren, ViewChild } from '@angular/core';
2
+ import { Component, InjectionToken, Injectable, inject, Inject, Optional, makeEnvironmentProviders, APP_INITIALIZER, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, ErrorHandler, EventEmitter, Output, Input, ChangeDetectionStrategy, Directive, SecurityContext, ViewContainerRef, SimpleChange, ContentChild, HostBinding, HostListener, ViewChildren, ViewChild } from '@angular/core';
3
3
  import * as i1 from '@angular/common/http';
4
4
  import { HttpHeaders, HttpClient, HttpParams, HttpResponse, HttpContextToken, HTTP_INTERCEPTORS, withInterceptors } from '@angular/common/http';
5
5
  import { of, defer, throwError, from, EMPTY, BehaviorSubject, firstValueFrom, Subject, map as map$1, switchMap as switchMap$1 } from 'rxjs';
@@ -12118,6 +12118,162 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12118
12118
  args: [{ providedIn: 'any' }]
12119
12119
  }] });
12120
12120
 
12121
+ const PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS = new InjectionToken('PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS');
12122
+ const PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY = new InjectionToken('PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY');
12123
+ function providePraxisEnterpriseRuntimeContext(options = {}) {
12124
+ const normalized = {
12125
+ ...options,
12126
+ includeGlobalFetchHeaders: options.includeGlobalFetchHeaders ?? true,
12127
+ blocking: options.blocking ?? false,
12128
+ errorPolicy: options.errorPolicy ?? 'ignore',
12129
+ };
12130
+ return [
12131
+ { provide: PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, useValue: normalized },
12132
+ {
12133
+ provide: PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY,
12134
+ useFactory: (service) => {
12135
+ let promise = null;
12136
+ return () => {
12137
+ if (promise)
12138
+ return promise;
12139
+ promise = service.ready().then(() => undefined);
12140
+ return promise;
12141
+ };
12142
+ },
12143
+ deps: [EnterpriseRuntimeContextService],
12144
+ },
12145
+ {
12146
+ provide: APP_INITIALIZER,
12147
+ multi: true,
12148
+ useFactory: (ready) => () => normalized.blocking ? ready() : undefined,
12149
+ deps: [PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY],
12150
+ },
12151
+ ];
12152
+ }
12153
+
12154
+ class EnterpriseRuntimeContextService {
12155
+ http = inject(HttpClient);
12156
+ apiUrl = inject(API_URL, { optional: true });
12157
+ options = inject(PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, {
12158
+ optional: true,
12159
+ });
12160
+ contextSubject = new BehaviorSubject(null);
12161
+ loadPromise = null;
12162
+ contextChanges$ = this.contextSubject.asObservable();
12163
+ get snapshot() {
12164
+ return this.contextSubject.value;
12165
+ }
12166
+ ready() {
12167
+ if (this.contextSubject.value) {
12168
+ return Promise.resolve(this.contextSubject.value);
12169
+ }
12170
+ if (this.loadPromise) {
12171
+ return this.loadPromise;
12172
+ }
12173
+ this.loadPromise = this.load()
12174
+ .catch((error) => {
12175
+ if ((this.options?.errorPolicy ?? 'ignore') === 'fail') {
12176
+ throw error;
12177
+ }
12178
+ return null;
12179
+ })
12180
+ .finally(() => {
12181
+ this.loadPromise = null;
12182
+ });
12183
+ return this.loadPromise;
12184
+ }
12185
+ refresh() {
12186
+ this.loadPromise = null;
12187
+ return this.load().catch((error) => {
12188
+ if ((this.options?.errorPolicy ?? 'ignore') === 'fail') {
12189
+ throw error;
12190
+ }
12191
+ return null;
12192
+ });
12193
+ }
12194
+ headers(fallback) {
12195
+ return {
12196
+ ...this.normalizeHeaders(fallback ?? {}),
12197
+ ...this.normalizeHeaders(this.headersFromSnapshot(this.contextSubject.value)),
12198
+ };
12199
+ }
12200
+ async load() {
12201
+ const context = await firstValueFrom(this.http.get(this.endpoint(), {
12202
+ headers: this.requestHeaders(),
12203
+ }));
12204
+ this.contextSubject.next(context ?? null);
12205
+ return context ?? null;
12206
+ }
12207
+ endpoint() {
12208
+ const configured = this.options?.endpoint?.trim();
12209
+ if (configured) {
12210
+ return configured.replace(/\/+$/, '');
12211
+ }
12212
+ const defaultEntry = this.apiUrl?.['default'];
12213
+ const base = defaultEntry ? buildApiUrl(defaultEntry) : '';
12214
+ if (base) {
12215
+ return `${base}/praxis/runtime/context`;
12216
+ }
12217
+ return '/api/praxis/runtime/context';
12218
+ }
12219
+ requestHeaders() {
12220
+ const merged = this.normalizeHeaders({
12221
+ ...(this.options?.includeGlobalFetchHeaders ?? true ? this.globalFetchHeaders() : {}),
12222
+ ...(this.options?.headersFactory?.() ?? {}),
12223
+ });
12224
+ let headers = new HttpHeaders();
12225
+ for (const [key, value] of Object.entries(merged)) {
12226
+ if (value) {
12227
+ headers = headers.set(key, value);
12228
+ }
12229
+ }
12230
+ return headers;
12231
+ }
12232
+ globalFetchHeaders() {
12233
+ try {
12234
+ const factory = globalThis.PAX_FETCH_HEADERS;
12235
+ return factory?.() ?? {};
12236
+ }
12237
+ catch {
12238
+ return {};
12239
+ }
12240
+ }
12241
+ headersFromSnapshot(context) {
12242
+ if (!context) {
12243
+ return {};
12244
+ }
12245
+ return {
12246
+ 'X-Tenant-ID': context.activeTenant?.tenantId,
12247
+ 'X-User-ID': context.user?.userId,
12248
+ 'X-Env': context.environment ?? undefined,
12249
+ 'Accept-Language': context.locale ?? undefined,
12250
+ 'X-Timezone': context.timezone ?? undefined,
12251
+ 'X-Praxis-Profile-ID': context.activeProfileId ?? undefined,
12252
+ 'X-Praxis-Module-Key': context.activeModuleKey ?? undefined,
12253
+ };
12254
+ }
12255
+ normalizeHeaders(headers) {
12256
+ const normalized = {};
12257
+ for (const [key, value] of Object.entries(headers)) {
12258
+ if (typeof value !== 'string') {
12259
+ continue;
12260
+ }
12261
+ const trimmed = value.trim();
12262
+ if (!trimmed) {
12263
+ continue;
12264
+ }
12265
+ normalized[key] = trimmed;
12266
+ }
12267
+ return normalized;
12268
+ }
12269
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EnterpriseRuntimeContextService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
12270
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EnterpriseRuntimeContextService, providedIn: 'root' });
12271
+ }
12272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EnterpriseRuntimeContextService, decorators: [{
12273
+ type: Injectable,
12274
+ args: [{ providedIn: 'root' }]
12275
+ }] });
12276
+
12121
12277
  function clonePraxisRuntimeComponentObservation(observation) {
12122
12278
  assertPraxisRuntimeComponentObservationSerializable(observation);
12123
12279
  return JSON.parse(JSON.stringify(observation));
@@ -12640,9 +12796,10 @@ class SurfaceOpenMaterializerService {
12640
12796
  : null;
12641
12797
  if (collectionData) {
12642
12798
  if (this.shouldPreserveCollectionPresentation(payload)) {
12799
+ const preservedPayload = this.ensureCollectionTableSelectionContract(payload);
12643
12800
  return {
12644
- ...payload,
12645
- context: this.mergeMaterializationContext(payload, {
12801
+ ...preservedPayload,
12802
+ context: this.mergeMaterializationContext(preservedPayload, {
12646
12803
  readUrl,
12647
12804
  dataShape: 'array',
12648
12805
  recordCount: collectionData.length,
@@ -12666,18 +12823,24 @@ class SurfaceOpenMaterializerService {
12666
12823
  if (data && typeof data === 'object' && !Array.isArray(data)) {
12667
12824
  const objectData = data;
12668
12825
  if (payload.widget.id === 'praxis-dynamic-form') {
12669
- const schemaFields = await this.resolveSchemaFields(payload, discoveryOptions);
12670
12826
  return {
12671
12827
  ...payload,
12672
12828
  widget: {
12673
12829
  ...payload.widget,
12674
12830
  inputs: {
12675
12831
  ...this.projectMaterializedFormInputs(payload.widget.inputs || {}),
12676
- configPersistenceStrategy: 'input-first',
12677
12832
  mode: payload.widget.inputs?.['mode'] || 'view',
12678
12833
  initialValue: objectData,
12679
12834
  resourceId,
12680
- config: this.buildLocalFormConfig(objectData, schemaFields),
12835
+ layoutPolicy: payload.widget.inputs?.['layoutPolicy'] || {
12836
+ source: 'schema',
12837
+ intent: 'detail',
12838
+ preset: 'compactPresentation',
12839
+ lifecycle: 'live',
12840
+ persistence: 'transient',
12841
+ schemaOperation: 'detail',
12842
+ schemaType: 'response',
12843
+ },
12681
12844
  },
12682
12845
  },
12683
12846
  context: this.mergeMaterializationContext(payload, {
@@ -12715,11 +12878,14 @@ class SurfaceOpenMaterializerService {
12715
12878
  'resourceId',
12716
12879
  'apiEndpointKey',
12717
12880
  'apiUrlEntry',
12881
+ 'schemaUrl',
12882
+ 'readUrl',
12718
12883
  'submitUrl',
12719
12884
  'submitMethod',
12720
12885
  'responseSchemaUrl',
12721
12886
  'customEndpoints',
12722
12887
  'configPersistenceStrategy',
12888
+ 'layoutPolicy',
12723
12889
  'mode',
12724
12890
  'actions',
12725
12891
  'enableCustomization',
@@ -12727,6 +12893,7 @@ class SurfaceOpenMaterializerService {
12727
12893
  'readonlyModeGlobal',
12728
12894
  'disabledModeGlobal',
12729
12895
  'presentationModeGlobal',
12896
+ 'fieldIconPolicy',
12730
12897
  'visibleGlobal',
12731
12898
  'layout',
12732
12899
  'backConfig',
@@ -12740,186 +12907,6 @@ class SurfaceOpenMaterializerService {
12740
12907
  ]);
12741
12908
  return Object.fromEntries(Object.entries(inputs).filter(([key]) => supported.has(key)));
12742
12909
  }
12743
- buildLocalFormConfig(data, schemaFields = []) {
12744
- const fields = this.buildMaterializedFormFields(data, schemaFields);
12745
- const sections = this.buildMaterializedFormSections(fields);
12746
- return {
12747
- sections,
12748
- fieldMetadata: fields,
12749
- };
12750
- }
12751
- buildMaterializedFormFields(data, schemaFields) {
12752
- const schemaByName = new Map(schemaFields
12753
- .filter((field) => !!field?.name)
12754
- .map((field) => [field.name, field]));
12755
- const orderedNames = schemaFields.length
12756
- ? [
12757
- ...schemaFields
12758
- .filter((field) => field?.name && Object.prototype.hasOwnProperty.call(data, field.name))
12759
- .sort((left, right) => (left.order ?? Number.MAX_SAFE_INTEGER) - (right.order ?? Number.MAX_SAFE_INTEGER))
12760
- .map((field) => field.name),
12761
- ...Object.keys(data).filter((key) => !schemaByName.has(key)),
12762
- ]
12763
- : Object.keys(data);
12764
- return orderedNames
12765
- .filter((key, index, keys) => keys.indexOf(key) === index)
12766
- .filter((key) => this.shouldRenderMaterializedFormField(key, data[key], schemaByName.get(key), data))
12767
- .map((key) => {
12768
- const field = schemaByName.get(key);
12769
- if (field) {
12770
- return {
12771
- ...mapFieldDefinitionToMetadata({
12772
- ...field,
12773
- hidden: false,
12774
- formHidden: false,
12775
- readOnly: true,
12776
- }),
12777
- readOnly: true,
12778
- };
12779
- }
12780
- return {
12781
- name: key,
12782
- label: this.humanizeFieldName(key),
12783
- controlType: this.inferFormControlType(data[key]),
12784
- readOnly: true,
12785
- };
12786
- });
12787
- }
12788
- buildMaterializedFormSections(fields) {
12789
- const groups = new Map();
12790
- for (const field of fields) {
12791
- const group = String(field.group || '').trim() || 'Detalhes';
12792
- groups.set(group, [...(groups.get(group) || []), field]);
12793
- }
12794
- return Array.from(groups.entries()).map(([group, groupFields], sectionIndex) => {
12795
- const fieldNames = groupFields.map((field) => field.name);
12796
- const rows = this.chunk(fieldNames, 2).map((names, rowIndex) => ({
12797
- id: `row-${sectionIndex + 1}-${rowIndex + 1}`,
12798
- columns: names.map((name) => ({
12799
- id: `col-${name}`,
12800
- fields: [name],
12801
- })),
12802
- }));
12803
- return {
12804
- id: this.stableSectionId(group, sectionIndex),
12805
- title: group,
12806
- rows,
12807
- };
12808
- });
12809
- }
12810
- shouldRenderMaterializedFormField(key, value, field, data) {
12811
- if (!key || key.startsWith('_'))
12812
- return false;
12813
- if (field?.hidden === true)
12814
- return false;
12815
- if (this.isTechnicalRelationIdField(key, field, data))
12816
- return false;
12817
- if (this.isDuplicateMediaUrlField(key, value, field, data))
12818
- return false;
12819
- if (field?.formHidden === true && !this.isResolvedDisplayCompanionField(key, data)) {
12820
- return false;
12821
- }
12822
- if (value == null)
12823
- return true;
12824
- return typeof value !== 'object' || value instanceof Date;
12825
- }
12826
- isTechnicalRelationIdField(key, field, data) {
12827
- if (key === 'id' || !/Id$/.test(key))
12828
- return false;
12829
- const base = key.slice(0, -2);
12830
- const hasDisplayCompanion = this.hasDisplayCompanion(base, data);
12831
- if (!hasDisplayCompanion)
12832
- return false;
12833
- const controlType = String(field?.controlType || '').toLowerCase();
12834
- return Boolean(field?.endpoint
12835
- || field?.resourcePath
12836
- || field?.optionSource
12837
- || controlType.includes('select')
12838
- || field?.tableHidden === true);
12839
- }
12840
- isResolvedDisplayCompanionField(key, data) {
12841
- const base = this.resolveDisplayCompanionBase(key);
12842
- return !!base && Object.prototype.hasOwnProperty.call(data, `${base}Id`);
12843
- }
12844
- resolveDisplayCompanionBase(key) {
12845
- const suffixes = ['Nome', 'Name', 'Label', 'Descricao', 'Description', 'Title', 'Text'];
12846
- const suffix = suffixes.find((candidate) => key.endsWith(candidate));
12847
- return suffix ? key.slice(0, -suffix.length) : null;
12848
- }
12849
- hasDisplayCompanion(base, data) {
12850
- const suffixes = ['Nome', 'Name', 'Label', 'Descricao', 'Description', 'Title', 'Text'];
12851
- return suffixes.some((suffix) => {
12852
- const value = data[`${base}${suffix}`];
12853
- return value != null && String(value).trim().length > 0;
12854
- });
12855
- }
12856
- isDuplicateMediaUrlField(key, value, field, data) {
12857
- if (typeof value !== 'string' || !this.looksLikeMediaUrlField(key, field)) {
12858
- return false;
12859
- }
12860
- return Object.entries(data).some(([candidateKey, candidateValue]) => {
12861
- if (candidateKey === key || candidateValue !== value) {
12862
- return false;
12863
- }
12864
- return this.looksLikeAvatarFieldName(candidateKey);
12865
- });
12866
- }
12867
- looksLikeMediaUrlField(key, field) {
12868
- const type = String(field?.type || '').toLowerCase();
12869
- const controlType = String(field?.controlType || '').toLowerCase();
12870
- const normalized = key.toLowerCase();
12871
- return Boolean(type === 'url'
12872
- || controlType.includes('url')
12873
- || normalized.includes('url')
12874
- || normalized.includes('foto')
12875
- || normalized.includes('photo')
12876
- || normalized.includes('image')
12877
- || normalized.includes('imagem'));
12878
- }
12879
- looksLikeAvatarFieldName(key) {
12880
- const normalized = key.toLowerCase();
12881
- return normalized.includes('avatar') || normalized.includes('portrait');
12882
- }
12883
- inferFormControlType(value) {
12884
- if (typeof value === 'boolean')
12885
- return 'checkbox';
12886
- if (typeof value === 'number')
12887
- return 'numericTextBox';
12888
- if (typeof value === 'string') {
12889
- if (/^\d{4}-\d{2}-\d{2}$/.test(value))
12890
- return 'dateInput';
12891
- if (/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(value))
12892
- return 'email';
12893
- }
12894
- return 'input';
12895
- }
12896
- humanizeFieldName(key) {
12897
- return key
12898
- .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
12899
- .replace(/[_-]+/g, ' ')
12900
- .replace(/\s+/g, ' ')
12901
- .trim()
12902
- .replace(/^./, (char) => char.toUpperCase());
12903
- }
12904
- stableSectionId(group, index) {
12905
- if (group === 'Detalhes') {
12906
- return 'details';
12907
- }
12908
- const normalized = group
12909
- .normalize('NFD')
12910
- .replace(/[\u0300-\u036f]/g, '')
12911
- .toLowerCase()
12912
- .replace(/[^a-z0-9]+/g, '-')
12913
- .replace(/^-+|-+$/g, '');
12914
- return normalized || `details-${index + 1}`;
12915
- }
12916
- chunk(items, size) {
12917
- const result = [];
12918
- for (let index = 0; index < items.length; index += size) {
12919
- result.push(items.slice(index, index + size));
12920
- }
12921
- return result;
12922
- }
12923
12910
  shouldMaterializeItemReadProjection(payload) {
12924
12911
  const surface = payload.context?.['surface'];
12925
12912
  const kind = String(surface?.['kind'] || '').toUpperCase();
@@ -13002,6 +12989,8 @@ class SurfaceOpenMaterializerService {
13002
12989
  bindingOrder: [
13003
12990
  'tableId',
13004
12991
  'componentInstanceId',
12992
+ 'configPersistenceStrategy',
12993
+ 'resourcePath',
13005
12994
  'title',
13006
12995
  'subtitle',
13007
12996
  'icon',
@@ -13009,11 +12998,17 @@ class SurfaceOpenMaterializerService {
13009
12998
  'config',
13010
12999
  'enableCustomization',
13011
13000
  ],
13001
+ outputs: {
13002
+ rowClick: 'emit',
13003
+ selectionChange: 'emit',
13004
+ widgetEvent: 'emit',
13005
+ },
13012
13006
  inputs: {
13013
13007
  ...tableInputOverrides,
13014
13008
  resourcePath: '',
13015
13009
  tableId: String(previousInputs['tableId'] || this.stableSurfaceId(payload)),
13016
13010
  componentInstanceId: `${this.stableSurfaceId(payload)}.${resourceId}`,
13011
+ configPersistenceStrategy: previousInputs['configPersistenceStrategy'] ?? 'volatile',
13017
13012
  title: payload.title,
13018
13013
  subtitle: payload.subtitle,
13019
13014
  icon: payload.icon,
@@ -13029,6 +13024,52 @@ class SurfaceOpenMaterializerService {
13029
13024
  }),
13030
13025
  };
13031
13026
  }
13027
+ ensureCollectionTableSelectionContract(payload) {
13028
+ if (payload.widget?.id !== 'praxis-table') {
13029
+ return payload;
13030
+ }
13031
+ const inputs = payload.widget.inputs || {};
13032
+ return {
13033
+ ...payload,
13034
+ widget: {
13035
+ ...payload.widget,
13036
+ outputs: {
13037
+ ...(payload.widget.outputs || {}),
13038
+ rowClick: 'emit',
13039
+ selectionChange: 'emit',
13040
+ widgetEvent: 'emit',
13041
+ },
13042
+ inputs: {
13043
+ ...inputs,
13044
+ config: this.ensureTableSelectionConfig(inputs['config']),
13045
+ },
13046
+ },
13047
+ };
13048
+ }
13049
+ ensureTableSelectionConfig(config) {
13050
+ if (!config || typeof config !== 'object' || Array.isArray(config)) {
13051
+ return config;
13052
+ }
13053
+ const tableConfig = config;
13054
+ const rawBehavior = tableConfig['behavior'];
13055
+ const behavior = (rawBehavior && typeof rawBehavior === 'object' && !Array.isArray(rawBehavior)
13056
+ ? rawBehavior
13057
+ : {});
13058
+ if (behavior['selection'] && typeof behavior['selection'] === 'object') {
13059
+ return config;
13060
+ }
13061
+ return {
13062
+ ...tableConfig,
13063
+ behavior: {
13064
+ ...behavior,
13065
+ selection: {
13066
+ enabled: true,
13067
+ type: 'single',
13068
+ mode: 'both',
13069
+ },
13070
+ },
13071
+ };
13072
+ }
13032
13073
  projectTableInputs(inputs) {
13033
13074
  const supported = new Set([
13034
13075
  'tableId',
@@ -13065,6 +13106,11 @@ class SurfaceOpenMaterializerService {
13065
13106
  behavior: {
13066
13107
  localDataMode: { enabled: true },
13067
13108
  pagination: { enabled: true, pageSize: 10 },
13109
+ selection: {
13110
+ enabled: true,
13111
+ type: 'single',
13112
+ mode: 'both',
13113
+ },
13068
13114
  },
13069
13115
  };
13070
13116
  }
@@ -16247,10 +16293,16 @@ const VISUALIZATION_TONES = new Set([
16247
16293
  'critical',
16248
16294
  ]);
16249
16295
  const TABLE_SAFE_KINDS = new Set([
16296
+ 'line',
16297
+ 'area',
16298
+ 'column',
16250
16299
  'comparison',
16251
16300
  'stackedBar',
16301
+ 'radial',
16302
+ 'harveyBall',
16252
16303
  'bullet',
16253
16304
  'delta',
16305
+ 'processFlow',
16254
16306
  ]);
16255
16307
  function normalizePraxisPresentationVisualization(value) {
16256
16308
  if (!value || typeof value !== 'object') {
@@ -16265,6 +16317,7 @@ function normalizePraxisPresentationVisualization(value) {
16265
16317
  const size = normalizeEnum$1(value.size, VISUALIZATION_SIZES);
16266
16318
  const tone = normalizeEnum$1(value.tone, VISUALIZATION_TONES);
16267
16319
  const ariaLabel = normalizeText$1(value.ariaLabel);
16320
+ const valueSuffix = normalizeText$1(value.valueSuffix);
16268
16321
  return {
16269
16322
  kind,
16270
16323
  fallbackText,
@@ -16272,8 +16325,10 @@ function normalizePraxisPresentationVisualization(value) {
16272
16325
  ...(size ? { size } : {}),
16273
16326
  ...(tone ? { tone } : {}),
16274
16327
  ...(ariaLabel ? { ariaLabel } : {}),
16328
+ ...(valueSuffix ? { valueSuffix } : {}),
16275
16329
  ...(Object.prototype.hasOwnProperty.call(value, 'value') ? { value: value.value } : {}),
16276
16330
  ...(normalizeExpression(value.valueExpr, 'valueExpr') ?? {}),
16331
+ ...(normalizeExpression(value.valueSuffixExpr, 'valueSuffixExpr') ?? {}),
16277
16332
  ...(normalizeNumber(value.total, 'total') ?? {}),
16278
16333
  ...(normalizeExpression(value.totalExpr, 'totalExpr') ?? {}),
16279
16334
  ...(normalizeNumber(value.target, 'target') ?? {}),
@@ -16311,6 +16366,18 @@ function renderPraxisPresentationVisualizationHtml(value, options = {}) {
16311
16366
  return renderBulletVisualizationHtml(visualization, options);
16312
16367
  case 'delta':
16313
16368
  return renderDeltaVisualizationHtml(visualization, options);
16369
+ case 'radial':
16370
+ return renderRadialVisualizationHtml(visualization, options);
16371
+ case 'harveyBall':
16372
+ return renderHarveyBallVisualizationHtml(visualization, options);
16373
+ case 'line':
16374
+ return renderLineVisualizationHtml(visualization, options);
16375
+ case 'area':
16376
+ return renderAreaVisualizationHtml(visualization, options);
16377
+ case 'column':
16378
+ return renderColumnVisualizationHtml(visualization, options);
16379
+ case 'processFlow':
16380
+ return renderProcessFlowVisualizationHtml(visualization, options);
16314
16381
  default:
16315
16382
  return `<span class="pfx-micro-viz__fallback">${escapeHtml$1(visualization.fallbackText)}</span>`;
16316
16383
  }
@@ -16357,26 +16424,61 @@ function renderStackedBarVisualizationHtml(visualization, options) {
16357
16424
  <span class="pfx-micro-viz__meta">${meta}</span>
16358
16425
  </span>`;
16359
16426
  }
16427
+ function resolveBulletMax(visualization) {
16428
+ const thresholds = visualization.thresholds ?? [];
16429
+ const values = [
16430
+ toFiniteNumber(visualization.value) ?? 0,
16431
+ visualization.target ?? 0,
16432
+ visualization.total ?? 0,
16433
+ ...thresholds.map(t => t.value)
16434
+ ].filter(v => Number.isFinite(v) && v > 0);
16435
+ return Math.max(...values, 100);
16436
+ }
16360
16437
  function renderBulletVisualizationHtml(visualization, options) {
16361
16438
  const currentValue = toFiniteNumber(visualization.value) ?? 0;
16362
- const total = visualization.total && visualization.total > 0 ? visualization.total : 100;
16439
+ const max = resolveBulletMax(visualization);
16363
16440
  const target = toFiniteNumber(visualization.target);
16364
- const targetLeft = target === undefined ? null : percent(target, total);
16441
+ const targetLeft = target === undefined ? null : percent(target, max);
16442
+ const isTable = visualization.surface === 'table-cell';
16443
+ // thresholds
16444
+ const thresholds = visualization.thresholds ?? [];
16445
+ let previous = 0;
16446
+ const bands = thresholds.map(t => {
16447
+ const current = Math.max(t.value, previous);
16448
+ const left = max > 0 ? percent(previous, max) : '0';
16449
+ const width = max > 0 ? percent(current - previous, max) : '0';
16450
+ previous = current;
16451
+ return { left, width, tone: t.tone ?? 'info' };
16452
+ }).filter(b => parseFloat(b.width) > 0);
16453
+ const bandsHtml = bands.map(b => `<span class="pfx-micro-bullet__range" data-tone="${escapeHtml$1(b.tone)}" style="left: ${b.left}%; width: ${b.width}%;"></span>`).join('');
16454
+ const topHtml = isTable ? '' : `
16455
+ <div class="pfx-micro-bullet__top">
16456
+ <span class="pfx-micro-bullet__label">${escapeHtml$1(visualization.fallbackText)}</span>
16457
+ <span class="pfx-micro-bullet__value">
16458
+ ${escapeHtml$1(formatMicroNumber(currentValue, options.locale))}
16459
+ ${target === undefined ? '' : `<span class="pfx-micro-bullet__target-val">/ Target: ${escapeHtml$1(formatMicroNumber(target, options.locale))}</span>`}
16460
+ </span>
16461
+ </div>`;
16462
+ const bottomHtml = isTable ? '' : `
16463
+ <div class="pfx-micro-bullet__bottom">
16464
+ <span>${escapeHtml$1(formatMicroNumber(visualization.baseline ?? 0, options.locale))}</span>
16465
+ <span>${escapeHtml$1(formatMicroNumber(max, options.locale))}</span>
16466
+ </div>`;
16365
16467
  return `
16366
16468
  <span class="pfx-micro-viz pfx-micro-viz__bullet" data-tone="${escapeHtml$1(visualization.tone ?? 'info')}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
16367
- <span class="pfx-micro-viz__track">
16368
- <span class="pfx-micro-viz__bar" style="width:${percent(currentValue, total)}%"></span>
16369
- ${targetLeft === null ? '' : `<span class="pfx-micro-viz__target" style="left:${targetLeft}%"></span>`}
16370
- </span>
16371
- <span class="pfx-micro-viz__meta">
16372
- <span>${escapeHtml$1(formatMicroNumber(currentValue, options.locale))}</span>
16373
- ${target === undefined ? '' : `<span>${escapeHtml$1(formatMicroNumber(target, options.locale))}</span>`}
16469
+ ${topHtml}
16470
+ <span class="pfx-micro-bullet__track">
16471
+ ${bandsHtml}
16472
+ <span class="pfx-micro-bullet__actual" data-tone="${escapeHtml$1(visualization.tone ?? 'info')}" style="width: ${percent(currentValue, max)}%;"></span>
16473
+ ${targetLeft === null ? '' : `<span class="pfx-micro-bullet__target" style="left: ${targetLeft}%;"></span>`}
16374
16474
  </span>
16475
+ ${bottomHtml}
16375
16476
  </span>`;
16376
16477
  }
16377
16478
  function renderDeltaVisualizationHtml(visualization, options) {
16378
16479
  const value = toFiniteNumber(visualization.value);
16379
- const symbol = value === undefined ? '=' : value < 0 ? '-' : value > 0 ? '+' : '=';
16480
+ const direction = value === undefined ? 'neutral' : value < 0 ? 'down' : value > 0 ? 'up' : 'neutral';
16481
+ const symbol = direction === 'up' ? '&#9650;' : direction === 'down' ? '&#9660;' : '&rarr;';
16380
16482
  const tone = visualization.tone ??
16381
16483
  (value === undefined
16382
16484
  ? 'neutral'
@@ -16385,12 +16487,19 @@ function renderDeltaVisualizationHtml(visualization, options) {
16385
16487
  : value > 0
16386
16488
  ? 'success'
16387
16489
  : 'neutral');
16490
+ const valueSuffix = visualization.valueSuffix ?? '';
16388
16491
  const text = value === undefined
16389
16492
  ? visualization.fallbackText
16390
- : formatMicroNumber(value, options.locale);
16493
+ : `${formatMicroNumber(Math.abs(value), options.locale)}${valueSuffix}`;
16494
+ const directionLabel = direction === 'up'
16495
+ ? 'up'
16496
+ : direction === 'down'
16497
+ ? 'down'
16498
+ : 'stable';
16499
+ const aria = visualization.ariaLabel ?? `${visualization.fallbackText}: ${directionLabel} ${text}`;
16391
16500
  return `
16392
- <span class="pfx-micro-viz pfx-micro-viz__delta" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
16393
- <span class="pfx-micro-viz__delta-symbol">${symbol}</span>
16501
+ <span class="pfx-micro-viz pfx-micro-viz__delta" data-tone="${escapeHtml$1(tone)}" data-direction="${escapeHtml$1(direction)}" role="img" aria-label="${escapeHtml$1(aria)}">
16502
+ <span class="pfx-micro-viz__delta-symbol" aria-hidden="true">${symbol}</span>
16394
16503
  <span>${escapeHtml$1(text)}</span>
16395
16504
  </span>`;
16396
16505
  }
@@ -16505,6 +16614,268 @@ function normalizeText$1(value) {
16505
16614
  const trimmed = value.trim();
16506
16615
  return trimmed.length ? trimmed : undefined;
16507
16616
  }
16617
+ function renderRadialVisualizationHtml(visualization, options) {
16618
+ const value = toFiniteNumber(visualization.value) ?? 0;
16619
+ const total = visualization.total && visualization.total > 0 ? visualization.total : 100;
16620
+ const pct = Math.max(0, Math.min(100, (value / total) * 100));
16621
+ const tone = visualization.tone ?? 'info';
16622
+ const dashArray = `${pct.toFixed(1)}, 100`;
16623
+ const pctText = `${Math.round(pct)}%`;
16624
+ const aria = visualization.ariaLabel ?? `${visualization.fallbackText} (${pctText})`;
16625
+ const isTable = visualization.surface === 'table-cell';
16626
+ const svgText = isTable
16627
+ ? ''
16628
+ : `<text x="18" y="21" class="pfx-micro-radial-svg__text">${escapeHtml$1(pctText)}</text>`;
16629
+ const externalText = isTable
16630
+ ? `<span class="pfx-micro-radial-value">${escapeHtml$1(pctText)}</span>`
16631
+ : '';
16632
+ return `
16633
+ <span class="pfx-micro-viz pfx-micro-viz__radial" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(aria)}">
16634
+ <svg class="pfx-micro-radial-svg" viewBox="0 0 36 36">
16635
+ <circle class="pfx-micro-radial-svg__track" cx="18" cy="18" r="15.9155" />
16636
+ <circle class="pfx-micro-radial-svg__bar" cx="18" cy="18" r="15.9155" stroke-dasharray="${dashArray}" transform="rotate(-90 18 18)" />
16637
+ ${svgText}
16638
+ </svg>
16639
+ ${externalText}
16640
+ </span>`;
16641
+ }
16642
+ function renderHarveyBallVisualizationHtml(visualization, options) {
16643
+ const value = toFiniteNumber(visualization.value) ?? 0;
16644
+ const total = visualization.total && visualization.total > 0 ? visualization.total : 100;
16645
+ const pct = Math.max(0, Math.min(100, (value / total) * 100));
16646
+ const tone = visualization.tone ?? 'info';
16647
+ const strokeLength = pct * 0.50265;
16648
+ const dashArray = `${strokeLength.toFixed(3)} 50.265`;
16649
+ const aria = visualization.ariaLabel ?? `${visualization.fallbackText} (${Math.round(pct)}%)`;
16650
+ return `
16651
+ <span class="pfx-micro-viz pfx-micro-viz__harvey" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(aria)}">
16652
+ <svg class="pfx-micro-harvey-svg" viewBox="0 0 36 36">
16653
+ <circle class="pfx-micro-harvey-svg__track" cx="18" cy="18" r="16" />
16654
+ <circle class="pfx-micro-harvey-svg__bar" cx="18" cy="18" r="8" stroke-dasharray="${dashArray}" transform="rotate(-90 18 18)" />
16655
+ </svg>
16656
+ <span class="pfx-micro-harvey-fraction">
16657
+ <strong>${escapeHtml$1(formatMicroNumber(value, options.locale))}</strong>
16658
+ <span class="pfx-separator">/</span>
16659
+ <span class="pfx-total">${escapeHtml$1(formatMicroNumber(total, options.locale))}</span>
16660
+ </span>
16661
+ </span>`;
16662
+ }
16663
+ function getPointsCoordinates(points, width, height, padding) {
16664
+ if (points.length < 2)
16665
+ return [];
16666
+ const values = points.map(p => p.value);
16667
+ const minVal = Math.min(...values);
16668
+ const maxVal = Math.max(...values);
16669
+ const valRange = maxVal - minVal === 0 ? 1 : maxVal - minVal;
16670
+ return points.map((p, index) => {
16671
+ const x = padding + (index / (points.length - 1)) * (width - 2 * padding);
16672
+ const y = height - padding - ((p.value - minVal) / valRange) * (height - 2 * padding);
16673
+ return { x, y };
16674
+ });
16675
+ }
16676
+ function renderLineVisualizationHtml(visualization, options) {
16677
+ const points = visualization.points ?? [];
16678
+ const tone = visualization.tone ?? 'info';
16679
+ if (points.length < 2) {
16680
+ return renderFallbackVisualizationHtml(visualization, tone);
16681
+ }
16682
+ const width = 100;
16683
+ const height = 30;
16684
+ const padding = 4;
16685
+ const coords = getPointsCoordinates(points, width, height, padding);
16686
+ const pathD = coords.map((c, i) => `${i === 0 ? 'M' : 'L'} ${c.x.toFixed(1)} ${c.y.toFixed(1)}`).join(' ');
16687
+ // Highlight extreme/boundary values
16688
+ let minIdx = 0;
16689
+ let maxIdx = 0;
16690
+ for (let i = 1; i < points.length; i++) {
16691
+ if (points[i].value < points[minIdx].value)
16692
+ minIdx = i;
16693
+ if (points[i].value > points[maxIdx].value)
16694
+ maxIdx = i;
16695
+ }
16696
+ const markers = [
16697
+ { x: coords[0].x, y: coords[0].y, tone: points[0].tone ?? tone },
16698
+ { x: coords[coords.length - 1].x, y: coords[coords.length - 1].y, tone: points[points.length - 1].tone ?? tone }
16699
+ ];
16700
+ if (minIdx !== 0 && minIdx !== coords.length - 1) {
16701
+ markers.push({ x: coords[minIdx].x, y: coords[minIdx].y, tone: points[minIdx].tone ?? 'danger' });
16702
+ }
16703
+ if (maxIdx !== 0 && maxIdx !== coords.length - 1) {
16704
+ markers.push({ x: coords[maxIdx].x, y: coords[maxIdx].y, tone: points[maxIdx].tone ?? 'success' });
16705
+ }
16706
+ const circlesHtml = markers.map(c => `<circle cx="${c.x.toFixed(1)}" cy="${c.y.toFixed(1)}" r="2.5" class="pfx-micro-trend__marker" data-tone="${escapeHtml$1(c.tone)}" />`).join('');
16707
+ const isTable = visualization.surface === 'table-cell';
16708
+ const firstPoint = points[0];
16709
+ const lastPoint = points[points.length - 1];
16710
+ const leftHtml = isTable ? '' : `
16711
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--start">
16712
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(firstPoint.value, options.locale))}</span>
16713
+ ${firstPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(firstPoint.label)}</span>` : ''}
16714
+ </div>`;
16715
+ const rightHtml = isTable ? '' : `
16716
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--end">
16717
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(lastPoint.value, options.locale))}</span>
16718
+ ${lastPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(lastPoint.label)}</span>` : ''}
16719
+ </div>`;
16720
+ return `
16721
+ <span class="pfx-micro-viz-container">
16722
+ ${leftHtml}
16723
+ <span class="pfx-micro-viz pfx-micro-viz__line" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
16724
+ <svg class="pfx-micro-line__svg" viewBox="0 0 100 30">
16725
+ <path class="pfx-micro-line__path" d="${pathD}" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
16726
+ ${circlesHtml}
16727
+ </svg>
16728
+ </span>
16729
+ ${rightHtml}
16730
+ </span>`;
16731
+ }
16732
+ function renderAreaVisualizationHtml(visualization, options) {
16733
+ const points = visualization.points ?? [];
16734
+ const tone = visualization.tone ?? 'info';
16735
+ if (points.length < 2) {
16736
+ return renderFallbackVisualizationHtml(visualization, tone);
16737
+ }
16738
+ const width = 100;
16739
+ const height = 30;
16740
+ const padding = 4;
16741
+ const coords = getPointsCoordinates(points, width, height, padding);
16742
+ const lineD = coords.map((c, i) => `${i === 0 ? 'M' : 'L'} ${c.x.toFixed(1)} ${c.y.toFixed(1)}`).join(' ');
16743
+ const firstX = coords[0].x.toFixed(1);
16744
+ const lastX = coords[coords.length - 1].x.toFixed(1);
16745
+ const areaD = `${lineD} L ${lastX} ${height} L ${firstX} ${height} Z`;
16746
+ // Highlight extreme/boundary values
16747
+ let minIdx = 0;
16748
+ let maxIdx = 0;
16749
+ for (let i = 1; i < points.length; i++) {
16750
+ if (points[i].value < points[minIdx].value)
16751
+ minIdx = i;
16752
+ if (points[i].value > points[maxIdx].value)
16753
+ maxIdx = i;
16754
+ }
16755
+ const markers = [
16756
+ { x: coords[0].x, y: coords[0].y, tone: points[0].tone ?? tone },
16757
+ { x: coords[coords.length - 1].x, y: coords[coords.length - 1].y, tone: points[points.length - 1].tone ?? tone }
16758
+ ];
16759
+ if (minIdx !== 0 && minIdx !== coords.length - 1) {
16760
+ markers.push({ x: coords[minIdx].x, y: coords[minIdx].y, tone: points[minIdx].tone ?? 'danger' });
16761
+ }
16762
+ if (maxIdx !== 0 && maxIdx !== coords.length - 1) {
16763
+ markers.push({ x: coords[maxIdx].x, y: coords[maxIdx].y, tone: points[maxIdx].tone ?? 'success' });
16764
+ }
16765
+ const circlesHtml = markers.map(c => `<circle cx="${c.x.toFixed(1)}" cy="${c.y.toFixed(1)}" r="2.5" class="pfx-micro-trend__marker" data-tone="${escapeHtml$1(c.tone)}" />`).join('');
16766
+ const isTable = visualization.surface === 'table-cell';
16767
+ const firstPoint = points[0];
16768
+ const lastPoint = points[points.length - 1];
16769
+ const leftHtml = isTable ? '' : `
16770
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--start">
16771
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(firstPoint.value, options.locale))}</span>
16772
+ ${firstPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(firstPoint.label)}</span>` : ''}
16773
+ </div>`;
16774
+ const rightHtml = isTable ? '' : `
16775
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--end">
16776
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(lastPoint.value, options.locale))}</span>
16777
+ ${lastPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(lastPoint.label)}</span>` : ''}
16778
+ </div>`;
16779
+ return `
16780
+ <span class="pfx-micro-viz-container">
16781
+ ${leftHtml}
16782
+ <span class="pfx-micro-viz pfx-micro-viz__area" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
16783
+ <svg class="pfx-micro-area__svg" viewBox="0 0 100 30">
16784
+ <path class="pfx-micro-area__fill" d="${areaD}" fill="currentColor" fill-opacity="0.15" />
16785
+ <path class="pfx-micro-area__path" d="${lineD}" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
16786
+ ${circlesHtml}
16787
+ </svg>
16788
+ </span>
16789
+ ${rightHtml}
16790
+ </span>`;
16791
+ }
16792
+ function renderColumnVisualizationHtml(visualization, options) {
16793
+ const points = visualization.points ?? [];
16794
+ const tone = visualization.tone ?? 'info';
16795
+ if (points.length === 0) {
16796
+ return renderFallbackVisualizationHtml(visualization, tone);
16797
+ }
16798
+ const width = 100;
16799
+ const height = 30;
16800
+ const padding = 4;
16801
+ const values = points.map(p => p.value);
16802
+ const maxVal = Math.max(...values, 0);
16803
+ const minVal = Math.min(...values, 0);
16804
+ const valRange = maxVal - minVal === 0 ? 1 : maxVal - minVal;
16805
+ const colWidth = Math.max(2, (width - 2 * padding) / points.length - 2);
16806
+ const columnsHtml = points.map((p, i) => {
16807
+ const x = padding + i * ((width - 2 * padding) / points.length) + 1;
16808
+ const rectHeight = Math.max(2, ((p.value - minVal) / valRange) * (height - 2 * padding));
16809
+ const rectY = height - padding - rectHeight;
16810
+ const itemTone = p.tone ?? tone;
16811
+ return `<rect class="pfx-micro-column__bar" x="${x.toFixed(1)}" y="${rectY.toFixed(1)}" width="${colWidth.toFixed(1)}" height="${rectHeight.toFixed(1)}" fill="currentColor" data-tone="${escapeHtml$1(itemTone)}" />`;
16812
+ }).join('');
16813
+ const isTable = visualization.surface === 'table-cell';
16814
+ const firstPoint = points[0];
16815
+ const lastPoint = points[points.length - 1];
16816
+ const leftHtml = isTable ? '' : `
16817
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--start">
16818
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(firstPoint.value, options.locale))}</span>
16819
+ ${firstPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(firstPoint.label)}</span>` : ''}
16820
+ </div>`;
16821
+ const rightHtml = isTable ? '' : `
16822
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--end">
16823
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(lastPoint.value, options.locale))}</span>
16824
+ ${lastPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(lastPoint.label)}</span>` : ''}
16825
+ </div>`;
16826
+ return `
16827
+ <span class="pfx-micro-viz-container">
16828
+ ${leftHtml}
16829
+ <span class="pfx-micro-viz pfx-micro-viz__column" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
16830
+ <svg class="pfx-micro-column__svg" viewBox="0 0 100 30">
16831
+ ${columnsHtml}
16832
+ </svg>
16833
+ </span>
16834
+ ${rightHtml}
16835
+ </span>`;
16836
+ }
16837
+ function renderProcessFlowVisualizationHtml(visualization, options) {
16838
+ const items = visualization.items ?? [];
16839
+ if (items.length === 0) {
16840
+ return renderFallbackVisualizationHtml(visualization, visualization.tone ?? 'neutral');
16841
+ }
16842
+ const isTable = visualization.surface === 'table-cell';
16843
+ const stepLabels = items.map((item, index) => item.label ?? item.id ?? `${index + 1}`);
16844
+ const aria = visualization.ariaLabel ?? `${visualization.fallbackText}: ${stepLabels.join(' > ')}`;
16845
+ const stepsHtml = items.map((item, index) => {
16846
+ const itemTone = item.tone ?? 'neutral';
16847
+ const itemState = item.state ?? '';
16848
+ const isLast = index === items.length - 1;
16849
+ const itemLabel = stepLabels[index];
16850
+ const label = !isTable && item.label ? `<span class="pfx-micro-step__label">${escapeHtml$1(item.label)}</span>` : '';
16851
+ const connector = !isLast ? `<span class="pfx-micro-step__connector" data-tone="${escapeHtml$1(itemTone)}"></span>` : '';
16852
+ const stepCircle = `
16853
+ <span class="pfx-micro-step__node" data-tone="${escapeHtml$1(itemTone)}" aria-hidden="true">
16854
+ ${item.icon ? `<span class="material-icons pfx-micro-step__icon" aria-hidden="true">${escapeHtml$1(item.icon)}</span>` : `${index + 1}`}
16855
+ </span>`;
16856
+ return `
16857
+ <div class="pfx-micro-step" data-state="${escapeHtml$1(itemState)}" data-tone="${escapeHtml$1(itemTone)}">
16858
+ <div class="pfx-micro-step__node-wrapper" title="${escapeHtml$1(itemLabel)}">
16859
+ ${stepCircle}
16860
+ ${label}
16861
+ </div>
16862
+ ${connector}
16863
+ </div>`;
16864
+ }).join('');
16865
+ return `
16866
+ <span class="pfx-micro-viz pfx-micro-viz__process" role="img" aria-label="${escapeHtml$1(aria)}">
16867
+ ${stepsHtml}
16868
+ </span>`;
16869
+ }
16870
+ function renderFallbackVisualizationHtml(visualization, tone) {
16871
+ return `
16872
+ <span
16873
+ class="pfx-micro-viz pfx-micro-viz__fallback"
16874
+ data-tone="${escapeHtml$1(tone)}"
16875
+ role="img"
16876
+ aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}"
16877
+ >${escapeHtml$1(visualization.fallbackText)}</span>`;
16878
+ }
16508
16879
 
16509
16880
  const TONES = new Set([
16510
16881
  'neutral',
@@ -20207,6 +20578,274 @@ const ValidationPattern = {
20207
20578
  CUSTOM: '',
20208
20579
  };
20209
20580
 
20581
+ function materializeFormLayoutFromMetadata(fields, options = {}) {
20582
+ const policy = normalizeLayoutPolicy(options.policy);
20583
+ const visibleFields = normalizeFields(fields, options.includeHidden === true);
20584
+ const groupedFields = groupFields(visibleFields);
20585
+ const sections = groupedFields.map(([groupKey, groupFields], sectionIndex) => createSection(groupKey, groupFields, sectionIndex, policy, options));
20586
+ return ensureIds({
20587
+ sections,
20588
+ fieldMetadata: fieldsForPolicy(visibleFields, policy),
20589
+ metadata: {
20590
+ version: '1.0.0',
20591
+ lastUpdated: new Date(),
20592
+ source: 'schema',
20593
+ generatedLayoutPreset: policy.preset,
20594
+ schemaLayoutPolicy: policy,
20595
+ ...(policy.preset === 'compactPresentation'
20596
+ ? { presentationDensity: 'compact' }
20597
+ : {}),
20598
+ },
20599
+ });
20600
+ }
20601
+ function normalizeLayoutPolicy(policy) {
20602
+ const intent = policy?.intent ?? (policy?.preset === 'groupedCommand' ? 'command' : 'detail');
20603
+ const preset = policy?.preset ?? (intent === 'command' ? 'groupedCommand' : 'compactPresentation');
20604
+ return {
20605
+ source: policy?.source ?? 'authored',
20606
+ preset,
20607
+ intent,
20608
+ lifecycle: policy?.lifecycle ?? 'initial',
20609
+ persistence: policy?.persistence ?? 'authorable',
20610
+ detachBehavior: policy?.detachBehavior ?? 'none',
20611
+ schemaOperation: policy?.schemaOperation,
20612
+ schemaType: policy?.schemaType,
20613
+ };
20614
+ }
20615
+ function normalizeFields(fields, includeHidden) {
20616
+ return (fields || [])
20617
+ .filter((field) => !!field?.name)
20618
+ .filter((field) => includeHidden || !isFormHidden(field))
20619
+ .sort(compareFields);
20620
+ }
20621
+ function isFormHidden(field) {
20622
+ const anyField = field;
20623
+ return anyField.formHidden === true || anyField.hidden === true || anyField.visible === false;
20624
+ }
20625
+ function groupFields(fields) {
20626
+ const groups = new Map();
20627
+ for (const field of fields) {
20628
+ const groupKey = normalizeGroupLabel(field.group);
20629
+ groups.set(groupKey, [...(groups.get(groupKey) || []), field]);
20630
+ }
20631
+ return Array.from(groups.entries()).sort(([, left], [, right]) => compareGroupFields(left, right));
20632
+ }
20633
+ function createSection(groupKey, groupFields, sectionIndex, policy, options) {
20634
+ const title = groupKey === 'default'
20635
+ ? options.defaultSectionTitle || 'Informacoes'
20636
+ : groupKey;
20637
+ const sectionId = stableSectionId(groupKey);
20638
+ const presentationRole = resolvePresentationRole(groupKey, groupFields, options.presentationRoleMap);
20639
+ return {
20640
+ id: sectionId,
20641
+ title,
20642
+ ...(policy.preset === 'compactPresentation'
20643
+ ? {
20644
+ icon: resolvePresentationSectionIcon(presentationRole),
20645
+ sectionHeader: {
20646
+ mode: 'icon',
20647
+ size: 'sm',
20648
+ fallbackIcon: resolvePresentationSectionIcon(presentationRole),
20649
+ },
20650
+ className: [
20651
+ 'pdx-presentation-section',
20652
+ `pdx-presentation-section--${presentationRole}`,
20653
+ ].join(' '),
20654
+ presentationRole,
20655
+ appearance: 'plain',
20656
+ }
20657
+ : {}),
20658
+ rows: policy.preset === 'groupedCommand'
20659
+ ? createCommandRows(groupFields, sectionId)
20660
+ : createPresentationRows(groupFields, sectionId),
20661
+ };
20662
+ }
20663
+ function createPresentationRows(fields, sectionId) {
20664
+ const rows = [];
20665
+ let pending = [];
20666
+ let pendingSpan = 0;
20667
+ let rowIndex = 0;
20668
+ const flush = () => {
20669
+ if (!pending.length)
20670
+ return;
20671
+ rows.push({ id: `${sectionId}-row-${++rowIndex}`, columns: pending });
20672
+ pending = [];
20673
+ pendingSpan = 0;
20674
+ };
20675
+ for (const field of fields) {
20676
+ const span = hasExplicitWidth(field)
20677
+ ? resolveCommandSpan(field)
20678
+ : { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 };
20679
+ const mdSpan = span.md ?? 12;
20680
+ const column = {
20681
+ id: `${sectionId}-col-${field.name}`,
20682
+ fields: [field.name],
20683
+ items: [{ id: `${sectionId}-item-${field.name}`, kind: 'field', fieldName: field.name }],
20684
+ span,
20685
+ };
20686
+ if (mdSpan >= 12) {
20687
+ flush();
20688
+ pending = [column];
20689
+ flush();
20690
+ continue;
20691
+ }
20692
+ if (pendingSpan + mdSpan > 12) {
20693
+ flush();
20694
+ }
20695
+ pending.push(column);
20696
+ pendingSpan += mdSpan;
20697
+ }
20698
+ flush();
20699
+ return rows;
20700
+ }
20701
+ function createCommandRows(fields, sectionId) {
20702
+ const rows = [];
20703
+ let pending = [];
20704
+ let pendingSpan = 0;
20705
+ let rowIndex = 0;
20706
+ const flush = () => {
20707
+ if (!pending.length)
20708
+ return;
20709
+ rows.push({ id: `${sectionId}-row-${++rowIndex}`, columns: pending });
20710
+ pending = [];
20711
+ pendingSpan = 0;
20712
+ };
20713
+ for (const field of fields) {
20714
+ const span = resolveCommandSpan(field);
20715
+ const mdSpan = span.md ?? 12;
20716
+ const column = {
20717
+ id: `${sectionId}-col-${field.name}`,
20718
+ fields: [field.name],
20719
+ items: [{ id: `${sectionId}-item-${field.name}`, kind: 'field', fieldName: field.name }],
20720
+ span,
20721
+ };
20722
+ if (mdSpan >= 12) {
20723
+ flush();
20724
+ pending = [column];
20725
+ flush();
20726
+ continue;
20727
+ }
20728
+ if (pendingSpan + mdSpan > 12) {
20729
+ flush();
20730
+ }
20731
+ pending.push(column);
20732
+ pendingSpan += mdSpan;
20733
+ }
20734
+ flush();
20735
+ return rows;
20736
+ }
20737
+ function resolveCommandSpan(field) {
20738
+ const rawWidth = field.width;
20739
+ const numericWidth = typeof rawWidth === 'number'
20740
+ ? rawWidth
20741
+ : typeof rawWidth === 'string' && /^\d+$/.test(rawWidth.trim())
20742
+ ? Number(rawWidth.trim())
20743
+ : null;
20744
+ if (numericWidth != null && Number.isFinite(numericWidth)) {
20745
+ const span = Math.max(1, Math.min(12, Math.round(numericWidth)));
20746
+ return {
20747
+ xs: 12,
20748
+ sm: span >= 6 ? 12 : 6,
20749
+ md: span,
20750
+ lg: span,
20751
+ xl: span,
20752
+ };
20753
+ }
20754
+ const width = String(rawWidth || '').toLowerCase();
20755
+ const controlType = String(field.controlType || field.type || '').toLowerCase();
20756
+ if (width === 'full' ||
20757
+ width === 'xl' ||
20758
+ controlType.includes('textarea') ||
20759
+ controlType.includes('rich') ||
20760
+ controlType.includes('file') ||
20761
+ controlType.includes('autocomplete') ||
20762
+ controlType.includes('lookup')) {
20763
+ return { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 };
20764
+ }
20765
+ if (width === 'lg')
20766
+ return { xs: 12, sm: 12, md: 8, lg: 8, xl: 8 };
20767
+ if (width === 'md')
20768
+ return { xs: 12, sm: 12, md: 6, lg: 6, xl: 6 };
20769
+ if (width === 'sm')
20770
+ return { xs: 12, sm: 6, md: 4, lg: 4, xl: 4 };
20771
+ if (width === 'xs' || controlType.includes('checkbox') || controlType.includes('toggle')) {
20772
+ return { xs: 12, sm: 6, md: 3, lg: 3, xl: 3 };
20773
+ }
20774
+ return { xs: 12, sm: 12, md: 6, lg: 6, xl: 6 };
20775
+ }
20776
+ function hasExplicitWidth(field) {
20777
+ const rawWidth = field.width;
20778
+ return rawWidth !== undefined && rawWidth !== null && String(rawWidth).trim() !== '';
20779
+ }
20780
+ function fieldsForPolicy(fields, policy) {
20781
+ if (policy.preset !== 'compactPresentation') {
20782
+ return fields;
20783
+ }
20784
+ return fields.map((field) => ({
20785
+ ...field,
20786
+ readOnly: true,
20787
+ presentationMode: field.presentationMode ?? true,
20788
+ valuePresentation: {
20789
+ ...(field.valuePresentation || {}),
20790
+ density: (field.valuePresentation || {}).density ?? 'compact',
20791
+ },
20792
+ }));
20793
+ }
20794
+ function compareGroupFields(left, right) {
20795
+ return compareFields(left[0], right[0]);
20796
+ }
20797
+ function compareFields(left, right) {
20798
+ const leftOrder = typeof left?.order === 'number' ? left.order : Number.MAX_SAFE_INTEGER;
20799
+ const rightOrder = typeof right?.order === 'number' ? right.order : Number.MAX_SAFE_INTEGER;
20800
+ if (leftOrder !== rightOrder)
20801
+ return leftOrder - rightOrder;
20802
+ return String(left?.name || '').localeCompare(String(right?.name || ''));
20803
+ }
20804
+ function normalizeGroupLabel(group) {
20805
+ const value = String(group || '').trim();
20806
+ return value || 'default';
20807
+ }
20808
+ function resolvePresentationRole(groupName, fields, map) {
20809
+ const direct = map?.[groupName];
20810
+ if (direct)
20811
+ return direct;
20812
+ const normalized = stableToken(groupName);
20813
+ if (normalized.includes('ident'))
20814
+ return 'identity';
20815
+ if (normalized.includes('marc') || normalized.includes('status'))
20816
+ return 'markers';
20817
+ if (normalized.includes('regra') || normalized.includes('rule'))
20818
+ return 'rules';
20819
+ if (fields.some((field) => String(field.controlType || '').toLowerCase().includes('checkbox'))) {
20820
+ return 'markers';
20821
+ }
20822
+ return 'default';
20823
+ }
20824
+ function resolvePresentationSectionIcon(role) {
20825
+ switch (role) {
20826
+ case 'identity':
20827
+ return 'badge';
20828
+ case 'rules':
20829
+ return 'rule';
20830
+ case 'markers':
20831
+ return 'fact_check';
20832
+ default:
20833
+ return 'info';
20834
+ }
20835
+ }
20836
+ function stableSectionId(groupName) {
20837
+ const token = stableToken(groupName) || 'default';
20838
+ return `section-${token}`;
20839
+ }
20840
+ function stableToken(value) {
20841
+ return String(value || '')
20842
+ .normalize('NFD')
20843
+ .replace(/[\u0300-\u036f]/g, '')
20844
+ .toLowerCase()
20845
+ .replace(/[^a-z0-9]+/g, '-')
20846
+ .replace(/^-+|-+$/g, '');
20847
+ }
20848
+
20210
20849
  function resolveSpan(span) {
20211
20850
  const xs = clamp(span?.xs ?? 12, 'xs');
20212
20851
  const sm = clamp(span?.sm ?? xs, 'sm');
@@ -25768,7 +26407,19 @@ class DynamicWidgetLoaderDirective {
25768
26407
  const defaultOrderMap = {
25769
26408
  'praxis-table': ['tableId', 'componentInstanceId', 'configPersistenceStrategy', 'resourcePath', 'data', 'config'],
25770
26409
  'praxis-crud': ['crudId', 'componentInstanceId', 'metadata'],
25771
- 'praxis-dynamic-form': ['formId', 'componentInstanceId', 'resourcePath'],
26410
+ 'praxis-dynamic-form': [
26411
+ 'formId',
26412
+ 'componentInstanceId',
26413
+ 'resourcePath',
26414
+ 'schemaUrl',
26415
+ 'submitUrl',
26416
+ 'submitMethod',
26417
+ 'apiEndpointKey',
26418
+ 'apiUrlEntry',
26419
+ 'initialValue',
26420
+ 'mode',
26421
+ 'layoutPolicy',
26422
+ ],
25772
26423
  'praxis-tabs': ['tabsId', 'componentInstanceId', 'configPersistenceStrategy', 'config'],
25773
26424
  'praxis-list': ['listId', 'componentInstanceId', 'enableCustomization', 'config'],
25774
26425
  'praxis-expansion': ['expansionId', 'componentInstanceId', 'config'],
@@ -32072,9 +32723,16 @@ class DynamicWidgetPageComponent {
32072
32723
  origin: 'dynamic-page.rich-content',
32073
32724
  componentId: 'praxis-dynamic-page',
32074
32725
  },
32726
+ }).then((result) => {
32727
+ if (!result?.success) {
32728
+ this.emitRichContentCustomAction(widgetKey, actionId, payload);
32729
+ }
32075
32730
  });
32076
32731
  return;
32077
32732
  }
32733
+ this.emitRichContentCustomAction(widgetKey, actionId, payload);
32734
+ }
32735
+ emitRichContentCustomAction(widgetKey, actionId, payload) {
32078
32736
  this.onWidgetEvent(widgetKey, {
32079
32737
  ownerWidgetKey: widgetKey,
32080
32738
  sourceComponentId: 'praxis-rich-content',
@@ -35038,6 +35696,8 @@ class PraxisSurfaceHostComponent {
35038
35696
  */
35039
35697
  renderTitleInsideBody = false;
35040
35698
  widgetEvent = new EventEmitter();
35699
+ rowClick = new EventEmitter();
35700
+ selectionChange = new EventEmitter();
35041
35701
  beforeWidgetLoader;
35042
35702
  mainWidgetLoader;
35043
35703
  afterWidgetLoader;
@@ -35151,13 +35811,19 @@ class PraxisSurfaceHostComponent {
35151
35811
  }
35152
35812
  }
35153
35813
  onSlotWidgetEvent(ownerWidgetKey, event) {
35814
+ if (event.output === 'rowClick') {
35815
+ this.rowClick.emit(event.payload);
35816
+ }
35817
+ if (event.output === 'selectionChange') {
35818
+ this.selectionChange.emit(event.payload);
35819
+ }
35154
35820
  this.widgetEvent.emit({
35155
35821
  ...event,
35156
35822
  ownerWidgetKey: event.ownerWidgetKey || ownerWidgetKey,
35157
35823
  });
35158
35824
  }
35159
35825
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisSurfaceHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
35160
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisSurfaceHostComponent, isStandalone: true, selector: "praxis-surface-host", inputs: { title: "title", subtitle: "subtitle", icon: "icon", beforeWidget: "beforeWidget", widget: "widget", afterWidget: "afterWidget", context: "context", strictValidation: "strictValidation", renderTitleInsideBody: "renderTitleInsideBody" }, outputs: { widgetEvent: "widgetEvent" }, viewQueries: [{ propertyName: "beforeWidgetLoader", first: true, predicate: ["beforeWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "mainWidgetLoader", first: true, predicate: ["mainWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "afterWidgetLoader", first: true, predicate: ["afterWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }], usesOnChanges: true, ngImport: i0, template: `
35826
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisSurfaceHostComponent, isStandalone: true, selector: "praxis-surface-host", inputs: { title: "title", subtitle: "subtitle", icon: "icon", beforeWidget: "beforeWidget", widget: "widget", afterWidget: "afterWidget", context: "context", strictValidation: "strictValidation", renderTitleInsideBody: "renderTitleInsideBody" }, outputs: { widgetEvent: "widgetEvent", rowClick: "rowClick", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "beforeWidgetLoader", first: true, predicate: ["beforeWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "mainWidgetLoader", first: true, predicate: ["mainWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "afterWidgetLoader", first: true, predicate: ["afterWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }], usesOnChanges: true, ngImport: i0, template: `
35161
35827
  <div class="pdx-surface-host">
35162
35828
  @if (subtitle || (title && renderTitleInsideBody)) {
35163
35829
  <header class="pdx-surface-host__header">
@@ -35184,6 +35850,7 @@ class PraxisSurfaceHostComponent {
35184
35850
  [ownerWidgetKey]="beforeWidgetKey"
35185
35851
  [context]="context"
35186
35852
  [strictValidation]="strictValidation"
35853
+ [autoWireOutputs]="true"
35187
35854
  (widgetEvent)="onSlotWidgetEvent(beforeWidgetKey, $event)"
35188
35855
  ></ng-container>
35189
35856
  </div>
@@ -35196,6 +35863,7 @@ class PraxisSurfaceHostComponent {
35196
35863
  [ownerWidgetKey]="mainWidgetKey"
35197
35864
  [context]="context"
35198
35865
  [strictValidation]="strictValidation"
35866
+ [autoWireOutputs]="true"
35199
35867
  (widgetEvent)="onSlotWidgetEvent(mainWidgetKey, $event)"
35200
35868
  ></ng-container>
35201
35869
  }
@@ -35208,6 +35876,7 @@ class PraxisSurfaceHostComponent {
35208
35876
  [ownerWidgetKey]="afterWidgetKey"
35209
35877
  [context]="context"
35210
35878
  [strictValidation]="strictValidation"
35879
+ [autoWireOutputs]="true"
35211
35880
  (widgetEvent)="onSlotWidgetEvent(afterWidgetKey, $event)"
35212
35881
  ></ng-container>
35213
35882
  </div>
@@ -35245,6 +35914,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35245
35914
  [ownerWidgetKey]="beforeWidgetKey"
35246
35915
  [context]="context"
35247
35916
  [strictValidation]="strictValidation"
35917
+ [autoWireOutputs]="true"
35248
35918
  (widgetEvent)="onSlotWidgetEvent(beforeWidgetKey, $event)"
35249
35919
  ></ng-container>
35250
35920
  </div>
@@ -35257,6 +35927,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35257
35927
  [ownerWidgetKey]="mainWidgetKey"
35258
35928
  [context]="context"
35259
35929
  [strictValidation]="strictValidation"
35930
+ [autoWireOutputs]="true"
35260
35931
  (widgetEvent)="onSlotWidgetEvent(mainWidgetKey, $event)"
35261
35932
  ></ng-container>
35262
35933
  }
@@ -35269,6 +35940,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35269
35940
  [ownerWidgetKey]="afterWidgetKey"
35270
35941
  [context]="context"
35271
35942
  [strictValidation]="strictValidation"
35943
+ [autoWireOutputs]="true"
35272
35944
  (widgetEvent)="onSlotWidgetEvent(afterWidgetKey, $event)"
35273
35945
  ></ng-container>
35274
35946
  </div>
@@ -35296,6 +35968,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35296
35968
  type: Input
35297
35969
  }], widgetEvent: [{
35298
35970
  type: Output
35971
+ }], rowClick: [{
35972
+ type: Output
35973
+ }], selectionChange: [{
35974
+ type: Output
35299
35975
  }], beforeWidgetLoader: [{
35300
35976
  type: ViewChild,
35301
35977
  args: ['beforeWidgetLoader', { read: DynamicWidgetLoaderDirective }]
@@ -36765,4 +37441,4 @@ function provideHookWhitelist(allowed) {
36765
37441
  * Generated bundle index. Do not edit.
36766
37442
  */
36767
37443
 
36768
- 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, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, 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_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, 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, PraxisRuntimeComponentObservationRegistryService, 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, SurfaceOpenMaterializerService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, 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, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, 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, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, 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, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withMessage, withPraxisHttpLoading };
37444
+ 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, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_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, PraxisRuntimeComponentObservationRegistryService, 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, SurfaceOpenMaterializerService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, 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, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, 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, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withMessage, withPraxisHttpLoading };