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

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.
@@ -12666,18 +12666,24 @@ class SurfaceOpenMaterializerService {
12666
12666
  if (data && typeof data === 'object' && !Array.isArray(data)) {
12667
12667
  const objectData = data;
12668
12668
  if (payload.widget.id === 'praxis-dynamic-form') {
12669
- const schemaFields = await this.resolveSchemaFields(payload, discoveryOptions);
12670
12669
  return {
12671
12670
  ...payload,
12672
12671
  widget: {
12673
12672
  ...payload.widget,
12674
12673
  inputs: {
12675
12674
  ...this.projectMaterializedFormInputs(payload.widget.inputs || {}),
12676
- configPersistenceStrategy: 'input-first',
12677
12675
  mode: payload.widget.inputs?.['mode'] || 'view',
12678
12676
  initialValue: objectData,
12679
12677
  resourceId,
12680
- config: this.buildLocalFormConfig(objectData, schemaFields),
12678
+ layoutPolicy: payload.widget.inputs?.['layoutPolicy'] || {
12679
+ source: 'schema',
12680
+ intent: 'detail',
12681
+ preset: 'compactPresentation',
12682
+ lifecycle: 'live',
12683
+ persistence: 'transient',
12684
+ schemaOperation: 'detail',
12685
+ schemaType: 'response',
12686
+ },
12681
12687
  },
12682
12688
  },
12683
12689
  context: this.mergeMaterializationContext(payload, {
@@ -12715,11 +12721,14 @@ class SurfaceOpenMaterializerService {
12715
12721
  'resourceId',
12716
12722
  'apiEndpointKey',
12717
12723
  'apiUrlEntry',
12724
+ 'schemaUrl',
12725
+ 'readUrl',
12718
12726
  'submitUrl',
12719
12727
  'submitMethod',
12720
12728
  'responseSchemaUrl',
12721
12729
  'customEndpoints',
12722
12730
  'configPersistenceStrategy',
12731
+ 'layoutPolicy',
12723
12732
  'mode',
12724
12733
  'actions',
12725
12734
  'enableCustomization',
@@ -12727,6 +12736,7 @@ class SurfaceOpenMaterializerService {
12727
12736
  'readonlyModeGlobal',
12728
12737
  'disabledModeGlobal',
12729
12738
  'presentationModeGlobal',
12739
+ 'fieldIconPolicy',
12730
12740
  'visibleGlobal',
12731
12741
  'layout',
12732
12742
  'backConfig',
@@ -12740,186 +12750,6 @@ class SurfaceOpenMaterializerService {
12740
12750
  ]);
12741
12751
  return Object.fromEntries(Object.entries(inputs).filter(([key]) => supported.has(key)));
12742
12752
  }
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
12753
  shouldMaterializeItemReadProjection(payload) {
12924
12754
  const surface = payload.context?.['surface'];
12925
12755
  const kind = String(surface?.['kind'] || '').toUpperCase();
@@ -13002,6 +12832,8 @@ class SurfaceOpenMaterializerService {
13002
12832
  bindingOrder: [
13003
12833
  'tableId',
13004
12834
  'componentInstanceId',
12835
+ 'configPersistenceStrategy',
12836
+ 'resourcePath',
13005
12837
  'title',
13006
12838
  'subtitle',
13007
12839
  'icon',
@@ -13009,11 +12841,17 @@ class SurfaceOpenMaterializerService {
13009
12841
  'config',
13010
12842
  'enableCustomization',
13011
12843
  ],
12844
+ outputs: {
12845
+ rowClick: 'emit',
12846
+ selectionChange: 'emit',
12847
+ widgetEvent: 'emit',
12848
+ },
13012
12849
  inputs: {
13013
12850
  ...tableInputOverrides,
13014
12851
  resourcePath: '',
13015
12852
  tableId: String(previousInputs['tableId'] || this.stableSurfaceId(payload)),
13016
12853
  componentInstanceId: `${this.stableSurfaceId(payload)}.${resourceId}`,
12854
+ configPersistenceStrategy: previousInputs['configPersistenceStrategy'] ?? 'volatile',
13017
12855
  title: payload.title,
13018
12856
  subtitle: payload.subtitle,
13019
12857
  icon: payload.icon,
@@ -13065,6 +12903,11 @@ class SurfaceOpenMaterializerService {
13065
12903
  behavior: {
13066
12904
  localDataMode: { enabled: true },
13067
12905
  pagination: { enabled: true, pageSize: 10 },
12906
+ selection: {
12907
+ enabled: true,
12908
+ type: 'single',
12909
+ mode: 'both',
12910
+ },
13068
12911
  },
13069
12912
  };
13070
12913
  }
@@ -16247,10 +16090,16 @@ const VISUALIZATION_TONES = new Set([
16247
16090
  'critical',
16248
16091
  ]);
16249
16092
  const TABLE_SAFE_KINDS = new Set([
16093
+ 'line',
16094
+ 'area',
16095
+ 'column',
16250
16096
  'comparison',
16251
16097
  'stackedBar',
16098
+ 'radial',
16099
+ 'harveyBall',
16252
16100
  'bullet',
16253
16101
  'delta',
16102
+ 'processFlow',
16254
16103
  ]);
16255
16104
  function normalizePraxisPresentationVisualization(value) {
16256
16105
  if (!value || typeof value !== 'object') {
@@ -16265,6 +16114,7 @@ function normalizePraxisPresentationVisualization(value) {
16265
16114
  const size = normalizeEnum$1(value.size, VISUALIZATION_SIZES);
16266
16115
  const tone = normalizeEnum$1(value.tone, VISUALIZATION_TONES);
16267
16116
  const ariaLabel = normalizeText$1(value.ariaLabel);
16117
+ const valueSuffix = normalizeText$1(value.valueSuffix);
16268
16118
  return {
16269
16119
  kind,
16270
16120
  fallbackText,
@@ -16272,8 +16122,10 @@ function normalizePraxisPresentationVisualization(value) {
16272
16122
  ...(size ? { size } : {}),
16273
16123
  ...(tone ? { tone } : {}),
16274
16124
  ...(ariaLabel ? { ariaLabel } : {}),
16125
+ ...(valueSuffix ? { valueSuffix } : {}),
16275
16126
  ...(Object.prototype.hasOwnProperty.call(value, 'value') ? { value: value.value } : {}),
16276
16127
  ...(normalizeExpression(value.valueExpr, 'valueExpr') ?? {}),
16128
+ ...(normalizeExpression(value.valueSuffixExpr, 'valueSuffixExpr') ?? {}),
16277
16129
  ...(normalizeNumber(value.total, 'total') ?? {}),
16278
16130
  ...(normalizeExpression(value.totalExpr, 'totalExpr') ?? {}),
16279
16131
  ...(normalizeNumber(value.target, 'target') ?? {}),
@@ -16311,6 +16163,18 @@ function renderPraxisPresentationVisualizationHtml(value, options = {}) {
16311
16163
  return renderBulletVisualizationHtml(visualization, options);
16312
16164
  case 'delta':
16313
16165
  return renderDeltaVisualizationHtml(visualization, options);
16166
+ case 'radial':
16167
+ return renderRadialVisualizationHtml(visualization, options);
16168
+ case 'harveyBall':
16169
+ return renderHarveyBallVisualizationHtml(visualization, options);
16170
+ case 'line':
16171
+ return renderLineVisualizationHtml(visualization, options);
16172
+ case 'area':
16173
+ return renderAreaVisualizationHtml(visualization, options);
16174
+ case 'column':
16175
+ return renderColumnVisualizationHtml(visualization, options);
16176
+ case 'processFlow':
16177
+ return renderProcessFlowVisualizationHtml(visualization, options);
16314
16178
  default:
16315
16179
  return `<span class="pfx-micro-viz__fallback">${escapeHtml$1(visualization.fallbackText)}</span>`;
16316
16180
  }
@@ -16357,26 +16221,61 @@ function renderStackedBarVisualizationHtml(visualization, options) {
16357
16221
  <span class="pfx-micro-viz__meta">${meta}</span>
16358
16222
  </span>`;
16359
16223
  }
16224
+ function resolveBulletMax(visualization) {
16225
+ const thresholds = visualization.thresholds ?? [];
16226
+ const values = [
16227
+ toFiniteNumber(visualization.value) ?? 0,
16228
+ visualization.target ?? 0,
16229
+ visualization.total ?? 0,
16230
+ ...thresholds.map(t => t.value)
16231
+ ].filter(v => Number.isFinite(v) && v > 0);
16232
+ return Math.max(...values, 100);
16233
+ }
16360
16234
  function renderBulletVisualizationHtml(visualization, options) {
16361
16235
  const currentValue = toFiniteNumber(visualization.value) ?? 0;
16362
- const total = visualization.total && visualization.total > 0 ? visualization.total : 100;
16236
+ const max = resolveBulletMax(visualization);
16363
16237
  const target = toFiniteNumber(visualization.target);
16364
- const targetLeft = target === undefined ? null : percent(target, total);
16238
+ const targetLeft = target === undefined ? null : percent(target, max);
16239
+ const isTable = visualization.surface === 'table-cell';
16240
+ // thresholds
16241
+ const thresholds = visualization.thresholds ?? [];
16242
+ let previous = 0;
16243
+ const bands = thresholds.map(t => {
16244
+ const current = Math.max(t.value, previous);
16245
+ const left = max > 0 ? percent(previous, max) : '0';
16246
+ const width = max > 0 ? percent(current - previous, max) : '0';
16247
+ previous = current;
16248
+ return { left, width, tone: t.tone ?? 'info' };
16249
+ }).filter(b => parseFloat(b.width) > 0);
16250
+ 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('');
16251
+ const topHtml = isTable ? '' : `
16252
+ <div class="pfx-micro-bullet__top">
16253
+ <span class="pfx-micro-bullet__label">${escapeHtml$1(visualization.fallbackText)}</span>
16254
+ <span class="pfx-micro-bullet__value">
16255
+ ${escapeHtml$1(formatMicroNumber(currentValue, options.locale))}
16256
+ ${target === undefined ? '' : `<span class="pfx-micro-bullet__target-val">/ Target: ${escapeHtml$1(formatMicroNumber(target, options.locale))}</span>`}
16257
+ </span>
16258
+ </div>`;
16259
+ const bottomHtml = isTable ? '' : `
16260
+ <div class="pfx-micro-bullet__bottom">
16261
+ <span>${escapeHtml$1(formatMicroNumber(visualization.baseline ?? 0, options.locale))}</span>
16262
+ <span>${escapeHtml$1(formatMicroNumber(max, options.locale))}</span>
16263
+ </div>`;
16365
16264
  return `
16366
16265
  <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>`}
16266
+ ${topHtml}
16267
+ <span class="pfx-micro-bullet__track">
16268
+ ${bandsHtml}
16269
+ <span class="pfx-micro-bullet__actual" data-tone="${escapeHtml$1(visualization.tone ?? 'info')}" style="width: ${percent(currentValue, max)}%;"></span>
16270
+ ${targetLeft === null ? '' : `<span class="pfx-micro-bullet__target" style="left: ${targetLeft}%;"></span>`}
16374
16271
  </span>
16272
+ ${bottomHtml}
16375
16273
  </span>`;
16376
16274
  }
16377
16275
  function renderDeltaVisualizationHtml(visualization, options) {
16378
16276
  const value = toFiniteNumber(visualization.value);
16379
- const symbol = value === undefined ? '=' : value < 0 ? '-' : value > 0 ? '+' : '=';
16277
+ const direction = value === undefined ? 'neutral' : value < 0 ? 'down' : value > 0 ? 'up' : 'neutral';
16278
+ const symbol = direction === 'up' ? '&#9650;' : direction === 'down' ? '&#9660;' : '&rarr;';
16380
16279
  const tone = visualization.tone ??
16381
16280
  (value === undefined
16382
16281
  ? 'neutral'
@@ -16385,12 +16284,19 @@ function renderDeltaVisualizationHtml(visualization, options) {
16385
16284
  : value > 0
16386
16285
  ? 'success'
16387
16286
  : 'neutral');
16287
+ const valueSuffix = visualization.valueSuffix ?? '';
16388
16288
  const text = value === undefined
16389
16289
  ? visualization.fallbackText
16390
- : formatMicroNumber(value, options.locale);
16290
+ : `${formatMicroNumber(Math.abs(value), options.locale)}${valueSuffix}`;
16291
+ const directionLabel = direction === 'up'
16292
+ ? 'up'
16293
+ : direction === 'down'
16294
+ ? 'down'
16295
+ : 'stable';
16296
+ const aria = visualization.ariaLabel ?? `${visualization.fallbackText}: ${directionLabel} ${text}`;
16391
16297
  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>
16298
+ <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)}">
16299
+ <span class="pfx-micro-viz__delta-symbol" aria-hidden="true">${symbol}</span>
16394
16300
  <span>${escapeHtml$1(text)}</span>
16395
16301
  </span>`;
16396
16302
  }
@@ -16505,6 +16411,268 @@ function normalizeText$1(value) {
16505
16411
  const trimmed = value.trim();
16506
16412
  return trimmed.length ? trimmed : undefined;
16507
16413
  }
16414
+ function renderRadialVisualizationHtml(visualization, options) {
16415
+ const value = toFiniteNumber(visualization.value) ?? 0;
16416
+ const total = visualization.total && visualization.total > 0 ? visualization.total : 100;
16417
+ const pct = Math.max(0, Math.min(100, (value / total) * 100));
16418
+ const tone = visualization.tone ?? 'info';
16419
+ const dashArray = `${pct.toFixed(1)}, 100`;
16420
+ const pctText = `${Math.round(pct)}%`;
16421
+ const aria = visualization.ariaLabel ?? `${visualization.fallbackText} (${pctText})`;
16422
+ const isTable = visualization.surface === 'table-cell';
16423
+ const svgText = isTable
16424
+ ? ''
16425
+ : `<text x="18" y="21" class="pfx-micro-radial-svg__text">${escapeHtml$1(pctText)}</text>`;
16426
+ const externalText = isTable
16427
+ ? `<span class="pfx-micro-radial-value">${escapeHtml$1(pctText)}</span>`
16428
+ : '';
16429
+ return `
16430
+ <span class="pfx-micro-viz pfx-micro-viz__radial" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(aria)}">
16431
+ <svg class="pfx-micro-radial-svg" viewBox="0 0 36 36">
16432
+ <circle class="pfx-micro-radial-svg__track" cx="18" cy="18" r="15.9155" />
16433
+ <circle class="pfx-micro-radial-svg__bar" cx="18" cy="18" r="15.9155" stroke-dasharray="${dashArray}" transform="rotate(-90 18 18)" />
16434
+ ${svgText}
16435
+ </svg>
16436
+ ${externalText}
16437
+ </span>`;
16438
+ }
16439
+ function renderHarveyBallVisualizationHtml(visualization, options) {
16440
+ const value = toFiniteNumber(visualization.value) ?? 0;
16441
+ const total = visualization.total && visualization.total > 0 ? visualization.total : 100;
16442
+ const pct = Math.max(0, Math.min(100, (value / total) * 100));
16443
+ const tone = visualization.tone ?? 'info';
16444
+ const strokeLength = pct * 0.50265;
16445
+ const dashArray = `${strokeLength.toFixed(3)} 50.265`;
16446
+ const aria = visualization.ariaLabel ?? `${visualization.fallbackText} (${Math.round(pct)}%)`;
16447
+ return `
16448
+ <span class="pfx-micro-viz pfx-micro-viz__harvey" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(aria)}">
16449
+ <svg class="pfx-micro-harvey-svg" viewBox="0 0 36 36">
16450
+ <circle class="pfx-micro-harvey-svg__track" cx="18" cy="18" r="16" />
16451
+ <circle class="pfx-micro-harvey-svg__bar" cx="18" cy="18" r="8" stroke-dasharray="${dashArray}" transform="rotate(-90 18 18)" />
16452
+ </svg>
16453
+ <span class="pfx-micro-harvey-fraction">
16454
+ <strong>${escapeHtml$1(formatMicroNumber(value, options.locale))}</strong>
16455
+ <span class="pfx-separator">/</span>
16456
+ <span class="pfx-total">${escapeHtml$1(formatMicroNumber(total, options.locale))}</span>
16457
+ </span>
16458
+ </span>`;
16459
+ }
16460
+ function getPointsCoordinates(points, width, height, padding) {
16461
+ if (points.length < 2)
16462
+ return [];
16463
+ const values = points.map(p => p.value);
16464
+ const minVal = Math.min(...values);
16465
+ const maxVal = Math.max(...values);
16466
+ const valRange = maxVal - minVal === 0 ? 1 : maxVal - minVal;
16467
+ return points.map((p, index) => {
16468
+ const x = padding + (index / (points.length - 1)) * (width - 2 * padding);
16469
+ const y = height - padding - ((p.value - minVal) / valRange) * (height - 2 * padding);
16470
+ return { x, y };
16471
+ });
16472
+ }
16473
+ function renderLineVisualizationHtml(visualization, options) {
16474
+ const points = visualization.points ?? [];
16475
+ const tone = visualization.tone ?? 'info';
16476
+ if (points.length < 2) {
16477
+ return renderFallbackVisualizationHtml(visualization, tone);
16478
+ }
16479
+ const width = 100;
16480
+ const height = 30;
16481
+ const padding = 4;
16482
+ const coords = getPointsCoordinates(points, width, height, padding);
16483
+ const pathD = coords.map((c, i) => `${i === 0 ? 'M' : 'L'} ${c.x.toFixed(1)} ${c.y.toFixed(1)}`).join(' ');
16484
+ // Highlight extreme/boundary values
16485
+ let minIdx = 0;
16486
+ let maxIdx = 0;
16487
+ for (let i = 1; i < points.length; i++) {
16488
+ if (points[i].value < points[minIdx].value)
16489
+ minIdx = i;
16490
+ if (points[i].value > points[maxIdx].value)
16491
+ maxIdx = i;
16492
+ }
16493
+ const markers = [
16494
+ { x: coords[0].x, y: coords[0].y, tone: points[0].tone ?? tone },
16495
+ { x: coords[coords.length - 1].x, y: coords[coords.length - 1].y, tone: points[points.length - 1].tone ?? tone }
16496
+ ];
16497
+ if (minIdx !== 0 && minIdx !== coords.length - 1) {
16498
+ markers.push({ x: coords[minIdx].x, y: coords[minIdx].y, tone: points[minIdx].tone ?? 'danger' });
16499
+ }
16500
+ if (maxIdx !== 0 && maxIdx !== coords.length - 1) {
16501
+ markers.push({ x: coords[maxIdx].x, y: coords[maxIdx].y, tone: points[maxIdx].tone ?? 'success' });
16502
+ }
16503
+ 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('');
16504
+ const isTable = visualization.surface === 'table-cell';
16505
+ const firstPoint = points[0];
16506
+ const lastPoint = points[points.length - 1];
16507
+ const leftHtml = isTable ? '' : `
16508
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--start">
16509
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(firstPoint.value, options.locale))}</span>
16510
+ ${firstPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(firstPoint.label)}</span>` : ''}
16511
+ </div>`;
16512
+ const rightHtml = isTable ? '' : `
16513
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--end">
16514
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(lastPoint.value, options.locale))}</span>
16515
+ ${lastPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(lastPoint.label)}</span>` : ''}
16516
+ </div>`;
16517
+ return `
16518
+ <span class="pfx-micro-viz-container">
16519
+ ${leftHtml}
16520
+ <span class="pfx-micro-viz pfx-micro-viz__line" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
16521
+ <svg class="pfx-micro-line__svg" viewBox="0 0 100 30">
16522
+ <path class="pfx-micro-line__path" d="${pathD}" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
16523
+ ${circlesHtml}
16524
+ </svg>
16525
+ </span>
16526
+ ${rightHtml}
16527
+ </span>`;
16528
+ }
16529
+ function renderAreaVisualizationHtml(visualization, options) {
16530
+ const points = visualization.points ?? [];
16531
+ const tone = visualization.tone ?? 'info';
16532
+ if (points.length < 2) {
16533
+ return renderFallbackVisualizationHtml(visualization, tone);
16534
+ }
16535
+ const width = 100;
16536
+ const height = 30;
16537
+ const padding = 4;
16538
+ const coords = getPointsCoordinates(points, width, height, padding);
16539
+ const lineD = coords.map((c, i) => `${i === 0 ? 'M' : 'L'} ${c.x.toFixed(1)} ${c.y.toFixed(1)}`).join(' ');
16540
+ const firstX = coords[0].x.toFixed(1);
16541
+ const lastX = coords[coords.length - 1].x.toFixed(1);
16542
+ const areaD = `${lineD} L ${lastX} ${height} L ${firstX} ${height} Z`;
16543
+ // Highlight extreme/boundary values
16544
+ let minIdx = 0;
16545
+ let maxIdx = 0;
16546
+ for (let i = 1; i < points.length; i++) {
16547
+ if (points[i].value < points[minIdx].value)
16548
+ minIdx = i;
16549
+ if (points[i].value > points[maxIdx].value)
16550
+ maxIdx = i;
16551
+ }
16552
+ const markers = [
16553
+ { x: coords[0].x, y: coords[0].y, tone: points[0].tone ?? tone },
16554
+ { x: coords[coords.length - 1].x, y: coords[coords.length - 1].y, tone: points[points.length - 1].tone ?? tone }
16555
+ ];
16556
+ if (minIdx !== 0 && minIdx !== coords.length - 1) {
16557
+ markers.push({ x: coords[minIdx].x, y: coords[minIdx].y, tone: points[minIdx].tone ?? 'danger' });
16558
+ }
16559
+ if (maxIdx !== 0 && maxIdx !== coords.length - 1) {
16560
+ markers.push({ x: coords[maxIdx].x, y: coords[maxIdx].y, tone: points[maxIdx].tone ?? 'success' });
16561
+ }
16562
+ 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('');
16563
+ const isTable = visualization.surface === 'table-cell';
16564
+ const firstPoint = points[0];
16565
+ const lastPoint = points[points.length - 1];
16566
+ const leftHtml = isTable ? '' : `
16567
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--start">
16568
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(firstPoint.value, options.locale))}</span>
16569
+ ${firstPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(firstPoint.label)}</span>` : ''}
16570
+ </div>`;
16571
+ const rightHtml = isTable ? '' : `
16572
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--end">
16573
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(lastPoint.value, options.locale))}</span>
16574
+ ${lastPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(lastPoint.label)}</span>` : ''}
16575
+ </div>`;
16576
+ return `
16577
+ <span class="pfx-micro-viz-container">
16578
+ ${leftHtml}
16579
+ <span class="pfx-micro-viz pfx-micro-viz__area" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
16580
+ <svg class="pfx-micro-area__svg" viewBox="0 0 100 30">
16581
+ <path class="pfx-micro-area__fill" d="${areaD}" fill="currentColor" fill-opacity="0.15" />
16582
+ <path class="pfx-micro-area__path" d="${lineD}" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
16583
+ ${circlesHtml}
16584
+ </svg>
16585
+ </span>
16586
+ ${rightHtml}
16587
+ </span>`;
16588
+ }
16589
+ function renderColumnVisualizationHtml(visualization, options) {
16590
+ const points = visualization.points ?? [];
16591
+ const tone = visualization.tone ?? 'info';
16592
+ if (points.length === 0) {
16593
+ return renderFallbackVisualizationHtml(visualization, tone);
16594
+ }
16595
+ const width = 100;
16596
+ const height = 30;
16597
+ const padding = 4;
16598
+ const values = points.map(p => p.value);
16599
+ const maxVal = Math.max(...values, 0);
16600
+ const minVal = Math.min(...values, 0);
16601
+ const valRange = maxVal - minVal === 0 ? 1 : maxVal - minVal;
16602
+ const colWidth = Math.max(2, (width - 2 * padding) / points.length - 2);
16603
+ const columnsHtml = points.map((p, i) => {
16604
+ const x = padding + i * ((width - 2 * padding) / points.length) + 1;
16605
+ const rectHeight = Math.max(2, ((p.value - minVal) / valRange) * (height - 2 * padding));
16606
+ const rectY = height - padding - rectHeight;
16607
+ const itemTone = p.tone ?? tone;
16608
+ 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)}" />`;
16609
+ }).join('');
16610
+ const isTable = visualization.surface === 'table-cell';
16611
+ const firstPoint = points[0];
16612
+ const lastPoint = points[points.length - 1];
16613
+ const leftHtml = isTable ? '' : `
16614
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--start">
16615
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(firstPoint.value, options.locale))}</span>
16616
+ ${firstPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(firstPoint.label)}</span>` : ''}
16617
+ </div>`;
16618
+ const rightHtml = isTable ? '' : `
16619
+ <div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--end">
16620
+ <span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(lastPoint.value, options.locale))}</span>
16621
+ ${lastPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(lastPoint.label)}</span>` : ''}
16622
+ </div>`;
16623
+ return `
16624
+ <span class="pfx-micro-viz-container">
16625
+ ${leftHtml}
16626
+ <span class="pfx-micro-viz pfx-micro-viz__column" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
16627
+ <svg class="pfx-micro-column__svg" viewBox="0 0 100 30">
16628
+ ${columnsHtml}
16629
+ </svg>
16630
+ </span>
16631
+ ${rightHtml}
16632
+ </span>`;
16633
+ }
16634
+ function renderProcessFlowVisualizationHtml(visualization, options) {
16635
+ const items = visualization.items ?? [];
16636
+ if (items.length === 0) {
16637
+ return renderFallbackVisualizationHtml(visualization, visualization.tone ?? 'neutral');
16638
+ }
16639
+ const isTable = visualization.surface === 'table-cell';
16640
+ const stepLabels = items.map((item, index) => item.label ?? item.id ?? `${index + 1}`);
16641
+ const aria = visualization.ariaLabel ?? `${visualization.fallbackText}: ${stepLabels.join(' > ')}`;
16642
+ const stepsHtml = items.map((item, index) => {
16643
+ const itemTone = item.tone ?? 'neutral';
16644
+ const itemState = item.state ?? '';
16645
+ const isLast = index === items.length - 1;
16646
+ const itemLabel = stepLabels[index];
16647
+ const label = !isTable && item.label ? `<span class="pfx-micro-step__label">${escapeHtml$1(item.label)}</span>` : '';
16648
+ const connector = !isLast ? `<span class="pfx-micro-step__connector" data-tone="${escapeHtml$1(itemTone)}"></span>` : '';
16649
+ const stepCircle = `
16650
+ <span class="pfx-micro-step__node" data-tone="${escapeHtml$1(itemTone)}" aria-hidden="true">
16651
+ ${item.icon ? `<span class="material-icons pfx-micro-step__icon" aria-hidden="true">${escapeHtml$1(item.icon)}</span>` : `${index + 1}`}
16652
+ </span>`;
16653
+ return `
16654
+ <div class="pfx-micro-step" data-state="${escapeHtml$1(itemState)}" data-tone="${escapeHtml$1(itemTone)}">
16655
+ <div class="pfx-micro-step__node-wrapper" title="${escapeHtml$1(itemLabel)}">
16656
+ ${stepCircle}
16657
+ ${label}
16658
+ </div>
16659
+ ${connector}
16660
+ </div>`;
16661
+ }).join('');
16662
+ return `
16663
+ <span class="pfx-micro-viz pfx-micro-viz__process" role="img" aria-label="${escapeHtml$1(aria)}">
16664
+ ${stepsHtml}
16665
+ </span>`;
16666
+ }
16667
+ function renderFallbackVisualizationHtml(visualization, tone) {
16668
+ return `
16669
+ <span
16670
+ class="pfx-micro-viz pfx-micro-viz__fallback"
16671
+ data-tone="${escapeHtml$1(tone)}"
16672
+ role="img"
16673
+ aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}"
16674
+ >${escapeHtml$1(visualization.fallbackText)}</span>`;
16675
+ }
16508
16676
 
