@praxisui/core 8.0.0-beta.104 → 8.0.0-beta.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, InjectionToken, Injectable, inject, Inject, Optional, makeEnvironmentProviders, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, APP_INITIALIZER, ErrorHandler, EventEmitter, Output, Input, ChangeDetectionStrategy, Directive, SecurityContext, ViewContainerRef, inputBinding, ContentChild, HostBinding, HostListener, ViewChild } from '@angular/core';
2
+ import { Component, InjectionToken, Injectable, inject, Inject, Optional, makeEnvironmentProviders, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, APP_INITIALIZER, ErrorHandler, EventEmitter, Output, Input, ChangeDetectionStrategy, Directive, SecurityContext, ViewContainerRef, SimpleChange, ContentChild, HostBinding, HostListener, ViewChildren, ViewChild } from '@angular/core';
3
3
  import * as i1 from '@angular/common/http';
4
4
  import { HttpHeaders, HttpClient, HttpParams, HttpResponse, HttpContextToken, HTTP_INTERCEPTORS, withInterceptors } from '@angular/common/http';
5
5
  import { of, defer, throwError, from, EMPTY, BehaviorSubject, firstValueFrom, Subject, map as map$1, switchMap as switchMap$1 } from 'rxjs';
@@ -3085,6 +3085,7 @@ class GenericCrudService {
3085
3085
  endpoints = {}; // Stores user-defined custom endpoints
3086
3086
  apiUrlConfig;
3087
3087
  currentEndpointKey = ApiEndpoint.Default;
3088
+ currentApiUrlEntry = null;
3088
3089
  resourcePath;
3089
3090
  // Nova propriedade para armazenar a URL do schema
3090
3091
  _schemaUrl = null;
@@ -3185,19 +3186,22 @@ class GenericCrudService {
3185
3186
  if (this.configured &&
3186
3187
  this.apiUrl === nextApiUrl &&
3187
3188
  this.baseApiUrl === nextBaseApiUrl &&
3188
- this.currentEndpointKey === nextEndpointKey) {
3189
+ this.currentEndpointKey === nextEndpointKey &&
3190
+ this.currentApiUrlEntry === (configureOptions.apiUrlEntry ?? null)) {
3189
3191
  // No-op; already configured with same values
3190
3192
  // console.debug('[CRUD:Service] configure (no-op)', { resourcePath, baseApiUrl: nextBaseApiUrl });
3191
3193
  return;
3192
3194
  }
3193
3195
  // Apply new configuration
3194
3196
  this.currentEndpointKey = nextEndpointKey;
3197
+ this.currentApiUrlEntry = configureOptions.apiUrlEntry ?? null;
3195
3198
  this.baseApiUrl = nextBaseApiUrl;
3196
3199
  this.resourcePath = resource;
3197
3200
  this.apiUrl = nextApiUrl;
3198
3201
  this.configured = true;
3199
3202
  this._filterSchemaLoaded = false;
3200
3203
  this._rangeFilterFieldHints.clear();
3204
+ this._lastSchemaInfo = {};
3201
3205
  this._lastResourceMeta = {};
3202
3206
  this._lastResourceCapabilityDigest = null;
3203
3207
  console.debug('[CRUD:Service] configure', {
@@ -4280,6 +4284,10 @@ class GenericCrudService {
4280
4284
  }
4281
4285
  resolveEndpointEntry(key) {
4282
4286
  const cfgKey = key ?? this.currentEndpointKey;
4287
+ if (this.currentApiUrlEntry &&
4288
+ (!key || cfgKey === this.currentEndpointKey)) {
4289
+ return this.currentApiUrlEntry;
4290
+ }
4283
4291
  return this.apiUrlConfig[cfgKey] || this.apiUrlConfig['default'];
4284
4292
  }
4285
4293
  /**
@@ -6118,6 +6126,8 @@ class SurfaceBindingRuntimeService {
6118
6126
  if (!targetPath)
6119
6127
  continue;
6120
6128
  const value = this.resolveBindingValue(binding, context);
6129
+ if (value === undefined && binding.omitIfUndefined)
6130
+ continue;
6121
6131
  resolvedWidget = this.setValueAtPath(resolvedWidget, targetPath, value);
6122
6132
  }
6123
6133
  return resolvedWidget;
@@ -6130,6 +6140,8 @@ class SurfaceBindingRuntimeService {
6130
6140
  if (!rawTargetPath)
6131
6141
  continue;
6132
6142
  const value = this.resolveBindingValue(binding, context);
6143
+ if (value === undefined && binding.omitIfUndefined)
6144
+ continue;
6133
6145
  if (rawTargetPath.startsWith('widget.')) {
6134
6146
  resolvedPayload = {
6135
6147
  ...resolvedPayload,
@@ -6863,8 +6875,26 @@ class GlobalActionService {
6863
6875
  }
6864
6876
  const resolvedPayload = this.surfaceBindingRuntime.resolveSurfacePayload(surfacePayload, context, surfacePayload.context);
6865
6877
  const data = await this.surface.open(resolvedPayload, context);
6878
+ this.bindSurfaceResultAction(data, resolvedPayload, context);
6866
6879
  return { success: true, data };
6867
6880
  });
6881
+ this.register('surface.close', async (payload, context) => {
6882
+ const runtime = this.resolveSurfaceRuntime(context);
6883
+ if (typeof runtime?.close !== 'function') {
6884
+ return { success: false, error: 'Surface runtime not available' };
6885
+ }
6886
+ runtime.close(this.toSurfaceResult(payload, 'close'));
6887
+ return { success: true };
6888
+ });
6889
+ this.register('surface.result', async (payload, context) => {
6890
+ const runtime = this.resolveSurfaceRuntime(context);
6891
+ if (typeof runtime?.emitResult !== 'function') {
6892
+ return { success: false, error: 'Surface result runtime not available' };
6893
+ }
6894
+ runtime.emitResult(this.toSurfaceResult(payload, 'result'));
6895
+ return { success: true };
6896
+ });
6897
+ this.register('dynamicPage.composition.dispatch', async (payload, context) => this.handleCompositionDispatch(payload, context));
6868
6898
  this.register('toast.success', async (payload) => {
6869
6899
  const message = payload?.message || payload;
6870
6900
  if (!message)
@@ -6939,6 +6969,46 @@ class GlobalActionService {
6939
6969
  return { success: false, error: err?.message || String(err) };
6940
6970
  }
6941
6971
  }
6972
+ async handleCompositionDispatch(payload, context) {
6973
+ const dispatch = context?.runtime?.composition?.dispatch;
6974
+ if (typeof dispatch !== 'function') {
6975
+ return { success: false, error: 'Composition runtime not available' };
6976
+ }
6977
+ const source = payload?.source;
6978
+ if (!this.isCompositionEndpointRef(source)) {
6979
+ return { success: false, error: 'dynamicPage.composition.dispatch requires source endpoint' };
6980
+ }
6981
+ const eventPayload = payload && Object.prototype.hasOwnProperty.call(payload, 'payload')
6982
+ ? payload.payload
6983
+ : context?.payload;
6984
+ await dispatch({
6985
+ source,
6986
+ payload: eventPayload,
6987
+ ...(typeof payload?.occurredAt === 'string' ? { occurredAt: payload.occurredAt } : {}),
6988
+ });
6989
+ return {
6990
+ success: true,
6991
+ data: {
6992
+ source,
6993
+ payload: eventPayload,
6994
+ },
6995
+ };
6996
+ }
6997
+ isCompositionEndpointRef(value) {
6998
+ if (!value || typeof value !== 'object') {
6999
+ return false;
7000
+ }
7001
+ if (value.kind === 'component-port') {
7002
+ return !!value.ref?.widget && !!value.ref?.port && !!value.ref?.direction;
7003
+ }
7004
+ if (value.kind === 'state') {
7005
+ return !!value.ref?.path;
7006
+ }
7007
+ if (value.kind === 'global-action') {
7008
+ return !!value.ref?.actionId;
7009
+ }
7010
+ return false;
7011
+ }
6942
7012
  async handleNavigationOpenRoute(payload) {
6943
7013
  const url = this.buildNavigationUrl(payload);
6944
7014
  if (!url)
@@ -7077,6 +7147,51 @@ class GlobalActionService {
7077
7147
  return '';
7078
7148
  return `#${encodeURIComponent(raw.replace(/^#/, ''))}`;
7079
7149
  }
7150
+ resolveSurfaceRuntime(context) {
7151
+ return (context?.runtime?.state?.surfaceRuntime
7152
+ || context?.payload?.surfaceContext?.surfaceRuntime
7153
+ || context?.pageContext?.surfaceRuntime
7154
+ || null);
7155
+ }
7156
+ bindSurfaceResultAction(ref, payload, context) {
7157
+ const onResult = payload.onResult;
7158
+ if (!onResult || typeof ref?.result$?.subscribe !== 'function') {
7159
+ return;
7160
+ }
7161
+ ref.result$.subscribe((result) => {
7162
+ void this.executeRef(onResult, {
7163
+ ...context,
7164
+ payload: result,
7165
+ runtime: {
7166
+ ...(context?.runtime || {}),
7167
+ value: result,
7168
+ state: {
7169
+ ...(context?.runtime?.state || {}),
7170
+ surfaceResult: result,
7171
+ },
7172
+ },
7173
+ meta: {
7174
+ ...(context?.meta || {}),
7175
+ origin: 'surface.result',
7176
+ surfaceTitle: payload.title,
7177
+ surfacePresentation: payload.presentation,
7178
+ },
7179
+ });
7180
+ });
7181
+ }
7182
+ toSurfaceResult(payload, fallbackType) {
7183
+ if (payload && typeof payload === 'object' && ('type' in payload || 'data' in payload)) {
7184
+ return {
7185
+ type: String(payload.type || fallbackType),
7186
+ ...(Object.prototype.hasOwnProperty.call(payload, 'data')
7187
+ ? { data: payload.data }
7188
+ : {}),
7189
+ };
7190
+ }
7191
+ return payload === undefined
7192
+ ? { type: fallbackType }
7193
+ : { type: fallbackType, data: payload };
7194
+ }
7080
7195
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: GlobalActionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7081
7196
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: GlobalActionService, providedIn: 'root' });
7082
7197
  }
@@ -8596,6 +8711,15 @@ function minWordsValidator(minWords, message) {
8596
8711
  function requiredCheckedValidator(message) {
8597
8712
  return withMessage(Validators.requiredTrue, 'requiredTrue', message);
8598
8713
  }
8714
+ function requiredPresenceValidator(message) {
8715
+ return (control) => {
8716
+ const value = control.value;
8717
+ if (value === null || value === undefined || value === '') {
8718
+ return toMessageError('required', { required: true }, message);
8719
+ }
8720
+ return null;
8721
+ };
8722
+ }
8599
8723
  function fileTypeValidator(allowed, message) {
8600
8724
  const normalized = (allowed || []).map((s) => String(s).toLowerCase());
8601
8725
  const hasExt = (s) => s.startsWith('.');
@@ -8919,8 +9043,11 @@ function buildAngularValidators(field) {
8919
9043
  const v = [];
8920
9044
  let av = [];
8921
9045
  // Required / requiredChecked
8922
- if (field.required)
8923
- v.push(withMessage(Validators.required, 'required', field.requiredMessage));
9046
+ if (field.required) {
9047
+ v.push(isBooleanRequiredField(field)
9048
+ ? requiredPresenceValidator(field.requiredMessage)
9049
+ : withMessage(Validators.required, 'required', field.requiredMessage));
9050
+ }
8924
9051
  if (field.requiredChecked)
8925
9052
  v.push(requiredCheckedValidator());
8926
9053
  // Length
@@ -8973,6 +9100,11 @@ function buildAngularValidators(field) {
8973
9100
  }
8974
9101
  return { validators: v, asyncValidators: av };
8975
9102
  }
9103
+ function isBooleanRequiredField(field) {
9104
+ const controlType = String(field.controlType ?? '').toLowerCase();
9105
+ const type = String(field.type ?? field.dataType ?? '').toLowerCase();
9106
+ return type === 'boolean' || controlType === 'checkbox' || controlType === 'toggle';
9107
+ }
8976
9108
  function buildValidatorsFromValidatorOptions(opts = {}, jsonLogic = DEFAULT_JSON_LOGIC$3) {
8977
9109
  const v = [];
8978
9110
  let av = [];
@@ -9661,15 +9793,98 @@ class DynamicFormService {
9661
9793
  return null;
9662
9794
  });
9663
9795
  }
9796
+ else if (this.isPhoneField(meta)) {
9797
+ const pattern = meta.validators?.pattern ?? meta.pattern;
9798
+ const patternMessage = meta.validators?.patternMessage ?? meta.patternMessage;
9799
+ if (pattern) {
9800
+ v.push(this.buildNormalizedPhonePatternValidator(pattern, patternMessage));
9801
+ }
9802
+ }
9664
9803
  return v;
9665
9804
  }
9666
9805
  /**
9667
9806
  * Indica se o campo deve ser tratado como seleção múltipla (valor padrão []).
9668
9807
  */
9669
9808
  isMultipleField(meta) {
9670
- return (meta.controlType === FieldControlType.CHECKBOX ||
9671
- meta.controlType === FieldControlType.MULTI_SELECT ||
9672
- meta.multiple === true);
9809
+ return (meta.controlType === FieldControlType.MULTI_SELECT ||
9810
+ meta.multiple === true ||
9811
+ (meta.controlType === FieldControlType.CHECKBOX &&
9812
+ this.hasCheckboxOptions(meta)));
9813
+ }
9814
+ isBooleanField(meta) {
9815
+ const controlType = String(meta?.controlType ?? '').toLowerCase();
9816
+ const type = String(meta?.type ?? meta?.dataType ?? '').toLowerCase();
9817
+ if (controlType === 'checkbox' && (this.isMultipleField(meta) || this.hasCheckboxOptions(meta))) {
9818
+ return false;
9819
+ }
9820
+ return type === 'boolean' || controlType === 'checkbox' || controlType === 'toggle';
9821
+ }
9822
+ hasCheckboxOptions(meta) {
9823
+ return (Array.isArray(meta.checkboxOptions) ||
9824
+ Array.isArray(meta.options));
9825
+ }
9826
+ isPhoneField(meta) {
9827
+ const controlType = String(meta?.controlType ?? '').toLowerCase();
9828
+ return controlType === 'phone' || controlType === 'phoneinput' || controlType === 'inlinephone';
9829
+ }
9830
+ buildNormalizedPhonePatternValidator(pattern, message) {
9831
+ const { regex, requiredPattern } = this.buildAngularCompatiblePattern(pattern);
9832
+ return withMessage((control) => {
9833
+ const value = control.value;
9834
+ if (value === null || value === undefined || value === '') {
9835
+ return null;
9836
+ }
9837
+ const normalized = String(value).replace(/[()\s-]/g, '');
9838
+ regex.lastIndex = 0;
9839
+ return regex.test(normalized)
9840
+ ? null
9841
+ : {
9842
+ pattern: {
9843
+ requiredPattern,
9844
+ actualValue: value,
9845
+ normalizedValue: normalized,
9846
+ },
9847
+ };
9848
+ }, 'pattern', message);
9849
+ }
9850
+ buildAngularCompatiblePattern(pattern) {
9851
+ if (typeof pattern !== 'string') {
9852
+ return { regex: pattern, requiredPattern: pattern.toString() };
9853
+ }
9854
+ let regexStr = '';
9855
+ if (pattern.charAt(0) !== '^') {
9856
+ regexStr += '^';
9857
+ }
9858
+ regexStr += pattern;
9859
+ if (pattern.charAt(pattern.length - 1) !== '$') {
9860
+ regexStr += '$';
9861
+ }
9862
+ return { regex: new RegExp(regexStr), requiredPattern: regexStr };
9863
+ }
9864
+ buildFromMetadata(meta) {
9865
+ const options = { ...(meta.validators ?? {}) };
9866
+ const required = meta.validators?.required === true ||
9867
+ meta.required === true;
9868
+ if (meta.required === true && options.required === undefined) {
9869
+ options.required = true;
9870
+ }
9871
+ if (meta.pattern && options.pattern === undefined) {
9872
+ options.pattern = meta.pattern;
9873
+ }
9874
+ if (meta.patternMessage && options.patternMessage === undefined) {
9875
+ options.patternMessage = meta.patternMessage;
9876
+ }
9877
+ if (this.isBooleanField(meta) && required) {
9878
+ options.required = false;
9879
+ }
9880
+ if (this.isPhoneField(meta) && options.pattern) {
9881
+ options.pattern = undefined;
9882
+ }
9883
+ const built = this.buildFromValidatorOptions(options);
9884
+ if (this.isBooleanField(meta) && required) {
9885
+ built.validators.unshift(requiredPresenceValidator(meta.validators?.requiredMessage ?? meta.requiredMessage));
9886
+ }
9887
+ return built;
9673
9888
  }
9674
9889
  isArrayMetadata(meta) {
9675
9890
  return (meta.controlType === FieldControlType.ARRAY_INPUT ||
@@ -9890,7 +10105,7 @@ class DynamicFormService {
9890
10105
  * - Valor inicial: [] para campos múltiplos quando ausente.
9891
10106
  */
9892
10107
  createControlFromMetadata(meta) {
9893
- const { validators, asyncValidators } = this.buildFromValidatorOptions(meta.validators);
10108
+ const { validators, asyncValidators } = this.buildFromMetadata(meta);
9894
10109
  const updateOn = this.getUpdateOnFromMetadata(meta);
9895
10110
  const initialValue = meta.defaultValue ?? null;
9896
10111
  const value = this.isMultipleField(meta) && initialValue == null ? [] : initialValue;
@@ -9971,7 +10186,7 @@ class DynamicFormService {
9971
10186
  control.updateValueAndValidity({ emitEvent: opts.emitEvent ?? false });
9972
10187
  return;
9973
10188
  }
9974
- const { validators, asyncValidators } = this.buildFromValidatorOptions(meta.validators);
10189
+ const { validators, asyncValidators } = this.buildFromMetadata(meta);
9975
10190
  control.setValidators(validators);
9976
10191
  control.setAsyncValidators(asyncValidators);
9977
10192
  control.addValidators(this.getUiSpecificValidators(meta));
@@ -12025,9 +12240,7 @@ class ResourceSurfaceOpenAdapterService {
12025
12240
  const resolvedSubmitUrl = this.isWritableFormSurface(surface.kind)
12026
12241
  ? this.discovery.resolveHref(surface.path, discoveryOptions)
12027
12242
  : null;
12028
- const resolvedReadUrl = this.isReadableItemSurface(surface)
12029
- ? this.discovery.resolveHref(surface.path, discoveryOptions)
12030
- : null;
12243
+ const resolvedReadUrl = this.resolveItemHydrationReadUrl(surface, resourcePath, discoveryOptions);
12031
12244
  const basePayload = this.buildBasePayload(surface);
12032
12245
  const payload = {
12033
12246
  ...basePayload,
@@ -12078,10 +12291,10 @@ class ResourceSurfaceOpenAdapterService {
12078
12291
  apiEndpointKey: options.endpointKey ?? null,
12079
12292
  apiUrlEntry: options.apiUrlEntry ?? resolvedApiEntry,
12080
12293
  };
12081
- if (surface.scope === 'ITEM' && this.isReadableFormSurface(surface.kind)) {
12294
+ if (surface.scope === 'ITEM' && resolvedReadUrl) {
12082
12295
  payload.widget.inputs['customEndpoints'] = {
12083
12296
  ...(payload.widget.inputs['customEndpoints'] || {}),
12084
- getById: this.discovery.resolveHref(surface.path, discoveryOptions),
12297
+ getById: resolvedReadUrl,
12085
12298
  };
12086
12299
  payload.widget.bindingOrder = this.withInputBefore(payload.widget.bindingOrder, 'customEndpoints', 'resourceId');
12087
12300
  }
@@ -12156,6 +12369,24 @@ class ResourceSurfaceOpenAdapterService {
12156
12369
  surface.method.toUpperCase() === 'GET' &&
12157
12370
  (surface.kind === 'VIEW' || surface.kind === 'READ_PROJECTION'));
12158
12371
  }
12372
+ isItemFormHydrationSurface(surface) {
12373
+ return surface.scope === 'ITEM'
12374
+ && (this.isReadableFormSurface(surface.kind) || this.isWritableFormSurface(surface.kind));
12375
+ }
12376
+ resolveItemHydrationReadUrl(surface, resourcePath, discoveryOptions) {
12377
+ if (!this.isItemFormHydrationSurface(surface)) {
12378
+ return null;
12379
+ }
12380
+ if (this.isReadableItemSurface(surface)) {
12381
+ return this.discovery.resolveHref(surface.path, discoveryOptions);
12382
+ }
12383
+ return this.discovery.resolveHref(this.buildCanonicalItemHref(resourcePath), discoveryOptions);
12384
+ }
12385
+ buildCanonicalItemHref(resourcePath) {
12386
+ const normalizedResourcePath = this.normalizeResourcePath(resourcePath);
12387
+ const itemHref = `${normalizedResourcePath}/{id}`;
12388
+ return normalizedResourcePath.startsWith('api/') ? `/${itemHref}` : itemHref;
12389
+ }
12159
12390
  buildIdBinding(idBindingPath) {
12160
12391
  return {
12161
12392
  from: idBindingPath,
@@ -12284,6 +12515,15 @@ class SurfaceOpenMaterializerService {
12284
12515
  const supported = new Set([
12285
12516
  'formId',
12286
12517
  'componentInstanceId',
12518
+ 'resourcePath',
12519
+ 'resourceId',
12520
+ 'apiEndpointKey',
12521
+ 'apiUrlEntry',
12522
+ 'submitUrl',
12523
+ 'submitMethod',
12524
+ 'responseSchemaUrl',
12525
+ 'customEndpoints',
12526
+ 'configPersistenceStrategy',
12287
12527
  'mode',
12288
12528
  'actions',
12289
12529
  'enableCustomization',
@@ -15112,6 +15352,10 @@ const PRAXIS_GLOBAL_ACTION_CATALOG = [
15112
15352
  description: 'Bindings declarativos aplicados sobre widget.inputs.*. Prefira payload.* para o envelope canônico do evento e runtime.* para estado direto do host.',
15113
15353
  },
15114
15354
  context: { type: 'object', description: 'Contexto explícito adicional exposto ao runtime de bindings.' },
15355
+ onResult: {
15356
+ type: 'object',
15357
+ description: 'Ação estruturada executada quando a surface emite um resultado semântico via surface.result.',
15358
+ },
15115
15359
  },
15116
15360
  required: ['presentation', 'widget'],
15117
15361
  example: {
@@ -15132,6 +15376,60 @@ const PRAXIS_GLOBAL_ACTION_CATALOG = [
15132
15376
  },
15133
15377
  },
15134
15378
  },
15379
+ {
15380
+ id: 'surface.close',
15381
+ label: 'Fechar Surface',
15382
+ icon: 'close',
15383
+ description: 'Fecha a surface de runtime atual quando a ação é executada dentro de um host aberto por surface.open.',
15384
+ payloadSchema: {
15385
+ type: 'object',
15386
+ properties: {
15387
+ type: { type: 'string', description: 'Tipo semântico do fechamento.' },
15388
+ data: { type: 'object', description: 'Dados opcionais devolvidos ao host.' },
15389
+ },
15390
+ example: { type: 'done' },
15391
+ },
15392
+ },
15393
+ {
15394
+ id: 'surface.result',
15395
+ label: 'Emitir Resultado de Surface',
15396
+ icon: 'outbox',
15397
+ description: 'Emite um resultado semântico para a surface de runtime atual sem fechar o drawer.',
15398
+ payloadSchema: {
15399
+ type: 'object',
15400
+ properties: {
15401
+ type: { type: 'string', description: 'Tipo semântico do resultado.' },
15402
+ data: { type: 'object', description: 'Dados opcionais do resultado.' },
15403
+ },
15404
+ example: { type: 'selection', data: { id: 42 } },
15405
+ },
15406
+ },
15407
+ {
15408
+ id: 'dynamicPage.composition.dispatch',
15409
+ label: 'Despachar Evento de Composição',
15410
+ icon: 'hub',
15411
+ description: 'Publica um evento no runtime de composição da página atual para que links governados atualizem estado, widgets e projeções derivadas.',
15412
+ payloadSchema: {
15413
+ type: 'object',
15414
+ properties: {
15415
+ source: {
15416
+ type: 'object',
15417
+ description: 'Endpoint canônico que deve ser usado como origem do dispatch.',
15418
+ },
15419
+ payload: {
15420
+ type: 'object',
15421
+ description: 'Payload opcional do evento. Quando omitido, a ação usa o payload do contexto de execução.',
15422
+ },
15423
+ },
15424
+ required: ['source'],
15425
+ example: {
15426
+ source: {
15427
+ kind: 'global-action',
15428
+ ref: { actionId: 'peopleOps.decision.accepted' },
15429
+ },
15430
+ },
15431
+ },
15432
+ },
15135
15433
  {
15136
15434
  id: 'toast.success',
15137
15435
  label: 'Toast Sucesso',
@@ -23293,8 +23591,9 @@ class PraxisHeroBannerComponent {
23293
23591
  appearance = 'card';
23294
23592
  brandText;
23295
23593
  titleAccent;
23594
+ visualSummary;
23296
23595
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisHeroBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23297
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisHeroBannerComponent, isStandalone: true, selector: "praxis-hero-banner", inputs: { instanceId: "instanceId", analyticsId: "analyticsId", ariaLabel: "ariaLabel", title: "title", subtitle: "subtitle", description: "description", imageUrl: "imageUrl", imageAlt: "imageAlt", badges: "badges", metaItems: "metaItems", variant: "variant", appearance: "appearance", brandText: "brandText", titleAccent: "titleAccent" }, host: { properties: { "attr.data-instance-id": "instanceId || null", "attr.data-analytics-id": "analyticsId || null", "attr.aria-label": "ariaLabel || null", "attr.role": "ariaLabel ? \"region\" : null", "attr.data-variant": "variant" }, classAttribute: "praxis-hero-banner" }, ngImport: i0, template: `
23596
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisHeroBannerComponent, isStandalone: true, selector: "praxis-hero-banner", inputs: { instanceId: "instanceId", analyticsId: "analyticsId", ariaLabel: "ariaLabel", title: "title", subtitle: "subtitle", description: "description", imageUrl: "imageUrl", imageAlt: "imageAlt", badges: "badges", metaItems: "metaItems", variant: "variant", appearance: "appearance", brandText: "brandText", titleAccent: "titleAccent", visualSummary: "visualSummary" }, host: { properties: { "attr.data-instance-id": "instanceId || null", "attr.data-analytics-id": "analyticsId || null", "attr.aria-label": "ariaLabel || null", "attr.role": "ariaLabel ? \"region\" : null", "attr.data-variant": "variant" }, classAttribute: "praxis-hero-banner" }, ngImport: i0, template: `
23298
23597
  <section
23299
23598
  class="phb-shell"
23300
23599
  [class.phb-event]="variant === 'event'"
@@ -23306,7 +23605,7 @@ class PraxisHeroBannerComponent {
23306
23605
  <p class="phb-brand">{{ brandText }}</p>
23307
23606
  }
23308
23607
 
23309
- @if (badges?.length) {
23608
+ @if (badges.length) {
23310
23609
  <div class="phb-badges">
23311
23610
  @for (badge of badges; track badge) {
23312
23611
  <span
@@ -23331,7 +23630,7 @@ class PraxisHeroBannerComponent {
23331
23630
  <span>{{ title }}</span>
23332
23631
  }
23333
23632
  @if (titleAccent) {
23334
- <span class="phb-title-accent">{{ titleAccent }}</span>
23633
+ <span class="phb-title-accent"> {{ titleAccent }}</span>
23335
23634
  }
23336
23635
  </h2>
23337
23636
  }
@@ -23340,7 +23639,7 @@ class PraxisHeroBannerComponent {
23340
23639
  }
23341
23640
  </div>
23342
23641
 
23343
- @if (metaItems?.length) {
23642
+ @if (metaItems.length) {
23344
23643
  <dl class="phb-meta">
23345
23644
  @for (item of metaItems; track item) {
23346
23645
  <div class="phb-meta-item">
@@ -23356,16 +23655,93 @@ class PraxisHeroBannerComponent {
23356
23655
  <div class="phb-visual">
23357
23656
  <img class="phb-image" [src]="imageUrl" [alt]="imageAlt || title || subtitle || 'Imagem do destaque'" />
23358
23657
  </div>
23658
+ } @else if (visualSummary) {
23659
+ <aside class="phb-visual phb-visual-summary" aria-label="Resumo visual">
23660
+ <div class="phb-summary-header">
23661
+ <div>
23662
+ @if (visualSummary.eyebrow) {
23663
+ <p class="phb-summary-eyebrow">{{ visualSummary.eyebrow }}</p>
23664
+ }
23665
+ @if (visualSummary.title) {
23666
+ <h3>{{ visualSummary.title }}</h3>
23667
+ }
23668
+ </div>
23669
+ @if (visualSummary.status) {
23670
+ <span
23671
+ class="phb-status"
23672
+ [class.phb-tone-success]="visualSummary.statusTone === 'success'"
23673
+ [class.phb-tone-warning]="visualSummary.statusTone === 'warning'"
23674
+ [class.phb-tone-danger]="visualSummary.statusTone === 'danger'"
23675
+ [class.phb-tone-info]="visualSummary.statusTone === 'info'"
23676
+ >
23677
+ {{ visualSummary.status }}
23678
+ </span>
23679
+ }
23680
+ </div>
23681
+
23682
+ @if (visualSummary.items?.length) {
23683
+ <dl class="phb-summary-grid">
23684
+ @for (item of visualSummary.items; track item) {
23685
+ <div
23686
+ class="phb-summary-item"
23687
+ [class.phb-tone-success]="item.tone === 'success'"
23688
+ [class.phb-tone-warning]="item.tone === 'warning'"
23689
+ [class.phb-tone-danger]="item.tone === 'danger'"
23690
+ [class.phb-tone-info]="item.tone === 'info'"
23691
+ >
23692
+ <dt>{{ item.label }}</dt>
23693
+ <dd>{{ item.value }}</dd>
23694
+ </div>
23695
+ }
23696
+ </dl>
23697
+ }
23698
+
23699
+ @if (visualSummary.events?.length) {
23700
+ <div class="phb-summary-events">
23701
+ @for (event of visualSummary.events; track event) {
23702
+ <div
23703
+ class="phb-summary-event"
23704
+ [class.phb-tone-success]="event.tone === 'success'"
23705
+ [class.phb-tone-warning]="event.tone === 'warning'"
23706
+ [class.phb-tone-danger]="event.tone === 'danger'"
23707
+ [class.phb-tone-info]="event.tone === 'info'"
23708
+ >
23709
+ <span>{{ event.label }}</span>
23710
+ @if (event.value) {
23711
+ <strong>{{ event.value }}</strong>
23712
+ }
23713
+ </div>
23714
+ }
23715
+ </div>
23716
+ }
23717
+ </aside>
23359
23718
  } @else {
23360
23719
  <div class="phb-visual phb-visual-fallback" aria-hidden="true">
23361
- <div class="phb-orb phb-orb-a"></div>
23362
- <div class="phb-orb phb-orb-b"></div>
23363
- <div class="phb-grid"></div>
23720
+ <div class="phb-preview">
23721
+ <div class="phb-preview-header"></div>
23722
+ <div class="phb-preview-kpis">
23723
+ <span></span>
23724
+ <span></span>
23725
+ <span></span>
23726
+ </div>
23727
+ <div class="phb-preview-chart">
23728
+ <span style="--bar-height: 42%"></span>
23729
+ <span style="--bar-height: 68%"></span>
23730
+ <span style="--bar-height: 54%"></span>
23731
+ <span style="--bar-height: 82%"></span>
23732
+ <span style="--bar-height: 62%"></span>
23733
+ </div>
23734
+ <div class="phb-preview-list">
23735
+ <span></span>
23736
+ <span></span>
23737
+ <span></span>
23738
+ </div>
23739
+ </div>
23364
23740
  </div>
23365
23741
  }
23366
23742
 
23367
23743
  </section>
23368
- `, isInline: true, styles: [":host{display:block;--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-shell-shadow: 0 24px 60px color-mix(in srgb, var(--md-sys-color-shadow, #000) 10%, transparent);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 14%, transparent), transparent 38%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 92%, var(--md-sys-color-primary-container) 8%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-surface-container) 4%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .24), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 45%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .2), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 18%, var(--md-sys-color-surface-container-lowest) 82%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 48%, color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-secondary-container) 6%) 100% );--phb-brand-color: color-mix(in srgb, var(--md-sys-color-primary) 68%, var(--md-sys-color-on-surface) 32%);--phb-subtitle-color: color-mix(in srgb, var(--md-sys-color-primary) 52%, var(--md-sys-color-on-surface) 48%);--phb-title-color: var(--md-sys-color-on-surface);--phb-description-color: var(--md-sys-color-on-surface-variant);--phb-badge-bg: color-mix(in srgb, var(--md-sys-color-surface-container-high) 78%, transparent);--phb-badge-color: var(--md-sys-color-on-surface);--phb-badge-highlight-bg: color-mix(in srgb, var(--md-sys-color-primary-container) 78%, transparent);--phb-badge-highlight-color: var(--md-sys-color-on-primary-container);--phb-badge-muted-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 82%, transparent);--phb-badge-muted-color: var(--md-sys-color-on-surface-variant);--phb-badge-warning-bg: color-mix(in srgb, var(--md-sys-color-error-container) 74%, transparent);--phb-badge-warning-color: var(--md-sys-color-on-error-container);--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 72%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 48%, transparent);--phb-meta-label-color: var(--md-sys-color-on-surface-variant);--phb-meta-value-color: var(--md-sys-color-on-surface);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 90%, var(--md-sys-color-primary) 10%), color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 24%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 18%, var(--md-sys-color-surface-container-high) 82%), color-mix(in srgb, var(--md-sys-color-primary-container) 18%, var(--md-sys-color-surface-container-low) 82%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 68%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 22%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent)}:host-context(.mdc-theme-dark),:host-context(.theme-dark){--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 84%, transparent);--phb-shell-shadow: 0 22px 54px rgba(0, 0, 0, .28);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent), transparent 40%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 90%, var(--md-sys-color-primary-container) 10%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 84%, var(--md-sys-color-primary-container) 16%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .18), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 22%, var(--md-sys-color-surface-container-low) 78%) 45%, color-mix(in srgb, var(--md-sys-color-surface-container) 90%, var(--md-sys-color-primary-container) 10%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .16), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 20%, var(--md-sys-color-surface-container-low) 80%) 48%, color-mix(in srgb, var(--md-sys-color-surface-container) 92%, var(--md-sys-color-secondary-container) 8%) 100% );--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 70%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 88%, var(--md-sys-color-primary) 12%), color-mix(in srgb, var(--md-sys-color-surface-container) 82%, var(--md-sys-color-primary-container) 18%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 22%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 22%, var(--md-sys-color-surface-container-high) 78%), color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 34%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 26%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 10%, transparent)}.phb-shell{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(240px,.95fr);gap:22px;align-items:stretch;padding:22px;border-radius:28px;overflow:hidden;background:var(--phb-shell-bg);border:1px solid var(--phb-shell-border);box-shadow:var(--phb-shell-shadow)}.phb-event{background:var(--phb-event-bg)}.phb-institutional{background:var(--phb-institutional-bg)}.phb-copy{display:grid;gap:18px;min-width:0}.phb-brand{margin:0;color:var(--phb-brand-color);font-size:.88rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.phb-badges{display:flex;flex-wrap:wrap;gap:8px}.phb-badge{display:inline-flex;align-items:center;min-height:28px;padding:0 12px;border-radius:999px;background:var(--phb-badge-bg);color:var(--phb-badge-color);font-size:.76rem;font-weight:700;letter-spacing:.02em}.phb-badge-highlight{background:var(--phb-badge-highlight-bg);color:var(--phb-badge-highlight-color)}.phb-badge-muted{background:var(--phb-badge-muted-bg);color:var(--phb-badge-muted-color)}.phb-badge-warning{background:var(--phb-badge-warning-bg);color:var(--phb-badge-warning-color)}.phb-text{display:grid;gap:8px}.phb-subtitle{margin:0;color:var(--phb-subtitle-color);font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-title{margin:0;color:var(--phb-title-color);font-size:clamp(1.6rem,2.2vw,2.5rem);line-height:1.08;letter-spacing:-.03em}.phb-title-accent{display:inline;margin-left:.18em;background:linear-gradient(90deg,#4285f4,#6ea8ff 28%,#a142f4 62%,#ea4335);-webkit-background-clip:text;background-clip:text;color:transparent}.phb-description{margin:0;max-width:56ch;color:var(--phb-description-color);font-size:.98rem;line-height:1.65}.phb-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:0}.phb-meta-item{display:grid;gap:4px;padding:12px 14px;border-radius:16px;background:var(--phb-meta-bg);border:1px solid var(--phb-meta-border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.phb-meta-item dt{margin:0;color:var(--phb-meta-label-color);font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-meta-item dd{margin:0;color:var(--phb-meta-value-color);font-size:.92rem;line-height:1.45}.phb-visual{position:relative;min-height:220px;border-radius:22px;overflow:hidden;background:var(--phb-visual-bg)}.phb-image{display:block;width:100%;height:100%;object-fit:cover}.phb-visual-fallback{background:var(--phb-visual-fallback)}.phb-flat{padding:0 0 18px;border:0;border-radius:0;box-shadow:none;background:transparent;grid-template-columns:minmax(0,1.15fr) minmax(220px,.85fr);gap:18px}.phb-flat .phb-brand{color:var(--md-sys-color-primary)}.phb-flat .phb-badges{order:3}.phb-flat .phb-meta{grid-template-columns:1fr;gap:6px}.phb-flat .phb-meta-item{padding:0;border:0;border-radius:0;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.phb-flat .phb-meta-item dt,.phb-flat .phb-meta-item dd{display:inline}.phb-flat .phb-meta-item dt{margin-right:6px}.phb-flat .phb-visual{min-height:190px;border-radius:26px}.phb-orb{position:absolute;border-radius:999px;filter:blur(2px)}.phb-orb-a{inset:24px auto auto 20px;width:86px;height:86px;background:var(--phb-orb-a-bg)}.phb-orb-b{inset:auto 16px 18px auto;width:132px;height:132px;background:var(--phb-orb-b-bg)}.phb-grid{position:absolute;inset:0;background-image:linear-gradient(var(--phb-grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--phb-grid-line) 1px,transparent 1px);background-size:24px 24px;opacity:.5}@media(max-width:900px){.phb-shell{grid-template-columns:1fr;padding:18px}.phb-visual{order:-1;min-height:180px}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
23744
+ `, isInline: true, styles: [":host{display:block;--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-shell-shadow: 0 24px 60px color-mix(in srgb, var(--md-sys-color-shadow, #000) 10%, transparent);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 14%, transparent), transparent 38%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 92%, var(--md-sys-color-primary-container) 8%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-surface-container) 4%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .24), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 45%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .2), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 18%, var(--md-sys-color-surface-container-lowest) 82%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 48%, color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-secondary-container) 6%) 100% );--phb-brand-color: color-mix(in srgb, var(--md-sys-color-primary) 68%, var(--md-sys-color-on-surface) 32%);--phb-subtitle-color: color-mix(in srgb, var(--md-sys-color-primary) 52%, var(--md-sys-color-on-surface) 48%);--phb-title-color: var(--md-sys-color-on-surface);--phb-description-color: var(--md-sys-color-on-surface-variant);--phb-badge-bg: color-mix(in srgb, var(--md-sys-color-surface-container-high) 78%, transparent);--phb-badge-color: var(--md-sys-color-on-surface);--phb-badge-highlight-bg: color-mix(in srgb, var(--md-sys-color-primary-container) 78%, transparent);--phb-badge-highlight-color: var(--md-sys-color-on-primary-container);--phb-badge-muted-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 82%, transparent);--phb-badge-muted-color: var(--md-sys-color-on-surface-variant);--phb-badge-warning-bg: color-mix(in srgb, var(--md-sys-color-error-container) 74%, transparent);--phb-badge-warning-color: var(--md-sys-color-on-error-container);--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 72%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 48%, transparent);--phb-meta-label-color: var(--md-sys-color-on-surface-variant);--phb-meta-value-color: var(--md-sys-color-on-surface);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 90%, var(--md-sys-color-primary) 10%), color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 24%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 18%, var(--md-sys-color-surface-container-high) 82%), color-mix(in srgb, var(--md-sys-color-primary-container) 18%, var(--md-sys-color-surface-container-low) 82%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 68%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 22%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent)}:host-context(.mdc-theme-dark),:host-context(.theme-dark){--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 84%, transparent);--phb-shell-shadow: 0 22px 54px rgba(0, 0, 0, .28);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent), transparent 40%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 90%, var(--md-sys-color-primary-container) 10%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 84%, var(--md-sys-color-primary-container) 16%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .18), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 22%, var(--md-sys-color-surface-container-low) 78%) 45%, color-mix(in srgb, var(--md-sys-color-surface-container) 90%, var(--md-sys-color-primary-container) 10%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .16), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 20%, var(--md-sys-color-surface-container-low) 80%) 48%, color-mix(in srgb, var(--md-sys-color-surface-container) 92%, var(--md-sys-color-secondary-container) 8%) 100% );--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 70%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 88%, var(--md-sys-color-primary) 12%), color-mix(in srgb, var(--md-sys-color-surface-container) 82%, var(--md-sys-color-primary-container) 18%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 22%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 22%, var(--md-sys-color-surface-container-high) 78%), color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 34%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 26%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 10%, transparent)}.phb-shell{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(240px,.95fr);gap:22px;align-items:stretch;padding:22px;border-radius:28px;overflow:hidden;background:var(--phb-shell-bg);border:1px solid var(--phb-shell-border);box-shadow:var(--phb-shell-shadow)}.phb-event{background:var(--phb-event-bg)}.phb-institutional{background:var(--phb-institutional-bg)}.phb-copy{display:grid;gap:14px;min-width:0}.phb-brand{margin:0;color:var(--phb-brand-color);font-size:.88rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.phb-badges{display:flex;flex-wrap:wrap;gap:8px}.phb-badge{display:inline-flex;align-items:center;min-height:28px;padding:0 12px;border-radius:999px;background:var(--phb-badge-bg);color:var(--phb-badge-color);font-size:.76rem;font-weight:700;letter-spacing:.02em}.phb-badge-highlight{background:var(--phb-badge-highlight-bg);color:var(--phb-badge-highlight-color)}.phb-badge-muted{background:var(--phb-badge-muted-bg);color:var(--phb-badge-muted-color)}.phb-badge-warning{background:var(--phb-badge-warning-bg);color:var(--phb-badge-warning-color)}.phb-text{display:grid;gap:8px}.phb-subtitle{margin:0;color:var(--phb-subtitle-color);font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-title{margin:0;color:var(--phb-title-color);font-size:clamp(1.6rem,2.2vw,2.5rem);line-height:1.08;letter-spacing:0}.phb-title-accent{display:inline;background:linear-gradient(90deg,#4285f4,#6ea8ff 28%,#a142f4 62%,#ea4335);-webkit-background-clip:text;background-clip:text;color:transparent}.phb-description{margin:0;max-width:56ch;color:var(--phb-description-color);font-size:.94rem;line-height:1.5}.phb-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:0}.phb-meta-item{display:grid;gap:4px;padding:12px 14px;border-radius:16px;background:var(--phb-meta-bg);border:1px solid var(--phb-meta-border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.phb-meta-item dt{margin:0;color:var(--phb-meta-label-color);font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-meta-item dd{margin:0;color:var(--phb-meta-value-color);font-size:.92rem;line-height:1.45}.phb-visual{position:relative;min-height:220px;border-radius:22px;overflow:hidden;background:var(--phb-visual-bg)}.phb-image{display:block;width:100%;height:100%;object-fit:cover}.phb-visual-fallback{background:var(--phb-visual-fallback)}.phb-visual-summary{display:grid;align-content:start;gap:10px;padding:14px;background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-surface-container-high) 92%,var(--md-sys-color-primary) 8%),color-mix(in srgb,var(--md-sys-color-surface-container-low) 88%,var(--md-sys-color-tertiary) 12%))}.phb-summary-header{display:flex;align-items:start;justify-content:space-between;gap:12px}.phb-summary-eyebrow{margin:0 0 4px;color:var(--md-sys-color-primary);font-size:.72rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.phb-summary-header h3{margin:0;color:var(--md-sys-color-on-surface);font-size:.95rem;line-height:1.25}.phb-status{display:inline-flex;align-items:center;min-height:26px;padding:0 10px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 74%,transparent);color:var(--md-sys-color-on-surface);font-size:.72rem;font-weight:800;white-space:nowrap}.phb-summary-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0}.phb-summary-item{display:grid;gap:4px;min-height:56px;padding:9px 10px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 48%,transparent);border-radius:14px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 58%,transparent)}.phb-summary-item dt{margin:0;color:var(--md-sys-color-on-surface-variant);font-size:.64rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.phb-summary-item dd{margin:0;color:var(--md-sys-color-on-surface);font-size:1.08rem;font-weight:850;line-height:1.15}.phb-summary-events{display:grid;gap:6px}.phb-summary-event{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:28px;padding:6px 9px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container) 68%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:.72rem}.phb-summary-event strong{color:var(--md-sys-color-on-surface);font-weight:800;white-space:nowrap}.phb-tone-success{--phb-tone-color: var(--md-sys-color-tertiary);border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 34%,var(--md-sys-color-outline-variant))}.phb-tone-warning{--phb-tone-color: #d79921;border-color:color-mix(in srgb,#d79921 36%,var(--md-sys-color-outline-variant))}.phb-tone-danger{--phb-tone-color: var(--md-sys-color-error);border-color:color-mix(in srgb,var(--md-sys-color-error) 34%,var(--md-sys-color-outline-variant))}.phb-tone-info{--phb-tone-color: var(--md-sys-color-primary);border-color:color-mix(in srgb,var(--md-sys-color-primary) 34%,var(--md-sys-color-outline-variant))}.phb-summary-item.phb-tone-success dd,.phb-summary-item.phb-tone-warning dd,.phb-summary-item.phb-tone-danger dd,.phb-summary-item.phb-tone-info dd,.phb-status.phb-tone-success,.phb-status.phb-tone-warning,.phb-status.phb-tone-danger,.phb-status.phb-tone-info,.phb-summary-event.phb-tone-success strong,.phb-summary-event.phb-tone-warning strong,.phb-summary-event.phb-tone-danger strong,.phb-summary-event.phb-tone-info strong{color:var(--phb-tone-color)}.phb-flat{padding:0 0 18px;border:0;border-radius:0;box-shadow:none;background:transparent;grid-template-columns:minmax(0,1.15fr) minmax(220px,.85fr);gap:18px}.phb-flat .phb-brand{color:var(--md-sys-color-primary)}.phb-flat .phb-badges{order:3}.phb-flat .phb-meta{grid-template-columns:1fr;gap:6px}.phb-flat .phb-meta-item{padding:0;border:0;border-radius:0;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.phb-flat .phb-meta-item dt,.phb-flat .phb-meta-item dd{display:inline}.phb-flat .phb-meta-item dt{margin-right:6px}.phb-flat .phb-visual{min-height:190px;border-radius:26px}.phb-preview{position:absolute;inset:18px;display:grid;grid-template-rows:18px 44px minmax(72px,1fr) 1fr;gap:12px;padding:16px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 50%,transparent);border-radius:18px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 62%,transparent);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-surface-bright, #fff) 28%,transparent)}.phb-preview-header,.phb-preview-kpis span,.phb-preview-list span{border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-on-surface) 12%,transparent)}.phb-preview-header{width:46%}.phb-preview-kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.phb-preview-kpis span{height:44px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 48%,var(--md-sys-color-surface-container-high) 52%)}.phb-preview-chart{display:grid;grid-template-columns:repeat(5,1fr);align-items:end;gap:8px;padding:12px;border-radius:14px;background:color-mix(in srgb,var(--md-sys-color-surface-container) 74%,transparent)}.phb-preview-chart span{min-height:18px;height:var(--bar-height);border-radius:8px 8px 4px 4px;background:color-mix(in srgb,var(--md-sys-color-primary) 68%,var(--md-sys-color-tertiary) 32%)}.phb-preview-list{display:grid;gap:8px;align-content:start}.phb-preview-list span{height:10px}.phb-preview-list span:nth-child(2){width:74%}.phb-preview-list span:nth-child(3){width:58%}@media(max-width:900px){.phb-shell{grid-template-columns:1fr;padding:18px}.phb-visual{order:-1;min-height:180px}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
23369
23745
  }
23370
23746
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisHeroBannerComponent, decorators: [{
23371
23747
  type: Component,
@@ -23388,7 +23764,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
23388
23764
  <p class="phb-brand">{{ brandText }}</p>
23389
23765
  }
23390
23766
 
23391
- @if (badges?.length) {
23767
+ @if (badges.length) {
23392
23768
  <div class="phb-badges">
23393
23769
  @for (badge of badges; track badge) {
23394
23770
  <span
@@ -23413,7 +23789,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
23413
23789
  <span>{{ title }}</span>
23414
23790
  }
23415
23791
  @if (titleAccent) {
23416
- <span class="phb-title-accent">{{ titleAccent }}</span>
23792
+ <span class="phb-title-accent"> {{ titleAccent }}</span>
23417
23793
  }
23418
23794
  </h2>
23419
23795
  }
@@ -23422,7 +23798,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
23422
23798
  }
23423
23799
  </div>
23424
23800
 
23425
- @if (metaItems?.length) {
23801
+ @if (metaItems.length) {
23426
23802
  <dl class="phb-meta">
23427
23803
  @for (item of metaItems; track item) {
23428
23804
  <div class="phb-meta-item">
@@ -23438,16 +23814,93 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
23438
23814
  <div class="phb-visual">
23439
23815
  <img class="phb-image" [src]="imageUrl" [alt]="imageAlt || title || subtitle || 'Imagem do destaque'" />
23440
23816
  </div>
23817
+ } @else if (visualSummary) {
23818
+ <aside class="phb-visual phb-visual-summary" aria-label="Resumo visual">
23819
+ <div class="phb-summary-header">
23820
+ <div>
23821
+ @if (visualSummary.eyebrow) {
23822
+ <p class="phb-summary-eyebrow">{{ visualSummary.eyebrow }}</p>
23823
+ }
23824
+ @if (visualSummary.title) {
23825
+ <h3>{{ visualSummary.title }}</h3>
23826
+ }
23827
+ </div>
23828
+ @if (visualSummary.status) {
23829
+ <span
23830
+ class="phb-status"
23831
+ [class.phb-tone-success]="visualSummary.statusTone === 'success'"
23832
+ [class.phb-tone-warning]="visualSummary.statusTone === 'warning'"
23833
+ [class.phb-tone-danger]="visualSummary.statusTone === 'danger'"
23834
+ [class.phb-tone-info]="visualSummary.statusTone === 'info'"
23835
+ >
23836
+ {{ visualSummary.status }}
23837
+ </span>
23838
+ }
23839
+ </div>
23840
+
23841
+ @if (visualSummary.items?.length) {
23842
+ <dl class="phb-summary-grid">
23843
+ @for (item of visualSummary.items; track item) {
23844
+ <div
23845
+ class="phb-summary-item"
23846
+ [class.phb-tone-success]="item.tone === 'success'"
23847
+ [class.phb-tone-warning]="item.tone === 'warning'"
23848
+ [class.phb-tone-danger]="item.tone === 'danger'"
23849
+ [class.phb-tone-info]="item.tone === 'info'"
23850
+ >
23851
+ <dt>{{ item.label }}</dt>
23852
+ <dd>{{ item.value }}</dd>
23853
+ </div>
23854
+ }
23855
+ </dl>
23856
+ }
23857
+
23858
+ @if (visualSummary.events?.length) {
23859
+ <div class="phb-summary-events">
23860
+ @for (event of visualSummary.events; track event) {
23861
+ <div
23862
+ class="phb-summary-event"
23863
+ [class.phb-tone-success]="event.tone === 'success'"
23864
+ [class.phb-tone-warning]="event.tone === 'warning'"
23865
+ [class.phb-tone-danger]="event.tone === 'danger'"
23866
+ [class.phb-tone-info]="event.tone === 'info'"
23867
+ >
23868
+ <span>{{ event.label }}</span>
23869
+ @if (event.value) {
23870
+ <strong>{{ event.value }}</strong>
23871
+ }
23872
+ </div>
23873
+ }
23874
+ </div>
23875
+ }
23876
+ </aside>
23441
23877
  } @else {
23442
23878
  <div class="phb-visual phb-visual-fallback" aria-hidden="true">
23443
- <div class="phb-orb phb-orb-a"></div>
23444
- <div class="phb-orb phb-orb-b"></div>
23445
- <div class="phb-grid"></div>
23879
+ <div class="phb-preview">
23880
+ <div class="phb-preview-header"></div>
23881
+ <div class="phb-preview-kpis">
23882
+ <span></span>
23883
+ <span></span>
23884
+ <span></span>
23885
+ </div>
23886
+ <div class="phb-preview-chart">
23887
+ <span style="--bar-height: 42%"></span>
23888
+ <span style="--bar-height: 68%"></span>
23889
+ <span style="--bar-height: 54%"></span>
23890
+ <span style="--bar-height: 82%"></span>
23891
+ <span style="--bar-height: 62%"></span>
23892
+ </div>
23893
+ <div class="phb-preview-list">
23894
+ <span></span>
23895
+ <span></span>
23896
+ <span></span>
23897
+ </div>
23898
+ </div>
23446
23899
  </div>
23447
23900
  }
23448
23901
 
23449
23902
  </section>
23450
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-shell-shadow: 0 24px 60px color-mix(in srgb, var(--md-sys-color-shadow, #000) 10%, transparent);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 14%, transparent), transparent 38%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 92%, var(--md-sys-color-primary-container) 8%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-surface-container) 4%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .24), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 45%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .2), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 18%, var(--md-sys-color-surface-container-lowest) 82%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 48%, color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-secondary-container) 6%) 100% );--phb-brand-color: color-mix(in srgb, var(--md-sys-color-primary) 68%, var(--md-sys-color-on-surface) 32%);--phb-subtitle-color: color-mix(in srgb, var(--md-sys-color-primary) 52%, var(--md-sys-color-on-surface) 48%);--phb-title-color: var(--md-sys-color-on-surface);--phb-description-color: var(--md-sys-color-on-surface-variant);--phb-badge-bg: color-mix(in srgb, var(--md-sys-color-surface-container-high) 78%, transparent);--phb-badge-color: var(--md-sys-color-on-surface);--phb-badge-highlight-bg: color-mix(in srgb, var(--md-sys-color-primary-container) 78%, transparent);--phb-badge-highlight-color: var(--md-sys-color-on-primary-container);--phb-badge-muted-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 82%, transparent);--phb-badge-muted-color: var(--md-sys-color-on-surface-variant);--phb-badge-warning-bg: color-mix(in srgb, var(--md-sys-color-error-container) 74%, transparent);--phb-badge-warning-color: var(--md-sys-color-on-error-container);--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 72%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 48%, transparent);--phb-meta-label-color: var(--md-sys-color-on-surface-variant);--phb-meta-value-color: var(--md-sys-color-on-surface);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 90%, var(--md-sys-color-primary) 10%), color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 24%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 18%, var(--md-sys-color-surface-container-high) 82%), color-mix(in srgb, var(--md-sys-color-primary-container) 18%, var(--md-sys-color-surface-container-low) 82%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 68%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 22%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent)}:host-context(.mdc-theme-dark),:host-context(.theme-dark){--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 84%, transparent);--phb-shell-shadow: 0 22px 54px rgba(0, 0, 0, .28);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent), transparent 40%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 90%, var(--md-sys-color-primary-container) 10%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 84%, var(--md-sys-color-primary-container) 16%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .18), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 22%, var(--md-sys-color-surface-container-low) 78%) 45%, color-mix(in srgb, var(--md-sys-color-surface-container) 90%, var(--md-sys-color-primary-container) 10%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .16), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 20%, var(--md-sys-color-surface-container-low) 80%) 48%, color-mix(in srgb, var(--md-sys-color-surface-container) 92%, var(--md-sys-color-secondary-container) 8%) 100% );--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 70%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 88%, var(--md-sys-color-primary) 12%), color-mix(in srgb, var(--md-sys-color-surface-container) 82%, var(--md-sys-color-primary-container) 18%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 22%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 22%, var(--md-sys-color-surface-container-high) 78%), color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 34%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 26%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 10%, transparent)}.phb-shell{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(240px,.95fr);gap:22px;align-items:stretch;padding:22px;border-radius:28px;overflow:hidden;background:var(--phb-shell-bg);border:1px solid var(--phb-shell-border);box-shadow:var(--phb-shell-shadow)}.phb-event{background:var(--phb-event-bg)}.phb-institutional{background:var(--phb-institutional-bg)}.phb-copy{display:grid;gap:18px;min-width:0}.phb-brand{margin:0;color:var(--phb-brand-color);font-size:.88rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.phb-badges{display:flex;flex-wrap:wrap;gap:8px}.phb-badge{display:inline-flex;align-items:center;min-height:28px;padding:0 12px;border-radius:999px;background:var(--phb-badge-bg);color:var(--phb-badge-color);font-size:.76rem;font-weight:700;letter-spacing:.02em}.phb-badge-highlight{background:var(--phb-badge-highlight-bg);color:var(--phb-badge-highlight-color)}.phb-badge-muted{background:var(--phb-badge-muted-bg);color:var(--phb-badge-muted-color)}.phb-badge-warning{background:var(--phb-badge-warning-bg);color:var(--phb-badge-warning-color)}.phb-text{display:grid;gap:8px}.phb-subtitle{margin:0;color:var(--phb-subtitle-color);font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-title{margin:0;color:var(--phb-title-color);font-size:clamp(1.6rem,2.2vw,2.5rem);line-height:1.08;letter-spacing:-.03em}.phb-title-accent{display:inline;margin-left:.18em;background:linear-gradient(90deg,#4285f4,#6ea8ff 28%,#a142f4 62%,#ea4335);-webkit-background-clip:text;background-clip:text;color:transparent}.phb-description{margin:0;max-width:56ch;color:var(--phb-description-color);font-size:.98rem;line-height:1.65}.phb-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:0}.phb-meta-item{display:grid;gap:4px;padding:12px 14px;border-radius:16px;background:var(--phb-meta-bg);border:1px solid var(--phb-meta-border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.phb-meta-item dt{margin:0;color:var(--phb-meta-label-color);font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-meta-item dd{margin:0;color:var(--phb-meta-value-color);font-size:.92rem;line-height:1.45}.phb-visual{position:relative;min-height:220px;border-radius:22px;overflow:hidden;background:var(--phb-visual-bg)}.phb-image{display:block;width:100%;height:100%;object-fit:cover}.phb-visual-fallback{background:var(--phb-visual-fallback)}.phb-flat{padding:0 0 18px;border:0;border-radius:0;box-shadow:none;background:transparent;grid-template-columns:minmax(0,1.15fr) minmax(220px,.85fr);gap:18px}.phb-flat .phb-brand{color:var(--md-sys-color-primary)}.phb-flat .phb-badges{order:3}.phb-flat .phb-meta{grid-template-columns:1fr;gap:6px}.phb-flat .phb-meta-item{padding:0;border:0;border-radius:0;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.phb-flat .phb-meta-item dt,.phb-flat .phb-meta-item dd{display:inline}.phb-flat .phb-meta-item dt{margin-right:6px}.phb-flat .phb-visual{min-height:190px;border-radius:26px}.phb-orb{position:absolute;border-radius:999px;filter:blur(2px)}.phb-orb-a{inset:24px auto auto 20px;width:86px;height:86px;background:var(--phb-orb-a-bg)}.phb-orb-b{inset:auto 16px 18px auto;width:132px;height:132px;background:var(--phb-orb-b-bg)}.phb-grid{position:absolute;inset:0;background-image:linear-gradient(var(--phb-grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--phb-grid-line) 1px,transparent 1px);background-size:24px 24px;opacity:.5}@media(max-width:900px){.phb-shell{grid-template-columns:1fr;padding:18px}.phb-visual{order:-1;min-height:180px}}\n"] }]
23903
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-shell-shadow: 0 24px 60px color-mix(in srgb, var(--md-sys-color-shadow, #000) 10%, transparent);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 14%, transparent), transparent 38%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 92%, var(--md-sys-color-primary-container) 8%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-surface-container) 4%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .24), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 45%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .2), transparent 34%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 18%, var(--md-sys-color-surface-container-lowest) 82%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 24%, var(--md-sys-color-surface-container-low) 76%) 48%, color-mix(in srgb, var(--md-sys-color-surface) 94%, var(--md-sys-color-secondary-container) 6%) 100% );--phb-brand-color: color-mix(in srgb, var(--md-sys-color-primary) 68%, var(--md-sys-color-on-surface) 32%);--phb-subtitle-color: color-mix(in srgb, var(--md-sys-color-primary) 52%, var(--md-sys-color-on-surface) 48%);--phb-title-color: var(--md-sys-color-on-surface);--phb-description-color: var(--md-sys-color-on-surface-variant);--phb-badge-bg: color-mix(in srgb, var(--md-sys-color-surface-container-high) 78%, transparent);--phb-badge-color: var(--md-sys-color-on-surface);--phb-badge-highlight-bg: color-mix(in srgb, var(--md-sys-color-primary-container) 78%, transparent);--phb-badge-highlight-color: var(--md-sys-color-on-primary-container);--phb-badge-muted-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 82%, transparent);--phb-badge-muted-color: var(--md-sys-color-on-surface-variant);--phb-badge-warning-bg: color-mix(in srgb, var(--md-sys-color-error-container) 74%, transparent);--phb-badge-warning-color: var(--md-sys-color-on-error-container);--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 72%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 48%, transparent);--phb-meta-label-color: var(--md-sys-color-on-surface-variant);--phb-meta-value-color: var(--md-sys-color-on-surface);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 90%, var(--md-sys-color-primary) 10%), color-mix(in srgb, var(--md-sys-color-surface-container-low) 88%, var(--md-sys-color-primary-container) 12%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 24%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 18%, var(--md-sys-color-surface-container-high) 82%), color-mix(in srgb, var(--md-sys-color-primary-container) 18%, var(--md-sys-color-surface-container-low) 82%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-bright, var(--md-sys-color-surface-container-high)) 68%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 22%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent)}:host-context(.mdc-theme-dark),:host-context(.theme-dark){--phb-shell-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 84%, transparent);--phb-shell-shadow: 0 22px 54px rgba(0, 0, 0, .28);--phb-shell-bg: radial-gradient(circle at top right, color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent), transparent 40%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 90%, var(--md-sys-color-primary-container) 10%) 0%, color-mix(in srgb, var(--md-sys-color-surface-container-low) 84%, var(--md-sys-color-primary-container) 16%) 54%, color-mix(in srgb, var(--md-sys-color-surface) 92%, var(--md-sys-color-primary-container) 8%) 100% );--phb-event-bg: radial-gradient(circle at top right, rgba(255, 184, 77, .18), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-primary-container) 22%, var(--md-sys-color-surface-container-low) 78%) 45%, color-mix(in srgb, var(--md-sys-color-surface-container) 90%, var(--md-sys-color-primary-container) 10%) 100% );--phb-institutional-bg: radial-gradient(circle at top right, rgba(17, 94, 89, .16), transparent 36%), linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-secondary-container) 16%, var(--md-sys-color-surface-container-lowest) 84%) 0%, color-mix(in srgb, var(--md-sys-color-secondary-container) 20%, var(--md-sys-color-surface-container-low) 80%) 48%, color-mix(in srgb, var(--md-sys-color-surface-container) 92%, var(--md-sys-color-secondary-container) 8%) 100% );--phb-meta-bg: color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 70%, transparent);--phb-meta-border: color-mix(in srgb, var(--md-sys-color-outline-variant) 60%, transparent);--phb-visual-bg: linear-gradient( 160deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 88%, var(--md-sys-color-primary) 12%), color-mix(in srgb, var(--md-sys-color-surface-container) 82%, var(--md-sys-color-primary-container) 18%) );--phb-visual-fallback: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface-container-high) 22%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 8%, transparent) ), linear-gradient( 145deg, color-mix(in srgb, var(--md-sys-color-primary) 22%, var(--md-sys-color-surface-container-high) 78%), color-mix(in srgb, var(--md-sys-color-primary-container) 24%, var(--md-sys-color-surface-container-low) 76%) );--phb-orb-a-bg: color-mix(in srgb, var(--md-sys-color-surface-container-highest) 34%, transparent);--phb-orb-b-bg: color-mix(in srgb, var(--md-sys-color-primary) 26%, transparent);--phb-grid-line: color-mix(in srgb, var(--md-sys-color-on-surface) 10%, transparent)}.phb-shell{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(240px,.95fr);gap:22px;align-items:stretch;padding:22px;border-radius:28px;overflow:hidden;background:var(--phb-shell-bg);border:1px solid var(--phb-shell-border);box-shadow:var(--phb-shell-shadow)}.phb-event{background:var(--phb-event-bg)}.phb-institutional{background:var(--phb-institutional-bg)}.phb-copy{display:grid;gap:14px;min-width:0}.phb-brand{margin:0;color:var(--phb-brand-color);font-size:.88rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.phb-badges{display:flex;flex-wrap:wrap;gap:8px}.phb-badge{display:inline-flex;align-items:center;min-height:28px;padding:0 12px;border-radius:999px;background:var(--phb-badge-bg);color:var(--phb-badge-color);font-size:.76rem;font-weight:700;letter-spacing:.02em}.phb-badge-highlight{background:var(--phb-badge-highlight-bg);color:var(--phb-badge-highlight-color)}.phb-badge-muted{background:var(--phb-badge-muted-bg);color:var(--phb-badge-muted-color)}.phb-badge-warning{background:var(--phb-badge-warning-bg);color:var(--phb-badge-warning-color)}.phb-text{display:grid;gap:8px}.phb-subtitle{margin:0;color:var(--phb-subtitle-color);font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-title{margin:0;color:var(--phb-title-color);font-size:clamp(1.6rem,2.2vw,2.5rem);line-height:1.08;letter-spacing:0}.phb-title-accent{display:inline;background:linear-gradient(90deg,#4285f4,#6ea8ff 28%,#a142f4 62%,#ea4335);-webkit-background-clip:text;background-clip:text;color:transparent}.phb-description{margin:0;max-width:56ch;color:var(--phb-description-color);font-size:.94rem;line-height:1.5}.phb-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:0}.phb-meta-item{display:grid;gap:4px;padding:12px 14px;border-radius:16px;background:var(--phb-meta-bg);border:1px solid var(--phb-meta-border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.phb-meta-item dt{margin:0;color:var(--phb-meta-label-color);font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.phb-meta-item dd{margin:0;color:var(--phb-meta-value-color);font-size:.92rem;line-height:1.45}.phb-visual{position:relative;min-height:220px;border-radius:22px;overflow:hidden;background:var(--phb-visual-bg)}.phb-image{display:block;width:100%;height:100%;object-fit:cover}.phb-visual-fallback{background:var(--phb-visual-fallback)}.phb-visual-summary{display:grid;align-content:start;gap:10px;padding:14px;background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-surface-container-high) 92%,var(--md-sys-color-primary) 8%),color-mix(in srgb,var(--md-sys-color-surface-container-low) 88%,var(--md-sys-color-tertiary) 12%))}.phb-summary-header{display:flex;align-items:start;justify-content:space-between;gap:12px}.phb-summary-eyebrow{margin:0 0 4px;color:var(--md-sys-color-primary);font-size:.72rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.phb-summary-header h3{margin:0;color:var(--md-sys-color-on-surface);font-size:.95rem;line-height:1.25}.phb-status{display:inline-flex;align-items:center;min-height:26px;padding:0 10px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 74%,transparent);color:var(--md-sys-color-on-surface);font-size:.72rem;font-weight:800;white-space:nowrap}.phb-summary-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0}.phb-summary-item{display:grid;gap:4px;min-height:56px;padding:9px 10px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 48%,transparent);border-radius:14px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 58%,transparent)}.phb-summary-item dt{margin:0;color:var(--md-sys-color-on-surface-variant);font-size:.64rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.phb-summary-item dd{margin:0;color:var(--md-sys-color-on-surface);font-size:1.08rem;font-weight:850;line-height:1.15}.phb-summary-events{display:grid;gap:6px}.phb-summary-event{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:28px;padding:6px 9px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container) 68%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:.72rem}.phb-summary-event strong{color:var(--md-sys-color-on-surface);font-weight:800;white-space:nowrap}.phb-tone-success{--phb-tone-color: var(--md-sys-color-tertiary);border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 34%,var(--md-sys-color-outline-variant))}.phb-tone-warning{--phb-tone-color: #d79921;border-color:color-mix(in srgb,#d79921 36%,var(--md-sys-color-outline-variant))}.phb-tone-danger{--phb-tone-color: var(--md-sys-color-error);border-color:color-mix(in srgb,var(--md-sys-color-error) 34%,var(--md-sys-color-outline-variant))}.phb-tone-info{--phb-tone-color: var(--md-sys-color-primary);border-color:color-mix(in srgb,var(--md-sys-color-primary) 34%,var(--md-sys-color-outline-variant))}.phb-summary-item.phb-tone-success dd,.phb-summary-item.phb-tone-warning dd,.phb-summary-item.phb-tone-danger dd,.phb-summary-item.phb-tone-info dd,.phb-status.phb-tone-success,.phb-status.phb-tone-warning,.phb-status.phb-tone-danger,.phb-status.phb-tone-info,.phb-summary-event.phb-tone-success strong,.phb-summary-event.phb-tone-warning strong,.phb-summary-event.phb-tone-danger strong,.phb-summary-event.phb-tone-info strong{color:var(--phb-tone-color)}.phb-flat{padding:0 0 18px;border:0;border-radius:0;box-shadow:none;background:transparent;grid-template-columns:minmax(0,1.15fr) minmax(220px,.85fr);gap:18px}.phb-flat .phb-brand{color:var(--md-sys-color-primary)}.phb-flat .phb-badges{order:3}.phb-flat .phb-meta{grid-template-columns:1fr;gap:6px}.phb-flat .phb-meta-item{padding:0;border:0;border-radius:0;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.phb-flat .phb-meta-item dt,.phb-flat .phb-meta-item dd{display:inline}.phb-flat .phb-meta-item dt{margin-right:6px}.phb-flat .phb-visual{min-height:190px;border-radius:26px}.phb-preview{position:absolute;inset:18px;display:grid;grid-template-rows:18px 44px minmax(72px,1fr) 1fr;gap:12px;padding:16px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 50%,transparent);border-radius:18px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 62%,transparent);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-surface-bright, #fff) 28%,transparent)}.phb-preview-header,.phb-preview-kpis span,.phb-preview-list span{border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-on-surface) 12%,transparent)}.phb-preview-header{width:46%}.phb-preview-kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.phb-preview-kpis span{height:44px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 48%,var(--md-sys-color-surface-container-high) 52%)}.phb-preview-chart{display:grid;grid-template-columns:repeat(5,1fr);align-items:end;gap:8px;padding:12px;border-radius:14px;background:color-mix(in srgb,var(--md-sys-color-surface-container) 74%,transparent)}.phb-preview-chart span{min-height:18px;height:var(--bar-height);border-radius:8px 8px 4px 4px;background:color-mix(in srgb,var(--md-sys-color-primary) 68%,var(--md-sys-color-tertiary) 32%)}.phb-preview-list{display:grid;gap:8px;align-content:start}.phb-preview-list span{height:10px}.phb-preview-list span:nth-child(2){width:74%}.phb-preview-list span:nth-child(3){width:58%}@media(max-width:900px){.phb-shell{grid-template-columns:1fr;padding:18px}.phb-visual{order:-1;min-height:180px}}\n"] }]
23451
23904
  }], propDecorators: { instanceId: [{
23452
23905
  type: Input
23453
23906
  }], analyticsId: [{
@@ -23476,6 +23929,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
23476
23929
  type: Input
23477
23930
  }], titleAccent: [{
23478
23931
  type: Input
23932
+ }], visualSummary: [{
23933
+ type: Input
23479
23934
  }] } });
23480
23935
 
23481
23936
  const PRAXIS_HERO_BANNER_METADATA = {
@@ -23498,6 +23953,7 @@ const PRAXIS_HERO_BANNER_METADATA = {
23498
23953
  { name: 'imageAlt', type: 'string', label: 'Alt da imagem', description: 'Texto alternativo da imagem, quando presente.' },
23499
23954
  { name: 'badges', type: 'Array<{ label: string; tone?: "default" | "highlight" | "muted" | "warning" }>', label: 'Badges', description: 'Badges curatoriais no topo do hero.' },
23500
23955
  { name: 'metaItems', type: 'Array<{ label: string; value: string }>', label: 'Metadados', description: 'Metadados como data, local ou tenant.' },
23956
+ { name: 'visualSummary', type: 'HeroVisualSummary | null', label: 'Resumo visual', description: 'Painel opcional com evidências executivas, métricas e eventos para substituir a ilustração padrão.' },
23501
23957
  { name: 'variant', type: "'default' | 'event' | 'institutional'", label: 'Variante', description: 'Variante visual inicial do hero banner.', default: 'default' },
23502
23958
  { name: 'appearance', type: "'card' | 'flat'", label: 'Aparência', description: 'Controla se o hero usa cartão completo ou composição mais plana e leve.', default: 'card' },
23503
23959
  ],
@@ -24215,12 +24671,19 @@ class DynamicWidgetLoaderDirective {
24215
24671
  currentId;
24216
24672
  currentUsesInitialBindings = false;
24217
24673
  currentInitialBindingSignature = null;
24674
+ boundInputValues = {};
24218
24675
  outputSubs = [];
24676
+ destroyed = false;
24219
24677
  /** Dispatch a shell action to the inner widget instance when supported. */
24220
24678
  dispatchAction(action) {
24221
24679
  const instance = this.compRef?.instance;
24222
24680
  if (!instance)
24223
24681
  return false;
24682
+ if (action?.id === 'component-settings' &&
24683
+ typeof instance.openTableSettings === 'function') {
24684
+ instance.openTableSettings();
24685
+ return true;
24686
+ }
24224
24687
  if (typeof instance.handleShellAction === 'function') {
24225
24688
  instance.handleShellAction(action);
24226
24689
  return true;
@@ -24245,11 +24708,30 @@ class DynamicWidgetLoaderDirective {
24245
24708
  }
24246
24709
  }
24247
24710
  ngOnDestroy() {
24711
+ this.destroyed = true;
24248
24712
  this.destroyCurrent();
24249
24713
  }
24250
24714
  renderNow() {
24251
24715
  this.tryRender();
24252
24716
  }
24717
+ materializedInputSnapshot(inputNames) {
24718
+ const instance = this.compRef?.instance;
24719
+ if (!instance || !Array.isArray(inputNames) || !inputNames.length) {
24720
+ return {};
24721
+ }
24722
+ const snapshot = {};
24723
+ for (const name of inputNames) {
24724
+ const key = typeof name === 'string' ? name.trim() : '';
24725
+ if (!key) {
24726
+ continue;
24727
+ }
24728
+ const value = instance[key];
24729
+ if (value !== undefined && typeof value !== 'function') {
24730
+ snapshot[key] = this.cloneValue(value);
24731
+ }
24732
+ }
24733
+ return snapshot;
24734
+ }
24253
24735
  parseWidget(input) {
24254
24736
  if (!input)
24255
24737
  return null;
@@ -24265,6 +24747,8 @@ class DynamicWidgetLoaderDirective {
24265
24747
  return input;
24266
24748
  }
24267
24749
  tryRender() {
24750
+ if (this.destroyed)
24751
+ return;
24268
24752
  const def = this.parseWidget(this.widget);
24269
24753
  if (!def || !def.id)
24270
24754
  return;
@@ -24281,7 +24765,7 @@ class DynamicWidgetLoaderDirective {
24281
24765
  throw error;
24282
24766
  }
24283
24767
  // New component type? recreate; else just update inputs
24284
- const useInitialBindings = this.shouldUseInitialInputBindings(def.id, meta || undefined);
24768
+ const useInitialBindings = this.shouldUseInitialInputBindings(def.id, inputs, meta || undefined);
24285
24769
  const initialBindingSignature = useInitialBindings
24286
24770
  ? this.initialBindingSignature(def.id, inputs, def.bindingOrder, meta || undefined)
24287
24771
  : null;
@@ -24289,17 +24773,22 @@ class DynamicWidgetLoaderDirective {
24289
24773
  || def.id !== this.currentId
24290
24774
  || (useInitialBindings
24291
24775
  && initialBindingSignature !== this.currentInitialBindingSignature);
24776
+ let recreated = false;
24292
24777
  if (needsRecreate) {
24293
24778
  this.createComponent(def.id, inputs, def.bindingOrder, meta || undefined, useInitialBindings, initialBindingSignature);
24779
+ recreated = !!this.compRef;
24294
24780
  }
24295
24781
  if (this.compRef) {
24296
24782
  try {
24783
+ let inputsChanged = false;
24297
24784
  // Faz o binding com coerção de tipos quando possível
24298
24785
  if (!this.currentUsesInitialBindings) {
24299
- this.bindInputs(this.compRef, def.id, inputs, def.bindingOrder, meta || undefined);
24786
+ inputsChanged = this.bindInputs(this.compRef, def.id, inputs, def.bindingOrder, meta || undefined);
24300
24787
  }
24301
24788
  this.bindOutputs(this.compRef.instance, def.id, outputs, meta || undefined);
24302
- this.compRef.changeDetectorRef.detectChanges();
24789
+ if (recreated || inputsChanged) {
24790
+ this.compRef.changeDetectorRef.detectChanges();
24791
+ }
24303
24792
  this.widgetDiagnostic.emit({
24304
24793
  componentId: def.id,
24305
24794
  childWidgetKey: def.childWidgetKey,
@@ -24345,11 +24834,10 @@ class DynamicWidgetLoaderDirective {
24345
24834
  }
24346
24835
  this.vcRef.clear();
24347
24836
  try {
24348
- const initialBindings = useInitialBindings
24349
- ? this.orderedInputEntries(id, inputs, bindingOrder)
24350
- .map(([key, raw]) => inputBinding(key, () => this.resolveAndCoerceValue(key, raw, metaForInputs)))
24351
- : [];
24352
- this.compRef = this.vcRef.createComponent(cmp, initialBindings.length ? { bindings: initialBindings } : undefined);
24837
+ this.compRef = this.vcRef.createComponent(cmp);
24838
+ if (useInitialBindings) {
24839
+ this.bindInputs(this.compRef, id, inputs, bindingOrder, metaForInputs);
24840
+ }
24353
24841
  this.currentId = id;
24354
24842
  this.currentUsesInitialBindings = useInitialBindings;
24355
24843
  this.currentInitialBindingSignature = useInitialBindings ? initialBindingSignature : null;
@@ -24372,25 +24860,57 @@ class DynamicWidgetLoaderDirective {
24372
24860
  this.currentId = undefined;
24373
24861
  this.currentUsesInitialBindings = false;
24374
24862
  this.currentInitialBindingSignature = null;
24863
+ this.boundInputValues = {};
24375
24864
  }
24376
24865
  this.vcRef.clear();
24377
24866
  }
24378
- shouldUseInitialInputBindings(id, meta) {
24867
+ cloneValue(value) {
24868
+ if (value == null || typeof value !== 'object') {
24869
+ return value;
24870
+ }
24871
+ try {
24872
+ return JSON.parse(JSON.stringify(value));
24873
+ }
24874
+ catch {
24875
+ return value;
24876
+ }
24877
+ }
24878
+ shouldUseInitialInputBindings(id, inputs, meta) {
24879
+ const hasDetachedDynamicFormRuntimeInputs = id === 'praxis-dynamic-form'
24880
+ && Boolean(inputs['apiUrlEntry']
24881
+ || inputs['apiEndpointKey']
24882
+ || inputs['schemaUrl']
24883
+ || inputs['readUrl']
24884
+ || inputs['submitUrl']
24885
+ || inputs['customEndpoints']);
24886
+ const hasDetachedFilterRuntimeInputs = id === 'praxis-filter'
24887
+ && Boolean(inputs['apiUrlEntry']);
24379
24888
  return meta?.requiresInitialInputs === true
24380
- || id === 'praxis-chart';
24889
+ || id === 'praxis-chart'
24890
+ || hasDetachedDynamicFormRuntimeInputs
24891
+ || hasDetachedFilterRuntimeInputs;
24381
24892
  }
24382
24893
  bindInputs(compRef, id, inputs, bindingOrder, meta) {
24383
24894
  const prioritized = this.orderedInputEntries(id, inputs, bindingOrder);
24895
+ const changes = {};
24896
+ let changed = false;
24384
24897
  const apply = (key, raw) => {
24385
24898
  const value = this.resolveAndCoerceValue(key, raw, meta);
24386
24899
  try {
24387
- if (typeof compRef.setInput === 'function') {
24900
+ const hadPreviousValue = Object.prototype.hasOwnProperty.call(this.boundInputValues, key);
24901
+ const previousValue = this.boundInputValues[key];
24902
+ if (hadPreviousValue && Object.is(previousValue, value)) {
24903
+ return;
24904
+ }
24905
+ if (this.isSignalInput(compRef.instance, key)) {
24388
24906
  compRef.setInput(key, value);
24389
24907
  }
24390
24908
  else {
24391
- // Fallback assignment when setInput is unavailable
24392
24909
  compRef.instance[key] = value;
24393
24910
  }
24911
+ this.boundInputValues[key] = value;
24912
+ changes[key] = new SimpleChange(previousValue, value, !hadPreviousValue);
24913
+ changed = true;
24394
24914
  }
24395
24915
  catch (e) {
24396
24916
  console.warn(`[DynamicWidgetLoader] Failed to set input ${key}`, e);
@@ -24401,6 +24921,20 @@ class DynamicWidgetLoaderDirective {
24401
24921
  for (const [key, raw] of prioritized) {
24402
24922
  apply(key, raw);
24403
24923
  }
24924
+ if (changed && typeof compRef.instance?.ngOnChanges === 'function') {
24925
+ compRef.instance.ngOnChanges(changes);
24926
+ }
24927
+ return changed;
24928
+ }
24929
+ isSignalInput(instance, key) {
24930
+ try {
24931
+ const candidate = instance?.[key];
24932
+ return typeof candidate === 'function'
24933
+ && candidate.length === 0;
24934
+ }
24935
+ catch {
24936
+ return false;
24937
+ }
24404
24938
  }
24405
24939
  initialBindingSignature(id, inputs, bindingOrder, meta) {
24406
24940
  const resolvedEntries = this.orderedInputEntries(id, inputs, bindingOrder)
@@ -24409,7 +24943,7 @@ class DynamicWidgetLoaderDirective {
24409
24943
  }
24410
24944
  orderedInputEntries(id, inputs, bindingOrder) {
24411
24945
  const defaultOrderMap = {
24412
- 'praxis-table': ['tableId', 'componentInstanceId', 'resourcePath', 'data', 'config'],
24946
+ 'praxis-table': ['tableId', 'componentInstanceId', 'configPersistenceStrategy', 'resourcePath', 'data', 'config'],
24413
24947
  'praxis-crud': ['crudId', 'componentInstanceId', 'metadata'],
24414
24948
  'praxis-dynamic-form': ['formId', 'componentInstanceId', 'resourcePath'],
24415
24949
  'praxis-tabs': ['tabsId', 'componentInstanceId', 'configPersistenceStrategy', 'config'],
@@ -24512,8 +25046,11 @@ class DynamicWidgetLoaderDirective {
24512
25046
  this.outputSubs.forEach((u) => u());
24513
25047
  this.outputSubs = [];
24514
25048
  let keys = Object.keys(outputs || {});
24515
- if (this.autoWireOutputs && keys.length === 0 && meta?.outputs?.length) {
24516
- keys = meta.outputs.map((o) => o.name);
25049
+ if (this.autoWireOutputs && meta?.outputs?.length) {
25050
+ keys = Array.from(new Set([
25051
+ ...keys,
25052
+ ...meta.outputs.map((o) => o.name),
25053
+ ]));
24517
25054
  }
24518
25055
  if (!keys.includes('widgetEvent') && isSubscribableOutput(instance?.widgetEvent)) {
24519
25056
  keys = [...keys, 'widgetEvent'];
@@ -25473,22 +26010,69 @@ const BUILTIN_PAGE_THEME_PRESETS = {
25473
26010
  id: 'analytics-calm',
25474
26011
  label: 'Analytics Calm',
25475
26012
  description: 'Superfícies leves, ênfase clara em dados e motion sutil.',
26013
+ shellPreset: 'light-neutral',
26014
+ chartThemePreset: 'executive',
25476
26015
  density: 'comfortable',
25477
26016
  motion: 'subtle',
26017
+ tokens: {
26018
+ '--pdx-page-bg': 'var(--md-sys-color-surface)',
26019
+ '--pdx-page-surface': 'var(--md-sys-color-surface-container-lowest)',
26020
+ '--pdx-page-gap': '20px',
26021
+ '--pdx-page-card-radius': '14px',
26022
+ '--pdx-page-card-shadow': '0 10px 26px color-mix(in srgb, var(--md-sys-color-shadow, #000) 8%, transparent)',
26023
+ '--pdx-page-accent': 'var(--md-sys-color-primary)',
26024
+ },
25478
26025
  },
25479
26026
  'workspace-balanced': {
25480
26027
  id: 'workspace-balanced',
25481
26028
  label: 'Workspace Balanced',
25482
26029
  description: 'Equilíbrio entre densidade operacional e clareza visual.',
26030
+ shellPreset: 'light-neutral',
26031
+ chartThemePreset: 'default',
25483
26032
  density: 'comfortable',
25484
26033
  motion: 'subtle',
26034
+ tokens: {
26035
+ '--pdx-page-bg': 'color-mix(in srgb, var(--md-sys-color-surface) 88%, var(--md-sys-color-surface-container) 12%)',
26036
+ '--pdx-page-surface': 'var(--md-sys-color-surface)',
26037
+ '--pdx-page-gap': '18px',
26038
+ '--pdx-page-card-radius': '12px',
26039
+ '--pdx-page-card-shadow': '0 8px 22px color-mix(in srgb, var(--md-sys-color-shadow, #000) 7%, transparent)',
26040
+ '--pdx-page-accent': 'var(--md-sys-color-primary)',
26041
+ },
25485
26042
  },
25486
26043
  'ops-monitoring': {
25487
26044
  id: 'ops-monitoring',
25488
26045
  label: 'Ops Monitoring',
25489
26046
  description: 'Contraste um pouco maior para leitura rápida de status, filas e alertas.',
26047
+ shellPreset: 'graphite',
26048
+ chartThemePreset: 'compact',
26049
+ density: 'compact',
26050
+ motion: 'subtle',
26051
+ tokens: {
26052
+ '--pdx-page-bg': 'color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 70%, var(--md-sys-color-primary-container) 30%)',
26053
+ '--pdx-page-surface': 'var(--md-sys-color-surface)',
26054
+ '--pdx-page-gap': '14px',
26055
+ '--pdx-page-card-radius': '12px',
26056
+ '--pdx-page-card-shadow': '0 12px 30px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)',
26057
+ '--pdx-page-accent': 'var(--md-sys-color-tertiary)',
26058
+ },
26059
+ },
26060
+ 'executive-command-center': {
26061
+ id: 'executive-command-center',
26062
+ label: 'Executive Command Center',
26063
+ description: 'Superfície premium para dashboards corporativos com hierarquia executiva, dados densos e ações de decisão.',
26064
+ shellPreset: 'graphite',
26065
+ chartThemePreset: 'executive',
25490
26066
  density: 'compact',
25491
26067
  motion: 'subtle',
26068
+ tokens: {
26069
+ '--pdx-page-bg': 'color-mix(in srgb, var(--md-sys-color-surface-container-lowest) 86%, var(--md-sys-color-primary-container) 14%)',
26070
+ '--pdx-page-surface': 'color-mix(in srgb, var(--md-sys-color-surface) 96%, var(--md-sys-color-surface-container-high) 4%)',
26071
+ '--pdx-page-gap': '12px',
26072
+ '--pdx-page-card-radius': '10px',
26073
+ '--pdx-page-card-shadow': '0 6px 18px color-mix(in srgb, var(--md-sys-color-shadow) 10%, transparent)',
26074
+ '--pdx-page-accent': 'var(--md-sys-color-primary)',
26075
+ },
25492
26076
  },
25493
26077
  };
25494
26078
 
@@ -29340,6 +29924,10 @@ class DynamicWidgetPageComponent {
29340
29924
  widgets = signal([], ...(ngDevMode ? [{ debugName: "widgets" }] : /* istanbul ignore next */ []));
29341
29925
  renderedGroups = signal([], ...(ngDevMode ? [{ debugName: "renderedGroups" }] : /* istanbul ignore next */ []));
29342
29926
  mergedContext = {};
29927
+ pageThemePresetId = null;
29928
+ pageThemeDensity = null;
29929
+ pageThemeMotion = null;
29930
+ pageThemeTokenStyle = {};
29343
29931
  pageGap = '16px';
29344
29932
  gridTemplateColumns = 'minmax(0, 1fr)';
29345
29933
  gridAutoRows = 'auto';
@@ -29360,13 +29948,14 @@ class DynamicWidgetPageComponent {
29360
29948
  pageColumnCount = 1;
29361
29949
  activeTabs = {};
29362
29950
  widgetDiagnostics = {};
29363
- selectedWidgetKey = null;
29951
+ selectedWidgetKeyState = signal(null, ...(ngDevMode ? [{ debugName: "selectedWidgetKeyState" }] : /* istanbul ignore next */ []));
29364
29952
  blockedCanvasWidgetKey = null;
29365
29953
  canvasPreviewState = signal(null, ...(ngDevMode ? [{ debugName: "canvasPreviewState" }] : /* istanbul ignore next */ []));
29366
29954
  canvasPreviewInvalidState = signal(false, ...(ngDevMode ? [{ debugName: "canvasPreviewInvalidState" }] : /* istanbul ignore next */ []));
29367
29955
  transientCanvasItemsState = signal({}, ...(ngDevMode ? [{ debugName: "transientCanvasItemsState" }] : /* istanbul ignore next */ []));
29368
29956
  activeCanvasInteraction = null;
29369
29957
  appliedPersisted = false;
29958
+ destroyed = false;
29370
29959
  isHydrating = false;
29371
29960
  persistenceReady = false;
29372
29961
  warnedMissingKey = false;
@@ -29404,10 +29993,12 @@ class DynamicWidgetPageComponent {
29404
29993
  optional: true,
29405
29994
  });
29406
29995
  runtimeObservationRegistration = null;
29996
+ widgetLoaders;
29407
29997
  constructor() {
29408
29998
  this.registerRuntimeComponentObservationProvider();
29409
29999
  }
29410
30000
  ngOnDestroy() {
30001
+ this.destroyed = true;
29411
30002
  this.runtimeObservationRegistration?.destroy();
29412
30003
  this.runtimeObservationRegistration = null;
29413
30004
  this.compositionRuntime.destroy();
@@ -29514,15 +30105,19 @@ class DynamicWidgetPageComponent {
29514
30105
  }
29515
30106
  applyWidgetInputPatchToPage(page, widgetKey, evt) {
29516
30107
  const payload = evt?.payload;
29517
- const inputPatch = this.extractWidgetInputPatch(payload);
30108
+ let inputPatch = this.extractWidgetInputPatch(payload);
29518
30109
  if (!inputPatch) {
29519
- return { page, changed: false };
30110
+ inputPatch = null;
29520
30111
  }
29521
30112
  const widgets = this.cloneWidgets(page.widgets || []);
29522
30113
  const widgetIndex = widgets.findIndex((widget) => widget.key === widgetKey);
29523
30114
  if (widgetIndex < 0) {
29524
30115
  return { page, changed: false };
29525
30116
  }
30117
+ inputPatch ??= this.extractImplicitInputPatchFromChangeOutput(evt, widgets[widgetIndex]);
30118
+ if (!inputPatch) {
30119
+ return { page, changed: false };
30120
+ }
29526
30121
  const nestedPath = this.resolveWidgetInputPatchNestedPath(widgets[widgetIndex], evt);
29527
30122
  if (nestedPath?.length) {
29528
30123
  let owner = widgets[widgetIndex];
@@ -29600,7 +30195,8 @@ class DynamicWidgetPageComponent {
29600
30195
  if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
29601
30196
  return null;
29602
30197
  }
29603
- const candidate = payload.inputPatch;
30198
+ const candidate = payload.inputPatch
30199
+ ?? payload.payload?.inputPatch;
29604
30200
  if (!candidate ||
29605
30201
  typeof candidate !== 'object' ||
29606
30202
  Array.isArray(candidate)) {
@@ -29608,6 +30204,26 @@ class DynamicWidgetPageComponent {
29608
30204
  }
29609
30205
  return candidate;
29610
30206
  }
30207
+ extractImplicitInputPatchFromChangeOutput(evt, widget) {
30208
+ const output = typeof evt?.output === 'string' ? evt.output.trim() : '';
30209
+ if (!output.endsWith('Change') || output.length <= 'Change'.length) {
30210
+ return null;
30211
+ }
30212
+ const inputName = output.slice(0, -'Change'.length);
30213
+ if (!inputName) {
30214
+ return null;
30215
+ }
30216
+ const declaredInputs = widget.definition?.inputs || {};
30217
+ const hasWidgetInput = Object.prototype.hasOwnProperty.call(declaredInputs, inputName);
30218
+ const hasMetadataInput = !!this.componentMetadata
30219
+ ?.get(widget.definition?.id || '')
30220
+ ?.inputs
30221
+ ?.some((input) => input.name === inputName);
30222
+ if (!hasWidgetInput && !hasMetadataInput) {
30223
+ return null;
30224
+ }
30225
+ return { [inputName]: this.cloneStateValues(evt.payload) };
30226
+ }
29611
30227
  buildStateRuntime(state, pageContext) {
29612
30228
  return this.stateRuntime.buildRuntimeSnapshot(state, this.buildStateContext(pageContext));
29613
30229
  }
@@ -29637,11 +30253,12 @@ class DynamicWidgetPageComponent {
29637
30253
  const pageId = this.resolveRuntimePageId();
29638
30254
  const widgets = this.widgets();
29639
30255
  const widgetKeys = widgets.map((widget) => widget.key).filter(Boolean);
29640
- const selectedWidgetKey = widgetKeys.includes(this.selectedWidgetKey || '')
29641
- ? this.selectedWidgetKey
30256
+ const currentSelectedWidgetKey = this.selectedWidgetKeyState();
30257
+ const selectedWidgetKey = widgetKeys.includes(currentSelectedWidgetKey || '')
30258
+ ? currentSelectedWidgetKey
29642
30259
  : null;
29643
30260
  const warnings = [];
29644
- if (this.selectedWidgetKey && !selectedWidgetKey) {
30261
+ if (currentSelectedWidgetKey && !selectedWidgetKey) {
29645
30262
  warnings.push('selectedWidgetKey omitted because it is not present in the active composition.');
29646
30263
  }
29647
30264
  const compositionLinks = this.compositionDefinition?.links || [];
@@ -30227,6 +30844,42 @@ class DynamicWidgetPageComponent {
30227
30844
  payload,
30228
30845
  });
30229
30846
  }
30847
+ dispatchRuntimeCompositionEvent(event) {
30848
+ const page = this.ensurePageDefinition();
30849
+ if (!this.compositionDefinition || !event?.source) {
30850
+ return;
30851
+ }
30852
+ let payload;
30853
+ try {
30854
+ payload = this.cloneStateValues(event.payload);
30855
+ }
30856
+ catch (error) {
30857
+ const message = 'DynamicWidgetPageComponent could not serialize global action payload for composition dispatch. ' +
30858
+ 'Composition links only support JSON-safe payloads.';
30859
+ const wrapped = new Error(message);
30860
+ wrapped.cause = error;
30861
+ throw wrapped;
30862
+ }
30863
+ const cycle = this.compositionRuntime.dispatch({
30864
+ eventId: this.buildRuntimeEventId('global-action', event.source.kind),
30865
+ source: event.source,
30866
+ payload,
30867
+ occurredAt: event.occurredAt,
30868
+ });
30869
+ if (!cycle.matchedLinkIds.length) {
30870
+ return;
30871
+ }
30872
+ const state = this.stateFromCompositionSnapshot(page.state, cycle.snapshot.state.primaryValues);
30873
+ let widgets = this.cloneWidgets(page.widgets || []);
30874
+ widgets = this.applyCompositionWidgetDeliveries(widgets, cycle).widgets;
30875
+ widgets = this.compositionRuntime.projectStateWidgetInputs(this.compositionDefinition, {
30876
+ widgets,
30877
+ state: cycle.snapshot.state,
30878
+ now: cycle.snapshot.generatedAt,
30879
+ }).widgets;
30880
+ const runtime = this.buildStateRuntime(state, page.context);
30881
+ this.applyPageUpdate({ ...page, widgets, state }, true, runtime, false, true);
30882
+ }
30230
30883
  matchesRuntimeSourceRef(endpoint, sourceRef) {
30231
30884
  return endpoint.kind === 'component-port'
30232
30885
  && endpoint.ref.widget === sourceRef.widget
@@ -30396,19 +31049,19 @@ class DynamicWidgetPageComponent {
30396
31049
  ...widget.definition,
30397
31050
  inputs: {
30398
31051
  ...(widget.definition.inputs || {}),
30399
- hostCapabilities: this.buildRichContentHostCapabilities(widget.key, runtime),
31052
+ hostCapabilities: this.buildRichContentHostCapabilities(widget.key, runtime, widget.definition.inputs?.['context']),
30400
31053
  },
30401
31054
  },
30402
31055
  };
30403
31056
  }
30404
- buildRichContentHostCapabilities(widgetKey, runtime) {
31057
+ buildRichContentHostCapabilities(widgetKey, runtime, widgetContext) {
30405
31058
  return {
30406
- dispatchAction: (actionId, payload) => this.dispatchRichContentAction(widgetKey, actionId, payload),
31059
+ dispatchAction: (actionId, payload) => this.dispatchRichContentAction(widgetKey, actionId, payload, widgetContext),
30407
31060
  isActionAvailable: (actionId) => this.isRichContentActionAvailable(widgetKey, actionId),
30408
31061
  hasCapability: (capabilityId) => this.hasRichContentCapability(widgetKey, capabilityId, runtime),
30409
31062
  };
30410
31063
  }
30411
- dispatchRichContentAction(widgetKey, actionId, payload) {
31064
+ dispatchRichContentAction(widgetKey, actionId, payload, widgetContext) {
30412
31065
  if (!actionId) {
30413
31066
  return;
30414
31067
  }
@@ -30422,6 +31075,14 @@ class DynamicWidgetPageComponent {
30422
31075
  payload,
30423
31076
  pageContext: this.mergedContext,
30424
31077
  pageState: this.cloneStateValues(this.pageRuntime?.effectiveValues || {}),
31078
+ richContentContext: widgetContext,
31079
+ },
31080
+ runtime: {
31081
+ widgetContext,
31082
+ pageState: this.cloneStateValues(this.pageRuntime?.effectiveValues || {}),
31083
+ composition: {
31084
+ dispatch: (event) => this.dispatchRuntimeCompositionEvent(event),
31085
+ },
30425
31086
  },
30426
31087
  meta: {
30427
31088
  origin: 'dynamic-page.rich-content',
@@ -30475,7 +31136,7 @@ class DynamicWidgetPageComponent {
30475
31136
  case 'page.autoPersist.disabled':
30476
31137
  return !this.autoPersist;
30477
31138
  case 'page.widget.selected':
30478
- return this.selectedWidgetKey === widgetKey;
31139
+ return this.selectedWidgetKeyState() === widgetKey;
30479
31140
  case 'page.widget.configurable': {
30480
31141
  const widget = this.widgets().find((candidate) => candidate.key === widgetKey);
30481
31142
  const widgetType = widget?.definition?.id || '';
@@ -30872,9 +31533,12 @@ class DynamicWidgetPageComponent {
30872
31533
  ref.saved$.subscribe((result) => this.applyWidgetShell(key, result, true));
30873
31534
  }
30874
31535
  openWidgetComponentSettings(key) {
31536
+ if (this.dispatchWidgetComponentSettingsToRuntime(key)) {
31537
+ return;
31538
+ }
30875
31539
  if (!this.settingsPanel)
30876
31540
  return;
30877
- const page = this.ensurePageDefinition();
31541
+ const page = this.materializeRuntimeInputsForWidget(this.ensurePageDefinition(), key);
30878
31542
  const widget = page.widgets.find((w) => w.key === key);
30879
31543
  if (!widget)
30880
31544
  return;
@@ -30899,6 +31563,54 @@ class DynamicWidgetPageComponent {
30899
31563
  ref.applied$.subscribe((result) => this.applyWidgetComponentInputs(key, result, false));
30900
31564
  ref.saved$.subscribe((result) => this.applyWidgetComponentInputs(key, result, true));
30901
31565
  }
31566
+ materializeRuntimeInputsForWidget(page, key) {
31567
+ const normalizedKey = String(key || '').trim();
31568
+ if (!normalizedKey) {
31569
+ return page;
31570
+ }
31571
+ const widget = page.widgets?.find((candidate) => candidate.key === normalizedKey);
31572
+ if (!widget) {
31573
+ return page;
31574
+ }
31575
+ const inputNames = this.componentMetadata
31576
+ ?.get(widget.definition?.id || '')
31577
+ ?.inputs
31578
+ ?.map((input) => input.name)
31579
+ ?.filter((name) => typeof name === 'string' && !!name.trim()) || [];
31580
+ if (!inputNames.length) {
31581
+ return page;
31582
+ }
31583
+ const loader = this.findWidgetLoader(normalizedKey);
31584
+ const materializedInputs = loader?.materializedInputSnapshot(inputNames) || {};
31585
+ if (!Object.keys(materializedInputs).length) {
31586
+ return page;
31587
+ }
31588
+ const result = this.applyWidgetInputPatchToPage(page, normalizedKey, {
31589
+ sourceComponentId: widget.definition?.id,
31590
+ output: 'runtimeInputSnapshot',
31591
+ payload: {
31592
+ inputPatch: materializedInputs,
31593
+ },
31594
+ });
31595
+ if (!result.changed) {
31596
+ return page;
31597
+ }
31598
+ this.applyPageUpdate(result.page, true, undefined, true, true);
31599
+ return result.page;
31600
+ }
31601
+ findWidgetLoader(key) {
31602
+ return this.widgetLoaders?.find((loader) => loader.ownerWidgetKey === key);
31603
+ }
31604
+ dispatchWidgetComponentSettingsToRuntime(key) {
31605
+ const loader = this.findWidgetLoader(String(key || '').trim());
31606
+ if (typeof loader?.dispatchAction !== 'function') {
31607
+ return false;
31608
+ }
31609
+ return loader?.dispatchAction({
31610
+ id: 'component-settings',
31611
+ command: 'component-settings',
31612
+ }) === true;
31613
+ }
30902
31614
  applyWidgetComponentInputs(key, result, persist) {
30903
31615
  if (!result || typeof result !== 'object' || Array.isArray(result))
30904
31616
  return;
@@ -30938,16 +31650,17 @@ class DynamicWidgetPageComponent {
30938
31650
  return;
30939
31651
  }
30940
31652
  this.applyPageUpdate(this.removeWidgetReferences(page, widgetKey), true);
30941
- if (this.selectedWidgetKey === widgetKey) {
30942
- this.selectedWidgetKey = null;
31653
+ if (this.selectedWidgetKeyState() === widgetKey) {
31654
+ this.selectedWidgetKeyState.set(null);
30943
31655
  this.widgetSelectionChange.emit(null);
30944
31656
  }
30945
31657
  }
30946
31658
  removeSelectedWidget() {
30947
- if (!this.selectedWidgetKey) {
31659
+ const selectedWidgetKey = this.selectedWidgetKeyState();
31660
+ if (!selectedWidgetKey) {
30948
31661
  return;
30949
31662
  }
30950
- void this.confirmAndRemoveWidget(this.selectedWidgetKey);
31663
+ void this.confirmAndRemoveWidget(selectedWidgetKey);
30951
31664
  }
30952
31665
  removeSelectedCanvasWidget() {
30953
31666
  this.removeSelectedWidget();
@@ -31178,7 +31891,7 @@ class DynamicWidgetPageComponent {
31178
31891
  const layoutPreset = pageDefinition
31179
31892
  ? this.resolveLayoutPresetDefinition(pageDefinition)
31180
31893
  : undefined;
31181
- return {
31894
+ const merged = {
31182
31895
  ...baseContext,
31183
31896
  ...(inputContext || {}),
31184
31897
  pageDeviceKind: this.resolveDeviceKind(),
@@ -31192,6 +31905,53 @@ class DynamicWidgetPageComponent {
31192
31905
  pageStateDerived: this.cloneStateValues(runtime.derivedValues),
31193
31906
  pageStateEffective: this.cloneStateValues(runtime.effectiveValues),
31194
31907
  };
31908
+ this.syncThemePresentation(themePreset);
31909
+ return this.projectThemeDefaultsIntoContext(merged, themePreset);
31910
+ }
31911
+ syncThemePresentation(themePreset) {
31912
+ this.pageThemePresetId = themePreset?.id || null;
31913
+ this.pageThemeDensity = themePreset?.density || null;
31914
+ this.pageThemeMotion = themePreset?.motion || null;
31915
+ this.pageThemeTokenStyle = this.normalizeThemeTokens(themePreset?.tokens);
31916
+ }
31917
+ normalizeThemeTokens(tokens) {
31918
+ if (!tokens)
31919
+ return {};
31920
+ const out = {};
31921
+ for (const [key, value] of Object.entries(tokens)) {
31922
+ if (!key.startsWith('--'))
31923
+ continue;
31924
+ if (typeof value !== 'string')
31925
+ continue;
31926
+ out[key] = value;
31927
+ }
31928
+ return out;
31929
+ }
31930
+ toPlainObject(value) {
31931
+ return value && typeof value === 'object' && !Array.isArray(value)
31932
+ ? { ...value }
31933
+ : {};
31934
+ }
31935
+ projectThemeDefaultsIntoContext(context, themePreset) {
31936
+ const shellPreset = themePreset?.shellPreset?.trim();
31937
+ if (!shellPreset)
31938
+ return context;
31939
+ const ui = this.toPlainObject(context['ui']);
31940
+ const shell = this.toPlainObject(ui['shell']);
31941
+ if (typeof shell['preset'] === 'string' && shell['preset'].trim()) {
31942
+ return context;
31943
+ }
31944
+ return {
31945
+ ...context,
31946
+ ui: {
31947
+ ...ui,
31948
+ shell: {
31949
+ ...shell,
31950
+ preset: shellPreset,
31951
+ presetSource: 'theme',
31952
+ },
31953
+ },
31954
+ };
31195
31955
  }
31196
31956
  onWindowResize() {
31197
31957
  if (!this.pageDefinition)
@@ -31464,8 +32224,8 @@ class DynamicWidgetPageComponent {
31464
32224
  selectWidget(widgetKey) {
31465
32225
  if (!this.enableCustomization)
31466
32226
  return;
31467
- if (this.selectedWidgetKey !== widgetKey) {
31468
- this.selectedWidgetKey = widgetKey;
32227
+ if (this.selectedWidgetKeyState() !== widgetKey) {
32228
+ this.selectedWidgetKeyState.set(widgetKey);
31469
32229
  this.widgetSelectionChange.emit(widgetKey);
31470
32230
  }
31471
32231
  if (this.blockedCanvasWidgetKey &&
@@ -31477,13 +32237,21 @@ class DynamicWidgetPageComponent {
31477
32237
  if (this.shouldPreserveInnerWidgetInteraction(event)) {
31478
32238
  return;
31479
32239
  }
32240
+ if (event.type === 'focusin') {
32241
+ setTimeout(() => {
32242
+ if (!this.destroyed) {
32243
+ this.selectWidget(widgetKey);
32244
+ }
32245
+ }, 0);
32246
+ return;
32247
+ }
31480
32248
  this.selectWidget(widgetKey);
31481
32249
  }
31482
32250
  isCanvasWidgetSelected(widgetKey) {
31483
32251
  return this.isWidgetSelected(widgetKey);
31484
32252
  }
31485
32253
  isWidgetSelected(widgetKey) {
31486
- return this.selectedWidgetKey === widgetKey;
32254
+ return this.selectedWidgetKeyState() === widgetKey;
31487
32255
  }
31488
32256
  shouldPreserveInnerWidgetInteraction(event) {
31489
32257
  if (!this.enableCustomization)
@@ -32427,8 +33195,15 @@ class DynamicWidgetPageComponent {
32427
33195
  throw new Error('DynamicWidgetPageComponent no longer accepts `page.connections`. Use `composition.links` only.');
32428
33196
  }
32429
33197
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicWidgetPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32430
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicWidgetPageComponent, isStandalone: true, selector: "praxis-dynamic-page", inputs: { page: "page", context: "context", strictValidation: "strictValidation", enableCustomization: "enableCustomization", showPageSettingsButton: "showPageSettingsButton", shellEditorComponent: "shellEditorComponent", pageEditorComponent: "pageEditorComponent", autoPersist: "autoPersist", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId", showWidgetAssistantButton: "showWidgetAssistantButton" }, outputs: { pageChange: "pageChange", widgetEvent: "widgetEvent", widgetSelectionChange: "widgetSelectionChange", widgetAssistantRequested: "widgetAssistantRequested", widgetDiagnosticsChange: "widgetDiagnosticsChange" }, host: { listeners: { "window:resize": "onWindowResize()", "window:pointermove": "onCanvasPointerMove($event)", "window:pointerup": "onCanvasPointerUp($event)", "window:pointercancel": "onCanvasPointerCancel($event)" } }, providers: [providePraxisI18nConfig(DYNAMIC_WIDGET_PAGE_I18N_CONFIG)], viewQueries: [{ propertyName: "pageCanvasHost", first: true, predicate: ["pageCanvasHost"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
32431
- <div class="pdx-page-wrapper" [class.editing]="enableCustomization">
33198
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicWidgetPageComponent, isStandalone: true, selector: "praxis-dynamic-page", inputs: { page: "page", context: "context", strictValidation: "strictValidation", enableCustomization: "enableCustomization", showPageSettingsButton: "showPageSettingsButton", shellEditorComponent: "shellEditorComponent", pageEditorComponent: "pageEditorComponent", autoPersist: "autoPersist", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId", showWidgetAssistantButton: "showWidgetAssistantButton" }, outputs: { pageChange: "pageChange", widgetEvent: "widgetEvent", widgetSelectionChange: "widgetSelectionChange", widgetAssistantRequested: "widgetAssistantRequested", widgetDiagnosticsChange: "widgetDiagnosticsChange" }, host: { listeners: { "window:resize": "onWindowResize()", "window:pointermove": "onCanvasPointerMove($event)", "window:pointerup": "onCanvasPointerUp($event)", "window:pointercancel": "onCanvasPointerCancel($event)" } }, providers: [providePraxisI18nConfig(DYNAMIC_WIDGET_PAGE_I18N_CONFIG)], viewQueries: [{ propertyName: "pageCanvasHost", first: true, predicate: ["pageCanvasHost"], descendants: true }, { propertyName: "widgetLoaders", predicate: ["widgetLoader"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
33199
+ <div
33200
+ class="pdx-page-wrapper"
33201
+ [class.editing]="enableCustomization"
33202
+ [attr.data-theme-preset]="pageThemePresetId"
33203
+ [attr.data-density]="pageThemeDensity"
33204
+ [attr.data-motion]="pageThemeMotion"
33205
+ [ngStyle]="pageThemeTokenStyle"
33206
+ >
32432
33207
  @if (enableCustomization && showPageSettingsButton) {
32433
33208
  <button
32434
33209
  class="pdx-page-settings"
@@ -32454,6 +33229,7 @@ class DynamicWidgetPageComponent {
32454
33229
  @for (w of widgets(); track w.key) {
32455
33230
  <div
32456
33231
  class="pdx-widget pdx-widget--canvas"
33232
+ [attr.data-widget-key]="w.key"
32457
33233
  [class.pdx-widget--interactive]="enableCustomization"
32458
33234
  [class.pdx-widget--selected]="
32459
33235
  enableCustomization && isWidgetSelected(w.key)
@@ -32502,6 +33278,7 @@ class DynamicWidgetPageComponent {
32502
33278
  >
32503
33279
  <ng-container
32504
33280
  [dynamicWidgetLoader]="w.definition"
33281
+ #widgetLoader="dynamicWidgetLoader"
32505
33282
  [ownerWidgetKey]="w.key"
32506
33283
  [context]="mergedContext"
32507
33284
  [strictValidation]="strictValidation"
@@ -32590,6 +33367,7 @@ class DynamicWidgetPageComponent {
32590
33367
  @for (w of tab.widgets; track w.key) {
32591
33368
  <div
32592
33369
  class="pdx-widget"
33370
+ [attr.data-widget-key]="w.key"
32593
33371
  [class.pdx-widget--interactive]="enableCustomization"
32594
33372
  [class.pdx-widget--selected]="
32595
33373
  enableCustomization && isWidgetSelected(w.key)
@@ -32606,6 +33384,7 @@ class DynamicWidgetPageComponent {
32606
33384
  >
32607
33385
  <ng-container
32608
33386
  [dynamicWidgetLoader]="w.definition"
33387
+ #widgetLoader="dynamicWidgetLoader"
32609
33388
  [ownerWidgetKey]="w.key"
32610
33389
  [context]="mergedContext"
32611
33390
  [strictValidation]="strictValidation"
@@ -32654,6 +33433,7 @@ class DynamicWidgetPageComponent {
32654
33433
  @for (w of group.widgets; track w.key) {
32655
33434
  <div
32656
33435
  class="pdx-widget"
33436
+ [attr.data-widget-key]="w.key"
32657
33437
  [class.pdx-widget--interactive]="enableCustomization"
32658
33438
  [class.pdx-widget--selected]="
32659
33439
  enableCustomization && isWidgetSelected(w.key)
@@ -32670,6 +33450,7 @@ class DynamicWidgetPageComponent {
32670
33450
  >
32671
33451
  <ng-container
32672
33452
  [dynamicWidgetLoader]="w.definition"
33453
+ #widgetLoader="dynamicWidgetLoader"
32673
33454
  [ownerWidgetKey]="w.key"
32674
33455
  [context]="mergedContext"
32675
33456
  [strictValidation]="strictValidation"
@@ -32710,6 +33491,7 @@ class DynamicWidgetPageComponent {
32710
33491
  @for (w of widgets(); track w.key) {
32711
33492
  <div
32712
33493
  class="pdx-widget"
33494
+ [attr.data-widget-key]="w.key"
32713
33495
  [class.pdx-widget--interactive]="enableCustomization"
32714
33496
  [class.pdx-widget--selected]="
32715
33497
  enableCustomization && isWidgetSelected(w.key)
@@ -32726,6 +33508,7 @@ class DynamicWidgetPageComponent {
32726
33508
  >
32727
33509
  <ng-container
32728
33510
  [dynamicWidgetLoader]="w.definition"
33511
+ #widgetLoader="dynamicWidgetLoader"
32729
33512
  [ownerWidgetKey]="w.key"
32730
33513
  [context]="mergedContext"
32731
33514
  [strictValidation]="strictValidation"
@@ -32766,7 +33549,7 @@ class DynamicWidgetPageComponent {
32766
33549
  </div>
32767
33550
  }
32768
33551
  </div>
32769
- `, isInline: true, styles: [".pdx-page-wrapper{position:relative;display:block}.pdx-page{display:grid;gap:12px;grid-template-columns:minmax(0,1fr)}.pdx-page--canvas{align-items:start;grid-auto-flow:dense}.pdx-page-settings{position:sticky;top:8px;z-index:2;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:inherit;border-radius:12px;width:36px;height:36px;margin-bottom:6px}.pdx-widget{position:relative;background:var(--pfx-surface, transparent);border-radius:6px;min-width:0;min-height:0}.pdx-widget--interactive{cursor:pointer}.pdx-widget--selected:before{content:\"\";position:absolute;inset:0;border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);border-radius:14px;pointer-events:none;z-index:1;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent)}.pdx-widget--canvas{align-self:stretch;--pdx-resize-gradient-horizontal: linear-gradient( 90deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-vertical: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-se: linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-sw: linear-gradient( 225deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-widget--canvas:after{content:\"\";position:absolute;inset:0;padding:2px;border-radius:14px;background:var(--pdx-active-resize-gradient);opacity:0;pointer-events:none;transition:opacity .14s ease,filter .14s ease;filter:saturate(1.02) drop-shadow(0 0 5px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude}.pdx-widget--canvas-selected:before,.pdx-widget--canvas-blocked:before{content:\"\";position:absolute;inset:0;border-radius:14px;pointer-events:none;z-index:1;transition:opacity .14s ease,box-shadow .14s ease,border-color .14s ease}.pdx-widget--canvas-blocked:before{border:1px solid color-mix(in srgb,var(--md-sys-color-error) 74%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 20%,transparent),0 10px 24px color-mix(in srgb,var(--md-sys-color-error) 12%,transparent)}.pdx-widget--canvas:has(.pdx-canvas-resize:hover):after,.pdx-widget--canvas:has(.pdx-canvas-resize:focus-visible):after{opacity:.82}.pdx-widget--canvas:has(.pdx-canvas-resize--north:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-horizontal)}.pdx-widget--canvas:has(.pdx-canvas-resize--east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-vertical)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-sw)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize{position:absolute;z-index:7;border:0;padding:0;margin:0;background:transparent;touch-action:none;cursor:pointer;opacity:0;pointer-events:none;transform:scale(.94);transition:opacity .14s ease,transform .14s ease,filter .14s ease;filter:saturate(.9)}.pdx-widget--canvas:hover .pdx-canvas-resize,.pdx-widget--canvas:focus-within .pdx-canvas-resize,.pdx-widget--canvas-selected .pdx-canvas-resize{opacity:.88;pointer-events:auto;transform:scale(1);filter:saturate(1)}.pdx-widget--canvas:has(.pdx-shell.expanded) .pdx-canvas-resize,.pdx-widget--canvas:has(.pdx-shell.fullscreen) .pdx-canvas-resize{opacity:0;pointer-events:none;transform:scale(.94)}.pdx-canvas-resize-grip{display:block;width:9px;height:9px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant) 58%);background:color-mix(in srgb,var(--md-sys-color-surface) 92%,var(--md-sys-color-primary) 8%);box-shadow:0 1px 4px color-mix(in srgb,var(--md-sys-color-shadow) 10%,transparent);transition:transform .14s ease,border-color .14s ease,background .14s ease,box-shadow .14s ease}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant) 42%);background:color-mix(in srgb,var(--md-sys-color-surface) 84%,var(--md-sys-color-primary) 16%);box-shadow:0 2px 7px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:scale(1.04)}.pdx-canvas-resize--north,.pdx-canvas-resize--south{left:50%;width:40px;height:18px;margin-left:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north{top:-8px;cursor:ns-resize}.pdx-canvas-resize--south{bottom:-8px;cursor:ns-resize}.pdx-canvas-resize--east,.pdx-canvas-resize--west{top:50%;width:18px;height:40px;margin-top:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--east{right:-8px;cursor:ew-resize}.pdx-canvas-resize--west{left:-8px;cursor:ew-resize}.pdx-canvas-resize--north-east,.pdx-canvas-resize--north-west,.pdx-canvas-resize--south-east,.pdx-canvas-resize--south-west{width:18px;height:18px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north-east{top:-8px;right:-8px;cursor:nesw-resize}.pdx-canvas-resize--north-west{top:-8px;left:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-east{bottom:-8px;right:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-west{bottom:-8px;left:-8px;cursor:nesw-resize}.pdx-canvas-snap-preview{position:relative;align-self:stretch;border-radius:12px;pointer-events:none;z-index:0;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent),color-mix(in srgb,var(--md-sys-color-tertiary) 12%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 42%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 55%,transparent);animation:pdx-snap-preview-pulse .48s ease-out infinite alternate}.pdx-canvas-snap-preview:before,.pdx-canvas-snap-preview:after{content:\"\";position:absolute;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary) 82%,var(--md-sys-color-tertiary) 18%);opacity:.72}.pdx-canvas-snap-preview:before{inset:0 auto 0 0;width:3px}.pdx-canvas-snap-preview:after{inset:0 0 auto;height:3px}.pdx-canvas-snap-preview--invalid{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-error) 18%,transparent),color-mix(in srgb,var(--md-sys-color-error-container) 22%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 58%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 40%,transparent)}.pdx-canvas-snap-preview--invalid:before,.pdx-canvas-snap-preview--invalid:after{background:color-mix(in srgb,var(--md-sys-color-error) 86%,var(--md-sys-color-error-container) 14%)}.pdx-canvas-resize:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:transparent;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent),var(--mat-elevation-level3)}.pdx-canvas-resize--north:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-horizontal)}.pdx-canvas-resize--east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-vertical)}.pdx-canvas-resize--north-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-sw)}.pdx-canvas-resize--north-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-west:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{transform:scale(1.08)}@keyframes pdx-snap-preview-pulse{0%{opacity:.72;transform:scale(.996)}to{opacity:1;transform:scale(1)}}.pdx-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pdx-group{display:grid;gap:12px;grid-column:1 / -1;padding:12px;border-radius:16px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 76%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent)}.pdx-group--hero{padding:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 42%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-low) 86%,transparent))}.pdx-group--rail{align-self:start}.pdx-group-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.pdx-group-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.pdx-group-content{display:grid;gap:12px}.pdx-group-content--stack{grid-template-columns:minmax(0,1fr)}.pdx-group-content--row{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.pdx-group-content--grid{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.pdx-group-tabs{display:grid;gap:12px}.pdx-tabs-header{display:flex;flex-wrap:wrap;gap:8px}.pdx-tab-chip{appearance:none;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest);color:var(--md-sys-color-on-surface);border-radius:999px;padding:8px 12px;font:inherit;cursor:pointer}.pdx-tab-chip.active{border-color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 78%,transparent);color:var(--md-sys-color-on-primary-container)}.pdx-page-wrapper.editing .pdx-widget-settings{opacity:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: DynamicWidgetContextToolbarComponent, selector: "praxis-dynamic-widget-context-toolbar", inputs: ["toolbarLabel", "contextLabel", "contextTooltip", "showAssistant", "assistantLabel", "assistantTooltip", "showComponentSettings", "componentSettingsLabel", "componentSettingsTooltip", "showShellSettings", "shellSettingsLabel", "shellSettingsTooltip", "moreActionsLabel", "removeLabel"], outputs: ["assistant", "componentSettings", "shellSettings", "remove"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: WidgetShellComponent, selector: "praxis-widget-shell", inputs: ["shell", "context", "dragSurfaceEnabled", "dragSurfaceLabel"], outputs: ["action", "dragSurfacePointerDown", "dragSurfaceKeydown"] }] });
33552
+ `, isInline: true, styles: [".pdx-page-wrapper{position:relative;display:block;background:var(--pdx-page-bg, transparent);color:var(--pdx-page-color, inherit)}.pdx-page{display:grid;gap:var(--pdx-page-gap, 12px);grid-template-columns:minmax(0,1fr)}.pdx-page--canvas{align-items:start;grid-auto-flow:dense}.pdx-page-wrapper.editing .pdx-page--canvas{padding-block-start:var(--pdx-canvas-context-toolbar-safe-area, 22px)}.pdx-page-settings{position:sticky;top:8px;z-index:2;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:inherit;border-radius:12px;width:36px;height:36px;margin-bottom:6px}.pdx-widget{position:relative;background:var(--pfx-surface, transparent);border-radius:6px;min-width:0;min-height:0}.pdx-widget--interactive{cursor:pointer}.pdx-widget--selected:before{content:\"\";position:absolute;inset:0;border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);border-radius:14px;pointer-events:none;z-index:1;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent)}.pdx-widget--canvas{align-self:stretch;--pdx-resize-gradient-horizontal: linear-gradient( 90deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-vertical: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-se: linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-sw: linear-gradient( 225deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-widget--canvas:after{content:\"\";position:absolute;inset:0;padding:2px;border-radius:14px;background:var(--pdx-active-resize-gradient);opacity:0;pointer-events:none;transition:opacity .14s ease,filter .14s ease;filter:saturate(1.02) drop-shadow(0 0 5px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude}.pdx-widget--canvas-selected:before,.pdx-widget--canvas-blocked:before{content:\"\";position:absolute;inset:0;border-radius:14px;pointer-events:none;z-index:1;transition:opacity .14s ease,box-shadow .14s ease,border-color .14s ease}.pdx-widget--canvas-blocked:before{border:1px solid color-mix(in srgb,var(--md-sys-color-error) 74%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 20%,transparent),0 10px 24px color-mix(in srgb,var(--md-sys-color-error) 12%,transparent)}.pdx-widget--canvas:has(.pdx-canvas-resize:hover):after,.pdx-widget--canvas:has(.pdx-canvas-resize:focus-visible):after{opacity:.82}.pdx-widget--canvas:has(.pdx-canvas-resize--north:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-horizontal)}.pdx-widget--canvas:has(.pdx-canvas-resize--east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-vertical)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-sw)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize{position:absolute;z-index:7;border:0;padding:0;margin:0;background:transparent;touch-action:none;cursor:pointer;opacity:0;pointer-events:none;transform:scale(.94);transition:opacity .14s ease,transform .14s ease,filter .14s ease;filter:saturate(.9)}.pdx-widget--canvas:hover .pdx-canvas-resize,.pdx-widget--canvas:focus-within .pdx-canvas-resize,.pdx-widget--canvas-selected .pdx-canvas-resize{opacity:.88;pointer-events:auto;transform:scale(1);filter:saturate(1)}.pdx-widget--canvas:has(.pdx-shell.expanded) .pdx-canvas-resize,.pdx-widget--canvas:has(.pdx-shell.fullscreen) .pdx-canvas-resize{opacity:0;pointer-events:none;transform:scale(.94)}.pdx-canvas-resize-grip{display:block;width:9px;height:9px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant) 58%);background:color-mix(in srgb,var(--md-sys-color-surface) 92%,var(--md-sys-color-primary) 8%);box-shadow:0 1px 4px color-mix(in srgb,var(--md-sys-color-shadow) 10%,transparent);transition:transform .14s ease,border-color .14s ease,background .14s ease,box-shadow .14s ease}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant) 42%);background:color-mix(in srgb,var(--md-sys-color-surface) 84%,var(--md-sys-color-primary) 16%);box-shadow:0 2px 7px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:scale(1.04)}.pdx-canvas-resize--north,.pdx-canvas-resize--south{left:50%;width:40px;height:18px;margin-left:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north{top:-8px;cursor:ns-resize}.pdx-canvas-resize--south{bottom:-8px;cursor:ns-resize}.pdx-canvas-resize--east,.pdx-canvas-resize--west{top:50%;width:18px;height:40px;margin-top:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--east{right:-8px;cursor:ew-resize}.pdx-canvas-resize--west{left:-8px;cursor:ew-resize}.pdx-canvas-resize--north-east,.pdx-canvas-resize--north-west,.pdx-canvas-resize--south-east,.pdx-canvas-resize--south-west{width:18px;height:18px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north-east{top:-8px;right:-8px;cursor:nesw-resize}.pdx-canvas-resize--north-west{top:-8px;left:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-east{bottom:-8px;right:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-west{bottom:-8px;left:-8px;cursor:nesw-resize}.pdx-canvas-snap-preview{position:relative;align-self:stretch;border-radius:12px;pointer-events:none;z-index:0;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent),color-mix(in srgb,var(--md-sys-color-tertiary) 12%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 42%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 55%,transparent);animation:pdx-snap-preview-pulse .48s ease-out infinite alternate}.pdx-canvas-snap-preview:before,.pdx-canvas-snap-preview:after{content:\"\";position:absolute;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary) 82%,var(--md-sys-color-tertiary) 18%);opacity:.72}.pdx-canvas-snap-preview:before{inset:0 auto 0 0;width:3px}.pdx-canvas-snap-preview:after{inset:0 0 auto;height:3px}.pdx-canvas-snap-preview--invalid{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-error) 18%,transparent),color-mix(in srgb,var(--md-sys-color-error-container) 22%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 58%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 40%,transparent)}.pdx-canvas-snap-preview--invalid:before,.pdx-canvas-snap-preview--invalid:after{background:color-mix(in srgb,var(--md-sys-color-error) 86%,var(--md-sys-color-error-container) 14%)}.pdx-canvas-resize:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:transparent;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent),var(--mat-elevation-level3)}.pdx-canvas-resize--north:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-horizontal)}.pdx-canvas-resize--east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-vertical)}.pdx-canvas-resize--north-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-sw)}.pdx-canvas-resize--north-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-west:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{transform:scale(1.08)}@keyframes pdx-snap-preview-pulse{0%{opacity:.72;transform:scale(.996)}to{opacity:1;transform:scale(1)}}.pdx-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pdx-group{display:grid;gap:12px;grid-column:1 / -1;padding:12px;border-radius:16px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 76%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent)}.pdx-group--hero{padding:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 42%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-low) 86%,transparent))}.pdx-group--rail{align-self:start}.pdx-group-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.pdx-group-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.pdx-group-content{display:grid;gap:12px}.pdx-group-content--stack{grid-template-columns:minmax(0,1fr)}.pdx-group-content--row{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.pdx-group-content--grid{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.pdx-group-tabs{display:grid;gap:12px}.pdx-tabs-header{display:flex;flex-wrap:wrap;gap:8px}.pdx-tab-chip{appearance:none;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest);color:var(--md-sys-color-on-surface);border-radius:999px;padding:8px 12px;font:inherit;cursor:pointer}.pdx-tab-chip.active{border-color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 78%,transparent);color:var(--md-sys-color-on-primary-container)}.pdx-page-wrapper.editing .pdx-widget-settings{opacity:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: DynamicWidgetContextToolbarComponent, selector: "praxis-dynamic-widget-context-toolbar", inputs: ["toolbarLabel", "contextLabel", "contextTooltip", "showAssistant", "assistantLabel", "assistantTooltip", "showComponentSettings", "componentSettingsLabel", "componentSettingsTooltip", "showShellSettings", "shellSettingsLabel", "shellSettingsTooltip", "moreActionsLabel", "removeLabel"], outputs: ["assistant", "componentSettings", "shellSettings", "remove"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: WidgetShellComponent, selector: "praxis-widget-shell", inputs: ["shell", "context", "dragSurfaceEnabled", "dragSurfaceLabel"], outputs: ["action", "dragSurfacePointerDown", "dragSurfaceKeydown"] }] });
32770
33553
  }
32771
33554
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicWidgetPageComponent, decorators: [{
32772
33555
  type: Component,
@@ -32779,7 +33562,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
32779
33562
  DynamicWidgetLoaderDirective,
32780
33563
  WidgetShellComponent,
32781
33564
  ], providers: [providePraxisI18nConfig(DYNAMIC_WIDGET_PAGE_I18N_CONFIG)], template: `
32782
- <div class="pdx-page-wrapper" [class.editing]="enableCustomization">
33565
+ <div
33566
+ class="pdx-page-wrapper"
33567
+ [class.editing]="enableCustomization"
33568
+ [attr.data-theme-preset]="pageThemePresetId"
33569
+ [attr.data-density]="pageThemeDensity"
33570
+ [attr.data-motion]="pageThemeMotion"
33571
+ [ngStyle]="pageThemeTokenStyle"
33572
+ >
32783
33573
  @if (enableCustomization && showPageSettingsButton) {
32784
33574
  <button
32785
33575
  class="pdx-page-settings"
@@ -32805,6 +33595,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
32805
33595
  @for (w of widgets(); track w.key) {
32806
33596
  <div
32807
33597
  class="pdx-widget pdx-widget--canvas"
33598
+ [attr.data-widget-key]="w.key"
32808
33599
  [class.pdx-widget--interactive]="enableCustomization"
32809
33600
  [class.pdx-widget--selected]="
32810
33601
  enableCustomization && isWidgetSelected(w.key)
@@ -32853,6 +33644,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
32853
33644
  >
32854
33645
  <ng-container
32855
33646
  [dynamicWidgetLoader]="w.definition"
33647
+ #widgetLoader="dynamicWidgetLoader"
32856
33648
  [ownerWidgetKey]="w.key"
32857
33649
  [context]="mergedContext"
32858
33650
  [strictValidation]="strictValidation"
@@ -32941,6 +33733,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
32941
33733
  @for (w of tab.widgets; track w.key) {
32942
33734
  <div
32943
33735
  class="pdx-widget"
33736
+ [attr.data-widget-key]="w.key"
32944
33737
  [class.pdx-widget--interactive]="enableCustomization"
32945
33738
  [class.pdx-widget--selected]="
32946
33739
  enableCustomization && isWidgetSelected(w.key)
@@ -32957,6 +33750,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
32957
33750
  >
32958
33751
  <ng-container
32959
33752
  [dynamicWidgetLoader]="w.definition"
33753
+ #widgetLoader="dynamicWidgetLoader"
32960
33754
  [ownerWidgetKey]="w.key"
32961
33755
  [context]="mergedContext"
32962
33756
  [strictValidation]="strictValidation"
@@ -33005,6 +33799,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33005
33799
  @for (w of group.widgets; track w.key) {
33006
33800
  <div
33007
33801
  class="pdx-widget"
33802
+ [attr.data-widget-key]="w.key"
33008
33803
  [class.pdx-widget--interactive]="enableCustomization"
33009
33804
  [class.pdx-widget--selected]="
33010
33805
  enableCustomization && isWidgetSelected(w.key)
@@ -33021,6 +33816,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33021
33816
  >
33022
33817
  <ng-container
33023
33818
  [dynamicWidgetLoader]="w.definition"
33819
+ #widgetLoader="dynamicWidgetLoader"
33024
33820
  [ownerWidgetKey]="w.key"
33025
33821
  [context]="mergedContext"
33026
33822
  [strictValidation]="strictValidation"
@@ -33061,6 +33857,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33061
33857
  @for (w of widgets(); track w.key) {
33062
33858
  <div
33063
33859
  class="pdx-widget"
33860
+ [attr.data-widget-key]="w.key"
33064
33861
  [class.pdx-widget--interactive]="enableCustomization"
33065
33862
  [class.pdx-widget--selected]="
33066
33863
  enableCustomization && isWidgetSelected(w.key)
@@ -33077,6 +33874,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33077
33874
  >
33078
33875
  <ng-container
33079
33876
  [dynamicWidgetLoader]="w.definition"
33877
+ #widgetLoader="dynamicWidgetLoader"
33080
33878
  [ownerWidgetKey]="w.key"
33081
33879
  [context]="mergedContext"
33082
33880
  [strictValidation]="strictValidation"
@@ -33117,7 +33915,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33117
33915
  </div>
33118
33916
  }
33119
33917
  </div>
33120
- `, styles: [".pdx-page-wrapper{position:relative;display:block}.pdx-page{display:grid;gap:12px;grid-template-columns:minmax(0,1fr)}.pdx-page--canvas{align-items:start;grid-auto-flow:dense}.pdx-page-settings{position:sticky;top:8px;z-index:2;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:inherit;border-radius:12px;width:36px;height:36px;margin-bottom:6px}.pdx-widget{position:relative;background:var(--pfx-surface, transparent);border-radius:6px;min-width:0;min-height:0}.pdx-widget--interactive{cursor:pointer}.pdx-widget--selected:before{content:\"\";position:absolute;inset:0;border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);border-radius:14px;pointer-events:none;z-index:1;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent)}.pdx-widget--canvas{align-self:stretch;--pdx-resize-gradient-horizontal: linear-gradient( 90deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-vertical: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-se: linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-sw: linear-gradient( 225deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-widget--canvas:after{content:\"\";position:absolute;inset:0;padding:2px;border-radius:14px;background:var(--pdx-active-resize-gradient);opacity:0;pointer-events:none;transition:opacity .14s ease,filter .14s ease;filter:saturate(1.02) drop-shadow(0 0 5px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude}.pdx-widget--canvas-selected:before,.pdx-widget--canvas-blocked:before{content:\"\";position:absolute;inset:0;border-radius:14px;pointer-events:none;z-index:1;transition:opacity .14s ease,box-shadow .14s ease,border-color .14s ease}.pdx-widget--canvas-blocked:before{border:1px solid color-mix(in srgb,var(--md-sys-color-error) 74%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 20%,transparent),0 10px 24px color-mix(in srgb,var(--md-sys-color-error) 12%,transparent)}.pdx-widget--canvas:has(.pdx-canvas-resize:hover):after,.pdx-widget--canvas:has(.pdx-canvas-resize:focus-visible):after{opacity:.82}.pdx-widget--canvas:has(.pdx-canvas-resize--north:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-horizontal)}.pdx-widget--canvas:has(.pdx-canvas-resize--east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-vertical)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-sw)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize{position:absolute;z-index:7;border:0;padding:0;margin:0;background:transparent;touch-action:none;cursor:pointer;opacity:0;pointer-events:none;transform:scale(.94);transition:opacity .14s ease,transform .14s ease,filter .14s ease;filter:saturate(.9)}.pdx-widget--canvas:hover .pdx-canvas-resize,.pdx-widget--canvas:focus-within .pdx-canvas-resize,.pdx-widget--canvas-selected .pdx-canvas-resize{opacity:.88;pointer-events:auto;transform:scale(1);filter:saturate(1)}.pdx-widget--canvas:has(.pdx-shell.expanded) .pdx-canvas-resize,.pdx-widget--canvas:has(.pdx-shell.fullscreen) .pdx-canvas-resize{opacity:0;pointer-events:none;transform:scale(.94)}.pdx-canvas-resize-grip{display:block;width:9px;height:9px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant) 58%);background:color-mix(in srgb,var(--md-sys-color-surface) 92%,var(--md-sys-color-primary) 8%);box-shadow:0 1px 4px color-mix(in srgb,var(--md-sys-color-shadow) 10%,transparent);transition:transform .14s ease,border-color .14s ease,background .14s ease,box-shadow .14s ease}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant) 42%);background:color-mix(in srgb,var(--md-sys-color-surface) 84%,var(--md-sys-color-primary) 16%);box-shadow:0 2px 7px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:scale(1.04)}.pdx-canvas-resize--north,.pdx-canvas-resize--south{left:50%;width:40px;height:18px;margin-left:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north{top:-8px;cursor:ns-resize}.pdx-canvas-resize--south{bottom:-8px;cursor:ns-resize}.pdx-canvas-resize--east,.pdx-canvas-resize--west{top:50%;width:18px;height:40px;margin-top:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--east{right:-8px;cursor:ew-resize}.pdx-canvas-resize--west{left:-8px;cursor:ew-resize}.pdx-canvas-resize--north-east,.pdx-canvas-resize--north-west,.pdx-canvas-resize--south-east,.pdx-canvas-resize--south-west{width:18px;height:18px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north-east{top:-8px;right:-8px;cursor:nesw-resize}.pdx-canvas-resize--north-west{top:-8px;left:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-east{bottom:-8px;right:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-west{bottom:-8px;left:-8px;cursor:nesw-resize}.pdx-canvas-snap-preview{position:relative;align-self:stretch;border-radius:12px;pointer-events:none;z-index:0;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent),color-mix(in srgb,var(--md-sys-color-tertiary) 12%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 42%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 55%,transparent);animation:pdx-snap-preview-pulse .48s ease-out infinite alternate}.pdx-canvas-snap-preview:before,.pdx-canvas-snap-preview:after{content:\"\";position:absolute;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary) 82%,var(--md-sys-color-tertiary) 18%);opacity:.72}.pdx-canvas-snap-preview:before{inset:0 auto 0 0;width:3px}.pdx-canvas-snap-preview:after{inset:0 0 auto;height:3px}.pdx-canvas-snap-preview--invalid{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-error) 18%,transparent),color-mix(in srgb,var(--md-sys-color-error-container) 22%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 58%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 40%,transparent)}.pdx-canvas-snap-preview--invalid:before,.pdx-canvas-snap-preview--invalid:after{background:color-mix(in srgb,var(--md-sys-color-error) 86%,var(--md-sys-color-error-container) 14%)}.pdx-canvas-resize:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:transparent;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent),var(--mat-elevation-level3)}.pdx-canvas-resize--north:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-horizontal)}.pdx-canvas-resize--east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-vertical)}.pdx-canvas-resize--north-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-sw)}.pdx-canvas-resize--north-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-west:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{transform:scale(1.08)}@keyframes pdx-snap-preview-pulse{0%{opacity:.72;transform:scale(.996)}to{opacity:1;transform:scale(1)}}.pdx-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pdx-group{display:grid;gap:12px;grid-column:1 / -1;padding:12px;border-radius:16px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 76%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent)}.pdx-group--hero{padding:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 42%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-low) 86%,transparent))}.pdx-group--rail{align-self:start}.pdx-group-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.pdx-group-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.pdx-group-content{display:grid;gap:12px}.pdx-group-content--stack{grid-template-columns:minmax(0,1fr)}.pdx-group-content--row{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.pdx-group-content--grid{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.pdx-group-tabs{display:grid;gap:12px}.pdx-tabs-header{display:flex;flex-wrap:wrap;gap:8px}.pdx-tab-chip{appearance:none;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest);color:var(--md-sys-color-on-surface);border-radius:999px;padding:8px 12px;font:inherit;cursor:pointer}.pdx-tab-chip.active{border-color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 78%,transparent);color:var(--md-sys-color-on-primary-container)}.pdx-page-wrapper.editing .pdx-widget-settings{opacity:1}\n"] }]
33918
+ `, styles: [".pdx-page-wrapper{position:relative;display:block;background:var(--pdx-page-bg, transparent);color:var(--pdx-page-color, inherit)}.pdx-page{display:grid;gap:var(--pdx-page-gap, 12px);grid-template-columns:minmax(0,1fr)}.pdx-page--canvas{align-items:start;grid-auto-flow:dense}.pdx-page-wrapper.editing .pdx-page--canvas{padding-block-start:var(--pdx-canvas-context-toolbar-safe-area, 22px)}.pdx-page-settings{position:sticky;top:8px;z-index:2;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:inherit;border-radius:12px;width:36px;height:36px;margin-bottom:6px}.pdx-widget{position:relative;background:var(--pfx-surface, transparent);border-radius:6px;min-width:0;min-height:0}.pdx-widget--interactive{cursor:pointer}.pdx-widget--selected:before{content:\"\";position:absolute;inset:0;border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);border-radius:14px;pointer-events:none;z-index:1;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent)}.pdx-widget--canvas{align-self:stretch;--pdx-resize-gradient-horizontal: linear-gradient( 90deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-vertical: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-se: linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-sw: linear-gradient( 225deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-widget--canvas:after{content:\"\";position:absolute;inset:0;padding:2px;border-radius:14px;background:var(--pdx-active-resize-gradient);opacity:0;pointer-events:none;transition:opacity .14s ease,filter .14s ease;filter:saturate(1.02) drop-shadow(0 0 5px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude}.pdx-widget--canvas-selected:before,.pdx-widget--canvas-blocked:before{content:\"\";position:absolute;inset:0;border-radius:14px;pointer-events:none;z-index:1;transition:opacity .14s ease,box-shadow .14s ease,border-color .14s ease}.pdx-widget--canvas-blocked:before{border:1px solid color-mix(in srgb,var(--md-sys-color-error) 74%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 20%,transparent),0 10px 24px color-mix(in srgb,var(--md-sys-color-error) 12%,transparent)}.pdx-widget--canvas:has(.pdx-canvas-resize:hover):after,.pdx-widget--canvas:has(.pdx-canvas-resize:focus-visible):after{opacity:.82}.pdx-widget--canvas:has(.pdx-canvas-resize--north:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-horizontal)}.pdx-widget--canvas:has(.pdx-canvas-resize--east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-vertical)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-sw)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize{position:absolute;z-index:7;border:0;padding:0;margin:0;background:transparent;touch-action:none;cursor:pointer;opacity:0;pointer-events:none;transform:scale(.94);transition:opacity .14s ease,transform .14s ease,filter .14s ease;filter:saturate(.9)}.pdx-widget--canvas:hover .pdx-canvas-resize,.pdx-widget--canvas:focus-within .pdx-canvas-resize,.pdx-widget--canvas-selected .pdx-canvas-resize{opacity:.88;pointer-events:auto;transform:scale(1);filter:saturate(1)}.pdx-widget--canvas:has(.pdx-shell.expanded) .pdx-canvas-resize,.pdx-widget--canvas:has(.pdx-shell.fullscreen) .pdx-canvas-resize{opacity:0;pointer-events:none;transform:scale(.94)}.pdx-canvas-resize-grip{display:block;width:9px;height:9px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant) 58%);background:color-mix(in srgb,var(--md-sys-color-surface) 92%,var(--md-sys-color-primary) 8%);box-shadow:0 1px 4px color-mix(in srgb,var(--md-sys-color-shadow) 10%,transparent);transition:transform .14s ease,border-color .14s ease,background .14s ease,box-shadow .14s ease}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant) 42%);background:color-mix(in srgb,var(--md-sys-color-surface) 84%,var(--md-sys-color-primary) 16%);box-shadow:0 2px 7px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:scale(1.04)}.pdx-canvas-resize--north,.pdx-canvas-resize--south{left:50%;width:40px;height:18px;margin-left:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north{top:-8px;cursor:ns-resize}.pdx-canvas-resize--south{bottom:-8px;cursor:ns-resize}.pdx-canvas-resize--east,.pdx-canvas-resize--west{top:50%;width:18px;height:40px;margin-top:-20px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--east{right:-8px;cursor:ew-resize}.pdx-canvas-resize--west{left:-8px;cursor:ew-resize}.pdx-canvas-resize--north-east,.pdx-canvas-resize--north-west,.pdx-canvas-resize--south-east,.pdx-canvas-resize--south-west{width:18px;height:18px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north-east{top:-8px;right:-8px;cursor:nesw-resize}.pdx-canvas-resize--north-west{top:-8px;left:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-east{bottom:-8px;right:-8px;cursor:nwse-resize}.pdx-canvas-resize--south-west{bottom:-8px;left:-8px;cursor:nesw-resize}.pdx-canvas-snap-preview{position:relative;align-self:stretch;border-radius:12px;pointer-events:none;z-index:0;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent),color-mix(in srgb,var(--md-sys-color-tertiary) 12%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 42%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 55%,transparent);animation:pdx-snap-preview-pulse .48s ease-out infinite alternate}.pdx-canvas-snap-preview:before,.pdx-canvas-snap-preview:after{content:\"\";position:absolute;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary) 82%,var(--md-sys-color-tertiary) 18%);opacity:.72}.pdx-canvas-snap-preview:before{inset:0 auto 0 0;width:3px}.pdx-canvas-snap-preview:after{inset:0 0 auto;height:3px}.pdx-canvas-snap-preview--invalid{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-error) 18%,transparent),color-mix(in srgb,var(--md-sys-color-error-container) 22%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 58%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 40%,transparent)}.pdx-canvas-snap-preview--invalid:before,.pdx-canvas-snap-preview--invalid:after{background:color-mix(in srgb,var(--md-sys-color-error) 86%,var(--md-sys-color-error-container) 14%)}.pdx-canvas-resize:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:transparent;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent),var(--mat-elevation-level3)}.pdx-canvas-resize--north:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-horizontal)}.pdx-canvas-resize--east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-vertical)}.pdx-canvas-resize--north-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-sw)}.pdx-canvas-resize--north-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-west:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{transform:scale(1.08)}@keyframes pdx-snap-preview-pulse{0%{opacity:.72;transform:scale(.996)}to{opacity:1;transform:scale(1)}}.pdx-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pdx-group{display:grid;gap:12px;grid-column:1 / -1;padding:12px;border-radius:16px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 76%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent)}.pdx-group--hero{padding:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 42%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-low) 86%,transparent))}.pdx-group--rail{align-self:start}.pdx-group-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.pdx-group-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.pdx-group-content{display:grid;gap:12px}.pdx-group-content--stack{grid-template-columns:minmax(0,1fr)}.pdx-group-content--row{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.pdx-group-content--grid{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.pdx-group-tabs{display:grid;gap:12px}.pdx-tabs-header{display:flex;flex-wrap:wrap;gap:8px}.pdx-tab-chip{appearance:none;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest);color:var(--md-sys-color-on-surface);border-radius:999px;padding:8px 12px;font:inherit;cursor:pointer}.pdx-tab-chip.active{border-color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 78%,transparent);color:var(--md-sys-color-on-primary-container)}.pdx-page-wrapper.editing .pdx-widget-settings{opacity:1}\n"] }]
33121
33919
  }], ctorParameters: () => [], propDecorators: { pageCanvasHost: [{
33122
33920
  type: ViewChild,
33123
33921
  args: ['pageCanvasHost']
@@ -33153,6 +33951,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33153
33951
  type: Output
33154
33952
  }], widgetDiagnosticsChange: [{
33155
33953
  type: Output
33954
+ }], widgetLoaders: [{
33955
+ type: ViewChildren,
33956
+ args: ['widgetLoader']
33156
33957
  }], onWindowResize: [{
33157
33958
  type: HostListener,
33158
33959
  args: ['window:resize']
@@ -33210,10 +34011,13 @@ function providePraxisDynamicPageMetadata() {
33210
34011
  }
33211
34012
 
33212
34013
  class PraxisSurfaceHostComponent {
34014
+ globalActions = inject(GlobalActionService);
33213
34015
  title;
33214
34016
  subtitle;
33215
34017
  icon;
34018
+ beforeWidget;
33216
34019
  widget;
34020
+ afterWidget;
33217
34021
  context = null;
33218
34022
  strictValidation = true;
33219
34023
  /**
@@ -33221,13 +34025,21 @@ class PraxisSurfaceHostComponent {
33221
34025
  * modal/drawer hosts. Inline consumers may opt into rendering it again.
33222
34026
  */
33223
34027
  renderTitleInsideBody = false;
33224
- widgetLoader;
34028
+ widgetEvent = new EventEmitter();
34029
+ beforeWidgetLoader;
34030
+ mainWidgetLoader;
34031
+ afterWidgetLoader;
33225
34032
  renderQueued = false;
34033
+ beforeWidgetKey = 'surface.before';
34034
+ mainWidgetKey = 'surface.main';
34035
+ afterWidgetKey = 'surface.after';
33226
34036
  ngAfterViewInit() {
33227
34037
  this.scheduleWidgetRender();
33228
34038
  }
33229
34039
  ngOnChanges(changes) {
33230
34040
  if (changes['widget']
34041
+ || changes['beforeWidget']
34042
+ || changes['afterWidget']
33231
34043
  || changes['context']
33232
34044
  || changes['strictValidation']) {
33233
34045
  this.scheduleWidgetRender();
@@ -33239,17 +34051,101 @@ class PraxisSurfaceHostComponent {
33239
34051
  this.renderQueued = true;
33240
34052
  queueMicrotask(() => {
33241
34053
  this.renderQueued = false;
33242
- const loader = this.widgetLoader;
33243
- if (!loader)
33244
- return;
33245
- loader.widget = this.widget;
33246
- loader.context = this.context;
33247
- loader.strictValidation = this.strictValidation;
33248
- loader.renderNow();
34054
+ this.renderLoader(this.beforeWidgetLoader, this.beforeWidget, this.beforeWidgetKey);
34055
+ this.renderLoader(this.mainWidgetLoader, this.widget, this.mainWidgetKey);
34056
+ this.renderLoader(this.afterWidgetLoader, this.afterWidget, this.afterWidgetKey);
34057
+ });
34058
+ }
34059
+ renderLoader(loader, widget, widgetKey) {
34060
+ if (!loader)
34061
+ return;
34062
+ loader.widget = this.enrichWidget(widget, widgetKey);
34063
+ loader.ownerWidgetKey = widgetKey;
34064
+ loader.context = this.context;
34065
+ loader.strictValidation = this.strictValidation;
34066
+ loader.renderNow();
34067
+ }
34068
+ enrichWidget(widget, widgetKey) {
34069
+ if (!widget || widget.id !== 'praxis-rich-content') {
34070
+ return widget;
34071
+ }
34072
+ return {
34073
+ ...widget,
34074
+ inputs: {
34075
+ ...(widget.inputs || {}),
34076
+ hostCapabilities: this.buildRichContentHostCapabilities(widgetKey, widget.inputs?.['context']),
34077
+ },
34078
+ };
34079
+ }
34080
+ buildRichContentHostCapabilities(widgetKey, widgetContext) {
34081
+ return {
34082
+ dispatchAction: (actionId, payload) => this.dispatchRichContentAction(widgetKey, actionId, payload, widgetContext),
34083
+ isActionAvailable: (actionId) => this.isRichContentActionAvailable(actionId),
34084
+ hasCapability: (capabilityId) => this.hasRichContentCapability(capabilityId),
34085
+ };
34086
+ }
34087
+ dispatchRichContentAction(widgetKey, actionId, payload, widgetContext) {
34088
+ if (!actionId) {
34089
+ return;
34090
+ }
34091
+ if (this.globalActions.has(actionId)) {
34092
+ void this.globalActions.execute(actionId, payload, {
34093
+ sourceId: widgetKey,
34094
+ widgetKey,
34095
+ payload: {
34096
+ widgetKey,
34097
+ actionId,
34098
+ payload,
34099
+ surfaceContext: this.context,
34100
+ richContentContext: widgetContext,
34101
+ },
34102
+ runtime: {
34103
+ widgetContext,
34104
+ state: this.context,
34105
+ },
34106
+ meta: {
34107
+ origin: 'surface.rich-content',
34108
+ componentId: 'praxis-surface-host',
34109
+ },
34110
+ });
34111
+ return;
34112
+ }
34113
+ this.widgetEvent.emit({
34114
+ ownerWidgetKey: widgetKey,
34115
+ sourceComponentId: 'praxis-rich-content',
34116
+ output: 'customAction',
34117
+ payload: {
34118
+ actionId,
34119
+ payload,
34120
+ globalAction: {
34121
+ actionId,
34122
+ payload,
34123
+ },
34124
+ },
34125
+ });
34126
+ }
34127
+ isRichContentActionAvailable(actionId) {
34128
+ return !!actionId;
34129
+ }
34130
+ hasRichContentCapability(capabilityId) {
34131
+ switch (capabilityId) {
34132
+ case 'surface.host':
34133
+ case 'surface.rich-content.actions':
34134
+ return true;
34135
+ case 'surface.context':
34136
+ return !!this.context;
34137
+ default:
34138
+ return false;
34139
+ }
34140
+ }
34141
+ onSlotWidgetEvent(ownerWidgetKey, event) {
34142
+ this.widgetEvent.emit({
34143
+ ...event,
34144
+ ownerWidgetKey: event.ownerWidgetKey || ownerWidgetKey,
33249
34145
  });
33250
34146
  }
33251
34147
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisSurfaceHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
33252
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisSurfaceHostComponent, isStandalone: true, selector: "praxis-surface-host", inputs: { title: "title", subtitle: "subtitle", icon: "icon", widget: "widget", context: "context", strictValidation: "strictValidation", renderTitleInsideBody: "renderTitleInsideBody" }, viewQueries: [{ propertyName: "widgetLoader", first: true, predicate: DynamicWidgetLoaderDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
34148
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisSurfaceHostComponent, isStandalone: true, selector: "praxis-surface-host", inputs: { title: "title", subtitle: "subtitle", icon: "icon", beforeWidget: "beforeWidget", widget: "widget", afterWidget: "afterWidget", context: "context", strictValidation: "strictValidation", renderTitleInsideBody: "renderTitleInsideBody" }, outputs: { widgetEvent: "widgetEvent" }, viewQueries: [{ propertyName: "beforeWidgetLoader", first: true, predicate: ["beforeWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "mainWidgetLoader", first: true, predicate: ["mainWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "afterWidgetLoader", first: true, predicate: ["afterWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }], usesOnChanges: true, ngImport: i0, template: `
33253
34149
  <div class="pdx-surface-host">
33254
34150
  @if (subtitle || (title && renderTitleInsideBody)) {
33255
34151
  <header class="pdx-surface-host__header">
@@ -33268,16 +34164,45 @@ class PraxisSurfaceHostComponent {
33268
34164
  }
33269
34165
 
33270
34166
  <section class="pdx-surface-host__body">
34167
+ @if (beforeWidget) {
34168
+ <div class="pdx-surface-host__slot pdx-surface-host__slot--before">
34169
+ <ng-container
34170
+ #beforeWidgetLoader
34171
+ [dynamicWidgetLoader]="beforeWidget"
34172
+ [ownerWidgetKey]="beforeWidgetKey"
34173
+ [context]="context"
34174
+ [strictValidation]="strictValidation"
34175
+ (widgetEvent)="onSlotWidgetEvent(beforeWidgetKey, $event)"
34176
+ ></ng-container>
34177
+ </div>
34178
+ }
34179
+
33271
34180
  @if (widget) {
33272
34181
  <ng-container
34182
+ #mainWidgetLoader
33273
34183
  [dynamicWidgetLoader]="widget"
34184
+ [ownerWidgetKey]="mainWidgetKey"
33274
34185
  [context]="context"
33275
34186
  [strictValidation]="strictValidation"
34187
+ (widgetEvent)="onSlotWidgetEvent(mainWidgetKey, $event)"
33276
34188
  ></ng-container>
33277
34189
  }
34190
+
34191
+ @if (afterWidget) {
34192
+ <div class="pdx-surface-host__slot pdx-surface-host__slot--after">
34193
+ <ng-container
34194
+ #afterWidgetLoader
34195
+ [dynamicWidgetLoader]="afterWidget"
34196
+ [ownerWidgetKey]="afterWidgetKey"
34197
+ [context]="context"
34198
+ [strictValidation]="strictValidation"
34199
+ (widgetEvent)="onSlotWidgetEvent(afterWidgetKey, $event)"
34200
+ ></ng-container>
34201
+ </div>
34202
+ }
33278
34203
  </section>
33279
34204
  </div>
33280
- `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-surface-host{display:grid;gap:16px;min-width:0}.pdx-surface-host__header{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.pdx-surface-host__icon{font-size:20px;line-height:20px;color:var(--md-sys-color-primary, currentColor)}.pdx-surface-host__copy{display:grid;gap:4px;min-width:0}.pdx-surface-host__title,.pdx-surface-host__subtitle{margin:0}.pdx-surface-host__title{font-size:1rem;font-weight:600}.pdx-surface-host__subtitle{color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .64));font-size:.9375rem}.pdx-surface-host__body{min-width:0}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }] });
34205
+ `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-surface-host{display:grid;gap:16px;min-width:0}.pdx-surface-host__header{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.pdx-surface-host__icon{font-size:20px;line-height:20px;color:var(--md-sys-color-primary, currentColor)}.pdx-surface-host__copy{display:grid;gap:4px;min-width:0}.pdx-surface-host__title,.pdx-surface-host__subtitle{margin:0}.pdx-surface-host__title{font-size:1rem;font-weight:600}.pdx-surface-host__subtitle{color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .64));font-size:.9375rem}.pdx-surface-host__body{display:grid;gap:16px;min-width:0}.pdx-surface-host__slot{min-width:0}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }] });
33281
34206
  }
33282
34207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisSurfaceHostComponent, decorators: [{
33283
34208
  type: Component,
@@ -33300,33 +34225,74 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
33300
34225
  }
33301
34226
 
33302
34227
  <section class="pdx-surface-host__body">
34228
+ @if (beforeWidget) {
34229
+ <div class="pdx-surface-host__slot pdx-surface-host__slot--before">
34230
+ <ng-container
34231
+ #beforeWidgetLoader
34232
+ [dynamicWidgetLoader]="beforeWidget"
34233
+ [ownerWidgetKey]="beforeWidgetKey"
34234
+ [context]="context"
34235
+ [strictValidation]="strictValidation"
34236
+ (widgetEvent)="onSlotWidgetEvent(beforeWidgetKey, $event)"
34237
+ ></ng-container>
34238
+ </div>
34239
+ }
34240
+
33303
34241
  @if (widget) {
33304
34242
  <ng-container
34243
+ #mainWidgetLoader
33305
34244
  [dynamicWidgetLoader]="widget"
34245
+ [ownerWidgetKey]="mainWidgetKey"
33306
34246
  [context]="context"
33307
34247
  [strictValidation]="strictValidation"
34248
+ (widgetEvent)="onSlotWidgetEvent(mainWidgetKey, $event)"
33308
34249
  ></ng-container>
33309
34250
  }
34251
+
34252
+ @if (afterWidget) {
34253
+ <div class="pdx-surface-host__slot pdx-surface-host__slot--after">
34254
+ <ng-container
34255
+ #afterWidgetLoader
34256
+ [dynamicWidgetLoader]="afterWidget"
34257
+ [ownerWidgetKey]="afterWidgetKey"
34258
+ [context]="context"
34259
+ [strictValidation]="strictValidation"
34260
+ (widgetEvent)="onSlotWidgetEvent(afterWidgetKey, $event)"
34261
+ ></ng-container>
34262
+ </div>
34263
+ }
33310
34264
  </section>
33311
34265
  </div>
33312
- `, styles: [":host{display:block;min-width:0}.pdx-surface-host{display:grid;gap:16px;min-width:0}.pdx-surface-host__header{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.pdx-surface-host__icon{font-size:20px;line-height:20px;color:var(--md-sys-color-primary, currentColor)}.pdx-surface-host__copy{display:grid;gap:4px;min-width:0}.pdx-surface-host__title,.pdx-surface-host__subtitle{margin:0}.pdx-surface-host__title{font-size:1rem;font-weight:600}.pdx-surface-host__subtitle{color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .64));font-size:.9375rem}.pdx-surface-host__body{min-width:0}\n"] }]
34266
+ `, styles: [":host{display:block;min-width:0}.pdx-surface-host{display:grid;gap:16px;min-width:0}.pdx-surface-host__header{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start}.pdx-surface-host__icon{font-size:20px;line-height:20px;color:var(--md-sys-color-primary, currentColor)}.pdx-surface-host__copy{display:grid;gap:4px;min-width:0}.pdx-surface-host__title,.pdx-surface-host__subtitle{margin:0}.pdx-surface-host__title{font-size:1rem;font-weight:600}.pdx-surface-host__subtitle{color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .64));font-size:.9375rem}.pdx-surface-host__body{display:grid;gap:16px;min-width:0}.pdx-surface-host__slot{min-width:0}\n"] }]
33313
34267
  }], propDecorators: { title: [{
33314
34268
  type: Input
33315
34269
  }], subtitle: [{
33316
34270
  type: Input
33317
34271
  }], icon: [{
33318
34272
  type: Input
34273
+ }], beforeWidget: [{
34274
+ type: Input
33319
34275
  }], widget: [{
33320
34276
  type: Input
34277
+ }], afterWidget: [{
34278
+ type: Input
33321
34279
  }], context: [{
33322
34280
  type: Input
33323
34281
  }], strictValidation: [{
33324
34282
  type: Input
33325
34283
  }], renderTitleInsideBody: [{
33326
34284
  type: Input
33327
- }], widgetLoader: [{
34285
+ }], widgetEvent: [{
34286
+ type: Output
34287
+ }], beforeWidgetLoader: [{
33328
34288
  type: ViewChild,
33329
- args: [DynamicWidgetLoaderDirective]
34289
+ args: ['beforeWidgetLoader', { read: DynamicWidgetLoaderDirective }]
34290
+ }], mainWidgetLoader: [{
34291
+ type: ViewChild,
34292
+ args: ['mainWidgetLoader', { read: DynamicWidgetLoaderDirective }]
34293
+ }], afterWidgetLoader: [{
34294
+ type: ViewChild,
34295
+ args: ['afterWidgetLoader', { read: DynamicWidgetLoaderDirective }]
33330
34296
  }] } });
33331
34297
 
33332
34298
  class EmptyStateCardComponent {
@@ -34792,4 +35758,4 @@ function provideHookWhitelist(allowed) {
34792
35758
  * Generated bundle index. Do not edit.
34793
35759
  */
34794
35760
 
34795
- export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisRuntimeGlobalActionEffect, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withMessage, withPraxisHttpLoading };
35761
+ export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisRuntimeGlobalActionEffect, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withMessage, withPraxisHttpLoading };