@praxisui/core 9.0.68-rc.1 → 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)',
@@ -33171,256 +33258,280 @@ const BUILTIN_WIDGET_SHELL_PRESETS = [
33171
33258
  },
33172
33259
  },
33173
33260
  {
33174
- "id": "dark-glass",
33175
- "label": {
33176
- "key": "praxis.widgetShell.presets.dark-glass.label",
33177
- "text": "Dark glass"
33261
+ id: 'dark-glass',
33262
+ label: {
33263
+ key: 'praxis.widgetShell.presets.dark-glass.label',
33264
+ text: 'Dark glass',
33178
33265
  },
33179
- "description": {
33180
- "key": "praxis.widgetShell.presets.dark-glass.description",
33181
- "text": "Dark glass appearance for existing and new pages."
33266
+ description: {
33267
+ key: 'praxis.widgetShell.presets.dark-glass.description',
33268
+ text: 'Translucent frosted glass; uses an opaque surface with reduced transparency or fullscreen.',
33182
33269
  },
33183
- "category": "sectioned",
33184
- "appearance": {
33185
- "card": {
33186
- "background": "#0b1220",
33187
- "borderColor": "rgba(255,255,255,0.12)",
33188
- "borderRadius": "16px",
33189
- "shadow": "0 12px 26px rgba(0,0,0,0.35)"
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',
33190
33279
  },
33191
- "header": {
33192
- "titleColor": "#e6edf3",
33193
- "subtitleColor": "#9fb0c4",
33194
- "iconColor": "#8ab4ff"
33280
+ header: {
33281
+ background: 'transparent',
33282
+ borderColor: 'rgba(255,255,255,0.12)',
33283
+ titleColor: '#e6edf3',
33284
+ subtitleColor: '#d3deed',
33285
+ iconColor: '#8ab4ff',
33195
33286
  },
33196
- "typography": {
33197
- "titleSize": "14px",
33198
- "titleWeight": "600",
33199
- "subtitleSize": "12px"
33200
- }
33201
- }
33287
+ body: {
33288
+ background: 'transparent',
33289
+ textColor: '#e6edf3',
33290
+ },
33291
+ typography: {
33292
+ titleSize: '14px',
33293
+ titleWeight: '600',
33294
+ subtitleSize: '12px',
33295
+ },
33296
+ },
33202
33297
  },
33203
33298
  {
33204
- "id": "light-neutral",
33205
- "label": {
33206
- "key": "praxis.widgetShell.presets.light-neutral.label",
33207
- "text": "Light neutral"
33299
+ id: 'light-neutral',
33300
+ label: {
33301
+ key: 'praxis.widgetShell.presets.light-neutral.label',
33302
+ text: 'Adaptive neutral',
33208
33303
  },
33209
- "description": {
33210
- "key": "praxis.widgetShell.presets.light-neutral.description",
33211
- "text": "Light neutral appearance for existing and new pages."
33304
+ description: {
33305
+ key: 'praxis.widgetShell.presets.light-neutral.description',
33306
+ text: 'A neutral shadow-free surface that follows the light or dark theme.',
33212
33307
  },
33213
- "category": "sectioned",
33214
- "appearance": {
33215
- "card": {
33216
- "background": "var(--md-sys-color-surface)",
33217
- "borderColor": "color-mix(in srgb, var(--md-sys-color-outline-variant) 82%, transparent)",
33218
- "borderRadius": "12px",
33219
- "shadow": "0 4px 14px color-mix(in srgb, var(--md-sys-color-shadow, #000) 7%, transparent)"
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',
33220
33315
  },
33221
- "header": {
33222
- "background": "color-mix(in srgb, var(--md-sys-color-surface-container-low) 72%, transparent)",
33223
- "borderColor": "color-mix(in srgb, var(--md-sys-color-outline-variant) 70%, transparent)",
33224
- "titleColor": "var(--md-sys-color-on-surface)",
33225
- "subtitleColor": "var(--md-sys-color-on-surface-variant)",
33226
- "iconColor": "var(--md-sys-color-primary)"
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)',
33227
33322
  },
33228
- "body": {
33229
- "background": "var(--md-sys-color-surface)",
33230
- "textColor": "var(--md-sys-color-on-surface)"
33231
- }
33232
- }
33323
+ body: {
33324
+ background: 'var(--md-sys-color-surface)',
33325
+ textColor: 'var(--md-sys-color-on-surface)',
33326
+ },
33327
+ },
33233
33328
  },
33234
33329
  {
33235
- "id": "graphite",
33236
- "label": {
33237
- "key": "praxis.widgetShell.presets.graphite.label",
33238
- "text": "Graphite"
33330
+ id: 'graphite',
33331
+ label: {
33332
+ key: 'praxis.widgetShell.presets.graphite.label',
33333
+ text: 'Graphite',
33239
33334
  },
33240
- "description": {
33241
- "key": "praxis.widgetShell.presets.graphite.description",
33242
- "text": "Graphite appearance for existing and new pages."
33335
+ description: {
33336
+ key: 'praxis.widgetShell.presets.graphite.description',
33337
+ text: 'Opaque charcoal finish with a gray header and light text in both themes.',
33243
33338
  },
33244
- "category": "sectioned",
33245
- "appearance": {
33246
- "card": {
33247
- "background": "color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-surface-container-high) 6%)",
33248
- "borderColor": "color-mix(in srgb, var(--md-sys-color-outline-variant) 74%, transparent)",
33249
- "borderRadius": "12px",
33250
- "shadow": "0 8px 22px color-mix(in srgb, var(--md-sys-color-shadow, #000) 11%, transparent)"
33339
+ category: 'sectioned',
33340
+ appearance: {
33341
+ card: {
33342
+ background: '#272b30',
33343
+ borderColor: '#565d66',
33344
+ borderRadius: '8px',
33345
+ shadow: 'none',
33251
33346
  },
33252
- "header": {
33253
- "background": "color-mix(in srgb, var(--md-sys-color-surface-container-low) 76%, transparent)",
33254
- "borderColor": "color-mix(in srgb, var(--md-sys-color-outline-variant) 62%, transparent)",
33255
- "titleColor": "var(--md-sys-color-on-surface)",
33256
- "subtitleColor": "var(--md-sys-color-on-surface-variant)",
33257
- "iconColor": "var(--md-sys-color-primary)"
33347
+ header: {
33348
+ background: '#33383f',
33349
+ borderColor: '#565d66',
33350
+ titleColor: '#f2f4f7',
33351
+ subtitleColor: '#c4cad2',
33352
+ iconColor: '#d5dae2',
33258
33353
  },
33259
- "body": {
33260
- "background": "var(--md-sys-color-surface)",
33261
- "textColor": "var(--md-sys-color-on-surface)"
33262
- }
33263
- }
33354
+ body: {
33355
+ background: 'transparent',
33356
+ textColor: '#f2f4f7',
33357
+ padding: '12px',
33358
+ },
33359
+ },
33264
33360
  },
33265
33361
  {
33266
- "id": "data-panel",
33267
- "label": {
33268
- "key": "praxis.widgetShell.presets.data-panel.label",
33269
- "text": "Data panel"
33362
+ id: 'data-panel',
33363
+ label: {
33364
+ key: 'praxis.widgetShell.presets.data-panel.label',
33365
+ text: 'Data panel',
33270
33366
  },
33271
- "description": {
33272
- "key": "praxis.widgetShell.presets.data-panel.description",
33273
- "text": "Data panel appearance for existing and new pages."
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.',
33274
33370
  },
33275
- "category": "sectioned",
33276
- "appearance": {
33277
- "card": {
33278
- "background": "var(--md-sys-color-surface)",
33279
- "borderColor": "color-mix(in srgb, var(--md-sys-color-outline-variant) 76%, transparent)",
33280
- "borderRadius": "10px",
33281
- "shadow": "0 5px 16px color-mix(in srgb, var(--md-sys-color-shadow, #000) 7%, transparent)"
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',
33282
33378
  },
33283
- "header": {
33284
- "background": "color-mix(in srgb, var(--md-sys-color-surface-container-low) 64%, transparent)",
33285
- "borderColor": "color-mix(in srgb, var(--md-sys-color-outline-variant) 58%, transparent)",
33286
- "titleColor": "var(--md-sys-color-on-surface)",
33287
- "subtitleColor": "var(--md-sys-color-on-surface-variant)",
33288
- "iconColor": "var(--md-sys-color-primary)"
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)',
33289
33385
  },
33290
- "body": {
33291
- "background": "var(--md-sys-color-surface)",
33292
- "textColor": "var(--md-sys-color-on-surface)",
33293
- "padding": "12px"
33294
- }
33295
- }
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
+ },
33296
33397
  },
33297
33398
  {
33298
- "id": "chart-panel",
33299
- "label": {
33300
- "key": "praxis.widgetShell.presets.chart-panel.label",
33301
- "text": "Chart panel"
33399
+ id: 'chart-panel',
33400
+ label: {
33401
+ key: 'praxis.widgetShell.presets.chart-panel.label',
33402
+ text: 'Chart panel',
33302
33403
  },
33303
- "description": {
33304
- "key": "praxis.widgetShell.presets.chart-panel.description",
33305
- "text": "Chart panel appearance for existing and new pages."
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
+ },
33306
33428
  },
33307
- "category": "sectioned",
33308
- "appearance": {
33309
- "card": {
33310
- "background": "color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%)",
33311
- "borderColor": "color-mix(in srgb, var(--md-sys-color-primary) 22%, var(--md-sys-color-outline-variant) 62%)",
33312
- "borderRadius": "12px",
33313
- "shadow": "0 10px 24px color-mix(in srgb, var(--md-sys-color-shadow, #000) 9%, transparent)"
33314
- },
33315
- "header": {
33316
- "background": "color-mix(in srgb, var(--md-sys-color-primary-container) 22%, transparent)",
33317
- "borderColor": "color-mix(in srgb, var(--md-sys-color-primary) 20%, transparent)",
33318
- "titleColor": "var(--md-sys-color-on-surface)",
33319
- "subtitleColor": "var(--md-sys-color-on-surface-variant)",
33320
- "iconColor": "var(--md-sys-color-primary)"
33321
- },
33322
- "body": {
33323
- "background": "transparent",
33324
- "textColor": "var(--md-sys-color-on-surface)",
33325
- "padding": "12px"
33326
- }
33327
- }
33328
33429
  },
33329
33430
  {
33330
- "id": "metric-panel",
33331
- "label": {
33332
- "key": "praxis.widgetShell.presets.metric-panel.label",
33333
- "text": "Metric panel"
33431
+ id: 'metric-panel',
33432
+ label: {
33433
+ key: 'praxis.widgetShell.presets.metric-panel.label',
33434
+ text: 'Metric panel',
33334
33435
  },
33335
- "description": {
33336
- "key": "praxis.widgetShell.presets.metric-panel.description",
33337
- "text": "Metric panel appearance for existing and new pages."
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.',
33338
33439
  },
33339
- "category": "sectioned",
33340
- "appearance": {
33341
- "card": {
33342
- "background": "color-mix(in srgb, var(--md-sys-color-surface-container-low) 78%, var(--md-sys-color-primary-container) 22%)",
33343
- "borderColor": "color-mix(in srgb, var(--md-sys-color-primary) 24%, transparent)",
33344
- "borderRadius": "10px",
33345
- "shadow": "0 8px 18px color-mix(in srgb, var(--md-sys-color-shadow, #000) 8%, transparent)"
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)',
33346
33447
  },
33347
- "header": {
33348
- "background": "transparent",
33349
- "borderColor": "transparent",
33350
- "titleColor": "var(--md-sys-color-on-surface)",
33351
- "subtitleColor": "var(--md-sys-color-on-surface-variant)",
33352
- "iconColor": "var(--md-sys-color-primary)"
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)',
33353
33454
  },
33354
- "body": {
33355
- "background": "transparent",
33356
- "textColor": "var(--md-sys-color-on-surface)",
33357
- "padding": "10px 12px"
33358
- }
33359
- }
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
+ },
33360
33466
  },
33361
33467
  {
33362
- "id": "executive-card",
33363
- "label": {
33364
- "key": "praxis.widgetShell.presets.executive-card.label",
33365
- "text": "Executive card"
33468
+ id: 'executive-card',
33469
+ label: {
33470
+ key: 'praxis.widgetShell.presets.executive-card.label',
33471
+ text: 'Executive card',
33366
33472
  },
33367
- "description": {
33368
- "key": "praxis.widgetShell.presets.executive-card.description",
33369
- "text": "Executive card appearance for existing and new pages."
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.',
33370
33476
  },
33371
- "category": "sectioned",
33372
- "appearance": {
33373
- "card": {
33374
- "background": "color-mix(in srgb, var(--md-sys-color-surface) 88%, var(--md-sys-color-surface-container-high) 12%)",
33375
- "borderColor": "color-mix(in srgb, var(--md-sys-color-primary) 28%, var(--md-sys-color-outline-variant) 50%)",
33376
- "borderRadius": "10px",
33377
- "shadow": "0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 13%, transparent)"
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)',
33378
33484
  },
33379
- "header": {
33380
- "background": "color-mix(in srgb, var(--md-sys-color-primary-container) 18%, transparent)",
33381
- "borderColor": "color-mix(in srgb, var(--md-sys-color-primary) 22%, transparent)",
33382
- "titleColor": "var(--md-sys-color-on-surface)",
33383
- "subtitleColor": "var(--md-sys-color-on-surface-variant)",
33384
- "iconColor": "var(--md-sys-color-primary)"
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)',
33385
33491
  },
33386
- "body": {
33387
- "background": "transparent",
33388
- "textColor": "var(--md-sys-color-on-surface)",
33389
- "padding": "14px"
33390
- }
33391
- }
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
+ },
33392
33503
  },
33393
33504
  {
33394
- "id": "filter-bar",
33395
- "label": {
33396
- "key": "praxis.widgetShell.presets.filter-bar.label",
33397
- "text": "Filter bar"
33505
+ id: 'filter-bar',
33506
+ label: {
33507
+ key: 'praxis.widgetShell.presets.filter-bar.label',
33508
+ text: 'Filter bar',
33398
33509
  },
33399
- "description": {
33400
- "key": "praxis.widgetShell.presets.filter-bar.description",
33401
- "text": "Filter bar appearance for existing and new pages."
33510
+ description: {
33511
+ key: 'praxis.widgetShell.presets.filter-bar.description',
33512
+ text: 'A capsule for summaries or compact filters; not intended for tall panels.',
33402
33513
  },
33403
- "category": "sectioned",
33404
- "appearance": {
33405
- "card": {
33406
- "background": "color-mix(in srgb, var(--md-sys-color-surface-container-low) 74%, var(--md-sys-color-secondary-container) 26%)",
33407
- "borderColor": "color-mix(in srgb, var(--md-sys-color-secondary) 24%, transparent)",
33408
- "borderRadius": "999px",
33409
- "shadow": "0 6px 18px color-mix(in srgb, var(--md-sys-color-shadow, #000) 7%, transparent)"
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)',
33410
33521
  },
33411
- "header": {
33412
- "background": "transparent",
33413
- "borderColor": "transparent",
33414
- "titleColor": "var(--md-sys-color-on-surface)",
33415
- "subtitleColor": "var(--md-sys-color-on-surface-variant)",
33416
- "iconColor": "var(--md-sys-color-secondary)"
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)',
33417
33528
  },
33418
- "body": {
33419
- "background": "transparent",
33420
- "textColor": "var(--md-sys-color-on-surface)",
33421
- "padding": "10px 14px"
33422
- }
33423
- }
33529
+ body: {
33530
+ background: 'transparent',
33531
+ textColor: 'var(--md-sys-color-on-surface)',
33532
+ padding: '10px 14px',
33533
+ },
33534
+ },
33424
33535
  },