16509
16677
  const TONES = new Set([
16510
16678
  'neutral',
@@ -20207,6 +20375,274 @@ const ValidationPattern = {
20207
20375
  CUSTOM: '',
20208
20376
  };
20209
20377
 
20378
+ function materializeFormLayoutFromMetadata(fields, options = {}) {
20379
+ const policy = normalizeLayoutPolicy(options.policy);
20380
+ const visibleFields = normalizeFields(fields, options.includeHidden === true);
20381
+ const groupedFields = groupFields(visibleFields);
20382
+ const sections = groupedFields.map(([groupKey, groupFields], sectionIndex) => createSection(groupKey, groupFields, sectionIndex, policy, options));
20383
+ return ensureIds({
20384
+ sections,
20385
+ fieldMetadata: fieldsForPolicy(visibleFields, policy),
20386
+ metadata: {
20387
+ version: '1.0.0',
20388
+ lastUpdated: new Date(),
20389
+ source: 'schema',
20390
+ generatedLayoutPreset: policy.preset,
20391
+ schemaLayoutPolicy: policy,
20392
+ ...(policy.preset === 'compactPresentation'
20393
+ ? { presentationDensity: 'compact' }
20394
+ : {}),
20395
+ },
20396
+ });
20397
+ }
20398
+ function normalizeLayoutPolicy(policy) {
20399
+ const intent = policy?.intent ?? (policy?.preset === 'groupedCommand' ? 'command' : 'detail');
20400
+ const preset = policy?.preset ?? (intent === 'command' ? 'groupedCommand' : 'compactPresentation');
20401
+ return {
20402
+ source: policy?.source ?? 'authored',
20403
+ preset,
20404
+ intent,
20405
+ lifecycle: policy?.lifecycle ?? 'initial',
20406
+ persistence: policy?.persistence ?? 'authorable',
20407
+ detachBehavior: policy?.detachBehavior ?? 'none',
20408
+ schemaOperation: policy?.schemaOperation,
20409
+ schemaType: policy?.schemaType,
20410
+ };
20411
+ }
20412
+ function normalizeFields(fields, includeHidden) {
20413
+ return (fields || [])
20414
+ .filter((field) => !!field?.name)
20415
+ .filter((field) => includeHidden || !isFormHidden(field))
20416
+ .sort(compareFields);
20417
+ }
20418
+ function isFormHidden(field) {
20419
+ const anyField = field;
20420
+ return anyField.formHidden === true || anyField.hidden === true || anyField.visible === false;
20421
+ }
20422
+ function groupFields(fields) {
20423
+ const groups = new Map();
20424
+ for (const field of fields) {
20425
+ const groupKey = normalizeGroupLabel(field.group);
20426
+ groups.set(groupKey, [...(groups.get(groupKey) || []), field]);
20427
+ }
20428
+ return Array.from(groups.entries()).sort(([, left], [, right]) => compareGroupFields(left, right));
20429
+ }
20430
+ function createSection(groupKey, groupFields, sectionIndex, policy, options) {
20431
+ const title = groupKey === 'default'
20432
+ ? options.defaultSectionTitle || 'Informacoes'
20433
+ : groupKey;
20434
+ const sectionId = stableSectionId(groupKey);
20435
+ const presentationRole = resolvePresentationRole(groupKey, groupFields, options.presentationRoleMap);
20436
+ return {
20437
+ id: sectionId,
20438
+ title,
20439
+ ...(policy.preset === 'compactPresentation'
20440
+ ? {
20441
+ icon: resolvePresentationSectionIcon(presentationRole),
20442
+ sectionHeader: {
20443
+ mode: 'icon',
20444
+ size: 'sm',
20445
+ fallbackIcon: resolvePresentationSectionIcon(presentationRole),
20446
+ },
20447
+ className: [
20448
+ 'pdx-presentation-section',
20449
+ `pdx-presentation-section--${presentationRole}`,
20450
+ ].join(' '),
20451
+ presentationRole,
20452
+ appearance: 'plain',
20453
+ }
20454
+ : {}),
20455
+ rows: policy.preset === 'groupedCommand'
20456
+ ? createCommandRows(groupFields, sectionId)
20457
+ : createPresentationRows(groupFields, sectionId),
20458
+ };
20459
+ }
20460
+ function createPresentationRows(fields, sectionId) {
20461
+ const rows = [];
20462
+ let pending = [];
20463
+ let pendingSpan = 0;
20464
+ let rowIndex = 0;
20465
+ const flush = () => {
20466
+ if (!pending.length)
20467
+ return;
20468
+ rows.push({ id: `${sectionId}-row-${++rowIndex}`, columns: pending });
20469
+ pending = [];
20470
+ pendingSpan = 0;
20471
+ };
20472
+ for (const field of fields) {
20473
+ const span = hasExplicitWidth(field)
20474
+ ? resolveCommandSpan(field)
20475
+ : { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 };
20476
+ const mdSpan = span.md ?? 12;
20477
+ const column = {
20478
+ id: `${sectionId}-col-${field.name}`,
20479
+ fields: [field.name],
20480
+ items: [{ id: `${sectionId}-item-${field.name}`, kind: 'field', fieldName: field.name }],
20481
+ span,
20482
+ };
20483
+ if (mdSpan >= 12) {
20484
+ flush();
20485
+ pending = [column];
20486
+ flush();
20487
+ continue;
20488
+ }
20489
+ if (pendingSpan + mdSpan > 12) {
20490
+ flush();
20491
+ }
20492
+ pending.push(column);
20493
+ pendingSpan += mdSpan;
20494
+ }
20495
+ flush();
20496
+ return rows;
20497
+ }
20498
+ function createCommandRows(fields, sectionId) {
20499
+ const rows = [];
20500
+ let pending = [];
20501
+ let pendingSpan = 0;
20502
+ let rowIndex = 0;
20503
+ const flush = () => {
20504
+ if (!pending.length)
20505
+ return;
20506
+ rows.push({ id: `${sectionId}-row-${++rowIndex}`, columns: pending });
20507
+ pending = [];
20508
+ pendingSpan = 0;
20509
+ };
20510
+ for (const field of fields) {
20511
+ const span = resolveCommandSpan(field);
20512
+ const mdSpan = span.md ?? 12;
20513
+ const column = {
20514
+ id: `${sectionId}-col-${field.name}`,
20515
+ fields: [field.name],
20516
+ items: [{ id: `${sectionId}-item-${field.name}`, kind: 'field', fieldName: field.name }],
20517
+ span,
20518
+ };
20519
+ if (mdSpan >= 12) {
20520
+ flush();
20521
+ pending = [column];
20522
+ flush();
20523
+ continue;
20524
+ }
20525
+ if (pendingSpan + mdSpan > 12) {
20526
+ flush();
20527
+ }
20528
+ pending.push(column);
20529
+ pendingSpan += mdSpan;
20530
+ }
20531
+ flush();
20532
+ return rows;
20533
+ }
20534
+ function resolveCommandSpan(field) {
20535
+ const rawWidth = field.width;
20536
+ const numericWidth = typeof rawWidth === 'number'
20537
+ ? rawWidth
20538
+ : typeof rawWidth === 'string' && /^\d+$/.test(rawWidth.trim())
20539
+ ? Number(rawWidth.trim())
20540
+ : null;
20541
+ if (numericWidth != null && Number.isFinite(numericWidth)) {
20542
+ const span = Math.max(1, Math.min(12, Math.round(numericWidth)));
20543
+ return {
20544
+ xs: 12,
20545
+ sm: span >= 6 ? 12 : 6,
20546
+ md: span,
20547
+ lg: span,
20548
+ xl: span,
20549
+ };
20550
+ }
20551
+ const width = String(rawWidth || '').toLowerCase();
20552
+ const controlType = String(field.controlType || field.type || '').toLowerCase();
20553
+ if (width === 'full' ||
20554
+ width === 'xl' ||
20555
+ controlType.includes('textarea') ||
20556
+ controlType.includes('rich') ||
20557
+ controlType.includes('file') ||
20558
+ controlType.includes('autocomplete') ||
20559
+ controlType.includes('lookup')) {
20560
+ return { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 };
20561
+ }
20562
+ if (width === 'lg')
20563
+ return { xs: 12, sm: 12, md: 8, lg: 8, xl: 8 };
20564
+ if (width === 'md')
20565
+ return { xs: 12, sm: 12, md: 6, lg: 6, xl: 6 };
20566
+ if (width === 'sm')
20567
+ return { xs: 12, sm: 6, md: 4, lg: 4, xl: 4 };
20568
+ if (width === 'xs' || controlType.includes('checkbox') || controlType.includes('toggle')) {
20569
+ return { xs: 12, sm: 6, md: 3, lg: 3, xl: 3 };
20570
+ }
20571
+ return { xs: 12, sm: 12, md: 6, lg: 6, xl: 6 };
20572
+ }
20573
+ function hasExplicitWidth(field) {
20574
+ const rawWidth = field.width;
20575
+ return rawWidth !== undefined && rawWidth !== null && String(rawWidth).trim() !== '';
20576
+ }
20577
+ function fieldsForPolicy(fields, policy) {
20578
+ if (policy.preset !== 'compactPresentation') {
20579
+ return fields;
20580
+ }
20581
+ return fields.map((field) => ({
20582
+ ...field,
20583
+ readOnly: true,
20584
+ presentationMode: field.presentationMode ?? true,
20585
+ valuePresentation: {
20586
+ ...(field.valuePresentation || {}),
20587
+ density: (field.valuePresentation || {}).density ?? 'compact',
20588
+ },
20589
+ }));
20590
+ }
20591
+ function compareGroupFields(left, right) {
20592
+ return compareFields(left[0], right[0]);
20593
+ }
20594
+ function compareFields(left, right) {
20595
+ const leftOrder = typeof left?.order === 'number' ? left.order : Number.MAX_SAFE_INTEGER;
20596
+ const rightOrder = typeof right?.order === 'number' ? right.order : Number.MAX_SAFE_INTEGER;
20597
+ if (leftOrder !== rightOrder)
20598
+ return leftOrder - rightOrder;
20599
+ return String(left?.name || '').localeCompare(String(right?.name || ''));
20600
+ }
20601
+ function normalizeGroupLabel(group) {
20602
+ const value = String(group || '').trim();
20603
+ return value || 'default';
20604
+ }
20605
+ function resolvePresentationRole(groupName, fields, map) {
20606
+ const direct = map?.[groupName];
20607
+ if (direct)
20608
+ return direct;
20609
+ const normalized = stableToken(groupName);
20610
+ if (normalized.includes('ident'))
20611
+ return 'identity';
20612
+ if (normalized.includes('marc') || normalized.includes('status'))
20613
+ return 'markers';
20614
+ if (normalized.includes('regra') || normalized.includes('rule'))
20615
+ return 'rules';
20616
+ if (fields.some((field) => String(field.controlType || '').toLowerCase().includes('checkbox'))) {
20617
+ return 'markers';
20618
+ }
20619
+ return 'default';
20620
+ }
20621
+ function resolvePresentationSectionIcon(role) {
20622
+ switch (role) {
20623
+ case 'identity':
20624
+ return 'badge';
20625
+ case 'rules':
20626
+ return 'rule';
20627
+ case 'markers':
20628
+ return 'fact_check';
20629
+ default:
20630
+ return 'info';
20631
+ }
20632
+ }
20633
+ function stableSectionId(groupName) {
20634
+ const token = stableToken(groupName) || 'default';
20635
+ return `section-${token}`;
20636
+ }
20637
+ function stableToken(value) {
20638
+ return String(value || '')
20639
+ .normalize('NFD')
20640
+ .replace(/[\u0300-\u036f]/g, '')
20641
+ .toLowerCase()
20642
+ .replace(/[^a-z0-9]+/g, '-')
20643
+ .replace(/^-+|-+$/g, '');
20644
+ }
20645
+
20210
20646
  function resolveSpan(span) {
20211
20647
  const xs = clamp(span?.xs ?? 12, 'xs');
20212
20648
  const sm = clamp(span?.sm ?? xs, 'sm');
@@ -25768,7 +26204,19 @@ class DynamicWidgetLoaderDirective {
25768
26204
  const defaultOrderMap = {
25769
26205
  'praxis-table': ['tableId', 'componentInstanceId', 'configPersistenceStrategy', 'resourcePath', 'data', 'config'],
25770
26206
  'praxis-crud': ['crudId', 'componentInstanceId', 'metadata'],
25771
- 'praxis-dynamic-form': ['formId', 'componentInstanceId', 'resourcePath'],
26207
+ 'praxis-dynamic-form': [
26208
+ 'formId',
26209
+ 'componentInstanceId',
26210
+ 'resourcePath',
26211
+ 'schemaUrl',
26212
+ 'submitUrl',
26213
+ 'submitMethod',
26214
+ 'apiEndpointKey',
26215
+ 'apiUrlEntry',
26216
+ 'initialValue',
26217
+ 'mode',
26218
+ 'layoutPolicy',
26219
+ ],
25772
26220
  'praxis-tabs': ['tabsId', 'componentInstanceId', 'configPersistenceStrategy', 'config'],
25773
26221
  'praxis-list': ['listId', 'componentInstanceId', 'enableCustomization', 'config'],
25774
26222
  'praxis-expansion': ['expansionId', 'componentInstanceId', 'config'],
@@ -32072,9 +32520,16 @@ class DynamicWidgetPageComponent {
32072
32520
  origin: 'dynamic-page.rich-content',
32073
32521
  componentId: 'praxis-dynamic-page',
32074
32522
  },
32523
+ }).then((result) => {
32524
+ if (!result?.success) {
32525
+ this.emitRichContentCustomAction(widgetKey, actionId, payload);
32526
+ }
32075
32527
  });
32076
32528
  return;
32077
32529
  }
32530
+ this.emitRichContentCustomAction(widgetKey, actionId, payload);
32531
+ }
32532
+ emitRichContentCustomAction(widgetKey, actionId, payload) {
32078
32533
  this.onWidgetEvent(widgetKey, {
32079
32534
  ownerWidgetKey: widgetKey,
32080
32535
  sourceComponentId: 'praxis-rich-content',
@@ -35038,6 +35493,8 @@ class PraxisSurfaceHostComponent {
35038
35493
  */
35039
35494
  renderTitleInsideBody = false;
35040
35495
  widgetEvent = new EventEmitter();
35496
+ rowClick = new EventEmitter();
35497
+ selectionChange = new EventEmitter();
35041
35498
  beforeWidgetLoader;
35042
35499
  mainWidgetLoader;
35043
35500
  afterWidgetLoader;
@@ -35151,13 +35608,19 @@ class PraxisSurfaceHostComponent {
35151
35608
  }
35152
35609
  }
35153
35610
  onSlotWidgetEvent(ownerWidgetKey, event) {
35611
+ if (event.output === 'rowClick') {
35612
+ this.rowClick.emit(event.payload);
35613
+ }
35614
+ if (event.output === 'selectionChange') {
35615
+ this.selectionChange.emit(event.payload);
35616
+ }
35154
35617
  this.widgetEvent.emit({
35155
35618
  ...event,
35156
35619
  ownerWidgetKey: event.ownerWidgetKey || ownerWidgetKey,
35157
35620
  });
35158
35621
  }
35159
35622
  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: `
35623
+ 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
35624
  <div class="pdx-surface-host">
35162
35625
  @if (subtitle || (title && renderTitleInsideBody)) {
35163
35626
  <header class="pdx-surface-host__header">
@@ -35184,6 +35647,7 @@ class PraxisSurfaceHostComponent {
35184
35647
  [ownerWidgetKey]="beforeWidgetKey"
35185
35648
  [context]="context"
35186
35649
  [strictValidation]="strictValidation"
35650
+ [autoWireOutputs]="true"
35187
35651
  (widgetEvent)="onSlotWidgetEvent(beforeWidgetKey, $event)"
35188
35652
  ></ng-container>
35189
35653
  </div>
@@ -35196,6 +35660,7 @@ class PraxisSurfaceHostComponent {
35196
35660
  [ownerWidgetKey]="mainWidgetKey"
35197
35661
  [context]="context"
35198
35662
  [strictValidation]="strictValidation"
35663
+ [autoWireOutputs]="true"
35199
35664
  (widgetEvent)="onSlotWidgetEvent(mainWidgetKey, $event)"
35200
35665
  ></ng-container>
35201
35666
  }
@@ -35208,6 +35673,7 @@ class PraxisSurfaceHostComponent {
35208
35673
  [ownerWidgetKey]="afterWidgetKey"
35209
35674
  [context]="context"
35210
35675
  [strictValidation]="strictValidation"
35676
+ [autoWireOutputs]="true"
35211
35677
  (widgetEvent)="onSlotWidgetEvent(afterWidgetKey, $event)"
35212
35678
  ></ng-container>
35213
35679
  </div>
@@ -35245,6 +35711,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35245
35711
  [ownerWidgetKey]="beforeWidgetKey"
35246
35712
  [context]="context"
35247
35713
  [strictValidation]="strictValidation"
35714
+ [autoWireOutputs]="true"
35248
35715
  (widgetEvent)="onSlotWidgetEvent(beforeWidgetKey, $event)"
35249
35716
  ></ng-container>
35250
35717
  </div>
@@ -35257,6 +35724,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35257
35724
  [ownerWidgetKey]="mainWidgetKey"
35258
35725
  [context]="context"
35259
35726
  [strictValidation]="strictValidation"
35727
+ [autoWireOutputs]="true"
35260
35728
  (widgetEvent)="onSlotWidgetEvent(mainWidgetKey, $event)"
35261
35729
  ></ng-container>
35262
35730
  }
@@ -35269,6 +35737,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35269
35737
  [ownerWidgetKey]="afterWidgetKey"
35270
35738
  [context]="context"
35271
35739
  [strictValidation]="strictValidation"
35740
+ [autoWireOutputs]="true"
35272
35741
  (widgetEvent)="onSlotWidgetEvent(afterWidgetKey, $event)"
35273
35742
  ></ng-container>
35274
35743
  </div>
@@ -35296,6 +35765,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35296
35765
  type: Input
35297
35766
  }], widgetEvent: [{
35298
35767
  type: Output
35768
+ }], rowClick: [{
35769
+ type: Output
35770
+ }], selectionChange: [{
35771
+ type: Output
35299
35772
  }], beforeWidgetLoader: [{
35300
35773
  type: ViewChild,
35301
35774
  args: ['beforeWidgetLoader', { read: DynamicWidgetLoaderDirective }]
@@ -36765,4 +37238,4 @@ function provideHookWhitelist(allowed) {
36765
37238
  * Generated bundle index. Do not edit.
36766
37239
  */
36767
37240
 
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 };
37241
+ 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, 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, 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 };