@praxisui/core 9.0.68-rc.0 → 9.0.68-rc.2

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.
@@ -7542,6 +7542,70 @@ const COMPONENT_METADATA_REGISTRY_I18N_CONFIG = {
7542
7542
  },
7543
7543
  };
7544
7544
 
7545
+ /** Builtin fallback only; consumer dictionaries and translators retain precedence. */
7546
+ const WIDGET_SHELL_PRESET_DICTIONARIES = {
7547
+ 'pt-BR': {
7548
+ 'praxis.widgetShell.presets.dark-glass.label': "Vidro escuro",
7549
+ 'praxis.widgetShell.presets.dark-glass.description': "Vidro fosco translúcido; usa fundo opaco quando a transparência é reduzida ou em tela cheia.",
7550
+ 'praxis.widgetShell.presets.light-neutral.label': "Neutro adaptativo",
7551
+ 'praxis.widgetShell.presets.light-neutral.description': "Superfície neutra sem sombra, que acompanha o tema claro ou escuro.",
7552
+ 'praxis.widgetShell.presets.graphite.label': "Grafite",
7553
+ 'praxis.widgetShell.presets.graphite.description': "Acabamento carvão opaco com cabeçalho cinza e texto claro, nos dois temas.",
7554
+ 'praxis.widgetShell.presets.data-panel.label': "Painel de dados",
7555
+ 'praxis.widgetShell.presets.data-panel.description': "Moldura compacta, cantos discretos e cabeçalho definido; não altera a densidade da tabela.",
7556
+ 'praxis.widgetShell.presets.chart-panel.label': "Painel de gráfico",
7557
+ 'praxis.widgetShell.presets.chart-panel.description': "Moldura leve com mais espaço para o gráfico; eixos, séries e legenda usam o preset do gráfico.",
7558
+ 'praxis.widgetShell.presets.metric-panel.label': "Painel de indicadores",
7559
+ 'praxis.widgetShell.presets.metric-panel.description': "Superfície tonal com cabeçalho discreto; o componente interno define o valor e a comparação.",
7560
+ 'praxis.widgetShell.presets.executive-card.label': "Card executivo",
7561
+ 'praxis.widgetShell.presets.executive-card.description': "Cabeçalho na cor de destaque, título maior e corpo espaçoso para síntese e decisão.",
7562
+ 'praxis.widgetShell.presets.filter-bar.label': "Barra de filtros",
7563
+ 'praxis.widgetShell.presets.filter-bar.description': "Cápsula para resumos ou filtros compactos; não é indicada para painéis altos.",
7564
+ 'praxis.widgetShell.presets.integratedCard.label': 'Card integrado',
7565
+ 'praxis.widgetShell.presets.integratedCard.description': 'Uma superfície contínua para cabeçalho, ações e corpo do widget.',
7566
+ 'praxis.widgetShell.presets.outlinedCard.label': 'Card contornado',
7567
+ 'praxis.widgetShell.presets.outlinedCard.description': 'Superfície contínua e discreta, com contorno externo e sem sombra.',
7568
+ 'praxis.widgetShell.presets.elevatedCard.label': 'Card elevado',
7569
+ 'praxis.widgetShell.presets.elevatedCard.description': 'Superfície contínua separada da página por uma sombra suave.',
7570
+ 'praxis.widgetShell.presets.tonalCard.label': 'Card tonal',
7571
+ 'praxis.widgetShell.presets.tonalCard.description': 'Superfície contínua levemente tonalizada e com elevação mínima.',
7572
+ 'praxis.widgetShell.presets.sectionedCard.label': 'Card seccionado',
7573
+ 'praxis.widgetShell.presets.sectionedCard.description': 'Cabeçalho destacado para conteúdos operacionais densos.',
7574
+ 'praxis.widgetShell.presets.frameless.label': 'Sem moldura',
7575
+ 'praxis.widgetShell.presets.frameless.description': 'Sem superfície externa, contorno ou sombra; mantém o recuo de leitura do conteúdo.',
7576
+ },
7577
+ 'en-US': {
7578
+ 'praxis.widgetShell.presets.dark-glass.label': "Dark glass",
7579
+ 'praxis.widgetShell.presets.dark-glass.description': "Translucent frosted glass; uses an opaque surface with reduced transparency or fullscreen.",
7580
+ 'praxis.widgetShell.presets.light-neutral.label': "Adaptive neutral",
7581
+ 'praxis.widgetShell.presets.light-neutral.description': "A neutral shadow-free surface that follows the light or dark theme.",
7582
+ 'praxis.widgetShell.presets.graphite.label': "Graphite",
7583
+ 'praxis.widgetShell.presets.graphite.description': "Opaque charcoal finish with a gray header and light text in both themes.",
7584
+ 'praxis.widgetShell.presets.data-panel.label': "Data panel",
7585
+ 'praxis.widgetShell.presets.data-panel.description': "Compact framing, small corners and a defined header; does not change table density.",
7586
+ 'praxis.widgetShell.presets.chart-panel.label': "Chart panel",
7587
+ 'praxis.widgetShell.presets.chart-panel.description': "Light framing with more chart space; axes, series and legend use the chart preset.",
7588
+ 'praxis.widgetShell.presets.metric-panel.label': "Metric panel",
7589
+ 'praxis.widgetShell.presets.metric-panel.description': "A tonal surface with a quiet header; the inner component defines the value and comparison.",
7590
+ 'praxis.widgetShell.presets.executive-card.label': "Executive card",
7591
+ 'praxis.widgetShell.presets.executive-card.description': "An accent-colored header, larger title and spacious body for summaries and decisions.",
7592
+ 'praxis.widgetShell.presets.filter-bar.label': "Filter bar",
7593
+ 'praxis.widgetShell.presets.filter-bar.description': "A capsule for summaries or compact filters; not intended for tall panels.",
7594
+ 'praxis.widgetShell.presets.integratedCard.label': 'Integrated card',
7595
+ 'praxis.widgetShell.presets.integratedCard.description': 'One continuous surface for the header, actions and widget body.',
7596
+ 'praxis.widgetShell.presets.outlinedCard.label': 'Outlined card',
7597
+ 'praxis.widgetShell.presets.outlinedCard.description': 'A quiet continuous surface with a clear outer outline and no shadow.',
7598
+ 'praxis.widgetShell.presets.elevatedCard.label': 'Elevated card',
7599
+ 'praxis.widgetShell.presets.elevatedCard.description': 'A continuous surface separated from the page by a soft shadow.',
7600
+ 'praxis.widgetShell.presets.tonalCard.label': 'Tonal card',
7601
+ 'praxis.widgetShell.presets.tonalCard.description': 'A softly tinted continuous surface with minimal elevation.',
7602
+ 'praxis.widgetShell.presets.sectionedCard.label': 'Sectioned card',
7603
+ 'praxis.widgetShell.presets.sectionedCard.description': 'A distinct header layer for dense operational content.',
7604
+ 'praxis.widgetShell.presets.frameless.label': 'Frameless',
7605
+ 'praxis.widgetShell.presets.frameless.description': 'No outer surface, outline or shadow; keeps the content reading inset.',
7606
+ },
7607
+ };
7608
+
7545
7609
  function interpolatePraxisTranslation(template, params) {
7546
7610
  if (!template || !params)
7547
7611
  return template;
@@ -7622,7 +7686,9 @@ class PraxisI18nService {
7622
7686
  tForLocale(locale, key, params, fallback, namespace) {
7623
7687
  const message = this.translateExternally(key, params, fallback)
7624
7688
  ?? this.lookupInHierarchy(key, locale, namespace)
7689
+ ?? this.lookupBuiltinShellPreset(key, locale)
7625
7690
  ?? this.lookupInHierarchy(key, this.getFallbackLocale(), namespace)
7691
+ ?? this.lookupBuiltinShellPreset(key, this.getFallbackLocale())
7626
7692
  ?? fallback
7627
7693
  ?? key;
7628
7694
  return interpolatePraxisTranslation(message, params);
@@ -7741,6 +7807,10 @@ class PraxisI18nService {
7741
7807
  }
7742
7808
  return undefined;
7743
7809
  }
7810
+ lookupBuiltinShellPreset(key, locale) {
7811
+ const value = WIDGET_SHELL_PRESET_DICTIONARIES[locale]?.[key];
7812
+ return typeof value === 'string' ? value : undefined;
7813
+ }
7744
7814
  lookupInHierarchy(key, locale, namespace) {
7745
7815
  const local = this.lookup(key, locale, namespace);
7746
7816
  if (local)
@@ -12286,6 +12356,8 @@ class DynamicFormService {
12286
12356
  isMultipleField(meta) {
12287
12357
  return (meta.controlType === FieldControlType.MULTI_SELECT ||
12288
12358
  meta.multiple === true ||
12359
+ meta.dataType === 'array' ||
12360
+ meta.type === 'array' ||
12289
12361
  (meta.controlType === FieldControlType.CHECKBOX &&
12290
12362
  this.hasCheckboxOptions(meta)));
12291
12363
  }
@@ -12366,8 +12438,6 @@ class DynamicFormService {
12366
12438
  }
12367
12439
  isArrayMetadata(meta) {
12368
12440
  return (meta.controlType === FieldControlType.ARRAY_INPUT ||
12369
- meta.dataType === 'array' ||
12370
- meta.type === 'array' ||
12371
12441
  !!meta.array);
12372
12442
  }
12373
12443
  getArrayConfig(meta) {
@@ -12557,15 +12627,13 @@ class DynamicFormService {
12557
12627
  * - Valor inicial: [] para campos múltiplos quando ausente; caso contrário defaultValue.
12558
12628
  */
12559
12629
  createControlFromField(field) {
12560
- if (field.controlType === FieldControlType.ARRAY_INPUT ||
12561
- field.type === 'array' ||
12562
- !!field.array) {
12630
+ if (this.isArrayMetadata(mapFieldDefinitionToMetadata(field))) {
12563
12631
  return this.createArrayControlFromMetadata(mapFieldDefinitionToMetadata(field));
12564
12632
  }
12565
12633
  const { validators, asyncValidators } = this.buildFromFieldDefinition(field);
12566
12634
  const updateOn = this.getUpdateOnFromField(field);
12567
12635
  const initialValue = field.defaultValue ?? null;
12568
- const value = field.multiple && initialValue == null ? [] : initialValue;
12636
+ const value = this.isMultipleField(mapFieldDefinitionToMetadata(field)) && initialValue == null ? [] : initialValue;
12569
12637
  const ctrl = new FormControl({ value, disabled: !!field.disabled }, {
12570
12638
  validators,
12571
12639
  asyncValidators,
@@ -12613,9 +12681,7 @@ class DynamicFormService {
12613
12681
  this.addControlFromField(form, field, opts);
12614
12682
  return;
12615
12683
  }
12616
- if (field.controlType === FieldControlType.ARRAY_INPUT ||
12617
- field.type === 'array' ||
12618
- !!field.array) {
12684
+ if (this.isArrayMetadata(mapFieldDefinitionToMetadata(field))) {
12619
12685
  const metadata = mapFieldDefinitionToMetadata(field);
12620
12686
  control.setValidators(this.buildArrayValidators(metadata));
12621
12687
  if (field.disabled)
@@ -16678,6 +16744,16 @@ class ResourceActionOpenAdapterService {
16678
16744
  schemaType: 'request',
16679
16745
  groupedCommand: {
16680
16746
  partialRowStrategy: 'fill-compatible',
16747
+ // These fields are supplied by the governed selection, not edited as
16748
+ // command fields. Keep them in the form/payload through contextFields.
16749
+ ...(action.scope === 'COLLECTION' && action.execution?.selection?.idsField
16750
+ ? { contextFields: [
16751
+ action.execution.selection.idsField,
16752
+ ...(action.execution.preconditions.resourceVersionTransport === 'SELECTION_MAP'
16753
+ && action.execution.selection.versionsField
16754
+ ? [action.execution.selection.versionsField] : []),
16755
+ ] }
16756
+ : {}),
16681
16757
  },
16682
16758
  },
16683
16759
  schemaUrl: resolvedRequestSchemaUrl,
@@ -16740,8 +16816,9 @@ class ResourceActionOpenAdapterService {
16740
16816
  if (requiresFormConfirmation && !confirmationMessage) {
16741
16817
  throw new Error(`ResourceActionOpenAdapterService requires description or title for confirmed FORM action "${action.id}".`);
16742
16818
  }
16743
- const successMessage = String(action.successMessage ?? '').trim();
16744
- if (!confirmationMessage && !successMessage) {
16819
+ const perItem = action.execution?.outcome.mode === 'PER_ITEM';
16820
+ const successMessage = perItem ? '' : String(action.successMessage ?? '').trim();
16821
+ if (!confirmationMessage && !successMessage && !perItem) {
16745
16822
  return;
16746
16823
  }
16747
16824
  const inputs = payload.widget.inputs;
@@ -16753,6 +16830,16 @@ class ResourceActionOpenAdapterService {
16753
16830
  submit: confirmationMessage,
16754
16831
  };
16755
16832
  }
16833
+ if (perItem) {
16834
+ // HTTP success means the batch was processed, not that every item succeeded.
16835
+ // The opening consumer presents the canonical per-item surface outcome.
16836
+ currentMessages['createRegistrySuccess'] = '';
16837
+ currentMessages['updateRegistrySuccess'] = '';
16838
+ currentMessages['customActions'] = {
16839
+ ...(currentMessages['customActions'] ?? {}),
16840
+ submit: { success: '' },
16841
+ };
16842
+ }
16756
16843
  if (successMessage) {
16757
16844
  const customActions = {
16758
16845
  ...(currentMessages['customActions'] ?? {}),
@@ -25771,7 +25858,10 @@ const ValidationPattern = {
25771
25858
 
25772
25859
  function materializeFormLayoutFromMetadata(fields, options = {}) {
25773
25860
  const policy = normalizeLayoutPolicy(options.policy);
25774
- const visibleFields = normalizeFields(resolveRelationPresentationFields(fields, policy), options.includeHidden === true);
25861
+ const contextFields = policy.preset === 'groupedCommand'
25862
+ ? groupedCommandContextFields(policy) : new Set();
25863
+ const visibleFields = normalizeFields(resolveRelationPresentationFields(fields, policy), true).filter(field => options.includeHidden === true || !isFormHidden(field)
25864
+ || contextFields.has(field.name));
25775
25865
  const layoutFields = fieldsForLayoutPolicy(visibleFields, policy);
25776
25866
  const groupedFields = groupFields(layoutFields);
25777
25867
  const sections = groupedFields.map(([groupKey, groupFields], sectionIndex) => createSection(groupKey, groupFields, sectionIndex, policy, options));
@@ -32974,10 +33064,7 @@ function getWidgetShellActionIdError(id, siblingIds = []) {
32974
33064
  return null;
32975
33065
  }
32976
33066
 
32977
- const integratedSurface = 'color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-primary-container) 6%)';
32978
- const outlinedSurface = 'var(--md-sys-color-surface)';
32979
- const elevatedSurface = 'var(--md-sys-color-surface-container-lowest)';
32980
- const tonalSurface = 'color-mix(in srgb, var(--md-sys-color-surface-container-low) 84%, var(--md-sys-color-primary-container) 16%)';
33067
+ /** Canonical shell finishes; content behavior belongs to the projected component. */
32981
33068
  const BUILTIN_WIDGET_SHELL_PRESETS = [
32982
33069
  {
32983
33070
  id: 'integrated-card',
@@ -32992,13 +33079,13 @@ const BUILTIN_WIDGET_SHELL_PRESETS = [
32992
33079
  category: 'single-surface',
32993
33080
  appearance: {
32994
33081
  card: {
32995
- background: integratedSurface,
33082
+ background: 'color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-primary-container) 6%)',
32996
33083
  borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 76%, transparent)',
32997
33084
  borderRadius: '12px',
32998
33085
  shadow: '0 6px 18px color-mix(in srgb, var(--md-sys-color-shadow, #000) 7%, transparent)',
32999
33086
  },
33000
33087
  header: {
33001
- background: integratedSurface,
33088
+ background: 'color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-primary-container) 6%)',
33002
33089
  borderColor: 'transparent',
33003
33090
  titleColor: 'var(--md-sys-color-on-surface)',
33004
33091
  subtitleColor: 'var(--md-sys-color-on-surface-variant)',
@@ -33024,13 +33111,13 @@ const BUILTIN_WIDGET_SHELL_PRESETS = [
33024
33111
  category: 'single-surface',
33025
33112
  appearance: {
33026
33113
  card: {
33027
- background: outlinedSurface,
33028
- borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 88%, transparent)',
33114
+ background: 'var(--md-sys-color-surface)',
33115
+ borderColor: 'var(--md-sys-color-outline)',
33029
33116
  borderRadius: '12px',
33030
33117
  shadow: 'none',
33031
33118
  },
33032
33119
  header: {
33033
- background: outlinedSurface,
33120
+ background: 'var(--md-sys-color-surface)',
33034
33121
  borderColor: 'transparent',
33035
33122
  titleColor: 'var(--md-sys-color-on-surface)',
33036
33123
  subtitleColor: 'var(--md-sys-color-on-surface-variant)',
@@ -33056,13 +33143,13 @@ const BUILTIN_WIDGET_SHELL_PRESETS = [
33056
33143
  category: 'single-surface',
33057
33144
  appearance: {
33058
33145
  card: {
33059
- background: elevatedSurface,
33146
+ background: 'color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 88%, var(--md-sys-color-surface) 12%)',
33060
33147
  borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 46%, transparent)',
33061
33148
  borderRadius: '14px',
33062
- shadow: '0 10px 26px color-mix(in srgb, var(--md-sys-color-shadow, #000) 10%, transparent)',
33149
+ shadow: '0 2px 4px color-mix(in srgb, var(--md-sys-color-shadow, #000) 10%, transparent), 0 14px 32px color-mix(in srgb, var(--md-sys-color-shadow, #000) 16%, transparent)',
33063
33150
  },
33064
33151
  header: {
33065
- background: elevatedSurface,
33152
+ background: 'color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 88%, var(--md-sys-color-surface) 12%)',
33066
33153
  borderColor: 'transparent',
33067
33154
  titleColor: 'var(--md-sys-color-on-surface)',
33068
33155
  subtitleColor: 'var(--md-sys-color-on-surface-variant)',
@@ -33088,13 +33175,13 @@ const BUILTIN_WIDGET_SHELL_PRESETS = [
33088
33175
  category: 'single-surface',
33089
33176
  appearance: {
33090
33177
  card: {
33091
- background: tonalSurface,
33178
+ background: 'color-mix(in srgb, var(--md-sys-color-primary-container) 66%, var(--md-sys-color-surface) 34%)',
33092
33179
  borderColor: 'color-mix(in srgb, var(--md-sys-color-primary) 18%, transparent)',
33093
33180
  borderRadius: '12px',
33094
33181
  shadow: 'none',
33095
33182
  },
33096
33183
  header: {
33097
- background: tonalSurface,
33184
+ background: 'color-mix(in srgb, var(--md-sys-color-primary-container) 66%, var(--md-sys-color-surface) 34%)',
33098
33185
  borderColor: 'transparent',
33099
33186
  titleColor: 'var(--md-sys-color-on-surface)',
33100
33187
  subtitleColor: 'var(--md-sys-color-on-surface-variant)',
@@ -33126,7 +33213,7 @@ const BUILTIN_WIDGET_SHELL_PRESETS = [
33126
33213
  shadow: '0 5px 16px color-mix(in srgb, var(--md-sys-color-shadow, #000) 7%, transparent)',
33127
33214
  },
33128
33215
  header: {
33129
- background: 'color-mix(in srgb, var(--md-sys-color-surface-container-low) 72%, transparent)',
33216
+ background: 'var(--md-sys-color-surface-container-high)',
33130
33217
  borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 62%, transparent)',
33131
33218
  titleColor: 'var(--md-sys-color-on-surface)',
33132
33219
  subtitleColor: 'var(--md-sys-color-on-surface-variant)',
@@ -33170,7 +33257,285 @@ const BUILTIN_WIDGET_SHELL_PRESETS = [
33170
33257
  },
33171
33258
  },
33172
33259
  },
33260
+ {
33261
+ id: 'dark-glass',
33262
+ label: {
33263
+ key: 'praxis.widgetShell.presets.dark-glass.label',
33264
+ text: 'Dark glass',
33265
+ },
33266
+ description: {
33267
+ key: 'praxis.widgetShell.presets.dark-glass.description',
33268
+ text: 'Translucent frosted glass; uses an opaque surface with reduced transparency or fullscreen.',
33269
+ },
33270
+ category: 'sectioned',
33271
+ appearance: {
33272
+ card: {
33273
+ background: 'linear-gradient(135deg, rgba(11,18,32,0.82), rgba(11,18,32,0.68))',
33274
+ borderColor: 'rgba(255,255,255,0.28)',
33275
+ borderRadius: '16px',
33276
+ shadow: 'inset 0 1px 0 rgba(255,255,255,0.14), 0 12px 26px rgba(0,0,0,0.24)',
33277
+ backdropFilter: 'blur(16px) saturate(125%)',
33278
+ fallbackBackground: '#0b1220',
33279
+ },
33280
+ header: {
33281
+ background: 'transparent',
33282
+ borderColor: 'rgba(255,255,255,0.12)',
33283
+ titleColor: '#e6edf3',
33284
+ subtitleColor: '#d3deed',
33285
+ iconColor: '#8ab4ff',
33286
+ },
33287
+ body: {
33288
+ background: 'transparent',
33289
+ textColor: '#e6edf3',
33290
+ },
33291
+ typography: {
33292
+ titleSize: '14px',
33293
+ titleWeight: '600',
33294
+ subtitleSize: '12px',
33295
+ },
33296
+ },
33297
+ },
33298
+ {
33299
+ id: 'light-neutral',
33300
+ label: {
33301
+ key: 'praxis.widgetShell.presets.light-neutral.label',
33302
+ text: 'Adaptive neutral',
33303
+ },
33304
+ description: {
33305
+ key: 'praxis.widgetShell.presets.light-neutral.description',
33306
+ text: 'A neutral shadow-free surface that follows the light or dark theme.',
33307
+ },
33308
+ category: 'sectioned',
33309
+ appearance: {
33310
+ card: {
33311
+ background: 'var(--md-sys-color-surface)',
33312
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-outline-variant) 82%, transparent)',
33313
+ borderRadius: '12px',
33314
+ shadow: 'none',
33315
+ },
33316
+ header: {
33317
+ background: 'transparent',
33318
+ borderColor: 'transparent',
33319
+ titleColor: 'var(--md-sys-color-on-surface)',
33320
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
33321
+ iconColor: 'var(--md-sys-color-primary)',
33322
+ },
33323
+ body: {
33324
+ background: 'var(--md-sys-color-surface)',
33325
+ textColor: 'var(--md-sys-color-on-surface)',
33326
+ },
33327
+ },
33328
+ },
33329
+ {
33330
+ id: 'graphite',
33331
+ label: {
33332
+ key: 'praxis.widgetShell.presets.graphite.label',
33333
+ text: 'Graphite',
33334
+ },
33335
+ description: {
33336
+ key: 'praxis.widgetShell.presets.graphite.description',
33337
+ text: 'Opaque charcoal finish with a gray header and light text in both themes.',
33338
+ },
33339
+ category: 'sectioned',
33340
+ appearance: {
33341
+ card: {
33342
+ background: '#272b30',
33343
+ borderColor: '#565d66',
33344
+ borderRadius: '8px',
33345
+ shadow: 'none',
33346
+ },
33347
+ header: {
33348
+ background: '#33383f',
33349
+ borderColor: '#565d66',
33350
+ titleColor: '#f2f4f7',
33351
+ subtitleColor: '#c4cad2',
33352
+ iconColor: '#d5dae2',
33353
+ },
33354
+ body: {
33355
+ background: 'transparent',
33356
+ textColor: '#f2f4f7',
33357
+ padding: '12px',
33358
+ },
33359
+ },
33360
+ },
33361
+ {
33362
+ id: 'data-panel',
33363
+ label: {
33364
+ key: 'praxis.widgetShell.presets.data-panel.label',
33365
+ text: 'Data panel',
33366
+ },
33367
+ description: {
33368
+ key: 'praxis.widgetShell.presets.data-panel.description',
33369
+ text: 'Compact framing, small corners and a defined header; does not change table density.',
33370
+ },
33371
+ category: 'sectioned',
33372
+ appearance: {
33373
+ card: {
33374
+ background: 'var(--md-sys-color-surface)',
33375
+ borderColor: 'var(--md-sys-color-outline)',
33376
+ borderRadius: '4px',
33377
+ shadow: 'none',
33378
+ },
33379
+ header: {
33380
+ background: 'var(--md-sys-color-surface-container-highest)',
33381
+ borderColor: 'var(--md-sys-color-outline)',
33382
+ titleColor: 'var(--md-sys-color-on-surface)',
33383
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
33384
+ iconColor: 'var(--md-sys-color-primary)',
33385
+ },
33386
+ body: {
33387
+ background: 'var(--md-sys-color-surface)',
33388
+ textColor: 'var(--md-sys-color-on-surface)',
33389
+ padding: '8px',
33390
+ },
33391
+ typography: {
33392
+ titleSize: '12px',
33393
+ titleWeight: '700',
33394
+ subtitleSize: '11px',
33395
+ },
33396
+ },
33397
+ },
33398
+ {
33399
+ id: 'chart-panel',
33400
+ label: {
33401
+ key: 'praxis.widgetShell.presets.chart-panel.label',
33402
+ text: 'Chart panel',
33403
+ },
33404
+ description: {
33405
+ key: 'praxis.widgetShell.presets.chart-panel.description',
33406
+ text: 'Light framing with more chart space; axes, series and legend use the chart preset.',
33407
+ },
33408
+ category: 'sectioned',
33409
+ appearance: {
33410
+ card: {
33411
+ background: 'color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%)',
33412
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-primary) 22%, var(--md-sys-color-outline-variant) 62%)',
33413
+ borderRadius: '12px',
33414
+ shadow: 'none',
33415
+ },
33416
+ header: {
33417
+ background: 'transparent',
33418
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-primary) 20%, transparent)',
33419
+ titleColor: 'var(--md-sys-color-on-surface)',
33420
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
33421
+ iconColor: 'var(--md-sys-color-primary)',
33422
+ },
33423
+ body: {
33424
+ background: 'transparent',
33425
+ textColor: 'var(--md-sys-color-on-surface)',
33426
+ padding: '16px',
33427
+ },
33428
+ },
33429
+ },
33430
+ {
33431
+ id: 'metric-panel',
33432
+ label: {
33433
+ key: 'praxis.widgetShell.presets.metric-panel.label',
33434
+ text: 'Metric panel',
33435
+ },
33436
+ description: {
33437
+ key: 'praxis.widgetShell.presets.metric-panel.description',
33438
+ text: 'A tonal surface with a quiet header; the inner component defines the value and comparison.',
33439
+ },
33440
+ category: 'sectioned',
33441
+ appearance: {
33442
+ card: {
33443
+ background: 'color-mix(in srgb, var(--md-sys-color-primary-container) 44%, var(--md-sys-color-surface) 56%)',
33444
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-primary) 24%, transparent)',
33445
+ borderRadius: '10px',
33446
+ shadow: '0 8px 18px color-mix(in srgb, var(--md-sys-color-shadow, #000) 8%, transparent)',
33447
+ },
33448
+ header: {
33449
+ background: 'transparent',
33450
+ borderColor: 'transparent',
33451
+ titleColor: 'var(--md-sys-color-on-surface)',
33452
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
33453
+ iconColor: 'var(--md-sys-color-primary)',
33454
+ },
33455
+ body: {
33456
+ background: 'transparent',
33457
+ textColor: 'var(--md-sys-color-on-surface)',
33458
+ padding: '16px',
33459
+ },
33460
+ typography: {
33461
+ titleSize: '12px',
33462
+ titleWeight: '600',
33463
+ subtitleSize: '11px',
33464
+ },
33465
+ },
33466
+ },
33467
+ {
33468
+ id: 'executive-card',
33469
+ label: {
33470
+ key: 'praxis.widgetShell.presets.executive-card.label',
33471
+ text: 'Executive card',
33472
+ },
33473
+ description: {
33474
+ key: 'praxis.widgetShell.presets.executive-card.description',
33475
+ text: 'An accent-colored header, larger title and spacious body for summaries and decisions.',
33476
+ },
33477
+ category: 'sectioned',
33478
+ appearance: {
33479
+ card: {
33480
+ background: 'color-mix(in srgb, var(--md-sys-color-surface) 88%, var(--md-sys-color-surface-container-high) 12%)',
33481
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-primary) 28%, var(--md-sys-color-outline-variant) 50%)',
33482
+ borderRadius: '16px',
33483
+ shadow: '0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 13%, transparent)',
33484
+ },
33485
+ header: {
33486
+ background: 'var(--md-sys-color-primary)',
33487
+ borderColor: 'transparent',
33488
+ titleColor: 'var(--md-sys-color-on-primary)',
33489
+ subtitleColor: 'var(--md-sys-color-on-primary)',
33490
+ iconColor: 'var(--md-sys-color-on-primary)',
33491
+ },
33492
+ body: {
33493
+ background: 'transparent',
33494
+ textColor: 'var(--md-sys-color-on-surface)',
33495
+ padding: '20px',
33496
+ },
33497
+ typography: {
33498
+ titleSize: '16px',
33499
+ titleWeight: '600',
33500
+ subtitleSize: '12px',
33501
+ },
33502
+ },
33503
+ },
33504
+ {
33505
+ id: 'filter-bar',
33506
+ label: {
33507
+ key: 'praxis.widgetShell.presets.filter-bar.label',
33508
+ text: 'Filter bar',
33509
+ },
33510
+ description: {
33511
+ key: 'praxis.widgetShell.presets.filter-bar.description',
33512
+ text: 'A capsule for summaries or compact filters; not intended for tall panels.',
33513
+ },
33514
+ category: 'sectioned',
33515
+ appearance: {
33516
+ card: {
33517
+ background: 'color-mix(in srgb, var(--md-sys-color-surface-container-low) 74%, var(--md-sys-color-secondary-container) 26%)',
33518
+ borderColor: 'color-mix(in srgb, var(--md-sys-color-secondary) 24%, transparent)',
33519
+ borderRadius: '999px',
33520
+ shadow: '0 6px 18px color-mix(in srgb, var(--md-sys-color-shadow, #000) 7%, transparent)',
33521
+ },
33522
+ header: {
33523
+ background: 'transparent',
33524
+ borderColor: 'transparent',
33525
+ titleColor: 'var(--md-sys-color-on-surface)',
33526
+ subtitleColor: 'var(--md-sys-color-on-surface-variant)',
33527
+ iconColor: 'var(--md-sys-color-secondary)',
33528
+ },
33529
+ body: {
33530
+ background: 'transparent',
33531
+ textColor: 'var(--md-sys-color-on-surface)',
33532
+ padding: '10px 14px',
33533
+ },
33534
+ },
33535
+ },
33173
33536
  ];
33537
+ /** Public ID lookup derived from the canonical catalog; no separate preset definitions. */
33538
+ const BUILTIN_SHELL_PRESETS = Object.fromEntries(BUILTIN_WIDGET_SHELL_PRESETS.map(({ id, appearance }) => [id, appearance]));
33174
33539
  function findBuiltinWidgetShellPreset(id) {
33175
33540
  const normalizedId = id?.trim();
33176
33541
  if (!normalizedId)
@@ -34950,9 +35315,16 @@ class WidgetShellComponent {
34950
35315
  [class.pdx-shell--scroll-recovery]="scrollRecovery() && !collapsed && !expanded && !fullscreen"
34951
35316
  [style.--pdx-shell-card-bg]="appearance?.card?.background || null"
34952
35317
  [style.--pdx-shell-card-border]="appearance?.card?.borderColor || null"
35318
+ [style.--pdx-shell-card-border-width]="appearance?.card?.borderWidth || null"
35319
+ [style.--pdx-shell-card-border-style]="appearance?.card?.borderStyle || null"
34953
35320
  [style.--pdx-shell-card-radius]="appearance?.card?.borderRadius || null"
34954
35321
  [style.--pdx-shell-card-shadow]="appearance?.card?.shadow || null"
35322
+ [class.pdx-shell--backdrop]="!!appearance?.card?.backdropFilter && appearance?.card?.backdropFilter !== 'none'"
35323
+ [style.--pdx-shell-card-filter]="appearance?.card?.backdropFilter || null"
35324
+ [style.--pdx-shell-card-fallback-bg]="appearance?.card?.fallbackBackground || null"
34955
35325
  [style.--pdx-shell-header-bg]="appearance?.header?.background || null"
35326
+ [style.--pdx-shell-header-border-width]="appearance?.header?.borderWidth || null"
35327
+ [style.--pdx-shell-header-border-style]="appearance?.header?.borderStyle || null"
34956
35328
  [style.--pdx-shell-header-border]="
34957
35329
  appearance?.header?.borderColor || null
34958
35330
  "
@@ -35146,7 +35518,7 @@ class WidgetShellComponent {
35146
35518
  @if (expanded || fullscreen) {
35147
35519
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
35148
35520
  }
35149
- `, isInline: true, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{box-sizing:border-box;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{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:12px;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-authoring-drag{flex:0 0 auto;align-self:flex-start;margin:4px 6px 0;z-index:2;cursor:grab;touch-action:none}.pdx-shell-authoring-drag:active{cursor:grabbing}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1 1 min(14rem,50%);max-width:100%;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{flex:0 0 auto;color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0;flex:1}.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);color:var( --pdx-shell-subtitle-color, var(--md-sys-color-on-surface-variant, currentColor) );white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;flex-wrap:wrap;align-items:center;gap:4px;max-width:100%}.pdx-shell-actions{margin-left:auto;min-width:0}.pdx-shell-actions>button{max-width:100%}.pdx-shell-window-actions{margin-left:auto}.pdx-shell-text{display:grid;gap:2px}.pdx-shell-title-text,.pdx-shell-subtitle{display:-webkit-box;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2}.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:not(.praxis-icon-button){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.dashboard.pdx-shell--sticky-header{overflow:clip}.pdx-shell--sticky-header>.pdx-shell-header{position:sticky;top:var(--pdx-shell-sticky-header-offset, 0px);z-index:2;isolation:isolate;background:var(--md-sys-color-surface-container)}.pdx-shell--sticky-header>.pdx-shell-header:before{content:\"\";position:absolute;inset:0;z-index:-1;pointer-events:none;background:var(--pdx-shell-header-bg, transparent)}.pdx-shell--sticky-header>.pdx-shell-body{isolation:isolate}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 12px);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-scroll.pdx-shell--scroll-recovery{overflow:auto}.pdx-shell.body-scroll.pdx-shell--scroll-recovery>.pdx-shell-body{flex:0 0 auto;overflow:visible}.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,.pdx-shell-overlay-surface.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,.pdx-shell-overlay-surface.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-overlay-surface{background:var(--md-sys-color-surface);border-radius:var(--pdx-dashboard-card-radius, 16px);pointer-events:none}.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: "component", type: WidgetShellAvatarComponent, selector: "praxis-widget-shell-avatar", inputs: ["avatar"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.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: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.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.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.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: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
35521
+ `, isInline: true, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{--pdx-shell-card-border-width: initial;--pdx-shell-card-border-style: initial;--pdx-shell-header-border-width: initial;--pdx-shell-header-border-style: initial;--pdx-shell-card-filter: initial;--pdx-shell-card-fallback-bg: initial;box-sizing:border-box;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-width:var(--pdx-shell-card-border-width, 1px);border-style:var(--pdx-shell-card-border-style, solid);border-color: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.dashboard{-webkit-backdrop-filter:var(--pdx-shell-card-filter, none);backdrop-filter:var(--pdx-shell-card-filter, none)}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){.pdx-shell.dashboard.pdx-shell--backdrop{background:var(--pdx-shell-card-fallback-bg, var(--md-sys-color-surface))}}@media(prefers-reduced-transparency:reduce){.pdx-shell.dashboard.pdx-shell--backdrop{background:var(--pdx-shell-card-fallback-bg, var(--md-sys-color-surface));-webkit-backdrop-filter:none;backdrop-filter:none}}.pdx-shell.dashboard.pdx-shell--backdrop.expanded,.pdx-shell.dashboard.pdx-shell--backdrop.fullscreen{background:var(--pdx-shell-card-fallback-bg, var(--md-sys-color-surface));-webkit-backdrop-filter:none;backdrop-filter:none}.pdx-shell-header{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:12px;border-bottom:var(--pdx-shell-header-border-width, 1px) var(--pdx-shell-header-border-style, 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-authoring-drag{flex:0 0 auto;align-self:flex-start;margin:4px 6px 0;z-index:2;cursor:grab;touch-action:none}.pdx-shell-authoring-drag:active{cursor:grabbing}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1 1 min(14rem,50%);max-width:100%;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{flex:0 0 auto;color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0;flex:1}.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);color:var( --pdx-shell-subtitle-color, var(--md-sys-color-on-surface-variant, currentColor) );white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;flex-wrap:wrap;align-items:center;gap:4px;max-width:100%}.pdx-shell-actions{margin-left:auto;min-width:0}.pdx-shell-actions button.praxis-icon-button:not(:disabled):not(.praxis-icon-button--pressed){color:var(--pdx-shell-icon-color, var(--md-sys-color-on-surface-variant))}.pdx-shell-actions>button{max-width:100%}.pdx-shell-window-actions{margin-left:auto}.pdx-shell-text{display:grid;gap:2px}.pdx-shell-title-text,.pdx-shell-subtitle{display:-webkit-box;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2}.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:not(.praxis-icon-button){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.dashboard.pdx-shell--sticky-header{overflow:clip}.pdx-shell--sticky-header>.pdx-shell-header{position:sticky;top:var(--pdx-shell-sticky-header-offset, 0px);z-index:2;isolation:isolate;background:var(--md-sys-color-surface-container)}.pdx-shell--backdrop.pdx-shell--sticky-header>.pdx-shell-header{background:var(--pdx-shell-card-fallback-bg, var(--md-sys-color-surface-container))}.pdx-shell--sticky-header>.pdx-shell-header:before{content:\"\";position:absolute;inset:0;z-index:-1;pointer-events:none;background:var(--pdx-shell-header-bg, transparent)}.pdx-shell--sticky-header>.pdx-shell-body{isolation:isolate}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 12px);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-scroll.pdx-shell--scroll-recovery{overflow:auto}.pdx-shell.body-scroll.pdx-shell--scroll-recovery>.pdx-shell-body{flex:0 0 auto;overflow:visible}.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,.pdx-shell-overlay-surface.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,.pdx-shell-overlay-surface.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-overlay-surface{background:var(--md-sys-color-surface);border-radius:var(--pdx-dashboard-card-radius, 16px);pointer-events:none}.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: "component", type: WidgetShellAvatarComponent, selector: "praxis-widget-shell-avatar", inputs: ["avatar"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.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: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.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.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.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: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
35150
35522
  }
35151
35523
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: WidgetShellComponent, decorators: [{
35152
35524
  type: Component,
@@ -35188,9 +35560,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35188
35560
  [class.pdx-shell--scroll-recovery]="scrollRecovery() && !collapsed && !expanded && !fullscreen"
35189
35561
  [style.--pdx-shell-card-bg]="appearance?.card?.background || null"
35190
35562
  [style.--pdx-shell-card-border]="appearance?.card?.borderColor || null"
35563
+ [style.--pdx-shell-card-border-width]="appearance?.card?.borderWidth || null"
35564
+ [style.--pdx-shell-card-border-style]="appearance?.card?.borderStyle || null"
35191
35565
  [style.--pdx-shell-card-radius]="appearance?.card?.borderRadius || null"
35192
35566
  [style.--pdx-shell-card-shadow]="appearance?.card?.shadow || null"
35567
+ [class.pdx-shell--backdrop]="!!appearance?.card?.backdropFilter && appearance?.card?.backdropFilter !== 'none'"
35568
+ [style.--pdx-shell-card-filter]="appearance?.card?.backdropFilter || null"
35569
+ [style.--pdx-shell-card-fallback-bg]="appearance?.card?.fallbackBackground || null"
35193
35570
  [style.--pdx-shell-header-bg]="appearance?.header?.background || null"
35571
+ [style.--pdx-shell-header-border-width]="appearance?.header?.borderWidth || null"
35572
+ [style.--pdx-shell-header-border-style]="appearance?.header?.borderStyle || null"
35194
35573
  [style.--pdx-shell-header-border]="
35195
35574
  appearance?.header?.borderColor || null
35196
35575
  "
@@ -35384,7 +35763,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35384
35763
  @if (expanded || fullscreen) {
35385
35764
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
35386
35765
  }
35387
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{box-sizing:border-box;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{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:12px;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-authoring-drag{flex:0 0 auto;align-self:flex-start;margin:4px 6px 0;z-index:2;cursor:grab;touch-action:none}.pdx-shell-authoring-drag:active{cursor:grabbing}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1 1 min(14rem,50%);max-width:100%;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{flex:0 0 auto;color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0;flex:1}.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);color:var( --pdx-shell-subtitle-color, var(--md-sys-color-on-surface-variant, currentColor) );white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;flex-wrap:wrap;align-items:center;gap:4px;max-width:100%}.pdx-shell-actions{margin-left:auto;min-width:0}.pdx-shell-actions>button{max-width:100%}.pdx-shell-window-actions{margin-left:auto}.pdx-shell-text{display:grid;gap:2px}.pdx-shell-title-text,.pdx-shell-subtitle{display:-webkit-box;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2}.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:not(.praxis-icon-button){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.dashboard.pdx-shell--sticky-header{overflow:clip}.pdx-shell--sticky-header>.pdx-shell-header{position:sticky;top:var(--pdx-shell-sticky-header-offset, 0px);z-index:2;isolation:isolate;background:var(--md-sys-color-surface-container)}.pdx-shell--sticky-header>.pdx-shell-header:before{content:\"\";position:absolute;inset:0;z-index:-1;pointer-events:none;background:var(--pdx-shell-header-bg, transparent)}.pdx-shell--sticky-header>.pdx-shell-body{isolation:isolate}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 12px);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-scroll.pdx-shell--scroll-recovery{overflow:auto}.pdx-shell.body-scroll.pdx-shell--scroll-recovery>.pdx-shell-body{flex:0 0 auto;overflow:visible}.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,.pdx-shell-overlay-surface.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,.pdx-shell-overlay-surface.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-overlay-surface{background:var(--md-sys-color-surface);border-radius:var(--pdx-dashboard-card-radius, 16px);pointer-events:none}.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"] }]
35766
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{--pdx-shell-card-border-width: initial;--pdx-shell-card-border-style: initial;--pdx-shell-header-border-width: initial;--pdx-shell-header-border-style: initial;--pdx-shell-card-filter: initial;--pdx-shell-card-fallback-bg: initial;box-sizing:border-box;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-width:var(--pdx-shell-card-border-width, 1px);border-style:var(--pdx-shell-card-border-style, solid);border-color: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.dashboard{-webkit-backdrop-filter:var(--pdx-shell-card-filter, none);backdrop-filter:var(--pdx-shell-card-filter, none)}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){.pdx-shell.dashboard.pdx-shell--backdrop{background:var(--pdx-shell-card-fallback-bg, var(--md-sys-color-surface))}}@media(prefers-reduced-transparency:reduce){.pdx-shell.dashboard.pdx-shell--backdrop{background:var(--pdx-shell-card-fallback-bg, var(--md-sys-color-surface));-webkit-backdrop-filter:none;backdrop-filter:none}}.pdx-shell.dashboard.pdx-shell--backdrop.expanded,.pdx-shell.dashboard.pdx-shell--backdrop.fullscreen{background:var(--pdx-shell-card-fallback-bg, var(--md-sys-color-surface));-webkit-backdrop-filter:none;backdrop-filter:none}.pdx-shell-header{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:12px;border-bottom:var(--pdx-shell-header-border-width, 1px) var(--pdx-shell-header-border-style, 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-authoring-drag{flex:0 0 auto;align-self:flex-start;margin:4px 6px 0;z-index:2;cursor:grab;touch-action:none}.pdx-shell-authoring-drag:active{cursor:grabbing}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1 1 min(14rem,50%);max-width:100%;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{flex:0 0 auto;color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0;flex:1}.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);color:var( --pdx-shell-subtitle-color, var(--md-sys-color-on-surface-variant, currentColor) );white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;flex-wrap:wrap;align-items:center;gap:4px;max-width:100%}.pdx-shell-actions{margin-left:auto;min-width:0}.pdx-shell-actions button.praxis-icon-button:not(:disabled):not(.praxis-icon-button--pressed){color:var(--pdx-shell-icon-color, var(--md-sys-color-on-surface-variant))}.pdx-shell-actions>button{max-width:100%}.pdx-shell-window-actions{margin-left:auto}.pdx-shell-text{display:grid;gap:2px}.pdx-shell-title-text,.pdx-shell-subtitle{display:-webkit-box;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2}.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:not(.praxis-icon-button){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.dashboard.pdx-shell--sticky-header{overflow:clip}.pdx-shell--sticky-header>.pdx-shell-header{position:sticky;top:var(--pdx-shell-sticky-header-offset, 0px);z-index:2;isolation:isolate;background:var(--md-sys-color-surface-container)}.pdx-shell--backdrop.pdx-shell--sticky-header>.pdx-shell-header{background:var(--pdx-shell-card-fallback-bg, var(--md-sys-color-surface-container))}.pdx-shell--sticky-header>.pdx-shell-header:before{content:\"\";position:absolute;inset:0;z-index:-1;pointer-events:none;background:var(--pdx-shell-header-bg, transparent)}.pdx-shell--sticky-header>.pdx-shell-body{isolation:isolate}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 12px);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-scroll.pdx-shell--scroll-recovery{overflow:auto}.pdx-shell.body-scroll.pdx-shell--scroll-recovery>.pdx-shell-body{flex:0 0 auto;overflow:visible}.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,.pdx-shell-overlay-surface.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,.pdx-shell-overlay-surface.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-overlay-surface{background:var(--md-sys-color-surface);border-radius:var(--pdx-dashboard-card-radius, 16px);pointer-events:none}.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"] }]
35388
35767
  }], ctorParameters: () => [], propDecorators: { hostCollapsed: [{
35389
35768
  type: HostBinding,
35390
35769
  args: ['class.pdx-widget-shell-collapsed']
@@ -35747,6 +36126,161 @@ const BUILTIN_PAGE_THEME_PRESETS = {
35747
36126
  },
35748
36127
  },
35749
36128
  };
36129
+ /** Shared runtime/authoring resolution: a recognized explicit layout wins over presetFamily. */
36130
+ function resolveWidgetPageLayoutPreset(page) {
36131
+ const layoutPresetId = page.layoutPreset?.trim();
36132
+ if (layoutPresetId && BUILTIN_PAGE_LAYOUT_PRESETS[layoutPresetId]) {
36133
+ return BUILTIN_PAGE_LAYOUT_PRESETS[layoutPresetId];
36134
+ }
36135
+ const presetFamily = typeof page.layoutPresetOptions?.['presetFamily'] === 'string'
36136
+ ? page.layoutPresetOptions['presetFamily'].trim()
36137
+ : '';
36138
+ return presetFamily ? BUILTIN_PAGE_LAYOUT_PRESETS[presetFamily] : undefined;
36139
+ }
36140
+
36141
+ const geometry = ['col', 'row', 'colSpan', 'rowSpan'];
36142
+ const overlaps$2 = (a, b) => a.col < b.col + b.colSpan && b.col < a.col + a.colSpan
36143
+ && a.row < b.row + b.rowSpan && b.row < a.row + a.rowSpan;
36144
+ /** Prepare an explicit base-canvas arrangement. Widths are authored grid spans,
36145
+ * not semantic roles. The caller reviews the result before replacing the canvas.
36146
+ * No partial result is returned on failure. Device documents remain untouched.
36147
+ */
36148
+ function prepareCanvasArrangement(page, widths) {
36149
+ const fail = (reason, blockedKeys = []) => ({ canvas: null, changedKeys: [], blockedKeys, reason });
36150
+ const canvas = page.canvas;
36151
+ if (!canvas || !Number.isSafeInteger(canvas.columns) || canvas.columns < 1
36152
+ || !widths.length || widths.some(value => !Number.isSafeInteger(value) || value < 1)
36153
+ || widths.reduce((sum, value) => sum + value, 0) !== canvas.columns)
36154
+ return fail('geometry');
36155
+ const entries = Object.entries(canvas.items).sort(([ak, a], [bk, b]) => a.row - b.row || a.col - b.col || (ak < bk ? -1 : ak > bk ? 1 : 0));
36156
+ const keys = new Set(page.widgets.map(widget => widget.key));
36157
+ if (keys.size !== page.widgets.length || entries.length !== keys.size
36158
+ || entries.some(([key]) => !keys.has(key)))
36159
+ return fail('geometry');
36160
+ for (const [key, item] of entries) {
36161
+ if (!geometry.every(field => Number.isSafeInteger(item[field]) && item[field] > 0)
36162
+ || !Number.isSafeInteger(item.row + item.rowSpan)
36163
+ || item.col + item.colSpan > canvas.columns + 1)
36164
+ return fail('geometry', [key]);
36165
+ const c = item.constraints;
36166
+ if (Object.entries(c || {}).some(([name, value]) => !name.startsWith('lock')
36167
+ && (!Number.isSafeInteger(value) || Number(value) < 1))
36168
+ || item.colSpan < (c?.minColSpan ?? 1) || item.colSpan > (c?.maxColSpan ?? canvas.columns)
36169
+ || item.rowSpan < (c?.minRowSpan ?? 1) || item.rowSpan > (c?.maxRowSpan ?? Number.MAX_SAFE_INTEGER))
36170
+ return fail('limits', [key]);
36171
+ }
36172
+ // Locked positions are anchors. Never repair intentional overlaps implicitly.
36173
+ for (let index = 0; index < entries.length; index++) {
36174
+ const [key, item] = entries[index];
36175
+ const collision = entries.slice(index + 1).find(([, other]) => overlaps$2(item, other));
36176
+ if (collision)
36177
+ return fail('geometry', [key, collision[0]]);
36178
+ }
36179
+ const items = { ...canvas.items };
36180
+ const placed = entries.filter(([, item]) => item.constraints?.lockPosition).map(([, item]) => item);
36181
+ const lanes = widths.map((width, index) => ({ width, col: 1 + widths.slice(0, index).reduce((sum, value) => sum + value, 0), row: 1 }));
36182
+ let index = 0;
36183
+ for (const [key, item] of entries) {
36184
+ if (item.constraints?.lockPosition)
36185
+ continue;
36186
+ const lane = lanes[index++ % lanes.length];
36187
+ const colSpan = item.constraints?.lockSize ? item.colSpan : lane.width;
36188
+ if (colSpan > lane.width || colSpan < (item.constraints?.minColSpan ?? 1)
36189
+ || colSpan > (item.constraints?.maxColSpan ?? canvas.columns))
36190
+ return fail('limits', [key]);
36191
+ const next = { ...item, col: lane.col, row: lane.row, colSpan };
36192
+ let collisions = placed.filter(other => overlaps$2(next, other));
36193
+ while (collisions.length) {
36194
+ next.row = Math.max(...collisions.map(other => other.row + other.rowSpan));
36195
+ if (!Number.isSafeInteger(next.row + next.rowSpan))
36196
+ return fail('geometry', [key]);
36197
+ collisions = placed.filter(other => overlaps$2(next, other));
36198
+ }
36199
+ items[key] = next;
36200
+ placed.push(next);
36201
+ lane.row = next.row + next.rowSpan;
36202
+ }
36203
+ const changedKeys = entries.filter(([key, item]) => geometry.some(field => item[field] !== items[key][field])).map(([key]) => key);
36204
+ const candidate = { ...canvas, items };
36205
+ const issue = validateCanvasArrangement({ ...page, canvas: candidate }, page);
36206
+ if (issue)
36207
+ return fail(issue.reason, issue.blockedKeys);
36208
+ return { canvas: { ...canvas, items }, changedKeys, blockedKeys: [], reason: null };
36209
+ }
36210
+ /** Admit a final arrangement without calculating another placement. The source is
36211
+ * the reviewed transaction baseline; the candidate may include other draft edits.
36212
+ * Device inheritance and locks are checked again at submission, not only preview.
36213
+ */
36214
+ function validateCanvasArrangement(page, source) {
36215
+ const fail = (reason, ...blockedKeys) => ({ reason, blockedKeys });
36216
+ const canvas = page.canvas;
36217
+ if (!canvas || !Number.isSafeInteger(canvas.columns) || canvas.columns < 1)
36218
+ return fail('geometry');
36219
+ const entries = Object.entries(canvas.items);
36220
+ const keys = new Set(page.widgets.map(widget => widget.key));
36221
+ if (keys.size !== page.widgets.length || entries.length !== keys.size || entries.some(([key]) => !keys.has(key)))
36222
+ return fail('geometry');
36223
+ const withinLimits = (item, columns) => {
36224
+ const c = item.constraints;
36225
+ const minCol = c?.minColSpan ?? 1, maxCol = c?.maxColSpan ?? columns;
36226
+ const minRow = c?.minRowSpan ?? 1, maxRow = c?.maxRowSpan ?? Number.MAX_SAFE_INTEGER;
36227
+ return [minCol, maxCol, minRow, maxRow].every(value => Number.isSafeInteger(value) && value > 0)
36228
+ && minCol <= columns && minCol <= maxCol && minRow <= maxRow
36229
+ && item.colSpan >= minCol && item.colSpan <= maxCol
36230
+ && item.rowSpan >= minRow && item.rowSpan <= maxRow;
36231
+ };
36232
+ for (let index = 0; index < entries.length; index++) {
36233
+ const [key, item] = entries[index];
36234
+ if (!geometry.every(field => Number.isSafeInteger(item[field]) && item[field] > 0)
36235
+ || !Number.isSafeInteger(item.row + item.rowSpan) || item.col + item.colSpan > canvas.columns + 1)
36236
+ return fail('geometry', key);
36237
+ if (!withinLimits(item, canvas.columns))
36238
+ return fail('limits', key);
36239
+ const before = source.canvas?.items[key];
36240
+ const positionLocked = before?.constraints?.lockPosition || item.constraints?.lockPosition;
36241
+ const sizeLocked = before?.constraints?.lockSize || item.constraints?.lockSize;
36242
+ if (before && ((positionLocked && (before.col !== item.col || before.row !== item.row))
36243
+ || (sizeLocked && (before.colSpan !== item.colSpan || before.rowSpan !== item.rowSpan))))
36244
+ return fail('limits', key);
36245
+ const collision = entries.slice(index + 1).find(([, other]) => overlaps$2(item, other));
36246
+ if (collision)
36247
+ return fail('geometry', key, collision[0]);
36248
+ }
36249
+ for (const device of ['desktop', 'tablet', 'mobile']) {
36250
+ const variant = page.deviceLayouts?.[device];
36251
+ if (!variant)
36252
+ continue;
36253
+ const overrides = variant.canvas?.items || {};
36254
+ const columns = variant.canvas?.columns ?? canvas.columns;
36255
+ if (!Number.isSafeInteger(columns) || columns < 1)
36256
+ return fail('geometry');
36257
+ for (const [key, item] of entries) {
36258
+ const override = overrides[key];
36259
+ if (override?.hidden || variant.widgetOverrides?.[key]?.hidden)
36260
+ continue;
36261
+ const constraints = { ...item.constraints, ...override?.constraints };
36262
+ // A narrower device grid clips inherited widths in Core's responsive
36263
+ // materialization. Explicit widths still have to honor authored bounds.
36264
+ const effective = { ...item, ...override, constraints,
36265
+ colSpan: columns < canvas.columns ? Math.min(override?.colSpan ?? item.colSpan, columns) : override?.colSpan ?? item.colSpan };
36266
+ if (!withinLimits(effective, columns))
36267
+ return fail('limits', key);
36268
+ const before = source.canvas?.items[key];
36269
+ if (!before)
36270
+ continue;
36271
+ const priorOverride = source.deviceLayouts?.[device]?.canvas?.items?.[key];
36272
+ const priorConstraints = { ...before.constraints, ...priorOverride?.constraints };
36273
+ const inheritedChange = (fields) => fields.some(field => override?.[field] === undefined && item[field] !== before[field]);
36274
+ if (((constraints.lockPosition || priorConstraints.lockPosition) && inheritedChange(['col', 'row']))
36275
+ || ((constraints.lockSize || priorConstraints.lockSize) && inheritedChange(['colSpan', 'rowSpan'])))
36276
+ return fail('limits', key);
36277
+ if (Object.values(overrides).some(value => geometry.some(field => value[field] !== undefined))
36278
+ && inheritedChange(geometry))
36279
+ return fail('device-overrides', key);
36280
+ }
36281
+ }
36282
+ return null;
36283
+ }
35750
36284
 
35751
36285
  class WidgetPageCompositionFactory {
35752
36286
  create(page) {
@@ -40099,7 +40633,7 @@ const DYNAMIC_WIDGET_PAGE_I18N_CONFIG = {
40099
40633
  'size.presetLabelSingle': '{{fraction}} da grade: 1 coluna',
40100
40634
  'size.presetHelp': 'Fração da grade · número de colunas',
40101
40635
  'size.undo': 'Desfazer último redimensionamento',
40102
- 'size.undoHelp': 'Restaura o widget e os vizinhos alterados no último ajuste desta sessão.',
40636
+ 'size.undoHelp': 'Restaura o widget e os vizinhos alterados no último ajuste desta sessão. No painel de configurações, confirme a prévia com Aplicar.',
40103
40637
  'size.undoBlocked': 'O layout ou seus limites mudaram depois. O ajuste anterior não pode ser restaurado com segurança.',
40104
40638
  'size.undoDone': 'Último redimensionamento desfeito, incluindo os vizinhos afetados.',
40105
40639
  'size.width': 'Largura',
@@ -40261,7 +40795,7 @@ const DYNAMIC_WIDGET_PAGE_I18N_CONFIG = {
40261
40795
  'size.presetLabelSingle': '{{fraction}} of the grid: 1 column',
40262
40796
  'size.presetHelp': 'Grid fraction · number of columns',
40263
40797
  'size.undo': 'Undo last resize',
40264
- 'size.undoHelp': 'Restores the widget and neighbors changed by the last resize in this session.',
40798
+ 'size.undoHelp': 'Restores the widget and neighbors changed by the last resize in this session. In the settings panel, confirm the preview with Apply.',
40265
40799
  'size.undoBlocked': 'The layout or its limits changed afterwards. The previous size cannot be safely restored.',
40266
40800
  'size.undoDone': 'Last resize undone, including affected neighbors.',
40267
40801
  'size.width': 'Width',
@@ -43942,7 +44476,7 @@ class DynamicWidgetPageComponent {
43942
44476
  content: { component: WidgetSettingsEditorComponent, inputs: () => {
43943
44477
  const page = this.ensurePageDefinition();
43944
44478
  const widget = page.widgets.find(item => item.key === key);
43945
- const uiShell = page.context?.ui?.shell || {};
44479
+ const uiShell = this.mergedContext['ui']?.shell || {};
43946
44480
  this.closeSizeEditor(false);
43947
44481
  this.prepareSizeEditor(key);
43948
44482
  this.widgetSettingsKey = key;
@@ -44481,9 +45015,11 @@ class DynamicWidgetPageComponent {
44481
45015
  return;
44482
45016
  // Layout authoring must not capture runtime inputs such as loaded table rows.
44483
45017
  const page = this.clonePageDefinition(this.authoredPageDefinition ?? this.ensurePageDefinition());
44484
- const uiShell = page.context?.ui?.shell || {};
45018
+ const uiShell = this.mergedContext['ui']?.shell || {};
44485
45019
  const session = this.createSettingsSession();
44486
45020
  const owner = session.get(DestroyRef);
45021
+ const appliedValues = new Subject();
45022
+ owner.onDestroy(() => appliedValues.complete());
44487
45023
  const ref = this.settingsPanel.open({
44488
45024
  owner,
44489
45025
  id: 'dynamic-page-settings',
@@ -44492,6 +45028,7 @@ class DynamicWidgetPageComponent {
44492
45028
  component: editor,
44493
45029
  inputs: {
44494
45030
  page,
45031
+ appliedValues$: appliedValues.asObservable(),
44495
45032
  layout: page.layout || null,
44496
45033
  presets: uiShell?.presets || null,
44497
45034
  pagePreset: uiShell?.preset || null,
@@ -44501,7 +45038,16 @@ class DynamicWidgetPageComponent {
44501
45038
  },
44502
45039
  },
44503
45040
  });
44504
- ref.applied$.pipe(takeUntilDestroyed(owner)).subscribe((result) => this.applyPageLayout(result, false));
45041
+ ref.applied$.pipe(takeUntilDestroyed(owner)).subscribe((result) => {
45042
+ if (!result)
45043
+ return;
45044
+ // Runtime bootstrap may enrich the object while applying it. Acknowledge
45045
+ // the authored value submitted by the provider, not that materialization.
45046
+ const accepted = result && typeof result === 'object' && 'widgets' in result
45047
+ ? this.clonePageDefinition(result) : result;
45048
+ this.applyPageLayout(result, false);
45049
+ appliedValues.next(accepted);
45050
+ });
44505
45051
  ref.saved$.pipe(takeUntilDestroyed(owner)).subscribe((result) => this.applyPageLayout(result, true));
44506
45052
  ref.closed$?.pipe(take(1), takeUntilDestroyed(owner)).subscribe(() => this.releaseSettingsSession(session));
44507
45053
  }
@@ -44721,7 +45267,7 @@ class DynamicWidgetPageComponent {
44721
45267
  ? BUILTIN_PAGE_THEME_PRESETS[themePresetId]
44722
45268
  : undefined;
44723
45269
  const layoutPreset = pageDefinition
44724
- ? this.resolveLayoutPresetDefinition(pageDefinition)
45270
+ ? resolveWidgetPageLayoutPreset(pageDefinition)
44725
45271
  : undefined;
44726
45272
  const merged = {
44727
45273
  ...baseContext,
@@ -44955,7 +45501,7 @@ class DynamicWidgetPageComponent {
44955
45501
  return input;
44956
45502
  }
44957
45503
  resolvePagePresets(page) {
44958
- const preset = this.resolveLayoutPresetDefinition(page);
45504
+ const preset = resolveWidgetPageLayoutPreset(page);
44959
45505
  const themePresetId = page.themePreset || preset?.defaultThemePreset;
44960
45506
  const mergedLayout = this.mergeLayout(preset?.defaultLayout, page.layout);
44961
45507
  const grouping = (page.grouping && page.grouping.length
@@ -44968,16 +45514,6 @@ class DynamicWidgetPageComponent {
44968
45514
  themePreset: themePresetId,
44969
45515
  };
44970
45516
  }
44971
- resolveLayoutPresetDefinition(page) {
44972
- const layoutPresetId = page.layoutPreset?.trim();
44973
- if (layoutPresetId && BUILTIN_PAGE_LAYOUT_PRESETS[layoutPresetId]) {
44974
- return BUILTIN_PAGE_LAYOUT_PRESETS[layoutPresetId];
44975
- }
44976
- const presetFamily = typeof page.layoutPresetOptions?.['presetFamily'] === 'string'
44977
- ? page.layoutPresetOptions['presetFamily'].trim()
44978
- : '';
44979
- return presetFamily ? BUILTIN_PAGE_LAYOUT_PRESETS[presetFamily] : undefined;
44980
- }
44981
45517
  mergeLayout(presetLayout, pageLayout) {
44982
45518
  if (!presetLayout && !pageLayout)
44983
45519
  return undefined;
@@ -47063,7 +47599,7 @@ class DynamicWidgetPageComponent {
47063
47599
  }
47064
47600
  groupGridColumn(group) {
47065
47601
  if (group.kind === 'rail' && this.pageColumnCount > 1) {
47066
- return `${this.pageColumnCount} / span 1`;
47602
+ return `${group.side === 'left' ? 1 : this.pageColumnCount} / span 1`;
47067
47603
  }
47068
47604
  return '1 / -1';
47069
47605
  }
@@ -47247,7 +47783,7 @@ class DynamicWidgetPageComponent {
47247
47783
  */
47248
47784
  stripDerivedPresetDefaults(page) {
47249
47785
  const canonical = this.clonePageDefinition(page);
47250
- const preset = this.resolveLayoutPresetDefinition(canonical);
47786
+ const preset = resolveWidgetPageLayoutPreset(canonical);
47251
47787
  if (!preset)
47252
47788
  return canonical;
47253
47789
  const layoutDelta = this.jsonObjectDelta(canonical.layout, preset.defaultLayout);
@@ -52342,4 +52878,4 @@ function provideHookWhitelist(allowed) {
52342
52878
  * Generated bundle index. Do not edit.
52343
52879
  */
52344
52880
 
52345
- 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_WIDGET_SHELL_PRESETS, COMPONENT_METADATA_REGISTRY_I18N_CONFIG, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentAuthoringManifestProjectionError, ComponentKeyService, ComponentMetadataRegistry, ComponentRuntimeProfileService, CompositionRuntimeFacade, CompositionValidatorService, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_SCHEMA_REQUEST_TIMEOUT_MS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GOVERNED_COLOR_PALETTE_OPTIONS, GenericCrudService, GlobalActionService, GlobalConfigService, GovernedColorPaletteService, 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_ACTION_CONTROL_DEFAULTS, PRAXIS_ACTION_CONTROL_VARS, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_COLLECTION_SEARCH_DEFAULTS, PRAXIS_COLLECTION_SEARCH_VARS, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_AUTHORING_MANIFEST, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisRelatedResourceOutletConfigEditorComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_METADATA_CLIENT_OPTIONS, SCHEMA_VIEWER_CONTEXT, SETTINGS_EDITOR_SECTIONS_HOSTED, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_DRAWER_CONTENT_DATA, SURFACE_DRAWER_REF, SURFACE_NAVIGATION_I18N_CONFIG, SURFACE_NAVIGATION_I18N_NAMESPACE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SettingsSectionTabsComponent, SurfaceBindingRuntimeService, SurfaceNavigationError, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, SurfaceOutletRegistryService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageCompositionFactory, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisActionControlCss, buildPraxisCollectionSearchCss, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, canonicalJsonSha256, canonicalJsonStringify, 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, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, findBuiltinWidgetShellPreset, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionProviderEvidence, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, getWidgetShellActionIdError, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionProviderOperational, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, markGlobalActionProviderOperational, matchFieldValidator, materializeFormLayoutFromMetadata, materializeGovernedPaletteColors, materializeGovernedPaletteEntries, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, nestedPortPathIdentity, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeReactiveDeterminations, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeSurfaceOperationContext, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, projectComponentAuthoringManifest, projectGroupedCommandPartialRows, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisTelemetry, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveBuiltinWidgetShellAppearance, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDateRangeShortcutPreset, resolveDateRangeShortcutPresets, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveGroupedCommandPartialRowSpans, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsConfigDocuments, supportsImplicitValuePresentation, syncWithServerMetadata, textSha256, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateSurfaceOpenFailed, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };
52881
+ 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, BUILTIN_WIDGET_SHELL_PRESETS, COMPONENT_METADATA_REGISTRY_I18N_CONFIG, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentAuthoringManifestProjectionError, ComponentKeyService, ComponentMetadataRegistry, ComponentRuntimeProfileService, CompositionRuntimeFacade, CompositionValidatorService, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_SCHEMA_REQUEST_TIMEOUT_MS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GOVERNED_COLOR_PALETTE_OPTIONS, GenericCrudService, GlobalActionService, GlobalConfigService, GovernedColorPaletteService, 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_ACTION_CONTROL_DEFAULTS, PRAXIS_ACTION_CONTROL_VARS, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_COLLECTION_SEARCH_DEFAULTS, PRAXIS_COLLECTION_SEARCH_VARS, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_AUTHORING_MANIFEST, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisRelatedResourceOutletConfigEditorComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_METADATA_CLIENT_OPTIONS, SCHEMA_VIEWER_CONTEXT, SETTINGS_EDITOR_SECTIONS_HOSTED, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_DRAWER_CONTENT_DATA, SURFACE_DRAWER_REF, SURFACE_NAVIGATION_I18N_CONFIG, SURFACE_NAVIGATION_I18N_NAMESPACE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SettingsSectionTabsComponent, SurfaceBindingRuntimeService, SurfaceNavigationError, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, SurfaceOutletRegistryService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageCompositionFactory, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisActionControlCss, buildPraxisCollectionSearchCss, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, canonicalJsonSha256, canonicalJsonStringify, 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, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, findBuiltinWidgetShellPreset, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionProviderEvidence, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, getWidgetShellActionIdError, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionProviderOperational, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, markGlobalActionProviderOperational, matchFieldValidator, materializeFormLayoutFromMetadata, materializeGovernedPaletteColors, materializeGovernedPaletteEntries, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, nestedPortPathIdentity, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeReactiveDeterminations, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeSurfaceOperationContext, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, prepareCanvasArrangement, projectComponentAuthoringManifest, projectGroupedCommandPartialRows, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisTelemetry, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveBuiltinWidgetShellAppearance, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDateRangeShortcutPreset, resolveDateRangeShortcutPresets, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveGroupedCommandPartialRowSpans, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, resolveWidgetPageLayoutPreset, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsConfigDocuments, supportsImplicitValuePresentation, syncWithServerMetadata, textSha256, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateSurfaceOpenFailed, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateCanvasArrangement, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };