@praxisui/core 9.0.0-beta.2 → 9.0.0-beta.20

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.
@@ -2020,6 +2020,9 @@ class SchemaNormalizerService {
2020
2020
  if (ui.helpText !== undefined) {
2021
2021
  field.helpText = String(ui.helpText);
2022
2022
  }
2023
+ if (ui.tooltip !== undefined) {
2024
+ field.tooltip = String(ui.tooltip);
2025
+ }
2023
2026
  if (ui.hint !== undefined) {
2024
2027
  field.hint = ui.hint;
2025
2028
  }
@@ -5533,15 +5536,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5533
5536
  }], ctorParameters: () => [] });
5534
5537
 
5535
5538
  function buildBaseColumnFromDef(def) {
5539
+ const type = resolveColumnTypeFromFieldDefinition(def);
5540
+ const format = type === 'string' ? resolveTextMaskFormatFromFieldDefinition(def) : undefined;
5536
5541
  return {
5537
5542
  field: def.name,
5538
5543
  header: def.label || def.name,
5539
- type: inferType(def),
5544
+ type,
5540
5545
  visible: def.tableHidden === true ? false : true,
5541
5546
  sortable: def.sortable !== false,
5542
5547
  filterable: def.filterable === true,
5543
5548
  resizable: true,
5544
5549
  order: typeof def.order === 'number' ? def.order : undefined,
5550
+ ...(format ? { format } : {}),
5545
5551
  };
5546
5552
  }
5547
5553
  function applyLocalCustomizations$2(baseCol, localCol) {
@@ -5575,9 +5581,10 @@ function applyLocalCustomizations$2(baseCol, localCol) {
5575
5581
  result.renderer = localCol.renderer ?? baseCol.renderer;
5576
5582
  }
5577
5583
  else {
5578
- // Keep no format/renderer to avoid conflicts with server type
5579
- result.format = undefined;
5580
- result.valueMapping = undefined;
5584
+ // Drop local presentation that may be incompatible with the new server type,
5585
+ // but keep canonical server presentation for the resolved type.
5586
+ result.format = baseCol.format;
5587
+ result.valueMapping = baseCol.valueMapping;
5581
5588
  result.renderer = undefined;
5582
5589
  }
5583
5590
  return result;
@@ -5603,15 +5610,121 @@ function reconcileTableConfig(layout, serverDefs) {
5603
5610
  };
5604
5611
  return next;
5605
5612
  }