33425
33536
  ];
33426
33537
  /** Public ID lookup derived from the canonical catalog; no separate preset definitions. */
@@ -35204,9 +35315,16 @@ class WidgetShellComponent {
35204
35315
  [class.pdx-shell--scroll-recovery]="scrollRecovery() && !collapsed && !expanded && !fullscreen"
35205
35316
  [style.--pdx-shell-card-bg]="appearance?.card?.background || null"
35206
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"
35207
35320
  [style.--pdx-shell-card-radius]="appearance?.card?.borderRadius || null"
35208
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"
35209
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"
35210
35328
  [style.--pdx-shell-header-border]="
35211
35329
  appearance?.header?.borderColor || null
35212
35330
  "
@@ -35400,7 +35518,7 @@ class WidgetShellComponent {
35400
35518
  @if (expanded || fullscreen) {
35401
35519
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
35402
35520
  }
35403
- `, 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 });
35404
35522
  }
35405
35523
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: WidgetShellComponent, decorators: [{
35406
35524
  type: Component,
@@ -35442,9 +35560,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35442
35560
  [class.pdx-shell--scroll-recovery]="scrollRecovery() && !collapsed && !expanded && !fullscreen"
35443
35561
  [style.--pdx-shell-card-bg]="appearance?.card?.background || null"
35444
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"
35445
35565
  [style.--pdx-shell-card-radius]="appearance?.card?.borderRadius || null"
35446
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"
35447
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"
35448
35573
  [style.--pdx-shell-header-border]="
35449
35574
  appearance?.header?.borderColor || null
35450
35575
  "
@@ -35638,7 +35763,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
35638
35763
  @if (expanded || fullscreen) {
35639
35764
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
35640
35765
  }
35641
- `, 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"] }]
35642
35767
  }], ctorParameters: () => [], propDecorators: { hostCollapsed: [{
35643
35768
  type: HostBinding,
35644
35769
  args: ['class.pdx-widget-shell-collapsed']
@@ -36001,6 +36126,161 @@ const BUILTIN_PAGE_THEME_PRESETS = {
36001
36126
  },
36002
36127
  },
36003
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
+ }
36004
36284
 
36005
36285
  class WidgetPageCompositionFactory {
36006
36286
  create(page) {
@@ -40353,7 +40633,7 @@ const DYNAMIC_WIDGET_PAGE_I18N_CONFIG = {
40353
40633
  'size.presetLabelSingle': '{{fraction}} da grade: 1 coluna',
40354
40634
  'size.presetHelp': 'Fração da grade · número de colunas',
40355
40635
  'size.undo': 'Desfazer último redimensionamento',
40356
- '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.',
40357
40637
  'size.undoBlocked': 'O layout ou seus limites mudaram depois. O ajuste anterior não pode ser restaurado com segurança.',
40358
40638
  'size.undoDone': 'Último redimensionamento desfeito, incluindo os vizinhos afetados.',
40359
40639
  'size.width': 'Largura',
@@ -40515,7 +40795,7 @@ const DYNAMIC_WIDGET_PAGE_I18N_CONFIG = {
40515
40795
  'size.presetLabelSingle': '{{fraction}} of the grid: 1 column',
40516
40796
  'size.presetHelp': 'Grid fraction · number of columns',
40517
40797
  'size.undo': 'Undo last resize',
40518
- '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.',
40519
40799
  'size.undoBlocked': 'The layout or its limits changed afterwards. The previous size cannot be safely restored.',
40520
40800
  'size.undoDone': 'Last resize undone, including affected neighbors.',
40521
40801
  'size.width': 'Width',
@@ -44196,7 +44476,7 @@ class DynamicWidgetPageComponent {
44196
44476
  content: { component: WidgetSettingsEditorComponent, inputs: () => {
44197
44477
  const page = this.ensurePageDefinition();
44198
44478
  const widget = page.widgets.find(item => item.key === key);
44199
- const uiShell = page.context?.ui?.shell || {};
44479
+ const uiShell = this.mergedContext['ui']?.shell || {};
44200
44480
  this.closeSizeEditor(false);
44201
44481
  this.prepareSizeEditor(key);
44202
44482
  this.widgetSettingsKey = key;
@@ -44735,9 +45015,11 @@ class DynamicWidgetPageComponent {
44735
45015
  return;
44736
45016
  // Layout authoring must not capture runtime inputs such as loaded table rows.
44737
45017
  const page = this.clonePageDefinition(this.authoredPageDefinition ?? this.ensurePageDefinition());
44738
- const uiShell = page.context?.ui?.shell || {};
45018
+ const uiShell = this.mergedContext['ui']?.shell || {};
44739
45019
  const session = this.createSettingsSession();
44740
45020
  const owner = session.get(DestroyRef);
45021
+ const appliedValues = new Subject();
45022
+ owner.onDestroy(() => appliedValues.complete());
44741
45023
  const ref = this.settingsPanel.open({
44742
45024
  owner,
44743
45025
  id: 'dynamic-page-settings',
@@ -44746,6 +45028,7 @@ class DynamicWidgetPageComponent {
44746
45028
  component: editor,
44747
45029
  inputs: {
44748
45030
  page,
45031
+ appliedValues$: appliedValues.asObservable(),
44749
45032
  layout: page.layout || null,
44750
45033
  presets: uiShell?.presets || null,
44751
45034
  pagePreset: uiShell?.preset || null,
@@ -44755,7 +45038,16 @@ class DynamicWidgetPageComponent {
44755
45038
  },
44756
45039
  },
44757
45040
  });
44758
- 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
+ });
44759
45051
  ref.saved$.pipe(takeUntilDestroyed(owner)).subscribe((result) => this.applyPageLayout(result, true));
44760
45052
  ref.closed$?.pipe(take(1), takeUntilDestroyed(owner)).subscribe(() => this.releaseSettingsSession(session));
44761
45053
  }
@@ -44975,7 +45267,7 @@ class DynamicWidgetPageComponent {
44975
45267
  ? BUILTIN_PAGE_THEME_PRESETS[themePresetId]
44976
45268
  : undefined;
44977
45269
  const layoutPreset = pageDefinition
44978
- ? this.resolveLayoutPresetDefinition(pageDefinition)
45270
+ ? resolveWidgetPageLayoutPreset(pageDefinition)
44979
45271
  : undefined;
44980
45272
  const merged = {
44981
45273
  ...baseContext,
@@ -45209,7 +45501,7 @@ class DynamicWidgetPageComponent {
45209
45501
  return input;
45210
45502
  }
45211
45503
  resolvePagePresets(page) {
45212
- const preset = this.resolveLayoutPresetDefinition(page);
45504
+ const preset = resolveWidgetPageLayoutPreset(page);
45213
45505
  const themePresetId = page.themePreset || preset?.defaultThemePreset;
45214
45506
  const mergedLayout = this.mergeLayout(preset?.defaultLayout, page.layout);
45215
45507
  const grouping = (page.grouping && page.grouping.length
@@ -45222,16 +45514,6 @@ class DynamicWidgetPageComponent {
45222
45514
  themePreset: themePresetId,
45223
45515
  };
45224
45516
  }
45225
- resolveLayoutPresetDefinition(page) {
45226
- const layoutPresetId = page.layoutPreset?.trim();
45227
- if (layoutPresetId && BUILTIN_PAGE_LAYOUT_PRESETS[layoutPresetId]) {
45228
- return BUILTIN_PAGE_LAYOUT_PRESETS[layoutPresetId];
45229
- }
45230
- const presetFamily = typeof page.layoutPresetOptions?.['presetFamily'] === 'string'
45231
- ? page.layoutPresetOptions['presetFamily'].trim()
45232
- : '';
45233
- return presetFamily ? BUILTIN_PAGE_LAYOUT_PRESETS[presetFamily] : undefined;
45234
- }
45235
45517
  mergeLayout(presetLayout, pageLayout) {
45236
45518
  if (!presetLayout && !pageLayout)
45237
45519
  return undefined;
@@ -47317,7 +47599,7 @@ class DynamicWidgetPageComponent {
47317
47599
  }
47318
47600
  groupGridColumn(group) {
47319
47601
  if (group.kind === 'rail' && this.pageColumnCount > 1) {
47320
- return `${this.pageColumnCount} / span 1`;
47602
+ return `${group.side === 'left' ? 1 : this.pageColumnCount} / span 1`;
47321
47603
  }
47322
47604
  return '1 / -1';
47323
47605
  }
@@ -47501,7 +47783,7 @@ class DynamicWidgetPageComponent {
47501
47783
  */
47502
47784
  stripDerivedPresetDefaults(page) {
47503
47785
  const canonical = this.clonePageDefinition(page);
47504
- const preset = this.resolveLayoutPresetDefinition(canonical);
47786
+ const preset = resolveWidgetPageLayoutPreset(canonical);
47505
47787
  if (!preset)
47506
47788
  return canonical;
47507
47789
  const layoutDelta = this.jsonObjectDelta(canonical.layout, preset.defaultLayout);
@@ -52596,4 +52878,4 @@ function provideHookWhitelist(allowed) {
52596
52878
  * Generated bundle index. Do not edit.
52597
52879
  */
52598
52880
 
52599
- 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, 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 };