5606
- function inferType(def) {
5607
- const t = (def.type || '').toLowerCase();
5608
- if (t.includes('date'))
5613
+ function resolveColumnTypeFromFieldDefinition(def, fallback) {
5614
+ const semanticType = resolveSemanticColumnTypeFromFieldDefinition(def);
5615
+ if (resolveTextMaskFormatFromFieldDefinition(def) &&
5616
+ shouldUseTextMaskForColumn(def, semanticType)) {
5617
+ return 'string';
5618
+ }
5619
+ if (semanticType)
5620
+ return semanticType;
5621
+ if (fallback)
5622
+ return fallback;
5623
+ return 'string';
5624
+ }
5625
+ function resolveSemanticColumnTypeFromFieldDefinition(def) {
5626
+ const controlType = normalizePresentationToken(def.controlType);
5627
+ const numericFormat = normalizePresentationToken(def.numericFormat ?? def.format);
5628
+ const valuePresentationType = normalizePresentationToken(def.valuePresentation?.type);
5629
+ const dataType = normalizePresentationToken(def.type);
5630
+ if (valuePresentationType === 'currency')
5631
+ return 'currency';
5632
+ if (valuePresentationType === 'percent' || valuePresentationType === 'percentage')
5633
+ return 'percentage';
5634
+ if (valuePresentationType === 'date' || valuePresentationType === 'datetime' || valuePresentationType === 'time')
5609
5635
  return 'date';
5610
- if (t.includes('bool'))
5636
+ if (valuePresentationType === 'boolean')
5611
5637
  return 'boolean';
5612
- if (t.includes('number') || t.includes('int') || t.includes('decimal'))
5638
+ if (valuePresentationType === 'number')
5613
5639
  return 'number';
5614
- return 'string';
5640
+ if (valuePresentationType === 'string')
5641
+ return 'string';
5642
+ if (numericFormat === 'currency' || controlType === 'currency')
5643
+ return 'currency';
5644
+ if (numericFormat === 'percent' || numericFormat === 'percentage')
5645
+ return 'percentage';
5646
+ if (numericFormat === 'date' || numericFormat === 'datetime')
5647
+ return 'date';
5648
+ if (controlType === 'numerictextbox' || controlType === 'inlinenumber')
5649
+ return 'number';
5650
+ if (controlType === 'checkbox' || controlType === 'toggle' || controlType === 'inlinetoggle')
5651
+ return 'boolean';
5652
+ if (controlType.includes('date') || controlType === 'time' || controlType === 'timepicker')
5653
+ return 'date';
5654
+ if (isColumnType(dataType))
5655
+ return dataType;
5656
+ if (dataType === 'text' || dataType === 'email' || dataType === 'url' || dataType === 'password')
5657
+ return 'string';
5658
+ if (dataType.includes('date') || dataType === 'time')
5659
+ return 'date';
5660
+ if (dataType.includes('bool'))
5661
+ return 'boolean';
5662
+ if (dataType.includes('number') ||
5663
+ dataType.includes('int') ||
5664
+ dataType.includes('decimal') ||
5665
+ dataType.includes('double') ||
5666
+ dataType.includes('float')) {
5667
+ return 'number';
5668
+ }
5669
+ if (isTextualControlType(controlType))
5670
+ return 'string';
5671
+ return undefined;
5672
+ }
5673
+ function shouldUseTextMaskForColumn(def, semanticType) {
5674
+ if (!semanticType || semanticType === 'string')
5675
+ return true;
5676
+ const controlType = normalizePresentationToken(def.controlType);
5677
+ if (isTextualControlType(controlType))
5678
+ return true;
5679
+ if (['date', 'boolean', 'currency', 'percentage', 'custom'].includes(semanticType)) {
5680
+ return false;
5681
+ }
5682
+ const valuePresentationType = normalizePresentationToken(def.valuePresentation?.type);
5683
+ const numericFormat = normalizePresentationToken(def.numericFormat ?? def.format);
5684
+ return !valuePresentationType && !numericFormat;
5685
+ }
5686
+ function resolveTextMaskFormatFromFieldDefinition(def) {
5687
+ return resolveTextMaskFormat(def.mask ??
5688
+ def.displayMask ??
5689
+ def.inputMask ??
5690
+ def.extraProperties?.mask);
5691
+ }
5692
+ function resolveTextMaskFormat(value) {
5693
+ if (typeof value !== 'string')
5694
+ return undefined;
5695
+ const format = value.trim();
5696
+ if (!format)
5697
+ return undefined;
5698
+ const hasMaskTokens = /[0#9Xx]/.test(format);
5699
+ const hasInvalidMaskLetters = /[A-WYZa-wyz]/.test(format);
5700
+ return hasMaskTokens && !hasInvalidMaskLetters ? format : undefined;
5701
+ }
5702
+ function normalizePresentationToken(value) {
5703
+ return String(value ?? '').trim().toLowerCase().replace(/[\s_-]+/g, '');
5704
+ }
5705
+ function isColumnType(value) {
5706
+ return [
5707
+ 'string',
5708
+ 'number',
5709
+ 'date',
5710
+ 'boolean',
5711
+ 'currency',
5712
+ 'percentage',
5713
+ 'custom',
5714
+ ].includes(value);
5715
+ }
5716
+ function isTextualControlType(value) {
5717
+ return [
5718
+ 'input',
5719
+ 'inlineinput',
5720
+ 'textarea',
5721
+ 'search',
5722
+ 'email',
5723
+ 'url',
5724
+ 'phone',
5725
+ 'cpfcnpjinput',
5726
+ 'password',
5727
+ ].includes(value);
5615
5728
  }
5616
5729
 
5617
5730
  const PRAXIS_I18N_CONFIG = new InjectionToken('PRAXIS_I18N_CONFIG', {
@@ -6331,7 +6444,7 @@ const GLOBAL_SURFACE_SERVICE = new InjectionToken('GLOBAL_SURFACE_SERVICE');
6331
6444
 
6332
6445
  const dialogBaseFields = [
6333
6446
  { key: 'message', label: 'Mensagem', type: 'textarea', rows: 2, placeholder: 'Texto principal' },
6334
- { key: 'title', label: 'Titulo', type: 'text', placeholder: 'Titulo do dialogo' },
6447
+ { key: 'title', label: 'Título', type: 'text', placeholder: 'Título do diálogo' },
6335
6448
  {
6336
6449
  key: 'themeColor',
6337
6450
  label: 'Tema',
@@ -6342,13 +6455,13 @@ const dialogBaseFields = [
6342
6455
  { value: 'dark', label: 'Dark' },
6343
6456
  ],
6344
6457
  },
6345
- { key: 'positionTop', label: 'Posicao topo', type: 'text', placeholder: '12px' },
6346
- { key: 'positionRight', label: 'Posicao direita', type: 'text', placeholder: '12px' },
6347
- { key: 'positionBottom', label: 'Posicao base', type: 'text', placeholder: '12px' },
6348
- { key: 'positionLeft', label: 'Posicao esquerda', type: 'text', placeholder: '12px' },
6458
+ { key: 'positionTop', label: 'Posição topo', type: 'text', placeholder: '12px' },
6459
+ { key: 'positionRight', label: 'Posição direita', type: 'text', placeholder: '12px' },
6460
+ { key: 'positionBottom', label: 'Posição base', type: 'text', placeholder: '12px' },
6461
+ { key: 'positionLeft', label: 'Posição esquerda', type: 'text', placeholder: '12px' },
6349
6462
  {
6350
6463
  key: 'actionsLayout',
6351
- label: 'Layout das acoes',
6464
+ label: 'Layout das ações',
6352
6465
  type: 'select',
6353
6466
  options: [
6354
6467
  { value: 'start', label: 'Start' },
@@ -6359,7 +6472,7 @@ const dialogBaseFields = [
6359
6472
  },
6360
6473
  {
6361
6474
  key: 'animationType',
6362
- label: 'Animacao',
6475
+ label: 'Animação',
6363
6476
  type: 'select',
6364
6477
  options: [
6365
6478
  { value: 'translate', label: 'Translate' },
@@ -6371,7 +6484,7 @@ const dialogBaseFields = [
6371
6484
  },
6372
6485
  {
6373
6486
  key: 'animationDirection',
6374
- label: 'Direcao animacao',
6487
+ label: 'Direção animação',
6375
6488
  type: 'select',
6376
6489
  options: [
6377
6490
  { value: 'up', label: 'Up' },
@@ -6380,13 +6493,13 @@ const dialogBaseFields = [
6380
6493
  { value: 'right', label: 'Right' },
6381
6494
  ],
6382
6495
  },
6383
- { key: 'animationDuration', label: 'Duracao (ms)', type: 'number', placeholder: '300' },
6496
+ { key: 'animationDuration', label: 'Duração (ms)', type: 'number', placeholder: '300' },
6384
6497
  { key: 'width', label: 'Largura', type: 'text', placeholder: '480px' },
6385
6498
  { key: 'height', label: 'Altura', type: 'text', placeholder: 'auto' },
6386
- { key: 'minWidth', label: 'Largura minima', type: 'text', placeholder: '280px' },
6387
- { key: 'maxWidth', label: 'Largura maxima', type: 'text', placeholder: '90vw' },
6388
- { key: 'minHeight', label: 'Altura minima', type: 'text', placeholder: '120px' },
6389
- { key: 'maxHeight', label: 'Altura maxima', type: 'text', placeholder: '90vh' },
6499
+ { key: 'minWidth', label: 'Largura mínima', type: 'text', placeholder: '280px' },
6500
+ { key: 'maxWidth', label: 'Largura máxima', type: 'text', placeholder: '90vw' },
6501
+ { key: 'minHeight', label: 'Altura mínima', type: 'text', placeholder: '120px' },
6502
+ { key: 'maxHeight', label: 'Altura máxima', type: 'text', placeholder: '90vh' },
6390
6503
  { key: 'disableClose', label: 'Bloquear fechar', type: 'toggle' },
6391
6504
  { key: 'hasBackdrop', label: 'Backdrop', type: 'toggle' },
6392
6505
  { key: 'closeOnBackdropClick', label: 'Fechar ao clicar no backdrop', type: 'toggle' },
@@ -6414,7 +6527,7 @@ const dialogFieldsWithModeDependency = dialogFieldsWithoutMessage.map((field) =>
6414
6527
  ...field,
6415
6528
  dependsOnKey: field.dependsOnKey ?? 'mode',
6416
6529
  dependsOnValue: field.dependsOnValue ?? 'true',
6417
- hint: field.hint ?? 'Disponivel quando "Usar dialogo" estiver ativo.',
6530
+ hint: field.hint ?? 'Disponível quando "Usar diálogo" estiver ativo.',
6418
6531
  }));
6419
6532
  const GLOBAL_ACTION_UI_SCHEMAS = [
6420
6533
  {
@@ -6462,7 +6575,7 @@ const GLOBAL_ACTION_UI_SCHEMAS = [
6462
6575
  required: true,
6463
6576
  placeholder: 'Texto exibido no alerta simples',
6464
6577
  },
6465
- { key: 'mode', label: 'Usar dialogo (avancado)', type: 'toggle' },
6578
+ { key: 'mode', label: 'Usar diálogo (avançado)', type: 'toggle' },
6466
6579
  ...dialogFieldsWithModeDependency,
6467
6580
  ],
6468
6581
  },
@@ -6481,19 +6594,19 @@ const GLOBAL_ACTION_UI_SCHEMAS = [
6481
6594
  fields: [
6482
6595
  ...dialogBaseFields,
6483
6596
  { key: 'placeholder', label: 'Placeholder', type: 'text' },
6484
- { key: 'defaultValue', label: 'Valor padrao', type: 'text' },
6597
+ { key: 'defaultValue', label: 'Valor padrão', type: 'text' },
6485
6598
  { key: 'okLabel', label: 'Texto OK', type: 'text' },
6486
6599
  { key: 'cancelLabel', label: 'Texto cancelar', type: 'text' },
6487
6600
  ],
6488
6601
  },
6489
6602
  {
6490
6603
  id: 'dialog.open',
6491
- label: 'Abrir dialogo',
6604
+ label: 'Abrir diálogo',
6492
6605
  fields: [
6493
6606
  ...dialogBaseFields,
6494
6607
  {
6495
6608
  key: 'contentType',
6496
- label: 'Tipo de conteudo',
6609
+ label: 'Tipo de conteúdo',
6497
6610
  type: 'select',
6498
6611
  options: [
6499
6612
  { value: 'template', label: 'Template' },
@@ -6514,7 +6627,7 @@ const GLOBAL_ACTION_UI_SCHEMAS = [
6514
6627
  { key: 'message', label: 'Mensagem', type: 'text' },
6515
6628
  {
6516
6629
  key: 'level',
6517
- label: 'Nivel',
6630
+ label: 'Nível',
6518
6631
  type: 'select',
6519
6632
  options: [
6520
6633
  { value: 'log', label: 'log' },
@@ -9496,9 +9609,25 @@ function mapFieldDefinitionToMetadata(field) {
9496
9609
  metadata.maxLength = field.maxLength;
9497
9610
  if (field.pattern !== undefined)
9498
9611
  metadata.pattern = field.pattern;
9612
+ if (field.helpText !== undefined) {
9613
+ metadata.helpText = field.helpText;
9614
+ }
9499
9615
  if (field.hint || field.helpText) {
9500
9616
  metadata.hint = field.hint ?? field.helpText;
9501
9617
  }
9618
+ if (field.tooltipOnHover !== undefined) {
9619
+ metadata.tooltipOnHover = field.tooltipOnHover;
9620
+ const tooltip = field.tooltip ??
9621
+ (field.tooltipOnHover === true
9622
+ ? field.description ?? field.helpText ?? field.hint
9623
+ : undefined);
9624
+ if (tooltip !== undefined && tooltip !== null) {
9625
+ metadata.tooltip = String(tooltip);
9626
+ }
9627
+ }
9628
+ else if (field.tooltip !== undefined) {
9629
+ metadata.tooltip = String(field.tooltip);
9630
+ }
9502
9631
  if (field.hiddenCondition !== undefined) {
9503
9632
  metadata.hiddenCondition = field.hiddenCondition;
9504
9633
  }
@@ -16392,6 +16521,37 @@ function normalizeSelectLike(meta) {
16392
16521
  return m;
16393
16522
  }
16394
16523
 
16524
+ const SERVER_OWNED_FIELD_SEMANTIC_KEYS = [
16525
+ 'label',
16526
+ 'hint',
16527
+ 'helpText',
16528
+ 'description',
16529
+ 'tooltip',
16530
+ 'tooltipOnHover',
16531
+ 'icon',
16532
+ 'prefixIcon',
16533
+ 'suffixIcon',
16534
+ 'iconPosition',
16535
+ 'iconSize',
16536
+ 'iconColor',
16537
+ 'iconClass',
16538
+ 'iconStyle',
16539
+ 'iconFontSize',
16540
+ ];
16541
+ function applyServerOwnedFieldSemantics(merged, serverField) {
16542
+ const next = { ...merged };
16543
+ const server = serverField;
16544
+ for (const key of SERVER_OWNED_FIELD_SEMANTIC_KEYS) {
16545
+ if (server[key] === undefined) {
16546
+ delete next[key];
16547
+ }
16548
+ else {
16549
+ next[key] = server[key];
16550
+ }
16551
+ }
16552
+ return next;
16553
+ }
16554
+
16395
16555
  function createDefaultFormConfig() {
16396
16556
  const config = {
16397
16557
  sections: [
@@ -16554,7 +16714,7 @@ function syncWithServerMetadata(localConfig, serverMetadata) {
16554
16714
  toggleOptions: pick('toggleOptions'),
16555
16715
  nodes: pick('nodes'),
16556
16716
  };
16557
- mergedOverlapping.push(merged);
16717
+ mergedOverlapping.push(applyServerOwnedFieldSemantics(merged, serverField));
16558
16718
  // Track simple modifications for diagnostics
16559
16719
  ['label', 'required', 'maxLength', 'minLength', 'dataType', 'controlType'].forEach((prop) => {
16560
16720
  if (loc[prop] !== base[prop]) {
@@ -16894,7 +17054,7 @@ const EVENT_REGISTRATION_EDITORIAL_TEMPLATE = {
16894
17054
  content: [
16895
17055
  {
16896
17056
  type: 'text',
16897
- text: 'Ao enviar a inscricao, o participante reconhece o tratamento dos dados para credenciamento, comunicacoes e operacao do evento.',
17057
+ text: 'Ao enviar a inscrição, o participante reconhece o tratamento dos dados para credenciamento, comunicações e operação do evento.',
16898
17058
  },
16899
17059
  ],
16900
17060
  }),
@@ -17035,7 +17195,7 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
17035
17195
  wrap: true,
17036
17196
  items: [
17037
17197
  { type: 'badge', label: 'onboarding' },
17038
- { type: 'text', text: 'Admissao, conferencia e preferencias iniciais' },
17198
+ { type: 'text', text: 'Admissão, conferência e preferências iniciais' },
17039
17199
  ],
17040
17200
  },
17041
17201
  }, {
@@ -17044,7 +17204,7 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
17044
17204
  subtitle: 'Resumo do fluxo',
17045
17205
  content: [
17046
17206
  { type: 'text', text: 'Dados pessoais e de contato.' },
17047
- { type: 'text', text: 'Preferencias operacionais iniciais.' },
17207
+ { type: 'text', text: 'Preferências operacionais iniciais.' },
17048
17208
  { type: 'text', text: 'Anexos e termos obrigatorios.' },
17049
17209
  ],
17050
17210
  }),
@@ -17076,7 +17236,7 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
17076
17236
  id: 'operations',
17077
17237
  appearance: 'step',
17078
17238
  stepLabel: '2',
17079
- title: 'Operacao inicial',
17239
+ title: 'Operação inicial',
17080
17240
  description: 'Dados para preparacao do ambiente e comunicacao inicial.',
17081
17241
  rows: [
17082
17242
  {
@@ -17102,7 +17262,7 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
17102
17262
  title: 'Uso interno',
17103
17263
  subtitle: 'Antes do envio',
17104
17264
  badge: 'info',
17105
- description: 'As informacoes deste fluxo sao usadas exclusivamente para cadastro interno, provisionamento e comunicacao de onboarding.',
17265
+ description: 'As informações deste fluxo são usadas exclusivamente para cadastro interno, provisionamento e comunicação de onboarding.',
17106
17266
  }),
17107
17267
  formBlocksBeforeActionsPlacement: 'afterSections',
17108
17268
  actions: {
@@ -17151,7 +17311,7 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
17151
17311
  required: true,
17152
17312
  options: [
17153
17313
  { text: 'Presencial', value: 'ONSITE' },
17154
- { text: 'Hibrido', value: 'HYBRID' },
17314
+ { text: 'Híbrido', value: 'HYBRID' },
17155
17315
  { text: 'Remoto', value: 'REMOTE' },
17156
17316
  ],
17157
17317
  },
@@ -17162,22 +17322,22 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
17162
17322
  required: true,
17163
17323
  options: [
17164
17324
  { text: 'Sim', value: 'YES' },
17165
- { text: 'Nao', value: 'NO' },
17325
+ { text: 'Não', value: 'NO' },
17166
17326
  ],
17167
17327
  },
17168
17328
  {
17169
17329
  name: 'shippingAddress',
17170
- label: 'Endereco para envio',
17330
+ label: 'Endereço para envio',
17171
17331
  controlType: 'textarea',
17172
17332
  },
17173
17333
  {
17174
17334
  name: 'accessibilityNotes',
17175
- label: 'Observacoes de acessibilidade ou preferencias',
17335
+ label: 'Observações de acessibilidade ou preferências',
17176
17336
  controlType: 'textarea',
17177
17337
  },
17178
17338
  {
17179
17339
  name: 'privacyConsent',
17180
- label: 'Confirmo ciencia sobre o tratamento dos meus dados no processo de onboarding.',
17340
+ label: 'Confirmo ciência sobre o tratamento dos meus dados no processo de onboarding.',
17181
17341
  controlType: 'checkbox',
17182
17342
  selectionMode: 'boolean',
17183
17343
  variant: 'consent',
@@ -17250,7 +17410,7 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
17250
17410
  id: 'operations',
17251
17411
  appearance: 'step',
17252
17412
  stepLabel: '2',
17253
- title: 'Operacao inicial',
17413
+ title: 'Operação inicial',
17254
17414
  description: 'Configure os recursos necessarios para o primeiro dia.',
17255
17415
  rows: [
17256
17416
  {
@@ -17360,17 +17520,17 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
17360
17520
  options: [
17361
17521
  { text: 'Presencial', value: 'Presencial' },
17362
17522
  { text: 'Remoto', value: 'Remoto' },
17363
- { text: 'Hibrido', value: 'Hibrido' },
17523
+ { text: 'Híbrido', value: 'Híbrido' },
17364
17524
  ],
17365
17525
  },
17366
17526
  {
17367
17527
  name: 'accessibilityNotes',
17368
- label: 'Observacoes adicionais',
17528
+ label: 'Observações adicionais',
17369
17529
  controlType: 'textarea',
17370
17530
  },
17371
17531
  {
17372
17532
  name: 'privacyConsent',
17373
- label: 'Confirmo ciencia sobre o tratamento dos meus dados no processo de onboarding.',
17533
+ label: 'Confirmo ciência sobre o tratamento dos meus dados no processo de onboarding.',
17374
17534
  controlType: 'checkbox',
17375
17535
  selectionMode: 'boolean',
17376
17536
  variant: 'consent',
@@ -17386,7 +17546,7 @@ const PRIVACY_CONSENT_EDITORIAL_TEMPLATE = {
17386
17546
  version: '1.0.0',
17387
17547
  metadata: {
17388
17548
  title: 'Privacy Consent',
17389
- description: 'Template focado em aceite explicito, base legal, preferencias de comunicacao e registro de consentimento.',
17549
+ description: 'Template focado em aceite explícito, base legal, preferências de comunicação e registro de consentimento.',
17390
17550
  category: 'consent',
17391
17551
  tags: ['privacy', 'consent', 'compliance', 'legal'],
17392
17552
  source: 'catalog',
@@ -17408,13 +17568,13 @@ const PRIVACY_CONSENT_EDITORIAL_TEMPLATE = {
17408
17568
  title: 'Consentimento e tratamento de dados',
17409
17569
  subtitle: 'Template regulatorio',
17410
17570
  badge: 'info',
17411
- description: 'Use este template quando o objetivo principal do fluxo for registrar ciencia, aceite e preferencias relacionadas a privacidade.',
17571
+ description: 'Use este template quando o objetivo principal do fluxo for registrar ciência, aceite e preferências relacionadas a privacidade.',
17412
17572
  }),
17413
17573
  sections: [
17414
17574
  {
17415
17575
  id: 'consent',
17416
17576
  appearance: 'card',
17417
- title: 'Preferencias e consentimentos',
17577
+ title: 'Preferências e consentimentos',
17418
17578
  description: 'Aceites explicitos e canais opcionais de comunicacao.',
17419
17579
  rows: [
17420
17580
  {
@@ -17497,7 +17657,7 @@ const PRIVACY_CONSENT_EDITORIAL_TEMPLATE = {
17497
17657
  },
17498
17658
  {
17499
17659
  name: 'consentNotes',
17500
- label: 'Observacoes adicionais',
17660
+ label: 'Observações adicionais',
17501
17661
  controlType: 'textarea',
17502
17662
  },
17503
17663
  ],
@@ -18256,8 +18416,8 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION = {
18256
18416
  fields: [
18257
18417
  { key: 'selectedEquipment', label: 'Equipamentos', valuePath: 'formData.selectedEquipment', hideWhenEmpty: true },
18258
18418
  { key: 'needsEquipment', label: 'Necessita envio de equipamento', valuePath: 'formData.needsEquipment', hideWhenEmpty: true },
18259
- { key: 'shippingAddress', label: 'Endereco para envio', valuePath: 'formData.shippingAddress', hideWhenEmpty: true },
18260
- { key: 'accessibilityNotes', label: 'Observacoes adicionais', valuePath: 'formData.accessibilityNotes', hideWhenEmpty: true },
18419
+ { key: 'shippingAddress', label: 'Endereço para envio', valuePath: 'formData.shippingAddress', hideWhenEmpty: true },
18420
+ { key: 'accessibilityNotes', label: 'Observações adicionais', valuePath: 'formData.accessibilityNotes', hideWhenEmpty: true },
18261
18421
  ],
18262
18422
  },
18263
18423
  ],
@@ -20346,7 +20506,7 @@ class SurfaceOpenActionEditorComponent {
20346
20506
  .filter(Boolean)));
20347
20507
  }
20348
20508
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SurfaceOpenActionEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20349
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: SurfaceOpenActionEditorComponent, isStandalone: true, selector: "praxis-surface-open-action-editor", inputs: { value: "value", hostKind: "hostKind" }, outputs: { valueChange: "valueChange" }, providers: [providePraxisI18nConfig(SURFACE_OPEN_I18N_CONFIG)], usesOnChanges: true, ngImport: i0, template: `
20509
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: SurfaceOpenActionEditorComponent, isStandalone: true, selector: "praxis-surface-open-action-editor", inputs: { value: "value", hostKind: "hostKind" }, outputs: { valueChange: "valueChange" }, host: { attributes: { "data-praxis-surface-open-action-editor": "core" } }, providers: [providePraxisI18nConfig(SURFACE_OPEN_I18N_CONFIG)], usesOnChanges: true, ngImport: i0, template: `
20350
20510
  <div class="surface-editor">
20351
20511
  <div class="surface-section">
20352
20512
  <div class="surface-section-title">{{ t('editor.presets.title', 'Presets') }}</div>
@@ -20643,17 +20803,17 @@ class SurfaceOpenActionEditorComponent {
20643
20803
  {{ t('editor.bindings.empty', 'No bindings configured yet.') }}
20644
20804
  </div>
20645
20805
  }
20646
- <div class="surface-empty">
20806
+ <div class="surface-guidance">
20647
20807
  @if (bindingSourceSuggestionsPreview) {
20648
- <div>
20808
+ <div class="surface-guidance__item">
20649
20809
  {{ t('editor.bindings.suggestedSources', 'Suggested sources: {{value}}', { value: bindingSourceSuggestionsPreview }) }}
20650
20810
  </div>
20651
20811
  }
20652
- <div>
20812
+ <div class="surface-guidance__item surface-guidance__item--primary">
20653
20813
  {{ t('editor.bindings.sourceSemantics', 'Use payload.* for the canonical event envelope and runtime.* for direct host state when the source component exposes it.') }}
20654
20814
  </div>
20655
20815
  @if (bindingTargetSuggestionsPreview) {
20656
- <div>
20816
+ <div class="surface-guidance__item">
20657
20817
  {{ t('editor.bindings.suggestedTargets', 'Suggested targets: {{value}}', { value: bindingTargetSuggestionsPreview }) }}
20658
20818
  </div>
20659
20819
  }
@@ -20689,11 +20849,11 @@ class SurfaceOpenActionEditorComponent {
20689
20849
  </mat-form-field>
20690
20850
  </div>
20691
20851
  </div>
20692
- `, isInline: true, styles: [".surface-editor{display:grid;gap:16px}.surface-section{padding:12px 14px;border:1px dashed var(--md-sys-color-outline-variant, rgba(0, 0, 0, .18));border-radius:10px;background:var(--md-sys-color-surface-container-lowest, #fff)}.surface-section-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}.surface-section-title{font-size:12px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant, #5f6368);margin-bottom:10px}.surface-section-header .surface-section-title{margin-bottom:0}.surface-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px 16px}.surface-preset-row{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.surface-span-2{grid-column:span 2}.surface-span-all{width:100%}.surface-component-meta{display:grid;gap:4px}.surface-component-title{font-weight:600}.surface-component-description,.surface-empty{color:var(--md-sys-color-on-surface-variant, #5f6368);font-size:12px}.surface-bindings{display:grid;gap:12px}.surface-binding-row{display:grid;grid-template-columns:minmax(200px,1.2fr) minmax(220px,1.4fr) minmax(140px,.8fr) minmax(180px,1fr) auto;gap:12px;align-items:start}mat-form-field{width:100%}@media(max-width:960px){.surface-binding-row{grid-template-columns:minmax(0,1fr)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
20852
+ `, isInline: true, styles: [".surface-editor{display:grid;gap:14px;min-width:0}.surface-section{display:grid;gap:10px;min-width:0;padding:14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low)}.surface-section-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:0}.surface-section-title{font-size:12px;font-weight:700;letter-spacing:0;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant);margin-bottom:0}.surface-section-header .surface-section-title{margin-bottom:0}.surface-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:12px 16px;min-width:0}.surface-preset-row{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.surface-span-2{grid-column:span 2}.surface-span-all{width:100%;min-width:0}.surface-component-meta{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-component-title{font-weight:600;color:var(--md-sys-color-on-surface)}.surface-component-description,.surface-empty{color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-bindings{display:grid;gap:10px;min-width:0}.surface-binding-row{display:grid;grid-template-columns:minmax(min(220px,100%),1.15fr) minmax(min(240px,100%),1.25fr) minmax(128px,.55fr) auto;gap:10px;align-items:start;min-width:0;padding:10px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-binding-row mat-form-field:nth-child(4){grid-column:1 / -2}.surface-guidance{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 18%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-guidance__item{overflow-wrap:anywhere}.surface-guidance__item--primary{color:var(--md-sys-color-on-surface)}mat-form-field{width:100%;min-width:0}@media(max-width:960px){.surface-section{padding:12px}.surface-span-2{grid-column:1 / -1}.surface-binding-row{grid-template-columns:minmax(0,1fr)}.surface-binding-row mat-form-field:nth-child(4){grid-column:auto}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
20693
20853
  }
20694
20854
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SurfaceOpenActionEditorComponent, decorators: [{
20695
20855
  type: Component,
20696
- args: [{ selector: 'praxis-surface-open-action-editor', standalone: true, providers: [providePraxisI18nConfig(SURFACE_OPEN_I18N_CONFIG)], imports: [
20856
+ args: [{ selector: 'praxis-surface-open-action-editor', standalone: true, host: { 'data-praxis-surface-open-action-editor': 'core' }, providers: [providePraxisI18nConfig(SURFACE_OPEN_I18N_CONFIG)], imports: [
20697
20857
  FormsModule,
20698
20858
  MatButtonModule,
20699
20859
  MatFormFieldModule,
@@ -20999,17 +21159,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
20999
21159
  {{ t('editor.bindings.empty', 'No bindings configured yet.') }}
21000
21160
  </div>
21001
21161
  }
21002
- <div class="surface-empty">
21162
+ <div class="surface-guidance">
21003
21163
  @if (bindingSourceSuggestionsPreview) {
21004
- <div>
21164
+ <div class="surface-guidance__item">
21005
21165
  {{ t('editor.bindings.suggestedSources', 'Suggested sources: {{value}}', { value: bindingSourceSuggestionsPreview }) }}
21006
21166
  </div>
21007
21167
  }
21008
- <div>
21168
+ <div class="surface-guidance__item surface-guidance__item--primary">
21009
21169
  {{ t('editor.bindings.sourceSemantics', 'Use payload.* for the canonical event envelope and runtime.* for direct host state when the source component exposes it.') }}
21010
21170
  </div>
21011
21171
  @if (bindingTargetSuggestionsPreview) {
21012
- <div>
21172
+ <div class="surface-guidance__item">
21013
21173
  {{ t('editor.bindings.suggestedTargets', 'Suggested targets: {{value}}', { value: bindingTargetSuggestionsPreview }) }}
21014
21174
  </div>
21015
21175
  }
@@ -21045,7 +21205,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
21045
21205
  </mat-form-field>
21046
21206
  </div>
21047
21207
  </div>
21048
- `, styles: [".surface-editor{display:grid;gap:16px}.surface-section{padding:12px 14px;border:1px dashed var(--md-sys-color-outline-variant, rgba(0, 0, 0, .18));border-radius:10px;background:var(--md-sys-color-surface-container-lowest, #fff)}.surface-section-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}.surface-section-title{font-size:12px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant, #5f6368);margin-bottom:10px}.surface-section-header .surface-section-title{margin-bottom:0}.surface-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px 16px}.surface-preset-row{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.surface-span-2{grid-column:span 2}.surface-span-all{width:100%}.surface-component-meta{display:grid;gap:4px}.surface-component-title{font-weight:600}.surface-component-description,.surface-empty{color:var(--md-sys-color-on-surface-variant, #5f6368);font-size:12px}.surface-bindings{display:grid;gap:12px}.surface-binding-row{display:grid;grid-template-columns:minmax(200px,1.2fr) minmax(220px,1.4fr) minmax(140px,.8fr) minmax(180px,1fr) auto;gap:12px;align-items:start}mat-form-field{width:100%}@media(max-width:960px){.surface-binding-row{grid-template-columns:minmax(0,1fr)}}\n"] }]
21208
+ `, styles: [".surface-editor{display:grid;gap:14px;min-width:0}.surface-section{display:grid;gap:10px;min-width:0;padding:14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low)}.surface-section-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:0}.surface-section-title{font-size:12px;font-weight:700;letter-spacing:0;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant);margin-bottom:0}.surface-section-header .surface-section-title{margin-bottom:0}.surface-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:12px 16px;min-width:0}.surface-preset-row{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.surface-span-2{grid-column:span 2}.surface-span-all{width:100%;min-width:0}.surface-component-meta{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-component-title{font-weight:600;color:var(--md-sys-color-on-surface)}.surface-component-description,.surface-empty{color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-bindings{display:grid;gap:10px;min-width:0}.surface-binding-row{display:grid;grid-template-columns:minmax(min(220px,100%),1.15fr) minmax(min(240px,100%),1.25fr) minmax(128px,.55fr) auto;gap:10px;align-items:start;min-width:0;padding:10px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-binding-row mat-form-field:nth-child(4){grid-column:1 / -2}.surface-guidance{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 18%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-guidance__item{overflow-wrap:anywhere}.surface-guidance__item--primary{color:var(--md-sys-color-on-surface)}mat-form-field{width:100%;min-width:0}@media(max-width:960px){.surface-section{padding:12px}.surface-span-2{grid-column:1 / -1}.surface-binding-row{grid-template-columns:minmax(0,1fr)}.surface-binding-row mat-form-field:nth-child(4){grid-column:auto}}\n"] }]
21049
21209
  }], propDecorators: { value: [{
21050
21210
  type: Input
21051
21211
  }], hostKind: [{
@@ -21091,7 +21251,7 @@ const FIELD_METADATA_CAPABILITIES = {
21091
21251
  'Detalhes específicos de cada controle (ex: opções de datepicker, máscaras específicas) devem ser consultados nos catálogos de microcomponentes.',
21092
21252
  'POLICY: Arrays e objetos (ex: options, validators) devem sofrer merge/append, nunca substituição completa sem confirmação.',
21093
21253
  'Não gere função para conditionalDisplay/conditionalRequired. Use Json Logic serializável; funções ficam restritas a transforms e validators customizados.',
21094
- 'POLICY: Campos auxiliares do host devem usar source=local ou transient=true em FieldMetadata; nao invente campos no DTO/backend quando eles nao devem participar do payload persistido.',
21254
+ 'POLICY: Campos auxiliares do host devem usar source=local ou transient=true em FieldMetadata; não invente campos no DTO/backend quando eles não devem participar do payload persistido.',
21095
21255
  'POLICY: formSubmit.formData e o payload filtrado para backend; formSubmit.rawFormData preserva os valores completos da UI, incluindo campos locais/transient.',
21096
21256
  ],
21097
21257
  capabilities: [
@@ -21194,6 +21354,13 @@ const FIELD_METADATA_CAPABILITIES = {
21194
21354
  description: 'Texto de ajuda exibido abaixo do campo.',
21195
21355
  intentExamples: ['colocar dica', 'ajuda no rodapé do campo'],
21196
21356
  },
21357
+ {
21358
+ path: 'helpText',
21359
+ category: 'identity',
21360
+ valueKind: 'string',
21361
+ description: 'Texto semântico de ajuda publicado pelo schema/DTO.',
21362
+ intentExamples: ['explicar regra de negócio do campo', 'ajuda vinda do backend'],
21363
+ },
21197
21364
  {
21198
21365
  path: 'tooltip',
21199
21366
  category: 'identity',
@@ -21201,6 +21368,13 @@ const FIELD_METADATA_CAPABILITIES = {
21201
21368
  description: 'Texto exibido ao passar o mouse.',
21202
21369
  intentExamples: ['adicionar tooltip'],
21203
21370
  },
21371
+ {
21372
+ path: 'tooltipOnHover',
21373
+ category: 'identity',
21374
+ valueKind: 'boolean',
21375
+ description: 'Habilita apresentação do tooltip no hover quando suportado pelo renderer.',
21376
+ intentExamples: ['mostrar tooltip ao passar o mouse', 'ativar dica no hover'],
21377
+ },
21204
21378
  {
21205
21379
  path: 'description',
21206
21380
  category: 'identity',
@@ -21292,24 +21466,24 @@ const FIELD_METADATA_CAPABILITIES = {
21292
21466
  category: 'data',
21293
21467
  valueKind: 'enum',
21294
21468
  allowedValues: ENUMS$1.fieldSource,
21295
- description: 'Origem semantica do campo. Use local para campos do host que nao vem do schema backend.',
21296
- intentExamples: ['campo local', 'campo auxiliar do host', 'campo que nao vem do schema'],
21297
- safetyNotes: 'Nao marque como local um campo que exista no schema backend; remova a semantica local quando houver colisao com campo server-backed.',
21469
+ description: 'Origem semântica do campo. Use local para campos do host que não vêm do schema backend.',
21470
+ intentExamples: ['campo local', 'campo auxiliar do host', 'campo que não vem do schema'],
21471
+ safetyNotes: 'Não marque como local um campo que exista no schema backend; remova a semântica local quando houver colisão com campo server-backed.',
21298
21472
  },
21299
21473
  {
21300
21474
  path: 'transient',
21301
21475
  category: 'data',
21302
21476
  valueKind: 'boolean',
21303
- description: 'Marca o campo como temporario/local para preenchimento. O dynamic-form omite do submit por padrao.',
21304
- intentExamples: ['campo temporario', 'campo transient', 'nao enviar no payload', 'usar apenas na UI'],
21305
- safetyNotes: 'Campos transient continuam participando de UI, validacao, regras, visibilidade e valueChange; eles apenas saem do payload persistido por padrao.',
21477
+ description: 'Marca o campo como temporário/local para preenchimento. O dynamic-form omite do submit por padrão.',
21478
+ intentExamples: ['campo temporário', 'campo transient', 'não enviar no payload', 'usar apenas na UI'],
21479
+ safetyNotes: 'Campos transient continuam participando de UI, validação, regras, visibilidade e valueChange; eles apenas saem do payload persistido por padrão.',
21306
21480
  },
21307
21481
  {
21308
21482
  path: 'submitPolicy',
21309
21483
  category: 'behavior',
21310
21484
  valueKind: 'enum',
21311
21485
  allowedValues: ENUMS$1.fieldSubmitPolicy,
21312
- description: 'Politica de submit para sobrescrever o padrao de campos locais/transient.',
21486
+ description: 'Política de submit para sobrescrever o padrão de campos locais/transient.',
21313
21487
  intentExamples: ['omitir do submit', 'enviar mesmo sendo local', 'enviar apenas se alterado'],
21314
21488
  safetyNotes: 'Use omit para nunca persistir, include para enviar sempre e includeWhenDirty apenas quando o controle estiver dirty.',
21315
21489
  },
@@ -21412,6 +21586,34 @@ const FIELD_METADATA_CAPABILITIES = {
21412
21586
  description: 'Tamanho do ícone.',
21413
21587
  intentExamples: ['ícone pequeno', 'aumentar tamanho do ícone', 'ícone grande'],
21414
21588
  },
21589
+ {
21590
+ path: 'iconColor',
21591
+ category: 'appearance',
21592
+ valueKind: 'string',
21593
+ description: 'Cor semântica ou token de cor aplicado ao ícone principal.',
21594
+ intentExamples: ['ícone em cor primária', 'usar token do tema no ícone'],
21595
+ },
21596
+ {
21597
+ path: 'iconClass',
21598
+ category: 'appearance',
21599
+ valueKind: 'string',
21600
+ description: 'Classe CSS controlada pelo host para o ícone principal.',
21601
+ intentExamples: ['usar classe de ícone outlined', 'aplicar classe corporativa'],
21602
+ },
21603
+ {
21604
+ path: 'iconStyle',
21605
+ category: 'appearance',
21606
+ valueKind: 'string',
21607
+ description: 'Estilo visual semântico do ícone quando o renderer suportar variações.',
21608
+ intentExamples: ['usar ícone arredondado', 'aplicar estilo filled'],
21609
+ },
21610
+ {
21611
+ path: 'iconFontSize',
21612
+ category: 'appearance',
21613
+ valueKind: 'string',
21614
+ description: 'Tamanho tipográfico do ícone principal.',
21615
+ intentExamples: ['ícone com 18px', 'ajustar tamanho do ícone'],
21616
+ },
21415
21617
  // =============================================================================
21416
21618
  // MASK / FORMAT
21417
21619
  // =============================================================================
@@ -21451,8 +21653,8 @@ const FIELD_METADATA_CAPABILITIES = {
21451
21653
  path: 'required',
21452
21654
  category: 'validation',
21453
21655
  valueKind: 'boolean',
21454
- description: 'Campo obrigatorio (alias rapido do validators.required).',
21455
- intentExamples: ['campo obrigatorio', 'exigir preenchimento'],
21656
+ description: 'Campo obrigatório (alias rápido do validators.required).',
21657
+ intentExamples: ['campo obrigatório', 'exigir preenchimento'],
21456
21658
  },
21457
21659
  {
21458
21660
  path: 'validators.requiredMessage',
@@ -21471,7 +21673,7 @@ const FIELD_METADATA_CAPABILITIES = {
21471
21673
  path: 'validators.emailMessage',
21472
21674
  category: 'validation',
21473
21675
  valueKind: 'string',
21474
- description: 'Mensagem customizada para validacao de email.',
21676
+ description: 'Mensagem customizada para validação de email.',
21475
21677
  },
21476
21678
  {
21477
21679
  path: 'validators.minLength',
@@ -21611,15 +21813,15 @@ const FIELD_METADATA_CAPABILITIES = {
21611
21813
  path: 'validators.customValidator',
21612
21814
  category: 'validation',
21613
21815
  valueKind: 'expression',
21614
- description: 'Validador customizado (funcao).',
21615
- safetyNotes: 'Funcoes nao sao serializaveis; exige wiring manual.',
21816
+ description: 'Validador customizado (função).',
21817
+ safetyNotes: 'Funções não são serializáveis; exige wiring manual.',
21616
21818
  },
21617
21819
  {
21618
21820
  path: 'validators.asyncValidator',
21619
21821
  category: 'validation',
21620
21822
  valueKind: 'expression',
21621
- description: 'Validador async customizado (funcao).',
21622
- safetyNotes: 'Funcoes nao sao serializaveis; exige wiring manual.',
21823
+ description: 'Validador async customizado (função).',
21824
+ safetyNotes: 'Funções não são serializáveis; exige wiring manual.',
21623
21825
  },
21624
21826
  {
21625
21827
  path: 'validators.matchField',
@@ -21637,8 +21839,8 @@ const FIELD_METADATA_CAPABILITIES = {
21637
21839
  path: 'validators.uniqueValidator',
21638
21840
  category: 'validation',
21639
21841
  valueKind: 'expression',
21640
- description: 'Validador de unicidade via API (funcao).',
21641
- safetyNotes: 'Funcoes nao sao serializaveis; exige wiring manual.',
21842
+ description: 'Validador de unicidade via API (função).',
21843
+ safetyNotes: 'Funções não são serializáveis; exige wiring manual.',
21642
21844
  },
21643
21845
  {
21644
21846
  path: 'validators.uniqueMessage',
@@ -21650,8 +21852,8 @@ const FIELD_METADATA_CAPABILITIES = {
21650
21852
  path: 'validators.conditionalValidation',
21651
21853
  category: 'validation',
21652
21854
  valueKind: 'array',
21653
- description: 'Regras de validacao condicional.',
21654
- safetyNotes: 'Use regras declarativas com Json Logic serializavel; nao gere funcoes aqui.',
21855
+ description: 'Regras de validação condicional.',
21856
+ safetyNotes: 'Use regras declarativas com Json Logic serializável; não gere funções aqui.',
21655
21857
  },
21656
21858
  {
21657
21859
  path: 'validators.conditionalValidation[].condition',
@@ -21671,13 +21873,13 @@ const FIELD_METADATA_CAPABILITIES = {
21671
21873
  category: 'validation',
21672
21874
  valueKind: 'enum',
21673
21875
  allowedValues: ENUMS$1.validatorTrigger,
21674
- description: 'Gatilho de validacao no validator.',
21876
+ description: 'Gatilho de validação no validator.',
21675
21877
  },
21676
21878
  {
21677
21879
  path: 'validators.validationDebounce',
21678
21880
  category: 'validation',
21679
21881
  valueKind: 'number',
21680
- description: 'Debounce de validacao no validator (ms).',
21882
+ description: 'Debounce de validação no validator (ms).',
21681
21883
  },
21682
21884
  {
21683
21885
  path: 'validators.showInlineErrors',
@@ -22004,12 +22206,12 @@ const ENUMS = {
22004
22206
  actionPlacement: ['header', 'window'],
22005
22207
  };
22006
22208
  const CAPS = [
22007
- { path: 'page', category: 'page', valueKind: 'object', description: 'Definicao da pagina dinamica.' },
22209
+ { path: 'page', category: 'page', valueKind: 'object', description: 'Definição da página dinâmica.' },
22008
22210
  { path: 'page.context', category: 'context', valueKind: 'object', description: 'Contexto compartilhado entre widgets.' },
22009
- { path: 'page.layoutPreset', category: 'layout', valueKind: 'string', description: 'ID canonico opcional do preset estrutural da pagina.' },
22010
- { path: 'page.layoutPresetOptions', category: 'layout', valueKind: 'object', description: 'Opcoes especificas do preset estrutural consumidas por builders e runtimes futuros.' },
22011
- { path: 'page.themePreset', category: 'appearance', valueKind: 'string', description: 'ID opcional do preset de tema para shell, graficos, densidade e defaults visuais.' },
22012
- { path: 'page.layout', category: 'layout', valueKind: 'object', description: 'Layout base da pagina.' },
22211
+ { path: 'page.layoutPreset', category: 'layout', valueKind: 'string', description: 'ID canônico opcional do preset estrutural da página.' },
22212
+ { path: 'page.layoutPresetOptions', category: 'layout', valueKind: 'object', description: 'Opções específicas do preset estrutural consumidas por builders e runtimes futuros.' },
22213
+ { path: 'page.themePreset', category: 'appearance', valueKind: 'string', description: 'ID opcional do preset de tema para shell, gráficos, densidade e defaults visuais.' },
22214
+ { path: 'page.layout', category: 'layout', valueKind: 'object', description: 'Layout base da página.' },
22013
22215
  { path: 'page.layout.orientation', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.layoutOrientation, description: 'Orientacao do grid (vertical/columns).' },
22014
22216
  { path: 'page.layout.columns', category: 'layout', valueKind: 'number', description: 'Numero de colunas (quando orientation=columns).' },
22015
22217
  { path: 'page.layout.gap', category: 'layout', valueKind: 'string', description: 'Gap entre widgets (ex: 16px).' },
@@ -22018,7 +22220,7 @@ const CAPS = [
22018
22220
  { path: 'page.layout.breakpoints.md', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint md.' },
22019
22221
  { path: 'page.layout.breakpoints.lg', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint lg.' },
22020
22222
  { path: 'page.layout.breakpoints.xl', category: 'layout', valueKind: 'number', description: 'Colunas para breakpoint xl.' },
22021
- { path: 'page.canvas', category: 'layout', valueKind: 'object', description: 'Canvas espacial canonico da pagina quando houver geometria explicita.' },
22223
+ { path: 'page.canvas', category: 'layout', valueKind: 'object', description: 'Canvas espacial canônico da página quando houver geometria explícita.' },
22022
22224
  { path: 'page.canvas.mode', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.canvasMode, description: 'Modo canonico do canvas. Valor atual: grid.' },
22023
22225
  { path: 'page.canvas.columns', category: 'layout', valueKind: 'number', description: 'Numero de colunas do canvas espacial.' },
22024
22226
  { path: 'page.canvas.rowUnit', category: 'layout', valueKind: 'string', description: 'Altura base das linhas do canvas, como 80px.' },
@@ -22032,10 +22234,10 @@ const CAPS = [
22032
22234
  { path: 'page.canvas.items.<widgetKey>.rowSpan', category: 'layout', valueKind: 'number', description: 'Quantidade de linhas ocupadas pelo widget.' },
22033
22235
  { path: 'page.canvas.items.<widgetKey>.zIndex', category: 'layout', valueKind: 'number', description: 'Camada opcional do item no canvas.' },
22034
22236
  { path: 'page.canvas.items.<widgetKey>.constraints', category: 'layout', valueKind: 'object', description: 'Restricoes opcionais de posicao e tamanho do item no canvas.' },
22035
- { path: 'page.canvas.items.<widgetKey>.constraints.minColSpan', category: 'layout', valueKind: 'number', description: 'Span minimo de colunas permitido.' },
22036
- { path: 'page.canvas.items.<widgetKey>.constraints.minRowSpan', category: 'layout', valueKind: 'number', description: 'Span minimo de linhas permitido.' },
22037
- { path: 'page.canvas.items.<widgetKey>.constraints.maxColSpan', category: 'layout', valueKind: 'number', description: 'Span maximo de colunas permitido.' },
22038
- { path: 'page.canvas.items.<widgetKey>.constraints.maxRowSpan', category: 'layout', valueKind: 'number', description: 'Span maximo de linhas permitido.' },
22237
+ { path: 'page.canvas.items.<widgetKey>.constraints.minColSpan', category: 'layout', valueKind: 'number', description: 'Span mínimo de colunas permitido.' },
22238
+ { path: 'page.canvas.items.<widgetKey>.constraints.minRowSpan', category: 'layout', valueKind: 'number', description: 'Span mínimo de linhas permitido.' },
22239
+ { path: 'page.canvas.items.<widgetKey>.constraints.maxColSpan', category: 'layout', valueKind: 'number', description: 'Span máximo de colunas permitido.' },
22240
+ { path: 'page.canvas.items.<widgetKey>.constraints.maxRowSpan', category: 'layout', valueKind: 'number', description: 'Span máximo de linhas permitido.' },
22039
22241
  { path: 'page.canvas.items.<widgetKey>.constraints.lockPosition', category: 'layout', valueKind: 'boolean', description: 'Bloqueia alteracao de posicao do item no canvas.' },
22040
22242
  { path: 'page.canvas.items.<widgetKey>.constraints.lockSize', category: 'layout', valueKind: 'boolean', description: 'Bloqueia alteracao de tamanho do item no canvas.' },
22041
22243
  { path: 'page.widgets', category: 'widgets', valueKind: 'array', description: 'Lista de widgets renderizados.' },
@@ -22043,32 +22245,32 @@ const CAPS = [
22043
22245
  { path: 'page.widgets[].className', category: 'widgets', valueKind: 'string', description: 'Classe CSS opcional do widget.' },
22044
22246
  { path: 'page.widgets[].definition.id', category: 'widgets', valueKind: 'string', description: 'ID do componente do widget (ex: praxis-table).' },
22045
22247
  { path: 'page.widgets[].definition.inputs', category: 'widgets', valueKind: 'object', description: 'Inputs iniciais do widget.' },
22046
- { path: 'page.widgets[].definition.inputs.hostCapabilities', category: 'widgets', valueKind: 'object', description: 'Capacidades runtime mediadas pelo host quando definition.id = praxis-rich-content. Nao pertence ao JSON persistido.' },
22047
- { path: 'page.widgets[].definition.inputs.hostCapabilities.dispatchAction', category: 'widgets', valueKind: 'object', description: 'Dispatcher runtime para actionButton e actions declarativas de rich content hospedado na pagina.' },
22048
- { path: 'page.widgets[].definition.inputs.hostCapabilities.isActionAvailable', category: 'widgets', valueKind: 'object', description: 'Resolver runtime de disponibilidade de actionId para rich content hospedado na pagina.' },
22049
- { path: 'page.widgets[].definition.inputs.hostCapabilities.hasCapability', category: 'widgets', valueKind: 'object', description: 'Resolver runtime de capabilities como page.customization.enabled e page.widget.selected para rich content hospedado na pagina.' },
22248
+ { path: 'page.widgets[].definition.inputs.hostCapabilities', category: 'widgets', valueKind: 'object', description: 'Capacidades runtime mediadas pelo host quando definition.id = praxis-rich-content. Não pertence ao JSON persistido.' },
22249
+ { path: 'page.widgets[].definition.inputs.hostCapabilities.dispatchAction', category: 'widgets', valueKind: 'object', description: 'Dispatcher runtime para actionButton e actions declarativas de rich content hospedado na página.' },
22250
+ { path: 'page.widgets[].definition.inputs.hostCapabilities.isActionAvailable', category: 'widgets', valueKind: 'object', description: 'Resolver runtime de disponibilidade de actionId para rich content hospedado na página.' },
22251
+ { path: 'page.widgets[].definition.inputs.hostCapabilities.hasCapability', category: 'widgets', valueKind: 'object', description: 'Resolver runtime de capabilities como page.customization.enabled e page.widget.selected para rich content hospedado na página.' },
22050
22252
  { path: 'page.widgets[].definition.bindingOrder', category: 'widgets', valueKind: 'array', description: 'Ordem de binding de inputs.' },
22051
- { path: 'page.widgets[].shell', category: 'shell', valueKind: 'object', description: 'Configuracao do shell do widget.' },
22253
+ { path: 'page.widgets[].shell', category: 'shell', valueKind: 'object', description: 'Configuração do shell do widget.' },
22052
22254
  { path: 'page.widgets[].shell.kind', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.shellKind, description: 'Tipo de shell.' },
22053
- { path: 'page.widgets[].shell.title', category: 'shell', valueKind: 'string', description: 'Titulo do shell.' },
22054
- { path: 'page.widgets[].shell.subtitle', category: 'shell', valueKind: 'string', description: 'Subtitulo do shell.' },
22055
- { path: 'page.widgets[].shell.icon', category: 'shell', valueKind: 'string', description: 'Icone do shell.' },
22255
+ { path: 'page.widgets[].shell.title', category: 'shell', valueKind: 'string', description: 'Título do shell.' },
22256
+ { path: 'page.widgets[].shell.subtitle', category: 'shell', valueKind: 'string', description: 'Subtítulo do shell.' },
22257
+ { path: 'page.widgets[].shell.icon', category: 'shell', valueKind: 'string', description: 'Ícone do shell.' },
22056
22258
  { path: 'page.widgets[].shell.showHeader', category: 'shell', valueKind: 'boolean', description: 'Exibe o header do shell.' },
22057
- { path: 'page.widgets[].shell.actions', category: 'shell', valueKind: 'array', description: 'Acoes do shell.' },
22058
- { path: 'page.widgets[].shell.actions[].id', category: 'shell', valueKind: 'string', description: 'ID da acao.' },
22059
- { path: 'page.widgets[].shell.actions[].label', category: 'shell', valueKind: 'string', description: 'Label da acao.' },
22060
- { path: 'page.widgets[].shell.actions[].icon', category: 'shell', valueKind: 'string', description: 'Icone da acao.' },
22061
- { path: 'page.widgets[].shell.actions[].variant', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.actionVariant, description: 'Estilo visual da acao.' },
22062
- { path: 'page.widgets[].shell.actions[].placement', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.actionPlacement, description: 'Posicionamento da acao.' },
22063
- { path: 'page.widgets[].shell.actions[].emit', category: 'shell', valueKind: 'string', description: 'Evento emitido ao acionar a acao.' },
22259
+ { path: 'page.widgets[].shell.actions', category: 'shell', valueKind: 'array', description: 'Ações do shell.' },
22260
+ { path: 'page.widgets[].shell.actions[].id', category: 'shell', valueKind: 'string', description: 'ID da ação.' },
22261
+ { path: 'page.widgets[].shell.actions[].label', category: 'shell', valueKind: 'string', description: 'Label da ação.' },
22262
+ { path: 'page.widgets[].shell.actions[].icon', category: 'shell', valueKind: 'string', description: 'Ícone da ação.' },
22263
+ { path: 'page.widgets[].shell.actions[].variant', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.actionVariant, description: 'Estilo visual da ação.' },
22264
+ { path: 'page.widgets[].shell.actions[].placement', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.actionPlacement, description: 'Posicionamento da ação.' },
22265
+ { path: 'page.widgets[].shell.actions[].emit', category: 'shell', valueKind: 'string', description: 'Evento emitido ao acionar a ação.' },
22064
22266
  { path: 'page.state', category: 'state', valueKind: 'object', description: 'Estado declarativo opcional compartilhado por widgets e composicao.' },
22065
22267
  { path: 'page.state.values', category: 'state', valueKind: 'object', description: 'Valores primarios mutaveis escritos por widgets, defaults ou host.' },
22066
22268
  { path: 'page.state.schema', category: 'state', valueKind: 'object', description: 'Descritores dos paths primarios de estado.' },
22067
22269
  { path: 'page.state.schema.<token>.type', category: 'state', valueKind: 'string', description: 'Tipo semantico opcional do path de estado.' },
22068
22270
  { path: 'page.state.schema.<token>.initial', category: 'state', valueKind: 'object', description: 'Valor inicial usado quando page.state.values omite o path.' },
22069
- { path: 'page.state.schema.<token>.persist', category: 'state', valueKind: 'boolean', description: 'Indica se o path primario deve ser persistido com a pagina.' },
22271
+ { path: 'page.state.schema.<token>.persist', category: 'state', valueKind: 'boolean', description: 'Indica se o path primário deve ser persistido com a página.' },
22070
22272
  { path: 'page.state.schema.<token>.mergeStrategy', category: 'state', valueKind: 'enum', allowedValues: ENUMS.stateMergeStrategy, description: 'Como escritas de widget/estado combinam com o valor atual.' },
22071
- { path: 'page.state.schema.<token>.description', category: 'state', valueKind: 'string', description: 'Descricao opcional do path para builders e catalogos AI.' },
22273
+ { path: 'page.state.schema.<token>.description', category: 'state', valueKind: 'string', description: 'Descrição opcional do path para builders e catálogos AI.' },
22072
22274
  { path: 'page.state.schema.<token>.tags', category: 'state', valueKind: 'array', description: 'Tags opcionais para busca e governanca do estado.' },
22073
22275
  { path: 'page.state.derived', category: 'state', valueKind: 'object', description: 'Descritores de estado derivado recomputado pelo runtime.' },
22074
22276
  { path: 'page.state.derived.<token>.dependsOn', category: 'state', valueKind: 'array', description: 'Paths de estado que alimentam o valor derivado.' },
@@ -22077,9 +22279,9 @@ const CAPS = [
22077
22279
  { path: 'page.state.derived.<token>.compute.expression', category: 'state', valueKind: 'expression', description: 'Expressao Json Logic para compute.kind=json-logic.' },
22078
22280
  { path: 'page.state.derived.<token>.compute.value', category: 'state', valueKind: 'object', description: 'Valor template para compute.kind=template.' },
22079
22281
  { path: 'page.state.derived.<token>.compute.operator', category: 'state', valueKind: 'string', description: 'Operador para compute.kind=operator.' },
22080
- { path: 'page.state.derived.<token>.compute.options', category: 'state', valueKind: 'object', description: 'Opcoes do operador ou transformer.' },
22282
+ { path: 'page.state.derived.<token>.compute.options', category: 'state', valueKind: 'object', description: 'Opções do operador ou transformer.' },
22081
22283
  { path: 'page.state.derived.<token>.compute.transformerId', category: 'state', valueKind: 'string', description: 'Identificador do transformer para compute.kind=transformer.' },
22082
- { path: 'page.state.derived.<token>.description', category: 'state', valueKind: 'string', description: 'Descricao opcional do estado derivado.' },
22284
+ { path: 'page.state.derived.<token>.description', category: 'state', valueKind: 'string', description: 'Descrição opcional do estado derivado.' },
22083
22285
  { path: 'page.state.derived.<token>.cache', category: 'state', valueKind: 'boolean', description: 'Permite cache futuro do valor derivado.' },
22084
22286
  { path: 'page.composition', category: 'connections', valueKind: 'object', description: 'Envelope canonico da composicao persistida.' },
22085
22287
  { path: 'page.composition.version', category: 'connections', valueKind: 'string', description: 'Versao do envelope de composicao.' },
@@ -22095,7 +22297,7 @@ const CAPS = [
22095
22297
  { path: 'page.composition.links[].from.ref.nestedPath[].kind', category: 'connections', valueKind: 'string', description: 'Tipo do segmento nested de origem.' },
22096
22298
  { path: 'page.composition.links[].from.ref.nestedPath[].id', category: 'connections', valueKind: 'string', description: 'Identificador estrutural do segmento nested de origem.' },
22097
22299
  { path: 'page.composition.links[].from.ref.nestedPath[].key', category: 'connections', valueKind: 'string', description: 'Chave estavel do widget filho no segmento terminal de origem.', critical: true },
22098
- { path: 'page.composition.links[].from.ref.nestedPath[].index', category: 'connections', valueKind: 'number', description: 'Indice auxiliar para diagnostico visual; nao use como identidade primaria.' },
22300
+ { path: 'page.composition.links[].from.ref.nestedPath[].index', category: 'connections', valueKind: 'number', description: 'Índice auxiliar para diagnóstico visual; não use como identidade primária.' },
22099
22301
  { path: 'page.composition.links[].from.ref.nestedPath[].componentType', category: 'connections', valueKind: 'string', description: 'Tipo do componente real do widget filho de origem.' },
22100
22302
  { path: 'page.composition.links[].to', category: 'connections', valueKind: 'object', description: 'Endpoint de destino do link.' },
22101
22303
  { path: 'page.composition.links[].to.kind', category: 'connections', valueKind: 'string', description: 'Tipo do endpoint de destino, como component-port, state ou global-action.' },
@@ -22110,11 +22312,11 @@ const CAPS = [
22110
22312
  { path: 'page.composition.links[].to.ref.nestedPath[].kind', category: 'connections', valueKind: 'string', description: 'Tipo do segmento nested de destino.' },
22111
22313
  { path: 'page.composition.links[].to.ref.nestedPath[].id', category: 'connections', valueKind: 'string', description: 'Identificador estrutural do segmento nested de destino.' },
22112
22314
  { path: 'page.composition.links[].to.ref.nestedPath[].key', category: 'connections', valueKind: 'string', description: 'Chave estavel do widget filho no segmento terminal de destino.', critical: true },
22113
- { path: 'page.composition.links[].to.ref.nestedPath[].index', category: 'connections', valueKind: 'number', description: 'Indice auxiliar para diagnostico visual; nao use como identidade primaria.' },
22315
+ { path: 'page.composition.links[].to.ref.nestedPath[].index', category: 'connections', valueKind: 'number', description: 'Índice auxiliar para diagnóstico visual; não use como identidade primária.' },
22114
22316
  { path: 'page.composition.links[].to.ref.nestedPath[].componentType', category: 'connections', valueKind: 'string', description: 'Tipo do componente real do widget filho de destino.' },
22115
- { path: 'page.composition.links[].intent', category: 'connections', valueKind: 'string', description: 'Intencao semantica do link.' },
22317
+ { path: 'page.composition.links[].intent', category: 'connections', valueKind: 'string', description: 'Intenção semântica do link.' },
22116
22318
  { path: 'page.composition.links[].transform', category: 'connections', valueKind: 'object', description: 'Pipeline de transformacao do link.' },
22117
- { path: 'page.composition.links[].condition', category: 'connections', valueKind: 'expression', description: 'Guarda semantica opcional do link, expressa como um unico AST Json Logic canonico.' },
22319
+ { path: 'page.composition.links[].condition', category: 'connections', valueKind: 'expression', description: 'Guarda semântica opcional do link, expressa como um único AST Json Logic canônico.' },
22118
22320
  { path: 'page.composition.links[].policy', category: 'connections', valueKind: 'object', description: 'Politicas operacionais opcionais do link, como debounce, distinct e missing-value.' },
22119
22321
  { path: 'page.composition.links[].metadata', category: 'connections', valueKind: 'object', description: 'Metadados opcionais do link.' },
22120
22322
  { path: 'page.grouping', category: 'layout', valueKind: 'array', description: 'Modelo semantico opcional de secoes, abas, areas hero e rails.' },
@@ -22155,15 +22357,15 @@ const DYNAMIC_PAGE_AI_CAPABILITIES = {
22155
22357
  enums: ENUMS,
22156
22358
  targets: ['praxis-dynamic-page'],
22157
22359
  notes: [
22158
- 'Este catalogo e especifico para o runtime praxis-dynamic-page; operacoes de authoring/mutacao pertencem ao manifesto do praxis-page-builder.',
22360
+ 'Este catálogo é específico para o runtime praxis-dynamic-page; operações de authoring/mutação pertencem ao manifesto do praxis-page-builder.',
22159
22361
  'WidgetPageDefinition e o contrato canonico persistido: widgets, composition.links, state, context, layout, canvas, presets, grouping, slotAssignments, deviceLayouts e themePreset.',
22160
22362
  'Widgets e page.composition.links sao arrays; ferramentas de patch legadas fazem merge por key estavel e id estavel.',
22161
- 'page.canvas.items e um mapa por widget key; nao modele canvas.items como array.',
22162
- 'Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; nao trate ambos como a mesma "expression".',
22363
+ 'page.canvas.items é um mapa por widget key; não modele canvas.items como array.',
22364
+ 'Taxonomia editorial: condition usa Json Logic canônico; transform usa pipeline declarativo; não trate ambos como a mesma "expression".',
22163
22365
  'Para remocao/replace, use flags {_remove:true} ou {_replace:true} no item.',
22164
22366
  'Para renomear um link, inclua {_beforeKey:"link-id-anterior"} no item.',
22165
- 'Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmacao.',
22166
- 'Quando page.widgets[].definition.id for praxis-rich-content, o host praxis-dynamic-page injeta hostCapabilities em runtime para actions e capability gating; nao serialize funcoes nem tente persistir page.widgets[].definition.inputs.hostCapabilities.',
22367
+ 'Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmação.',
22368
+ 'Quando page.widgets[].definition.id for praxis-rich-content, o host praxis-dynamic-page injeta hostCapabilities em runtime para actions e capability gating; não serialize funções nem tente persistir page.widgets[].definition.inputs.hostCapabilities.',
22167
22369
  'Use ids estaveis para links e keys estaveis para widgets.',
22168
22370
  'Nested component ports usam endpoint component-port com nestedPath; o owner em ref.widget continua sendo o widget top-level.',
22169
22371
  'Objetivo: compor widgets e relacionamentos canonicos (ex.: master-detail).',
@@ -22192,7 +22394,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
22192
22394
  mode: 'enum',
22193
22395
  options: [
22194
22396
  { value: 'fixed', label: 'Linhas fixas' },
22195
- { value: 'content', label: 'Conteudo' },
22397
+ { value: 'content', label: 'Conteúdo' },
22196
22398
  ],
22197
22399
  },
22198
22400
  'page.canvas.collisionPolicy': {
@@ -22261,7 +22463,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
22261
22463
  'page.widgets[].shell.actions[].variant': {
22262
22464
  mode: 'enum',
22263
22465
  options: [
22264
- { value: 'icon', label: 'Icone' },
22466
+ { value: 'icon', label: 'Ícone' },
22265
22467
  { value: 'text', label: 'Texto' },
22266
22468
  { value: 'outlined', label: 'Outlined' },
22267
22469
  ],
@@ -22291,7 +22493,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
22291
22493
  mode: 'suggested',
22292
22494
  options: [
22293
22495
  { value: 'rowClick', label: 'Clique na linha (praxis-table)', example: 'Usar table.rowClick -> form.resourceId via transform pick-path payload.row.id' },
22294
- { value: 'rowAction', label: 'Acao da linha (praxis-table)' },
22496
+ { value: 'rowAction', label: 'Ação da linha (praxis-table)' },
22295
22497
  { value: 'formSubmit', label: 'Submit do formulario (praxis-dynamic-form)' },
22296
22498
  ],
22297
22499
  },
@@ -22305,7 +22507,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
22305
22507
  'page.composition.links[].transform.steps[].config.path': {
22306
22508
  mode: 'suggested',
22307
22509
  options: [
22308
- { value: 'payload.row.id', label: 'ID padrao do registro', example: 'rowClick -> resourceId' },
22510
+ { value: 'payload.row.id', label: 'ID padrão do registro', example: 'rowClick -> resourceId' },
22309
22511
  ],
22310
22512
  },
22311
22513
  },
@@ -22617,7 +22819,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
22617
22819
  { name: 'toInput', type: 'STRING' },
22618
22820
  { name: 'map', type: 'STRING' },
22619
22821
  ],
22620
- safetyNotes: 'Use transform pick-path payload.row.id para master-detail padrao.',
22822
+ safetyNotes: 'Use transform pick-path payload.row.id para master-detail padrão.',
22621
22823
  patchTemplate: {
22622
22824
  page: {
22623
22825
  composition: {
@@ -22668,7 +22870,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
22668
22870
  { name: 'fromWidget', type: 'STRING' },
22669
22871
  { name: 'toWidget', type: 'STRING' },
22670
22872
  ],
22671
- safetyNotes: 'Padrao master-detail: rowClick -> resourceId com transform pick-path payload.row.id.',
22873
+ safetyNotes: 'Padrão master-detail: rowClick -> resourceId com transform pick-path payload.row.id.',
22672
22874
  patchTemplate: {
22673
22875
  page: {
22674
22876
  composition: {
@@ -22711,7 +22913,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
22711
22913
  },
22712
22914
  {
22713
22915
  id: 'page.template.applyMasterDetail',
22714
- intentExamples: ['criar pagina master detail', 'setup master detail', 'tabela e formulario', 'master-detail'],
22916
+ intentExamples: ['criar página master detail', 'setup master detail', 'tabela e formulário', 'master-detail'],
22715
22917
  operation: 'create',
22716
22918
  scope: 'GLOBAL',
22717
22919
  valueType: 'OBJECT',
@@ -22720,7 +22922,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
22720
22922
  { name: 'formId', type: 'STRING' },
22721
22923
  { name: 'resourcePath', type: 'STRING' },
22722
22924
  ],
22723
- safetyNotes: 'Padrao master-detail: tabela (rowClick) -> formulario (resourceId) com transform pick-path payload.row.id.',
22925
+ safetyNotes: 'Padrão master-detail: tabela (rowClick) -> formulario (resourceId) com transform pick-path payload.row.id.',
22724
22926
  patchTemplate: {
22725
22927
  page: {
22726
22928
  widgets: [
@@ -22796,30 +22998,30 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
22796
22998
  },
22797
22999
  hints: [
22798
23000
  'praxis-dynamic-page e runtime de composicao: consome WidgetPageDefinition, renderiza widgets e mantem relacoes em page.composition.links.',
22799
- 'Mutacoes agentic de pagina pertencem ao manifesto do praxis-page-builder; use este context pack como descoberta/runtime guidance.',
23001
+ 'Mutações agentic de página pertencem ao manifesto do praxis-page-builder; use este context pack como descoberta/runtime guidance.',
22800
23002
  'WidgetPageDefinition inclui widgets, composition.links, state, context, layout, canvas, layoutPreset, layoutPresetOptions, grouping, slotAssignments, deviceLayouts e themePreset.',
22801
- 'page.canvas.items e um mapa por widget key, nao um array; cada entrada guarda col, row, colSpan, rowSpan, zIndex e constraints opcionais.',
23003
+ 'page.canvas.items é um mapa por widget key, não um array; cada entrada guarda col, row, colSpan, rowSpan, zIndex e constraints opcionais.',
22802
23004
  'Widgets e composition.links sao arrays; o patching deve fazer merge por key (widgets) e por id (links).',
22803
- 'Preferir mudancas incrementais: alterar/estender em vez de substituir toda a pagina.',
23005
+ 'Preferir mudanças incrementais: alterar/estender em vez de substituir toda a página.',
22804
23006
  'Para remover um item, envie {_remove: true} junto ao widget/link.',
22805
23007
  'Para substituir um item inteiro, envie {_replace: true}.',
22806
23008
  'Para alterar origem/destino de link, use {_beforeKey} com o id antigo.',
22807
23009
  'Use keys estaveis para widgets e ids estaveis para links ao criar composicoes.',
22808
23010
  'resourcePath sempre e o path base do recurso (sem /filter, /all).',
22809
- 'Praxis Table gera colunas dinamicamente a partir do resourcePath quando columns nao forem definidas.',
22810
- 'Praxis Dynamic Form gera campos dinamicamente a partir do resourcePath quando config nao for definida.',
22811
- 'Quando um widget praxis-rich-content estiver hospedado na pagina, definition.inputs.document continua sendo o contrato persistido; hostCapabilities e injetado somente em runtime pelo praxis-dynamic-page para actions e capability gating.',
23011
+ 'Praxis Table gera colunas dinamicamente a partir do resourcePath quando columns não forem definidas.',
23012
+ 'Praxis Dynamic Form gera campos dinamicamente a partir do resourcePath quando config não for definida.',
23013
+ 'Quando um widget praxis-rich-content estiver hospedado na página, definition.inputs.document continua sendo o contrato persistido; hostCapabilities é injetado somente em runtime pelo praxis-dynamic-page para actions e capability gating.',
22812
23014
  'Praxis List pode filtrar via config.dataSource.query (enviado para /filter).',
22813
23015
  'Quando houver recursos secundarios (ex.: enderecos), use contextHints.addressResourcePath.',
22814
23016
  'Exemplo master-detail: tabela emite rowClick -> form.resourceId via transform pick-path payload.row.id.',
22815
23017
  'Pattern Master-Detail: { "id":"master.rowClick->detail.resourceId", "from":{"kind":"component-port","ref":{"port":"rowClick","direction":"output"}}, "to":{"kind":"component-port","ref":{"port":"resourceId","direction":"input"}}, "transform":{"steps":[{"kind":"pick-path","config":{"path":"payload.row.id"}}]}}',
22816
23018
  'Ao criar widgets, use inputs minimos e complemente depois (evite inventar campos).',
22817
23019
  'Quando widgets ja existem, interpretar ports de origem/destino antes de conectar.',
22818
- 'Intencao comum: criar pagina master-detail = criar tabela + criar formulario + conectar selecao via composition.links.',
22819
- 'Intencao comum: ajustar pagina existente = modificar apenas widgets/inputs necessarios.',
23020
+ 'Intenção comum: criar página master-detail = criar tabela + criar formulário + conectar seleção via composition.links.',
23021
+ 'Intenção comum: ajustar página existente = modificar apenas widgets/inputs necessários.',
22820
23022
  'Exemplo de link canonico (master-detail): { id:"masterTable.rowClick->detailForm.resourceId", from:{kind:"component-port",ref:{widget:"masterTable",port:"rowClick",direction:"output"}}, to:{kind:"component-port",ref:{widget:"detailForm",port:"resourceId",direction:"input"}}, intent:"event-propagation", transform:{version:"2.0",phase:"link-propagation",mode:"single-value",steps:[{kind:"pick-path",phase:"link-propagation",input:{source:"event"},config:{path:"payload.row.id"}}]}}',
22821
- 'Exemplo de widget tabela (minimo): { key:"masterTable", definition:{ id:"praxis-table", inputs:{ resourcePath:"/api/x" }}}',
22822
- 'Exemplo de widget formulario (minimo): { key:"detailForm", definition:{ id:"praxis-dynamic-form", inputs:{ resourcePath:"/api/x", mode:"view" }}}',
23023
+ 'Exemplo de widget tabela (mínimo): { key:"masterTable", definition:{ id:"praxis-table", inputs:{ resourcePath:"/api/x" }}}',
23024
+ 'Exemplo de widget formulário (mínimo): { key:"detailForm", definition:{ id:"praxis-dynamic-form", inputs:{ resourcePath:"/api/x", mode:"view" }}}',
22823
23025
  'Se houver idField conhecido, use transform pick-path payload.row.{idField} em links canonicos.',
22824
23026
  ],
22825
23027
  };
@@ -24947,7 +25149,7 @@ class DynamicWidgetLoaderDirective {
24947
25149
  'praxis-crud': ['crudId', 'componentInstanceId', 'metadata'],
24948
25150
  'praxis-dynamic-form': ['formId', 'componentInstanceId', 'resourcePath'],
24949
25151
  'praxis-tabs': ['tabsId', 'componentInstanceId', 'configPersistenceStrategy', 'config'],
24950
- 'praxis-list': ['listId', 'componentInstanceId', 'config'],
25152
+ 'praxis-list': ['listId', 'componentInstanceId', 'enableCustomization', 'config'],
24951
25153
  'praxis-expansion': ['expansionId', 'componentInstanceId', 'config'],
24952
25154
  'praxis-stepper': ['stepperId', 'componentInstanceId', 'config'],
24953
25155
  'praxis-files-upload': ['filesUploadId', 'componentInstanceId', 'config'],
@@ -25307,28 +25509,160 @@ const BUILTIN_SHELL_PRESETS = {
25307
25509
  },
25308
25510
  'light-neutral': {
25309
25511
  card: {
25310
- background: '#f8fafc',
25311
- borderColor: '#d7dfeb',
25512
+ background: 'var(--md-sys-color-surface)',
25513
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 82%, transparent)',
25312
25514
  borderRadius: '12px',
25313
- shadow: '0 4px 12px rgba(15, 23, 42, 0.06)',
25515
+ shadow: '0 4px 14px color-mix(in srgb, var(--md-sys-color-shadow, #000) 7%, transparent)',
25314
25516
  },
25315
25517
  header: {
25316
- titleColor: '#1f2937',
25317
- subtitleColor: '#6b7280',
25318
- iconColor: '#0f172a',
25518
+ background: 'color-mix(in srgb, var(--md-sys-color-surface-container-low) 72%, transparent)',
25519
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 70%, transparent)',
25520
+ titleColor: 'var(--md-sys-color-on-surface)',
25521
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
25522
+ iconColor: 'var(--md-sys-color-primary)',
25523
+ },
25524
+ body: {
25525
+ background: 'var(--md-sys-color-surface)',
25526
+ textColor: 'var(--md-sys-color-on-surface)',
25319
25527
  },
25320
25528
  },
25321
25529
  graphite: {
25322
25530
  card: {
25323
- background: '#1c1f24',
25324
- borderColor: 'rgba(255,255,255,0.08)',
25325
- borderRadius: '14px',
25326
- shadow: '0 10px 22px rgba(0,0,0,0.28)',
25531
+ background: 'color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-surface-container-high) 6%)',
25532
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 74%, transparent)',
25533
+ borderRadius: '12px',
25534
+ shadow: '0 8px 22px color-mix(in srgb, var(--md-sys-color-shadow, #000) 11%, transparent)',
25535
+ },
25536
+ header: {
25537
+ background: 'color-mix(in srgb, var(--md-sys-color-surface-container-low) 76%, transparent)',
25538
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 62%, transparent)',
25539
+ titleColor: 'var(--md-sys-color-on-surface)',
25540
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
25541
+ iconColor: 'var(--md-sys-color-primary)',
25542
+ },
25543
+ body: {
25544
+ background: 'var(--md-sys-color-surface)',
25545
+ textColor: 'var(--md-sys-color-on-surface)',
25546
+ },
25547
+ },
25548
+ frameless: {
25549
+ card: {
25550
+ background: 'transparent',
25551
+ borderColor: 'transparent',
25552
+ borderRadius: '0',
25553
+ shadow: 'none',
25554
+ },
25555
+ header: {
25556
+ background: 'transparent',
25557
+ borderColor: 'transparent',
25558
+ titleColor: 'var(--md-sys-color-on-surface)',
25559
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
25560
+ iconColor: 'var(--md-sys-color-primary)',
25561
+ },
25562
+ body: {
25563
+ background: 'transparent',
25564
+ textColor: 'var(--md-sys-color-on-surface)',
25565
+ padding: '0',
25566
+ },
25567
+ },
25568
+ 'data-panel': {
25569
+ card: {
25570
+ background: 'var(--md-sys-color-surface)',
25571
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 76%, transparent)',
25572
+ borderRadius: '10px',
25573
+ shadow: '0 5px 16px color-mix(in srgb, var(--md-sys-color-shadow, #000) 7%, transparent)',
25327
25574
  },
25328
25575
  header: {
25329
- titleColor: '#f3f4f6',
25330
- subtitleColor: '#9ca3af',
25331
- iconColor: '#cbd5f5',
25576
+ background: 'color-mix(in srgb, var(--md-sys-color-surface-container-low) 64%, transparent)',
25577
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 58%, transparent)',
25578
+ titleColor: 'var(--md-sys-color-on-surface)',
25579
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
25580
+ iconColor: 'var(--md-sys-color-primary)',
25581
+ },
25582
+ body: {
25583
+ background: 'var(--md-sys-color-surface)',
25584
+ textColor: 'var(--md-sys-color-on-surface)',
25585
+ padding: '12px',
25586
+ },
25587
+ },
25588
+ 'chart-panel': {
25589
+ card: {
25590
+ background: 'color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%)',
25591
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-primary) 22%, var(--md-sys-color-outline-variant) 62%)',
25592
+ borderRadius: '12px',
25593
+ shadow: '0 10px 24px color-mix(in srgb, var(--md-sys-color-shadow, #000) 9%, transparent)',
25594
+ },
25595
+ header: {
25596
+ background: 'color-mix(in srgb, var(--md-sys-color-primary-container) 22%, transparent)',
25597
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-primary) 20%, transparent)',
25598
+ titleColor: 'var(--md-sys-color-on-surface)',
25599
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
25600
+ iconColor: 'var(--md-sys-color-primary)',
25601
+ },
25602
+ body: {
25603
+ background: 'transparent',
25604
+ textColor: 'var(--md-sys-color-on-surface)',
25605
+ padding: '12px',
25606
+ },
25607
+ },
25608
+ 'metric-panel': {
25609
+ card: {
25610
+ background: 'color-mix(in srgb, var(--md-sys-color-surface-container-low) 78%, var(--md-sys-color-primary-container) 22%)',
25611
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-primary) 24%, transparent)',
25612
+ borderRadius: '10px',
25613
+ shadow: '0 8px 18px color-mix(in srgb, var(--md-sys-color-shadow, #000) 8%, transparent)',
25614
+ },
25615
+ header: {
25616
+ background: 'transparent',
25617
+ borderColor: 'transparent',
25618
+ titleColor: 'var(--md-sys-color-on-surface)',
25619
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
25620
+ iconColor: 'var(--md-sys-color-primary)',
25621
+ },
25622
+ body: {
25623
+ background: 'transparent',
25624
+ textColor: 'var(--md-sys-color-on-surface)',
25625
+ padding: '10px 12px',
25626
+ },
25627
+ },
25628
+ 'executive-card': {
25629
+ card: {
25630
+ background: 'color-mix(in srgb, var(--md-sys-color-surface) 88%, var(--md-sys-color-surface-container-high) 12%)',
25631
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-primary) 28%, var(--md-sys-color-outline-variant) 50%)',
25632
+ borderRadius: '10px',
25633
+ shadow: '0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 13%, transparent)',
25634
+ },
25635
+ header: {
25636
+ background: 'color-mix(in srgb, var(--md-sys-color-primary-container) 18%, transparent)',
25637
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-primary) 22%, transparent)',
25638
+ titleColor: 'var(--md-sys-color-on-surface)',
25639
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
25640
+ iconColor: 'var(--md-sys-color-primary)',
25641
+ },
25642
+ body: {
25643
+ background: 'transparent',
25644
+ textColor: 'var(--md-sys-color-on-surface)',
25645
+ padding: '14px',
25646
+ },
25647
+ },
25648
+ 'filter-bar': {
25649
+ card: {
25650
+ background: 'color-mix(in srgb, var(--md-sys-color-surface-container-low) 74%, var(--md-sys-color-secondary-container) 26%)',
25651
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-secondary) 24%, transparent)',
25652
+ borderRadius: '999px',
25653
+ shadow: '0 6px 18px color-mix(in srgb, var(--md-sys-color-shadow, #000) 7%, transparent)',
25654
+ },
25655
+ header: {
25656
+ background: 'transparent',
25657
+ borderColor: 'transparent',
25658
+ titleColor: 'var(--md-sys-color-on-surface)',
25659
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
25660
+ iconColor: 'var(--md-sys-color-secondary)',
25661
+ },
25662
+ body: {
25663
+ background: 'transparent',
25664
+ textColor: 'var(--md-sys-color-on-surface)',
25665
+ padding: '10px 14px',
25332
25666
  },
25333
25667
  },
25334
25668
  };
@@ -25404,6 +25738,11 @@ class WidgetShellComponent {
25404
25738
  const builtins = this.buildWindowActions(custom);
25405
25739
  return [...builtins, ...custom];
25406
25740
  }
25741
+ displayActionIcon(action) {
25742
+ return action.pressed === true && action.pressedIcon
25743
+ ? action.pressedIcon
25744
+ : action.icon;
25745
+ }
25407
25746
  onAction(action, ev) {
25408
25747
  ev.stopPropagation();
25409
25748
  const handled = this.handleWindowAction(action);
@@ -25413,6 +25752,7 @@ class WidgetShellComponent {
25413
25752
  command: action.command,
25414
25753
  emit: action.emit,
25415
25754
  payload,
25755
+ pressed: action.pressed,
25416
25756
  action,
25417
25757
  };
25418
25758
  this.loader?.dispatchAction(event);
@@ -25603,14 +25943,16 @@ class WidgetShellComponent {
25603
25943
  <button
25604
25944
  [disabled]="action.disabled"
25605
25945
  [matTooltip]="action.tooltip || ''"
25606
- matTooltipPosition="below"
25946
+ matTooltipPosition="above"
25607
25947
  [ngClass]="action.variant === 'outlined' ? 'pdx-action-outlined' : 'pdx-action-text'"
25948
+ [class.pdx-shell-action--pressed]="action.pressed === true"
25608
25949
  mat-button
25609
25950
  type="button"
25951
+ [attr.aria-pressed]="action.pressed == null ? null : action.pressed"
25610
25952
  (click)="onAction(action, $event)"
25611
25953
  >
25612
- @if (action.icon) {
25613
- <mat-icon [praxisIcon]="action.icon"></mat-icon>
25954
+ @if (displayActionIcon(action); as actionIcon) {
25955
+ <mat-icon [praxisIcon]="actionIcon"></mat-icon>
25614
25956
  }
25615
25957
  <span class="pdx-action-label">{{ action.label }}</span>
25616
25958
  </button>
@@ -25620,13 +25962,15 @@ class WidgetShellComponent {
25620
25962
  mat-icon-button
25621
25963
  [disabled]="action.disabled"
25622
25964
  [matTooltip]="action.tooltip || action.label || ''"
25623
- matTooltipPosition="below"
25965
+ matTooltipPosition="above"
25624
25966
  [attr.aria-label]="action.label || action.tooltip || action.id"
25967
+ [attr.aria-pressed]="action.pressed == null ? null : action.pressed"
25968
+ [class.pdx-shell-action--pressed]="action.pressed === true"
25625
25969
  type="button"
25626
25970
  (click)="onAction(action, $event)"
25627
25971
  >
25628
- @if (action.icon) {
25629
- <mat-icon [praxisIcon]="action.icon"></mat-icon>
25972
+ @if (displayActionIcon(action); as actionIcon) {
25973
+ <mat-icon [praxisIcon]="actionIcon"></mat-icon>
25630
25974
  }
25631
25975
  </button>
25632
25976
  }
@@ -25637,7 +25981,7 @@ class WidgetShellComponent {
25637
25981
  mat-icon-button
25638
25982
  type="button"
25639
25983
  [matTooltip]="moreActionsLabel()"
25640
- matTooltipPosition="below"
25984
+ matTooltipPosition="above"
25641
25985
  [attr.aria-label]="moreActionsLabel()"
25642
25986
  [matMenuTriggerFor]="overflowMenu"
25643
25987
  (click)="$event.stopPropagation()"
@@ -25653,13 +25997,15 @@ class WidgetShellComponent {
25653
25997
  mat-icon-button
25654
25998
  [disabled]="action.disabled"
25655
25999
  [matTooltip]="action.tooltip || action.label || ''"
25656
- matTooltipPosition="below"
26000
+ matTooltipPosition="above"
25657
26001
  [attr.aria-label]="action.label || action.tooltip || action.id"
26002
+ [attr.aria-pressed]="action.pressed == null ? null : action.pressed"
26003
+ [class.pdx-shell-action--pressed]="action.pressed === true"
25658
26004
  type="button"
25659
26005
  (click)="onAction(action, $event)"
25660
26006
  >
25661
- @if (action.icon) {
25662
- <mat-icon [praxisIcon]="action.icon"></mat-icon>
26007
+ @if (displayActionIcon(action); as actionIcon) {
26008
+ <mat-icon [praxisIcon]="actionIcon"></mat-icon>
25663
26009
  }
25664
26010
  </button>
25665
26011
  }
@@ -25670,10 +26016,11 @@ class WidgetShellComponent {
25670
26016
  @for (action of overflowHeaderActions; track action.id) {
25671
26017
  <button
25672
26018
  mat-menu-item
26019
+ [attr.aria-pressed]="action.pressed == null ? null : action.pressed"
25673
26020
  (click)="onAction(action, $event)"
25674
26021
  >
25675
- @if (action.icon) {
25676
- <mat-icon [praxisIcon]="action.icon"></mat-icon>
26022
+ @if (displayActionIcon(action); as actionIcon) {
26023
+ <mat-icon [praxisIcon]="actionIcon"></mat-icon>
25677
26024
  }
25678
26025
  <span>{{ action.label || action.id }}</span>
25679
26026
  </button>
@@ -25688,7 +26035,7 @@ class WidgetShellComponent {
25688
26035
  @if (expanded || fullscreen) {
25689
26036
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
25690
26037
  }
25691
- `, isInline: true, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed{height:auto}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.body-fill .pdx-shell-body,.pdx-shell.body-scroll .pdx-shell-body,.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.collapsed .pdx-shell-body{display:none}.pdx-shell.body-fill .pdx-shell-body{overflow:hidden}.pdx-shell.body-scroll .pdx-shell-body{overflow:auto}.pdx-shell.body-fill .pdx-shell-body>*,.pdx-shell.body-scroll .pdx-shell-body>*,.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;inset:0;width:auto;height:auto;transform:none;border-radius:0;z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
26038
+ `, isInline: true, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-shell-action--pressed{color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent)}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed{height:auto}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.body-fill .pdx-shell-body,.pdx-shell.body-scroll .pdx-shell-body,.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.collapsed .pdx-shell-body{display:none}.pdx-shell.body-fill .pdx-shell-body{overflow:hidden}.pdx-shell.body-scroll .pdx-shell-body{overflow:auto}.pdx-shell.body-fill .pdx-shell-body>*,.pdx-shell.body-scroll .pdx-shell-body>*,.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;inset:0;width:auto;height:auto;transform:none;border-radius:0;z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
25692
26039
  }
25693
26040
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: WidgetShellComponent, decorators: [{
25694
26041
  type: Component,
@@ -25747,14 +26094,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
25747
26094
  <button
25748
26095
  [disabled]="action.disabled"
25749
26096
  [matTooltip]="action.tooltip || ''"
25750
- matTooltipPosition="below"
26097
+ matTooltipPosition="above"
25751
26098
  [ngClass]="action.variant === 'outlined' ? 'pdx-action-outlined' : 'pdx-action-text'"
26099
+ [class.pdx-shell-action--pressed]="action.pressed === true"
25752
26100
  mat-button
25753
26101
  type="button"
26102
+ [attr.aria-pressed]="action.pressed == null ? null : action.pressed"
25754
26103
  (click)="onAction(action, $event)"
25755
26104
  >
25756
- @if (action.icon) {
25757
- <mat-icon [praxisIcon]="action.icon"></mat-icon>
26105
+ @if (displayActionIcon(action); as actionIcon) {
26106
+ <mat-icon [praxisIcon]="actionIcon"></mat-icon>
25758
26107
  }
25759
26108
  <span class="pdx-action-label">{{ action.label }}</span>
25760
26109
  </button>
@@ -25764,13 +26113,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
25764
26113
  mat-icon-button
25765
26114
  [disabled]="action.disabled"
25766
26115
  [matTooltip]="action.tooltip || action.label || ''"
25767
- matTooltipPosition="below"
26116
+ matTooltipPosition="above"
25768
26117
  [attr.aria-label]="action.label || action.tooltip || action.id"
26118
+ [attr.aria-pressed]="action.pressed == null ? null : action.pressed"
26119
+ [class.pdx-shell-action--pressed]="action.pressed === true"
25769
26120
  type="button"
25770
26121
  (click)="onAction(action, $event)"
25771
26122
  >
25772
- @if (action.icon) {
25773
- <mat-icon [praxisIcon]="action.icon"></mat-icon>
26123
+ @if (displayActionIcon(action); as actionIcon) {
26124
+ <mat-icon [praxisIcon]="actionIcon"></mat-icon>
25774
26125
  }
25775
26126
  </button>
25776
26127
  }
@@ -25781,7 +26132,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
25781
26132
  mat-icon-button
25782
26133
  type="button"
25783
26134
  [matTooltip]="moreActionsLabel()"
25784
- matTooltipPosition="below"
26135
+ matTooltipPosition="above"
25785
26136
  [attr.aria-label]="moreActionsLabel()"
25786
26137
  [matMenuTriggerFor]="overflowMenu"
25787
26138
  (click)="$event.stopPropagation()"
@@ -25797,13 +26148,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
25797
26148
  mat-icon-button
25798
26149
  [disabled]="action.disabled"
25799
26150
  [matTooltip]="action.tooltip || action.label || ''"
25800
- matTooltipPosition="below"
26151
+ matTooltipPosition="above"
25801
26152
  [attr.aria-label]="action.label || action.tooltip || action.id"
26153
+ [attr.aria-pressed]="action.pressed == null ? null : action.pressed"
26154
+ [class.pdx-shell-action--pressed]="action.pressed === true"
25802
26155
  type="button"
25803
26156
  (click)="onAction(action, $event)"
25804
26157
  >
25805
- @if (action.icon) {
25806
- <mat-icon [praxisIcon]="action.icon"></mat-icon>
26158
+ @if (displayActionIcon(action); as actionIcon) {
26159
+ <mat-icon [praxisIcon]="actionIcon"></mat-icon>
25807
26160
  }
25808
26161
  </button>
25809
26162
  }
@@ -25814,10 +26167,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
25814
26167
  @for (action of overflowHeaderActions; track action.id) {
25815
26168
  <button
25816
26169
  mat-menu-item
26170
+ [attr.aria-pressed]="action.pressed == null ? null : action.pressed"
25817
26171
  (click)="onAction(action, $event)"
25818
26172
  >
25819
- @if (action.icon) {
25820
- <mat-icon [praxisIcon]="action.icon"></mat-icon>
26173
+ @if (displayActionIcon(action); as actionIcon) {
26174
+ <mat-icon [praxisIcon]="actionIcon"></mat-icon>
25821
26175
  }
25822
26176
  <span>{{ action.label || action.id }}</span>
25823
26177
  </button>
@@ -25832,7 +26186,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
25832
26186
  @if (expanded || fullscreen) {
25833
26187
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
25834
26188
  }
25835
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed{height:auto}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.body-fill .pdx-shell-body,.pdx-shell.body-scroll .pdx-shell-body,.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.collapsed .pdx-shell-body{display:none}.pdx-shell.body-fill .pdx-shell-body{overflow:hidden}.pdx-shell.body-scroll .pdx-shell-body{overflow:auto}.pdx-shell.body-fill .pdx-shell-body>*,.pdx-shell.body-scroll .pdx-shell-body>*,.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;inset:0;width:auto;height:auto;transform:none;border-radius:0;z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"] }]
26189
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-shell-action--pressed{color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent)}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed{height:auto}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.body-fill .pdx-shell-body,.pdx-shell.body-scroll .pdx-shell-body,.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.collapsed .pdx-shell-body{display:none}.pdx-shell.body-fill .pdx-shell-body{overflow:hidden}.pdx-shell.body-scroll .pdx-shell-body{overflow:auto}.pdx-shell.body-fill .pdx-shell-body>*,.pdx-shell.body-scroll .pdx-shell-body>*,.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;inset:0;width:auto;height:auto;transform:none;border-radius:0;z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"] }]
25836
26190
  }], propDecorators: { hostCollapsed: [{
25837
26191
  type: HostBinding,
25838
26192
  args: ['class.pdx-widget-shell-collapsed']
@@ -26010,7 +26364,7 @@ const BUILTIN_PAGE_THEME_PRESETS = {
26010
26364
  id: 'analytics-calm',
26011
26365
  label: 'Analytics Calm',
26012
26366
  description: 'Superfícies leves, ênfase clara em dados e motion sutil.',
26013
- shellPreset: 'light-neutral',
26367
+ shellPreset: 'chart-panel',
26014
26368
  chartThemePreset: 'executive',
26015
26369
  density: 'comfortable',
26016
26370
  motion: 'subtle',
@@ -26027,7 +26381,7 @@ const BUILTIN_PAGE_THEME_PRESETS = {
26027
26381
  id: 'workspace-balanced',
26028
26382
  label: 'Workspace Balanced',
26029
26383
  description: 'Equilíbrio entre densidade operacional e clareza visual.',
26030
- shellPreset: 'light-neutral',
26384
+ shellPreset: 'data-panel',
26031
26385
  chartThemePreset: 'default',
26032
26386
  density: 'comfortable',
26033
26387
  motion: 'subtle',
@@ -26044,7 +26398,7 @@ const BUILTIN_PAGE_THEME_PRESETS = {
26044
26398
  id: 'ops-monitoring',
26045
26399
  label: 'Ops Monitoring',
26046
26400
  description: 'Contraste um pouco maior para leitura rápida de status, filas e alertas.',
26047
- shellPreset: 'graphite',
26401
+ shellPreset: 'data-panel',
26048
26402
  chartThemePreset: 'compact',
26049
26403
  density: 'compact',
26050
26404
  motion: 'subtle',
@@ -26061,7 +26415,7 @@ const BUILTIN_PAGE_THEME_PRESETS = {
26061
26415
  id: 'executive-command-center',
26062
26416
  label: 'Executive Command Center',
26063
26417
  description: 'Superfície premium para dashboards corporativos com hierarquia executiva, dados densos e ações de decisão.',
26064
- shellPreset: 'graphite',
26418
+ shellPreset: 'executive-card',
26065
26419
  chartThemePreset: 'executive',
26066
26420
  density: 'compact',
26067
26421
  motion: 'subtle',
@@ -31033,9 +31387,18 @@ class DynamicWidgetPageComponent {
31033
31387
  if (!widget.shell) {
31034
31388
  return runtimeEnrichedWidget;
31035
31389
  }
31390
+ const widgetTemplateContext = {
31391
+ ...templateContext,
31392
+ widget: {
31393
+ key: widget.key,
31394
+ definition: this.cloneStateValues(widget.definition),
31395
+ inputs: this.cloneStateValues(widget.definition?.inputs || {}),
31396
+ shell: this.cloneStateValues(widget.shell || {}),
31397
+ },
31398
+ };
31036
31399
  return {
31037
31400
  ...runtimeEnrichedWidget,
31038
- shell: this.resolveTemplate(widget.shell, templateContext),
31401
+ shell: this.resolveTemplate(widget.shell, widgetTemplateContext),
31039
31402
  };
31040
31403
  });
31041
31404
  }
@@ -31412,6 +31775,8 @@ class DynamicWidgetPageComponent {
31412
31775
  void this.confirmAndRemoveWidget(fromKey);
31413
31776
  return;
31414
31777
  }
31778
+ if (this.handleToggleInputCommand(fromKey, evt))
31779
+ return;
31415
31780
  if (this.handleSetInputCommand(fromKey, evt))
31416
31781
  return;
31417
31782
  const output = evt?.emit || (evt?.id ? `shell:${evt.id}` : undefined);
@@ -31436,6 +31801,32 @@ class DynamicWidgetPageComponent {
31436
31801
  this.widgets.set(widgets);
31437
31802
  return true;
31438
31803
  }
31804
+ handleToggleInputCommand(fromKey, evt) {
31805
+ if (evt?.command !== 'pdx:toggle-input')
31806
+ return false;
31807
+ const payload = evt?.payload;
31808
+ const input = typeof payload?.input === 'string' ? payload.input.trim() : '';
31809
+ if (!input)
31810
+ return true;
31811
+ const page = this.ensurePageDefinition();
31812
+ const widget = (page.widgets || []).find((candidate) => candidate.key === fromKey);
31813
+ const currentValue = this.lookup(widget?.definition?.inputs || {}, input);
31814
+ const nextValue = !Boolean(currentValue);
31815
+ const result = this.applyWidgetInputPatchToPage(page, fromKey, {
31816
+ ownerWidgetKey: fromKey,
31817
+ sourceComponentId: 'widget-shell',
31818
+ output: evt.emit || `shell:${evt.id}`,
31819
+ payload: {
31820
+ inputPatch: {
31821
+ [input]: nextValue,
31822
+ },
31823
+ },
31824
+ });
31825
+ if (result.changed) {
31826
+ this.applyPageUpdate(result.page, true, undefined, false, true);
31827
+ }
31828
+ return true;
31829
+ }
31439
31830
  mergeOrder(keys) {
31440
31831
  const seen = new Set();
31441
31832
  const out = [];
@@ -33974,24 +34365,24 @@ const PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA = {
33974
34365
  selector: 'praxis-dynamic-page',
33975
34366
  component: DynamicWidgetPageComponent,
33976
34367
  friendlyName: 'Dynamic Page',
33977
- description: 'Pagina dinamica com widgets e composition.links em layout responsivo, incluindo mediacao runtime para rich-content hospedado.',
34368
+ description: 'Página dinâmica com widgets e composition.links em layout responsivo, incluindo mediação runtime para rich-content hospedado.',
33978
34369
  icon: 'dashboard',
33979
34370
  inputs: [
33980
- { name: 'page', type: 'WidgetPageDefinition', description: 'Definicao da pagina (widgets, layout e composition.links).' },
34371
+ { name: 'page', type: 'WidgetPageDefinition', description: 'Definição da página (widgets, layout e composition.links).' },
33981
34372
  { name: 'context', type: 'Record<string, any>', description: 'Contexto adicional compartilhado entre widgets.' },
33982
- { name: 'strictValidation', type: 'boolean', description: 'Habilita validacao estrita de inputs.' },
33983
- { name: 'enableCustomization', type: 'boolean', description: 'Habilita affordances de edicao na pagina.' },
33984
- { name: 'showPageSettingsButton', type: 'boolean', description: 'Exibe botao de configuracao da pagina.' },
34373
+ { name: 'strictValidation', type: 'boolean', description: 'Habilita validação estrita de inputs.' },
34374
+ { name: 'enableCustomization', type: 'boolean', description: 'Habilita affordances de edição na página.' },
34375
+ { name: 'showPageSettingsButton', type: 'boolean', description: 'Exibe botão de configuração da página.' },
33985
34376
  { name: 'shellEditorComponent', type: 'Type<any>', description: 'Override do editor de shell dos widgets.' },
33986
- { name: 'pageEditorComponent', type: 'Type<any>', description: 'Override do editor de configuracao da pagina.' },
33987
- { name: 'autoPersist', type: 'boolean', description: 'Ativa persistencia automatica (load/save) da pagina.' },
33988
- { name: 'pageIdentity', type: 'PageIdentity', description: 'Identidade de persistencia (tenant/usuario/rota/locale).' },
33989
- { name: 'componentInstanceId', type: 'string', description: 'Identificador opcional para multiplas instancias na mesma rota.' },
34377
+ { name: 'pageEditorComponent', type: 'Type<any>', description: 'Override do editor de configuração da página.' },
34378
+ { name: 'autoPersist', type: 'boolean', description: 'Ativa persistência automática (load/save) da página.' },
34379
+ { name: 'pageIdentity', type: 'PageIdentity', description: 'Identidade de persistência (tenant/usuário/rota/locale).' },
34380
+ { name: 'componentInstanceId', type: 'string', description: 'Identificador opcional para múltiplas instâncias na mesma rota.' },
33990
34381
  ],
33991
34382
  outputs: [
33992
- { name: 'pageChange', type: 'WidgetPageDefinition', description: 'Emitido ao alterar a definicao da pagina.' },
33993
- { name: 'widgetEvent', type: 'WidgetEventEnvelope', description: 'Reemite eventos dos widgets filhos com ownerWidgetKey para integracoes do host.' },
33994
- { name: 'widgetDiagnosticsChange', type: 'Record<string, WidgetResolutionDiagnostic>', description: 'Emitido quando o runtime detecta widgets resolvidos ou falhos durante o carregamento dinamico.' },
34383
+ { name: 'pageChange', type: 'WidgetPageDefinition', description: 'Emitido ao alterar a definição da página.' },
34384
+ { name: 'widgetEvent', type: 'WidgetEventEnvelope', description: 'Reemite eventos dos widgets filhos com ownerWidgetKey para integrações do host.' },
34385
+ { name: 'widgetDiagnosticsChange', type: 'Record<string, WidgetResolutionDiagnostic>', description: 'Emitido quando o runtime detecta widgets resolvidos ou falhos durante o carregamento dinâmico.' },
33995
34386
  ],
33996
34387
  tags: ['widget', 'page', 'dynamic', 'layout'],
33997
34388
  lib: '@praxisui/core',
@@ -35244,15 +35635,9 @@ function applyLocalCustomizations$1(base, local) {
35244
35635
  // Server authority on identity/core props
35245
35636
  const authoritative = {
35246
35637
  name: base.name,
35247
- label: base.label,
35248
35638
  type: base.type,
35249
35639
  controlType: base.controlType,
35250
35640
  required: base.required,
35251
- hint: base.hint,
35252
- helpText: base.helpText,
35253
- description: base.description,
35254
- icon: base.icon,
35255
- iconPosition: base.iconPosition,
35256
35641
  endpoint: base.endpoint,
35257
35642
  resourcePath: base.resourcePath,
35258
35643
  optionSource: base.optionSource,
@@ -35288,12 +35673,13 @@ function applyLocalCustomizations$1(base, local) {
35288
35673
  ? serverBackedLocal.queryParams
35289
35674
  : base.queryParams,
35290
35675
  };
35291
- return {
35676
+ const merged = {
35292
35677
  ...base,
35293
35678
  ...serverBackedLocal,
35294
35679
  ...authoritative,
35295
35680
  ...preserved,
35296
35681
  };
35682
+ return applyServerOwnedFieldSemantics(merged, base);
35297
35683
  }
35298
35684
  function mergeServerVisibilityFlag(serverValue) {
35299
35685
  return serverValue === true ? true : undefined;
@@ -35758,4 +36144,4 @@ function provideHookWhitelist(allowed) {
35758
36144
  * Generated bundle index. Do not edit.
35759
36145
  */
35760
36146
 
35761
- 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, 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, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, 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, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, 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 };
36147
+ 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, 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, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, 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, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, 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 };