@praxisui/core 6.0.0-beta.0 → 7.0.0-beta.0

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, ENVIRONMENT_INITIALIZER, ErrorHandler, APP_INITIALIZER, EventEmitter, Output, Input, ChangeDetectionStrategy, Directive, SecurityContext, ViewContainerRef, ContentChild, signal, HostListener, ViewChild, computed } from '@angular/core';
2
+ import { Component, InjectionToken, Injectable, inject, Inject, Optional, makeEnvironmentProviders, ENVIRONMENT_INITIALIZER, APP_INITIALIZER, ErrorHandler, EventEmitter, Output, Input, ChangeDetectionStrategy, Directive, SecurityContext, ViewContainerRef, ContentChild, signal, HostListener, ViewChild, computed } 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 } from 'rxjs';
@@ -10,12 +10,12 @@ import { Router, ActivatedRoute } from '@angular/router';
10
10
  import * as i1$1 from '@angular/forms';
11
11
  import { Validators, FormGroup, FormControl, FormsModule } from '@angular/forms';
12
12
  import { MatSnackBar } from '@angular/material/snack-bar';
13
+ import * as i3$1 from '@angular/material/icon';
14
+ import { MatIconRegistry, MatIconModule } from '@angular/material/icon';
13
15
  import * as i2 from '@angular/material/button';
14
16
  import { MatButtonModule } from '@angular/material/button';
15
17
  import * as i3 from '@angular/material/form-field';
16
18
  import { MatFormFieldModule } from '@angular/material/form-field';
17
- import * as i3$1 from '@angular/material/icon';
18
- import { MatIconModule } from '@angular/material/icon';
19
19
  import * as i5 from '@angular/material/input';
20
20
  import { MatInputModule } from '@angular/material/input';
21
21
  import * as i6 from '@angular/material/select';
@@ -8737,6 +8737,328 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
8737
8737
  args: [{ providedIn: 'any' }]
8738
8738
  }] });
8739
8739
 
8740
+ class CrudOperationResolutionService {
8741
+ discovery = inject(ResourceDiscoveryService);
8742
+ resolve(request) {
8743
+ const operation = request.operation;
8744
+ const metadataResourcePath = this.normalizeResourcePath(request.resourcePath);
8745
+ if (!metadataResourcePath) {
8746
+ throw new Error('CrudOperationResolutionService requires resourcePath.');
8747
+ }
8748
+ const resourcePath = this.resolveCanonicalResourcePath(request, metadataResourcePath);
8749
+ const diagnostics = [];
8750
+ const resolutionOptions = this.toDiscoveryOptions(request);
8751
+ if (this.hasExplicitContract(request)) {
8752
+ return this.buildExplicitResolution(request, resourcePath, diagnostics, resolutionOptions);
8753
+ }
8754
+ const capabilities = request.capabilities ?? null;
8755
+ const operationCapability = capabilities?.operations?.[operation] ??
8756
+ this.buildCapabilityFromCanonicalFlags(capabilities, operation);
8757
+ const scope = this.resolveScope(operationCapability, operation);
8758
+ const preferredMethod = this.resolvePreferredMethod(operationCapability, operation);
8759
+ const matchingSurface = this.findSurface(request.surfaces ?? capabilities?.surfaces ?? [], operation);
8760
+ if (matchingSurface) {
8761
+ return this.buildSurfaceResolution({
8762
+ operation,
8763
+ resourcePath,
8764
+ resourceId: request.resourceId ?? null,
8765
+ diagnostics,
8766
+ resolutionOptions,
8767
+ capability: operationCapability,
8768
+ surface: matchingSurface,
8769
+ });
8770
+ }
8771
+ const linkResolution = this.resolveLink(operation, request.links, resolutionOptions, operationCapability);
8772
+ if (linkResolution) {
8773
+ return {
8774
+ operation,
8775
+ source: 'link',
8776
+ resourcePath,
8777
+ resourceId: request.resourceId ?? null,
8778
+ scope,
8779
+ supported: operationCapability?.supported ?? true,
8780
+ visible: this.isAvailable(operationCapability),
8781
+ enabled: this.isAvailable(operationCapability),
8782
+ availability: operationCapability?.availability ?? null,
8783
+ schemaUrl: this.resolveCanonicalSchemaUrl(operation, resourcePath, preferredMethod, resolutionOptions),
8784
+ responseSchemaUrl: operation === 'view'
8785
+ ? this.resolveCanonicalSchemaUrl('view', resourcePath, preferredMethod, resolutionOptions)
8786
+ : null,
8787
+ submitUrl: linkResolution.href,
8788
+ submitMethod: operation === 'view'
8789
+ ? preferredMethod
8790
+ : (linkResolution.method ?? preferredMethod)?.toLowerCase() ?? null,
8791
+ diagnostics,
8792
+ };
8793
+ }
8794
+ return this.buildConventionResolution({
8795
+ operation,
8796
+ resourcePath,
8797
+ resourceId: request.resourceId ?? null,
8798
+ diagnostics,
8799
+ resolutionOptions,
8800
+ capability: operationCapability,
8801
+ preferredMethod,
8802
+ scope,
8803
+ });
8804
+ }
8805
+ buildExplicitResolution(request, resourcePath, diagnostics, options) {
8806
+ return {
8807
+ operation: request.operation,
8808
+ source: 'explicit',
8809
+ resourcePath,
8810
+ resourceId: request.resourceId ?? null,
8811
+ scope: this.defaultScope(request.operation),
8812
+ supported: true,
8813
+ visible: true,
8814
+ enabled: true,
8815
+ availability: { allowed: true, metadata: { source: 'explicit' } },
8816
+ schemaUrl: request.explicit?.schemaUrl
8817
+ ? this.discovery.resolveHref(request.explicit.schemaUrl, options)
8818
+ : null,
8819
+ responseSchemaUrl: request.explicit?.responseSchemaUrl
8820
+ ? this.discovery.resolveHref(request.explicit.responseSchemaUrl, options)
8821
+ : null,
8822
+ submitUrl: request.explicit?.submitUrl
8823
+ ? this.discovery.resolveHref(request.explicit.submitUrl, options)
8824
+ : null,
8825
+ submitMethod: request.explicit?.submitMethod
8826
+ ? String(request.explicit.submitMethod).trim().toLowerCase()
8827
+ : null,
8828
+ diagnostics,
8829
+ };
8830
+ }
8831
+ buildSurfaceResolution(params) {
8832
+ const { operation, resourcePath, resourceId, diagnostics, resolutionOptions, capability, surface } = params;
8833
+ const isWritable = this.isWritableSurface(surface.kind);
8834
+ return {
8835
+ operation,
8836
+ source: capability ? 'capability' : 'surface',
8837
+ resourcePath,
8838
+ resourceId,
8839
+ scope: surface.scope,
8840
+ supported: capability?.supported ?? true,
8841
+ visible: this.isAvailable(capability, surface),
8842
+ enabled: this.isAvailable(capability, surface),
8843
+ availability: surface.availability ?? capability?.availability ?? null,
8844
+ schemaUrl: surface.schemaUrl
8845
+ ? this.discovery.resolveHref(surface.schemaUrl, resolutionOptions)
8846
+ : this.resolveCanonicalSchemaUrl(operation, resourcePath, this.resolvePreferredMethod(capability, operation), resolutionOptions),
8847
+ responseSchemaUrl: operation === 'view' && surface.schemaUrl
8848
+ ? this.discovery.resolveHref(surface.schemaUrl, resolutionOptions)
8849
+ : null,
8850
+ submitUrl: isWritable
8851
+ ? this.discovery.resolveHref(this.resolveActualOperationPath(surface.path, resourceId, diagnostics), resolutionOptions)
8852
+ : null,
8853
+ submitMethod: isWritable ? String(surface.method || '').trim().toLowerCase() || null : null,
8854
+ diagnostics,
8855
+ };
8856
+ }
8857
+ buildConventionResolution(params) {
8858
+ const { operation, resourcePath, resourceId, diagnostics, resolutionOptions, capability, preferredMethod, scope } = params;
8859
+ const submitUrl = this.resolveConventionSubmitUrl(operation, resourcePath, resourceId, diagnostics, resolutionOptions);
8860
+ return {
8861
+ operation,
8862
+ source: 'convention',
8863
+ resourcePath,
8864
+ resourceId,
8865
+ scope,
8866
+ supported: capability?.supported ?? true,
8867
+ visible: this.isAvailable(capability),
8868
+ enabled: this.isAvailable(capability),
8869
+ availability: capability?.availability ?? null,
8870
+ schemaUrl: this.resolveCanonicalSchemaUrl(operation, resourcePath, preferredMethod, resolutionOptions),
8871
+ responseSchemaUrl: operation === 'view'
8872
+ ? this.resolveCanonicalSchemaUrl('view', resourcePath, preferredMethod, resolutionOptions)
8873
+ : null,
8874
+ submitUrl,
8875
+ submitMethod: operation === 'view' ? preferredMethod : preferredMethod?.toLowerCase() ?? null,
8876
+ diagnostics,
8877
+ };
8878
+ }
8879
+ resolveCanonicalSchemaUrl(operation, resourcePath, preferredMethod, options) {
8880
+ if (operation === 'delete') {
8881
+ return null;
8882
+ }
8883
+ const { path, method, schemaType } = this.buildCanonicalSchemaParams(operation, resourcePath, preferredMethod);
8884
+ const query = new URLSearchParams({
8885
+ path,
8886
+ operation: method.toLowerCase(),
8887
+ schemaType,
8888
+ });
8889
+ return this.discovery.resolveHref(`/schemas/filtered?${query.toString()}`, options);
8890
+ }
8891
+ buildCanonicalSchemaParams(operation, resourcePath, preferredMethod) {
8892
+ if (operation === 'create') {
8893
+ return { path: resourcePath, method: 'POST', schemaType: 'request' };
8894
+ }
8895
+ const itemPath = `${resourcePath}/{id}`;
8896
+ if (operation === 'view') {
8897
+ return { path: itemPath, method: 'GET', schemaType: 'response' };
8898
+ }
8899
+ return {
8900
+ path: itemPath,
8901
+ method: (preferredMethod || 'PUT').toUpperCase(),
8902
+ schemaType: 'request',
8903
+ };
8904
+ }
8905
+ resolveConventionSubmitUrl(operation, resourcePath, resourceId, diagnostics, options) {
8906
+ if (operation === 'view') {
8907
+ return null;
8908
+ }
8909
+ if (operation === 'create') {
8910
+ return this.discovery.resolveHref(resourcePath, options);
8911
+ }
8912
+ if (resourceId == null) {
8913
+ diagnostics.push(`Operation "${operation}" requires resourceId for canonical submit target resolution.`);
8914
+ return null;
8915
+ }
8916
+ return this.discovery.resolveHref(`${resourcePath}/${resourceId}`, options);
8917
+ }
8918
+ resolveLink(operation, links, options, capability) {
8919
+ const rel = String(capability?.preferredRel || this.operationRel(operation)).trim();
8920
+ const link = this.discovery.getLink(links, rel);
8921
+ if (!link?.href) {
8922
+ return null;
8923
+ }
8924
+ return {
8925
+ href: this.discovery.resolveHref(link.href, options),
8926
+ method: String(link.method || '').trim().toUpperCase()
8927
+ || capability?.preferredMethod?.toUpperCase()
8928
+ || this.defaultMethod(operation),
8929
+ };
8930
+ }
8931
+ buildCapabilityFromCanonicalFlags(capabilities, operation) {
8932
+ if (!capabilities?.canonicalOperations) {
8933
+ return null;
8934
+ }
8935
+ const canonicalKey = operation === 'view' ? 'byId' : operation === 'edit' ? 'update' : operation;
8936
+ if (!(canonicalKey in capabilities.canonicalOperations)) {
8937
+ return null;
8938
+ }
8939
+ return {
8940
+ id: operation,
8941
+ supported: !!capabilities.canonicalOperations[canonicalKey],
8942
+ scope: this.defaultScope(operation),
8943
+ preferredMethod: this.defaultMethod(operation),
8944
+ preferredRel: this.operationRel(operation),
8945
+ availability: { allowed: true, metadata: { source: 'canonicalOperations' } },
8946
+ };
8947
+ }
8948
+ findSurface(surfaces, operation) {
8949
+ const candidates = surfaces.filter((surface) => this.matchesOperation(surface, operation));
8950
+ if (operation === 'create') {
8951
+ return candidates.find((surface) => surface.id.toLowerCase() === 'create') ?? candidates[0] ?? null;
8952
+ }
8953
+ if (operation === 'view') {
8954
+ return candidates.find((surface) => ['detail', 'view'].includes(surface.id.toLowerCase())) ?? candidates[0] ?? null;
8955
+ }
8956
+ if (operation === 'edit') {
8957
+ return candidates.find((surface) => ['edit', 'update'].includes(surface.id.toLowerCase())) ?? candidates[0] ?? null;
8958
+ }
8959
+ return null;
8960
+ }
8961
+ matchesOperation(surface, operation) {
8962
+ if (operation === 'create') {
8963
+ return surface.scope === 'COLLECTION' && this.isWritableSurface(surface.kind);
8964
+ }
8965
+ if (operation === 'view') {
8966
+ return surface.scope === 'ITEM' && this.isReadableSurface(surface.kind);
8967
+ }
8968
+ if (operation === 'edit') {
8969
+ return surface.scope === 'ITEM' && this.isWritableSurface(surface.kind);
8970
+ }
8971
+ return false;
8972
+ }
8973
+ isReadableSurface(kind) {
8974
+ return kind === 'VIEW' || kind === 'READ_PROJECTION';
8975
+ }
8976
+ isWritableSurface(kind) {
8977
+ return kind === 'FORM' || kind === 'PARTIAL_FORM';
8978
+ }
8979
+ resolveScope(capability, operation) {
8980
+ return capability?.scope ?? this.defaultScope(operation);
8981
+ }
8982
+ resolvePreferredMethod(capability, operation) {
8983
+ return capability?.preferredMethod?.toUpperCase() ?? this.defaultMethod(operation);
8984
+ }
8985
+ resolveActualOperationPath(pathTemplate, resourceId, diagnostics) {
8986
+ if (!/\{id\}/.test(pathTemplate)) {
8987
+ return pathTemplate;
8988
+ }
8989
+ if (resourceId == null) {
8990
+ diagnostics.push(`Path "${pathTemplate}" requires resourceId to resolve the concrete target.`);
8991
+ return pathTemplate;
8992
+ }
8993
+ return pathTemplate.replace(/\{id\}/g, encodeURIComponent(String(resourceId)));
8994
+ }
8995
+ hasExplicitContract(request) {
8996
+ return !!(request.explicit?.schemaUrl ||
8997
+ request.explicit?.responseSchemaUrl ||
8998
+ request.explicit?.submitUrl ||
8999
+ request.explicit?.submitMethod);
9000
+ }
9001
+ isAvailable(capability, surface) {
9002
+ if (surface?.availability) {
9003
+ return surface.availability.allowed !== false;
9004
+ }
9005
+ if (capability?.availability) {
9006
+ return capability.availability.allowed !== false;
9007
+ }
9008
+ return capability?.supported !== false;
9009
+ }
9010
+ operationRel(operation) {
9011
+ if (operation === 'view') {
9012
+ return 'self';
9013
+ }
9014
+ return operation;
9015
+ }
9016
+ defaultScope(operation) {
9017
+ return operation === 'create' ? 'COLLECTION' : 'ITEM';
9018
+ }
9019
+ defaultMethod(operation) {
9020
+ switch (operation) {
9021
+ case 'create':
9022
+ return 'POST';
9023
+ case 'view':
9024
+ return 'GET';
9025
+ case 'edit':
9026
+ return 'PUT';
9027
+ case 'delete':
9028
+ return 'DELETE';
9029
+ }
9030
+ }
9031
+ normalizeResourcePath(resourcePath) {
9032
+ const normalized = String(resourcePath || '').trim().replace(/\/+/g, '/');
9033
+ if (!normalized) {
9034
+ return '';
9035
+ }
9036
+ return normalized.startsWith('/') ? normalized : `/${normalized}`;
9037
+ }
9038
+ resolveCanonicalResourcePath(request, fallbackResourcePath) {
9039
+ const capabilityResourcePath = this.normalizeResourcePath(request.capabilities?.resourcePath || '');
9040
+ if (capabilityResourcePath) {
9041
+ return capabilityResourcePath;
9042
+ }
9043
+ return fallbackResourcePath;
9044
+ }
9045
+ toDiscoveryOptions(request) {
9046
+ if (!request.endpointKey && !request.apiUrlEntry) {
9047
+ return undefined;
9048
+ }
9049
+ return {
9050
+ ...(request.endpointKey ? { endpointKey: request.endpointKey } : {}),
9051
+ ...(request.apiUrlEntry ? { apiUrlEntry: request.apiUrlEntry } : {}),
9052
+ };
9053
+ }
9054
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: CrudOperationResolutionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
9055
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: CrudOperationResolutionService, providedIn: 'any' });
9056
+ }
9057
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: CrudOperationResolutionService, decorators: [{
9058
+ type: Injectable,
9059
+ args: [{ providedIn: 'any' }]
9060
+ }] });
9061
+
8740
9062
  const DEFAULT_FAMILIES = [
8741
9063
  'chart',
8742
9064
  'analytic-table',
@@ -9280,6 +9602,30 @@ function providePraxisAnalyticsGlobalActions(opts = {}) {
9280
9602
  };
9281
9603
  }
9282
9604
 
9605
+ const DEFAULT_FONT_SET_CLASS = ['material-symbols-outlined', 'mat-ligature-font'];
9606
+ function normalizeDefaultFontSetClass(options) {
9607
+ const provided = options?.defaultFontSetClass?.filter((value) => typeof value === 'string' && value.trim().length);
9608
+ return provided?.length ? provided : DEFAULT_FONT_SET_CLASS;
9609
+ }
9610
+ function providePraxisIconDefaults(options) {
9611
+ const defaultFontSetClass = normalizeDefaultFontSetClass(options);
9612
+ return [
9613
+ {
9614
+ provide: APP_INITIALIZER,
9615
+ multi: true,
9616
+ deps: [MatIconRegistry],
9617
+ useFactory: (iconRegistry) => () => {
9618
+ iconRegistry.registerFontClassAlias('ms', 'material-symbols-outlined mat-ligature-font');
9619
+ iconRegistry.registerFontClassAlias('mso', 'material-symbols-outlined mat-ligature-font');
9620
+ iconRegistry.registerFontClassAlias('msr', 'material-symbols-rounded mat-ligature-font');
9621
+ iconRegistry.registerFontClassAlias('mss', 'material-symbols-sharp mat-ligature-font');
9622
+ iconRegistry.registerFontClassAlias('mi', 'material-icons mat-ligature-font');
9623
+ iconRegistry.setDefaultFontSetClass(...defaultFontSetClass);
9624
+ },
9625
+ },
9626
+ ];
9627
+ }
9628
+
9283
9629
  /**
9284
9630
  * Registers only the default visual renderer for Praxis loading.
9285
9631
  *
@@ -11498,6 +11844,14 @@ const FieldDataType = {
11498
11844
  * - Supports Material Design 3 specifications
11499
11845
  */
11500
11846
 
11847
+ function createEmptyRichContentDocument() {
11848
+ return {
11849
+ kind: 'praxis.rich-content',
11850
+ version: '1.0.0',
11851
+ nodes: [],
11852
+ };
11853
+ }
11854
+
11501
11855
  function defaultGenerateId(kind, used) {
11502
11856
  // determinístico + compacto, evitando Math.random (facilita tests/replays)
11503
11857
  let seq = 1;
@@ -11788,10 +12142,10 @@ function createDefaultFormConfig() {
11788
12142
  ],
11789
12143
  },
11790
12144
  ],
11791
- formBlocksBefore: [],
11792
- formBlocksBeforeActions: [],
12145
+ formBlocksBefore: createEmptyRichContentDocument(),
12146
+ formBlocksBeforeActions: createEmptyRichContentDocument(),
11793
12147
  formBlocksBeforeActionsPlacement: 'afterSections',
11794
- formBlocksAfter: [],
12148
+ formBlocksAfter: createEmptyRichContentDocument(),
11795
12149
  // Default mode hints (didactic tooltips)
11796
12150
  hints: getDefaultFormHints(),
11797
12151
  };
@@ -11806,10 +12160,10 @@ function isValidFormConfig(config) {
11806
12160
  function createEmptyFormConfig() {
11807
12161
  return {
11808
12162
  sections: [],
11809
- formBlocksBefore: [],
11810
- formBlocksBeforeActions: [],
12163
+ formBlocksBefore: createEmptyRichContentDocument(),
12164
+ formBlocksBeforeActions: createEmptyRichContentDocument(),
11811
12165
  formBlocksBeforeActionsPlacement: 'afterSections',
11812
- formBlocksAfter: [],
12166
+ formBlocksAfter: createEmptyRichContentDocument(),
11813
12167
  };
11814
12168
  }
11815
12169
  /**
@@ -12011,10 +12365,10 @@ function buildFormConfigFromEditorialTemplate(template, options = {}) {
12011
12365
  const overrides = options.overrides ?? {};
12012
12366
  const base = {
12013
12367
  sections: template.layout?.sections ?? [],
12014
- formBlocksBefore: template.layout?.formBlocksBefore ?? [],
12015
- formBlocksBeforeActions: template.layout?.formBlocksBeforeActions ?? [],
12368
+ formBlocksBefore: template.layout?.formBlocksBefore ?? createEmptyRichContentDocument(),
12369
+ formBlocksBeforeActions: template.layout?.formBlocksBeforeActions ?? createEmptyRichContentDocument(),
12016
12370
  formBlocksBeforeActionsPlacement: template.layout?.formBlocksBeforeActionsPlacement ?? 'afterSections',
12017
- formBlocksAfter: template.layout?.formBlocksAfter ?? [],
12371
+ formBlocksAfter: template.layout?.formBlocksAfter ?? createEmptyRichContentDocument(),
12018
12372
  editorialContext: template.defaults?.editorialContext,
12019
12373
  fieldMetadata: template.defaults?.fieldMetadata ?? [],
12020
12374
  actions: template.layout?.actions,
@@ -12079,12 +12433,62 @@ function mergeTemplateReference(base, metadataPatch, overridePatch) {
12079
12433
  };
12080
12434
  }
12081
12435
 
12436
+ function richDoc(...nodes) {
12437
+ return {
12438
+ kind: 'praxis.rich-content',
12439
+ version: '1.0.0',
12440
+ nodes,
12441
+ };
12442
+ }
12443
+ function richFooterCard(config) {
12444
+ return richDoc({
12445
+ type: 'card',
12446
+ title: config.title,
12447
+ subtitle: config.subtitle,
12448
+ content: [
12449
+ ...(config.links?.length
12450
+ ? [
12451
+ {
12452
+ type: 'compose',
12453
+ direction: 'row',
12454
+ wrap: true,
12455
+ items: config.links.map((label) => ({
12456
+ type: 'badge',
12457
+ label,
12458
+ })),
12459
+ },
12460
+ ]
12461
+ : []),
12462
+ ],
12463
+ });
12464
+ }
12465
+ function richIntroCard(config) {
12466
+ return richDoc({
12467
+ type: 'card',
12468
+ title: config.title,
12469
+ subtitle: config.subtitle,
12470
+ content: [
12471
+ ...(config.badge
12472
+ ? [
12473
+ {
12474
+ type: 'badge',
12475
+ label: config.badge,
12476
+ },
12477
+ ]
12478
+ : []),
12479
+ {
12480
+ type: 'text',
12481
+ text: config.description,
12482
+ },
12483
+ ],
12484
+ });
12485
+ }
12082
12486
  const EVENT_REGISTRATION_EDITORIAL_TEMPLATE = {
12083
12487
  templateId: 'event-registration',
12084
12488
  version: '1.0.0',
12085
12489
  metadata: {
12086
12490
  title: 'Event Registration',
12087
- description: 'Template editorial para inscrições institucionais, eventos, workshops e programas com contexto pré-submit.',
12491
+ description: 'Template editorial para inscricoes institucionais, eventos, workshops e programas com contexto pre-submit.',
12088
12492
  category: 'registration',
12089
12493
  tags: ['event', 'registration', 'editorial', 'consent'],
12090
12494
  source: 'catalog',
@@ -12107,99 +12511,101 @@ const EVENT_REGISTRATION_EDITORIAL_TEMPLATE = {
12107
12511
  { key: 'eventContext.dateLabel', type: 'string' },
12108
12512
  ],
12109
12513
  layout: {
12110
- formBlocksBefore: [
12111
- {
12112
- id: 'widget:hero-banner',
12113
- inputs: {
12114
- instanceId: 'template:event-registration:hero',
12115
- title: 'Inscrição em evento',
12116
- titleAccent: 'institucional',
12117
- subtitle: 'Template editorial',
12118
- description: 'Estrutura base para inscrições em encontros, workshops, roadshows e experiências de marca.',
12119
- variant: 'event',
12120
- appearance: 'flat',
12121
- },
12514
+ formBlocksBefore: richDoc({
12515
+ type: 'mediaBlock',
12516
+ title: { type: 'text', text: 'Inscricao em evento institucional' },
12517
+ subtitle: { type: 'text', text: 'Template editorial' },
12518
+ meta: {
12519
+ type: 'compose',
12520
+ direction: 'row',
12521
+ wrap: true,
12522
+ items: [
12523
+ { type: 'badge', label: 'registration' },
12524
+ { type: 'text', text: 'Fluxo institucional reutilizavel' },
12525
+ ],
12122
12526
  },
12123
- {
12124
- id: 'widget:rich-text-block',
12125
- inputs: {
12126
- instanceId: 'template:event-registration:intro',
12127
- title: 'Como preencher',
12128
- subtitle: 'Orientação inicial',
12129
- icon: 'info',
12130
- variant: 'default',
12131
- appearance: 'plain',
12132
- contentFormat: 'markdown',
12133
- content: 'Use dados atualizados, revise os consentimentos e confirme sua disponibilidade antes do envio.',
12527
+ }, {
12528
+ type: 'card',
12529
+ title: 'Como preencher',
12530
+ subtitle: 'Orientacao inicial',
12531
+ content: [
12532
+ {
12533
+ type: 'text',
12534
+ text: 'Use dados atualizados, revise os consentimentos e confirme sua disponibilidade antes do envio.',
12134
12535
  },
12135
- },
12136
- ],
12536
+ ],
12537
+ }),
12137
12538
  sections: [
12138
12539
  {
12139
12540
  id: 'registration',
12140
12541
  appearance: 'step',
12141
12542
  stepLabel: '1',
12142
- title: 'Inscrição',
12143
- description: 'Dados principais do participante e critérios de participação.',
12543
+ title: 'Inscricao',
12544
+ description: 'Dados principais do participante e criterios de participacao.',
12144
12545
  rows: [
12145
12546
  { id: 'row-name', columns: [{ id: 'col-name', fields: ['fullName'] }] },
12146
12547
  { id: 'row-email', columns: [{ id: 'col-email', fields: ['email'] }] },
12147
- { id: 'row-attendance', columns: [{ id: 'col-attendance', fields: ['attendanceMode'] }] },
12148
- { id: 'row-company', columns: [{ id: 'col-company', fields: ['organizationName'] }] },
12548
+ {
12549
+ id: 'row-attendance',
12550
+ columns: [{ id: 'col-attendance', fields: ['attendanceMode'] }],
12551
+ },
12552
+ {
12553
+ id: 'row-company',
12554
+ columns: [{ id: 'col-company', fields: ['organizationName'] }],
12555
+ },
12149
12556
  { id: 'row-role', columns: [{ id: 'col-role', fields: ['jobTitle'] }] },
12150
- { id: 'row-source', columns: [{ id: 'col-source', fields: ['discoverySource'] }] },
12151
- { id: 'row-photo-consent', columns: [{ id: 'col-photo-consent', fields: ['photoConsent'] }] },
12152
- { id: 'row-privacy-consent', columns: [{ id: 'col-privacy-consent', fields: ['privacyConsent'] }] },
12557
+ {
12558
+ id: 'row-source',
12559
+ columns: [{ id: 'col-source', fields: ['discoverySource'] }],
12560
+ },
12561
+ {
12562
+ id: 'row-photo-consent',
12563
+ columns: [{ id: 'col-photo-consent', fields: ['photoConsent'] }],
12564
+ },
12565
+ {
12566
+ id: 'row-privacy-consent',
12567
+ columns: [{ id: 'col-privacy-consent', fields: ['privacyConsent'] }],
12568
+ },
12153
12569
  ],
12154
12570
  },
12155
12571
  ],
12156
- formBlocksBeforeActions: [
12157
- {
12158
- id: 'form:user-context-summary',
12159
- inputs: {
12160
- instanceId: 'template:event-registration:user-context',
12161
- title: 'Conta usada no preenchimento',
12162
- subtitle: 'Resumo contextual antes do envio.',
12163
- appearance: 'plain',
12164
- source: 'context',
12165
- context: '${accountContext}',
12166
- fields: [
12167
- { label: 'Nome', valuePath: 'user.name', fallback: '-' },
12168
- { label: 'E-mail', valuePath: 'user.email', fallback: '-' },
12169
- ],
12170
- actionId: 'switch-user',
12171
- actionLabel: 'Trocar conta',
12572
+ formBlocksBeforeActions: richDoc({
12573
+ type: 'card',
12574
+ title: 'Conta usada no preenchimento',
12575
+ subtitle: 'Resumo contextual antes do envio.',
12576
+ content: [
12577
+ {
12578
+ type: 'metric',
12579
+ label: 'Nome',
12580
+ valueExpr: '${accountContext.user.name}',
12172
12581
  },
12173
- },
12174
- {
12175
- id: 'widget:legal-notice',
12176
- inputs: {
12177
- instanceId: 'template:event-registration:privacy',
12178
- title: 'Privacidade e uso de dados',
12179
- severity: 'muted',
12180
- appearance: 'plain',
12181
- contentFormat: 'markdown',
12182
- content: 'Ao enviar a inscrição, o participante reconhece o tratamento dos dados para credenciamento, comunicações e operação do evento.',
12582
+ {
12583
+ type: 'metric',
12584
+ label: 'E-mail',
12585
+ valueExpr: '${accountContext.user.email}',
12183
12586
  },
12184
- },
12185
- ],
12186
- formBlocksBeforeActionsPlacement: 'insideLastSection',
12187
- formBlocksAfter: [
12188
- {
12189
- id: 'widget:footer-links',
12190
- inputs: {
12191
- instanceId: 'template:event-registration:footer',
12192
- brandText: 'Praxis UI',
12193
- secondaryText: 'Template editorial reutilizável para experiências de inscrição.',
12194
- layout: 'inline',
12195
- appearance: 'plain',
12196
- links: [
12197
- { label: 'Privacidade', href: '/privacidade' },
12198
- { label: 'Termos', href: '/termos' },
12199
- ],
12587
+ {
12588
+ type: 'text',
12589
+ text: 'Se necessario, troque o contexto da conta antes de concluir a inscricao.',
12200
12590
  },
12201
- },
12202
- ],
12591
+ ],
12592
+ }, {
12593
+ type: 'card',
12594
+ title: 'Privacidade e uso de dados',
12595
+ subtitle: 'Antes do envio',
12596
+ content: [
12597
+ {
12598
+ type: 'text',
12599
+ text: 'Ao enviar a inscricao, o participante reconhece o tratamento dos dados para credenciamento, comunicacoes e operacao do evento.',
12600
+ },
12601
+ ],
12602
+ }),
12603
+ formBlocksBeforeActionsPlacement: 'insideLastSection',
12604
+ formBlocksAfter: richFooterCard({
12605
+ title: 'Praxis UI',
12606
+ subtitle: 'Template editorial reutilizavel para experiencias de inscricao.',
12607
+ links: ['Privacidade', 'Termos'],
12608
+ }),
12203
12609
  actions: {
12204
12610
  placement: 'afterSections',
12205
12611
  position: 'right',
@@ -12207,7 +12613,7 @@ const EVENT_REGISTRATION_EDITORIAL_TEMPLATE = {
12207
12613
  spacing: 'normal',
12208
12614
  submit: {
12209
12615
  visible: true,
12210
- label: 'Enviar inscrição',
12616
+ label: 'Enviar inscricao',
12211
12617
  type: 'submit',
12212
12618
  color: 'primary',
12213
12619
  variant: 'raised',
@@ -12228,8 +12634,19 @@ const EVENT_REGISTRATION_EDITORIAL_TEMPLATE = {
12228
12634
  },
12229
12635
  defaults: {
12230
12636
  fieldMetadata: [
12231
- { name: 'fullName', label: 'Nome completo*', controlType: 'input', required: true },
12232
- { name: 'email', label: 'E-mail*', controlType: 'email', required: true, readonly: true },
12637
+ {
12638
+ name: 'fullName',
12639
+ label: 'Nome completo*',
12640
+ controlType: 'input',
12641
+ required: true,
12642
+ },
12643
+ {
12644
+ name: 'email',
12645
+ label: 'E-mail*',
12646
+ controlType: 'email',
12647
+ required: true,
12648
+ readonly: true,
12649
+ },
12233
12650
  {
12234
12651
  name: 'attendanceMode',
12235
12652
  label: 'Como pretende participar?*',
@@ -12241,7 +12658,12 @@ const EVENT_REGISTRATION_EDITORIAL_TEMPLATE = {
12241
12658
  { text: 'Online', value: 'ONLINE' },
12242
12659
  ],
12243
12660
  },
12244
- { name: 'organizationName', label: 'Empresa ou instituição*', controlType: 'input', required: true },
12661
+ {
12662
+ name: 'organizationName',
12663
+ label: 'Empresa ou instituicao*',
12664
+ controlType: 'input',
12665
+ required: true,
12666
+ },
12245
12667
  { name: 'jobTitle', label: 'Cargo', controlType: 'input' },
12246
12668
  {
12247
12669
  name: 'discoverySource',
@@ -12251,7 +12673,7 @@ const EVENT_REGISTRATION_EDITORIAL_TEMPLATE = {
12251
12673
  options: [
12252
12674
  { text: 'Site institucional', value: 'WEBSITE' },
12253
12675
  { text: 'LinkedIn', value: 'LINKEDIN' },
12254
- { text: 'Indicação', value: 'REFERRAL' },
12676
+ { text: 'Indicacao', value: 'REFERRAL' },
12255
12677
  { text: 'Outro', value: 'OTHER' },
12256
12678
  ],
12257
12679
  },
@@ -12267,7 +12689,7 @@ const EVENT_REGISTRATION_EDITORIAL_TEMPLATE = {
12267
12689
  },
12268
12690
  {
12269
12691
  name: 'privacyConsent',
12270
- label: 'Aceito a política de privacidade e o tratamento dos dados informados.',
12692
+ label: 'Aceito a politica de privacidade e o tratamento dos dados informados.',
12271
12693
  controlType: 'checkbox',
12272
12694
  selectionMode: 'boolean',
12273
12695
  variant: 'consent',
@@ -12283,7 +12705,7 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
12283
12705
  version: '1.0.0',
12284
12706
  metadata: {
12285
12707
  title: 'Employee Onboarding',
12286
- description: 'Template editorial para admissão, pré-boarding e coleta inicial de dados de colaboradores.',
12708
+ description: 'Template editorial para admissao, pre-boarding e coleta inicial de dados de colaboradores.',
12287
12709
  category: 'onboarding',
12288
12710
  tags: ['employee', 'onboarding', 'hr', 'documents'],
12289
12711
  source: 'catalog',
@@ -12305,39 +12727,35 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
12305
12727
  { key: 'manager.name', type: 'string' },
12306
12728
  ],
12307
12729
  layout: {
12308
- formBlocksBefore: [
12309
- {
12310
- id: 'widget:hero-banner',
12311
- inputs: {
12312
- instanceId: 'template:employee-onboarding:hero',
12313
- title: 'Boas-vindas ao processo de',
12314
- titleAccent: 'onboarding',
12315
- subtitle: 'Template corporativo',
12316
- description: 'Base para admissão, conferência cadastral, preferências de trabalho e aceite de políticas internas.',
12317
- variant: 'institutional',
12318
- appearance: 'card',
12319
- },
12320
- },
12321
- {
12322
- id: 'widget:rich-text-block',
12323
- inputs: {
12324
- instanceId: 'template:employee-onboarding:summary',
12325
- title: 'O que será coletado',
12326
- subtitle: 'Resumo do fluxo',
12327
- icon: 'badge',
12328
- variant: 'subtle',
12329
- appearance: 'plain',
12330
- contentFormat: 'markdown',
12331
- content: '- dados pessoais e de contato\n- preferências operacionais iniciais\n- anexos e termos obrigatórios',
12332
- },
12730
+ formBlocksBefore: richDoc({
12731
+ type: 'mediaBlock',
12732
+ title: { type: 'text', text: 'Boas-vindas ao processo de onboarding' },
12733
+ subtitle: { type: 'text', text: 'Template corporativo' },
12734
+ meta: {
12735
+ type: 'compose',
12736
+ direction: 'row',
12737
+ wrap: true,
12738
+ items: [
12739
+ { type: 'badge', label: 'onboarding' },
12740
+ { type: 'text', text: 'Admissao, conferencia e preferencias iniciais' },
12741
+ ],
12333
12742
  },
12334
- ],
12743
+ }, {
12744
+ type: 'card',
12745
+ title: 'O que sera coletado',
12746
+ subtitle: 'Resumo do fluxo',
12747
+ content: [
12748
+ { type: 'text', text: 'Dados pessoais e de contato.' },
12749
+ { type: 'text', text: 'Preferencias operacionais iniciais.' },
12750
+ { type: 'text', text: 'Anexos e termos obrigatorios.' },
12751
+ ],
12752
+ }),
12335
12753
  sections: [
12336
12754
  {
12337
12755
  id: 'identity',
12338
12756
  appearance: 'step',
12339
12757
  stepLabel: '1',
12340
- title: 'Identificação',
12758
+ title: 'Identificacao',
12341
12759
  description: 'Dados essenciais para cadastro inicial do colaborador.',
12342
12760
  rows: [
12343
12761
  {
@@ -12360,28 +12778,34 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
12360
12778
  id: 'operations',
12361
12779
  appearance: 'step',
12362
12780
  stepLabel: '2',
12363
- title: 'Operação inicial',
12364
- description: 'Dados para preparação do ambiente e comunicação inicial.',
12781
+ title: 'Operacao inicial',
12782
+ description: 'Dados para preparacao do ambiente e comunicacao inicial.',
12365
12783
  rows: [
12366
- { id: 'row-equipment', columns: [{ id: 'col-equipment', fields: ['needsEquipment'] }] },
12367
- { id: 'row-address', columns: [{ id: 'col-address', fields: ['shippingAddress'] }] },
12368
- { id: 'row-notes', columns: [{ id: 'col-notes', fields: ['accessibilityNotes'] }] },
12369
- { id: 'row-privacy', columns: [{ id: 'col-privacy', fields: ['privacyConsent'] }] },
12784
+ {
12785
+ id: 'row-equipment',
12786
+ columns: [{ id: 'col-equipment', fields: ['needsEquipment'] }],
12787
+ },
12788
+ {
12789
+ id: 'row-address',
12790
+ columns: [{ id: 'col-address', fields: ['shippingAddress'] }],
12791
+ },
12792
+ {
12793
+ id: 'row-notes',
12794
+ columns: [{ id: 'col-notes', fields: ['accessibilityNotes'] }],
12795
+ },
12796
+ {
12797
+ id: 'row-privacy',
12798
+ columns: [{ id: 'col-privacy', fields: ['privacyConsent'] }],
12799
+ },
12370
12800
  ],
12371
12801
  },
12372
12802
  ],
12373
- formBlocksBeforeActions: [
12374
- {
12375
- id: 'widget:legal-notice',
12376
- inputs: {
12377
- instanceId: 'template:employee-onboarding:notice',
12378
- title: 'Uso interno',
12379
- severity: 'info',
12380
- appearance: 'plain',
12381
- content: 'As informações deste fluxo são usadas exclusivamente para cadastro interno, provisionamento e comunicação de onboarding.',
12382
- },
12383
- },
12384
- ],
12803
+ formBlocksBeforeActions: richIntroCard({
12804
+ title: 'Uso interno',
12805
+ subtitle: 'Antes do envio',
12806
+ badge: 'info',
12807
+ description: 'As informacoes deste fluxo sao usadas exclusivamente para cadastro interno, provisionamento e comunicacao de onboarding.',
12808
+ }),
12385
12809
  formBlocksBeforeActionsPlacement: 'afterSections',
12386
12810
  actions: {
12387
12811
  placement: 'afterSections',
@@ -12393,14 +12817,34 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
12393
12817
  color: 'primary',
12394
12818
  variant: 'raised',
12395
12819
  },
12396
- cancel: { visible: false, label: 'Cancelar', type: 'button', color: 'basic' },
12397
- reset: { visible: false, label: 'Reset', type: 'reset', color: 'basic' },
12820
+ cancel: {
12821
+ visible: false,
12822
+ label: 'Cancelar',
12823
+ type: 'button',
12824
+ color: 'basic',
12825
+ },
12826
+ reset: {
12827
+ visible: false,
12828
+ label: 'Reset',
12829
+ type: 'reset',
12830
+ color: 'basic',
12831
+ },
12398
12832
  },
12399
12833
  },
12400
12834
  defaults: {
12401
12835
  fieldMetadata: [
12402
- { name: 'fullName', label: 'Nome completo*', controlType: 'input', required: true },
12403
- { name: 'corporateEmail', label: 'E-mail corporativo*', controlType: 'email', required: true },
12836
+ {
12837
+ name: 'fullName',
12838
+ label: 'Nome completo*',
12839
+ controlType: 'input',
12840
+ required: true,
12841
+ },
12842
+ {
12843
+ name: 'corporateEmail',
12844
+ label: 'E-mail corporativo*',
12845
+ controlType: 'email',
12846
+ required: true,
12847
+ },
12404
12848
  { name: 'phoneNumber', label: 'Telefone', controlType: 'input' },
12405
12849
  {
12406
12850
  name: 'workModel',
@@ -12409,7 +12853,7 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
12409
12853
  required: true,
12410
12854
  options: [
12411
12855
  { text: 'Presencial', value: 'ONSITE' },
12412
- { text: 'Híbrido', value: 'HYBRID' },
12856
+ { text: 'Hibrido', value: 'HYBRID' },
12413
12857
  { text: 'Remoto', value: 'REMOTE' },
12414
12858
  ],
12415
12859
  },
@@ -12420,14 +12864,22 @@ const EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE = {
12420
12864
  required: true,
12421
12865
  options: [
12422
12866
  { text: 'Sim', value: 'YES' },
12423
- { text: 'Não', value: 'NO' },
12867
+ { text: 'Nao', value: 'NO' },
12424
12868
  ],
12425
12869
  },
12426
- { name: 'shippingAddress', label: 'Endereço para envio', controlType: 'textarea' },
12427
- { name: 'accessibilityNotes', label: 'Observações de acessibilidade ou preferências', controlType: 'textarea' },
12870
+ {
12871
+ name: 'shippingAddress',
12872
+ label: 'Endereco para envio',
12873
+ controlType: 'textarea',
12874
+ },
12875
+ {
12876
+ name: 'accessibilityNotes',
12877
+ label: 'Observacoes de acessibilidade ou preferencias',
12878
+ controlType: 'textarea',
12879
+ },
12428
12880
  {
12429
12881
  name: 'privacyConsent',
12430
- label: 'Confirmo ciência sobre o tratamento dos meus dados no processo de onboarding.',
12882
+ label: 'Confirmo ciencia sobre o tratamento dos meus dados no processo de onboarding.',
12431
12883
  controlType: 'checkbox',
12432
12884
  selectionMode: 'boolean',
12433
12885
  variant: 'consent',
@@ -12443,7 +12895,7 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
12443
12895
  version: '1.0.0',
12444
12896
  metadata: {
12445
12897
  title: 'Employee Onboarding Guided',
12446
- description: 'Template editorial guiado para onboarding com identificação enriquecida, preparação operacional e actions orientadas por etapa.',
12898
+ description: 'Template editorial guiado para onboarding com identificacao enriquecida, preparacao operacional e actions orientadas por etapa.',
12447
12899
  category: 'onboarding',
12448
12900
  tags: ['employee', 'onboarding', 'hr', 'guided', 'wizard'],
12449
12901
  source: 'catalog',
@@ -12469,7 +12921,7 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
12469
12921
  id: 'identity',
12470
12922
  appearance: 'step',
12471
12923
  stepLabel: '1',
12472
- title: 'Identificação',
12924
+ title: 'Identificacao',
12473
12925
  description: 'Preencha seus dados para que possamos configurar seu acesso.',
12474
12926
  rows: [
12475
12927
  {
@@ -12500,8 +12952,8 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
12500
12952
  id: 'operations',
12501
12953
  appearance: 'step',
12502
12954
  stepLabel: '2',
12503
- title: 'Operação inicial',
12504
- description: 'Configure os recursos necessários para o primeiro dia.',
12955
+ title: 'Operacao inicial',
12956
+ description: 'Configure os recursos necessarios para o primeiro dia.',
12505
12957
  rows: [
12506
12958
  {
12507
12959
  id: 'operations-row-1',
@@ -12510,7 +12962,10 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
12510
12962
  {
12511
12963
  id: 'operations-row-2',
12512
12964
  columns: [
12513
- { id: 'operations-col-observations', fields: ['accessibilityNotes'] },
12965
+ {
12966
+ id: 'operations-col-observations',
12967
+ fields: ['accessibilityNotes'],
12968
+ },
12514
12969
  ],
12515
12970
  },
12516
12971
  {
@@ -12520,9 +12975,9 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
12520
12975
  ],
12521
12976
  },
12522
12977
  ],
12523
- formBlocksBefore: [],
12524
- formBlocksBeforeActions: [],
12525
- formBlocksAfter: [],
12978
+ formBlocksBefore: richDoc(),
12979
+ formBlocksBeforeActions: richDoc(),
12980
+ formBlocksAfter: richDoc(),
12526
12981
  actions: {
12527
12982
  placement: 'afterSections',
12528
12983
  position: 'split',
@@ -12530,7 +12985,7 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
12530
12985
  spacing: 'normal',
12531
12986
  submit: {
12532
12987
  visible: true,
12533
- label: 'Próximo',
12988
+ label: 'Proximo',
12534
12989
  type: 'submit',
12535
12990
  color: 'primary',
12536
12991
  variant: 'raised',
@@ -12555,8 +13010,18 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
12555
13010
  },
12556
13011
  defaults: {
12557
13012
  fieldMetadata: [
12558
- { name: 'fullName', label: 'Nome completo *', controlType: 'input', required: true },
12559
- { name: 'corporateEmail', label: 'E-mail corporativo *', controlType: 'email', required: true },
13013
+ {
13014
+ name: 'fullName',
13015
+ label: 'Nome completo *',
13016
+ controlType: 'input',
13017
+ required: true,
13018
+ },
13019
+ {
13020
+ name: 'corporateEmail',
13021
+ label: 'E-mail corporativo *',
13022
+ controlType: 'email',
13023
+ required: true,
13024
+ },
12560
13025
  { name: 'phoneNumber', label: 'Telefone', controlType: 'input' },
12561
13026
  {
12562
13027
  name: 'department',
@@ -12584,7 +13049,7 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
12584
13049
  },
12585
13050
  {
12586
13051
  name: 'startDate',
12587
- label: 'Data de início',
13052
+ label: 'Data de inicio',
12588
13053
  controlType: 'date',
12589
13054
  required: true,
12590
13055
  },
@@ -12597,17 +13062,17 @@ const EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE = {
12597
13062
  options: [
12598
13063
  { text: 'Presencial', value: 'Presencial' },
12599
13064
  { text: 'Remoto', value: 'Remoto' },
12600
- { text: 'Híbrido', value: 'Híbrido' },
13065
+ { text: 'Hibrido', value: 'Hibrido' },
12601
13066
  ],
12602
13067
  },
12603
13068
  {
12604
13069
  name: 'accessibilityNotes',
12605
- label: 'Observações adicionais',
13070
+ label: 'Observacoes adicionais',
12606
13071
  controlType: 'textarea',
12607
13072
  },
12608
13073
  {
12609
13074
  name: 'privacyConsent',
12610
- label: 'Confirmo ciência sobre o tratamento dos meus dados no processo de onboarding.',
13075
+ label: 'Confirmo ciencia sobre o tratamento dos meus dados no processo de onboarding.',
12611
13076
  controlType: 'checkbox',
12612
13077
  selectionMode: 'boolean',
12613
13078
  variant: 'consent',
@@ -12623,7 +13088,7 @@ const PRIVACY_CONSENT_EDITORIAL_TEMPLATE = {
12623
13088
  version: '1.0.0',
12624
13089
  metadata: {
12625
13090
  title: 'Privacy Consent',
12626
- description: 'Template focado em aceite explícito, base legal, preferências de comunicação e registro de consentimento.',
13091
+ description: 'Template focado em aceite explicito, base legal, preferencias de comunicacao e registro de consentimento.',
12627
13092
  category: 'consent',
12628
13093
  tags: ['privacy', 'consent', 'compliance', 'legal'],
12629
13094
  source: 'catalog',
@@ -12641,49 +13106,43 @@ const PRIVACY_CONSENT_EDITORIAL_TEMPLATE = {
12641
13106
  { key: 'policy.updatedAt', type: 'date' },
12642
13107
  ],
12643
13108
  layout: {
12644
- formBlocksBefore: [
12645
- {
12646
- id: 'widget:legal-notice',
12647
- inputs: {
12648
- instanceId: 'template:privacy-consent:lead',
12649
- title: 'Consentimento e tratamento de dados',
12650
- severity: 'info',
12651
- appearance: 'card',
12652
- contentFormat: 'markdown',
12653
- content: 'Use este template quando o objetivo principal do fluxo for registrar ciência, aceite e preferências relacionadas a privacidade.',
12654
- },
12655
- },
12656
- ],
13109
+ formBlocksBefore: richIntroCard({
13110
+ title: 'Consentimento e tratamento de dados',
13111
+ subtitle: 'Template regulatorio',
13112
+ badge: 'info',
13113
+ description: 'Use este template quando o objetivo principal do fluxo for registrar ciencia, aceite e preferencias relacionadas a privacidade.',
13114
+ }),
12657
13115
  sections: [
12658
13116
  {
12659
13117
  id: 'consent',
12660
13118
  appearance: 'card',
12661
- title: 'Preferências e consentimentos',
12662
- description: 'Aceites explícitos e canais opcionais de comunicação.',
13119
+ title: 'Preferencias e consentimentos',
13120
+ description: 'Aceites explicitos e canais opcionais de comunicacao.',
12663
13121
  rows: [
12664
- { id: 'row-primary', columns: [{ id: 'col-primary', fields: ['privacyConsent'] }] },
12665
- { id: 'row-marketing', columns: [{ id: 'col-marketing', fields: ['marketingConsent'] }] },
12666
- { id: 'row-channels', columns: [{ id: 'col-channels', fields: ['preferredChannel'] }] },
12667
- { id: 'row-observation', columns: [{ id: 'col-observation', fields: ['consentNotes'] }] },
13122
+ {
13123
+ id: 'row-primary',
13124
+ columns: [{ id: 'col-primary', fields: ['privacyConsent'] }],
13125
+ },
13126
+ {
13127
+ id: 'row-marketing',
13128
+ columns: [{ id: 'col-marketing', fields: ['marketingConsent'] }],
13129
+ },
13130
+ {
13131
+ id: 'row-channels',
13132
+ columns: [{ id: 'col-channels', fields: ['preferredChannel'] }],
13133
+ },
13134
+ {
13135
+ id: 'row-observation',
13136
+ columns: [{ id: 'col-observation', fields: ['consentNotes'] }],
13137
+ },
12668
13138
  ],
12669
13139
  },
12670
13140
  ],
12671
- formBlocksAfter: [
12672
- {
12673
- id: 'widget:footer-links',
12674
- inputs: {
12675
- instanceId: 'template:privacy-consent:footer',
12676
- brandText: 'Praxis UI',
12677
- secondaryText: 'Template para fluxos regulatórios e comprovação de consentimento.',
12678
- layout: 'inline',
12679
- appearance: 'divider',
12680
- links: [
12681
- { label: 'Política de Privacidade', href: '/privacidade' },
12682
- { label: 'Canal LGPD', href: '/lgpd' },
12683
- ],
12684
- },
12685
- },
12686
- ],
13141
+ formBlocksAfter: richFooterCard({
13142
+ title: 'Praxis UI',
13143
+ subtitle: 'Template para fluxos regulatorios e comprovacao de consentimento.',
13144
+ links: ['Politica de Privacidade', 'Canal LGPD'],
13145
+ }),
12687
13146
  actions: {
12688
13147
  placement: 'afterSections',
12689
13148
  position: 'right',
@@ -12694,15 +13153,25 @@ const PRIVACY_CONSENT_EDITORIAL_TEMPLATE = {
12694
13153
  color: 'primary',
12695
13154
  variant: 'raised',
12696
13155
  },
12697
- cancel: { visible: false, label: 'Cancelar', type: 'button', color: 'basic' },
12698
- reset: { visible: false, label: 'Reset', type: 'reset', color: 'basic' },
13156
+ cancel: {
13157
+ visible: false,
13158
+ label: 'Cancelar',
13159
+ type: 'button',
13160
+ color: 'basic',
13161
+ },
13162
+ reset: {
13163
+ visible: false,
13164
+ label: 'Reset',
13165
+ type: 'reset',
13166
+ color: 'basic',
13167
+ },
12699
13168
  },
12700
13169
  },
12701
13170
  defaults: {
12702
13171
  fieldMetadata: [
12703
13172
  {
12704
13173
  name: 'privacyConsent',
12705
- label: 'Li e aceito a política de privacidade aplicável.',
13174
+ label: 'Li e aceito a politica de privacidade aplicavel.',
12706
13175
  controlType: 'checkbox',
12707
13176
  selectionMode: 'boolean',
12708
13177
  variant: 'consent',
@@ -12712,7 +13181,7 @@ const PRIVACY_CONSENT_EDITORIAL_TEMPLATE = {
12712
13181
  },
12713
13182
  {
12714
13183
  name: 'marketingConsent',
12715
- label: 'Aceito receber comunicações institucionais e materiais relacionados.',
13184
+ label: 'Aceito receber comunicacoes institucionais e materiais relacionados.',
12716
13185
  controlType: 'checkbox',
12717
13186
  selectionMode: 'boolean',
12718
13187
  variant: 'consent',
@@ -12720,7 +13189,7 @@ const PRIVACY_CONSENT_EDITORIAL_TEMPLATE = {
12720
13189
  },
12721
13190
  {
12722
13191
  name: 'preferredChannel',
12723
- label: 'Canal preferencial de comunicação',
13192
+ label: 'Canal preferencial de comunicacao',
12724
13193
  controlType: 'select',
12725
13194
  options: [
12726
13195
  { text: 'E-mail', value: 'EMAIL' },
@@ -12730,7 +13199,7 @@ const PRIVACY_CONSENT_EDITORIAL_TEMPLATE = {
12730
13199
  },
12731
13200
  {
12732
13201
  name: 'consentNotes',
12733
- label: 'Observações adicionais',
13202
+ label: 'Observacoes adicionais',
12734
13203
  controlType: 'textarea',
12735
13204
  },
12736
13205
  ],
@@ -18392,11 +18861,11 @@ function providePraxisHeroBannerMetadata() {
18392
18861
 
18393
18862
  /**
18394
18863
  * Binds a stored icon string to a mat-icon element supporting:
18395
- * - Material Icons (classic ligatures): "mi:pending" or "pending"
18864
+ * - Material Icons (classic ligatures): "mi:pending"
18396
18865
  * - Material Symbols Outlined: "mso:right_click" or "ms:right_click"
18397
18866
  * - Material Symbols Rounded: "msr:right_click"
18398
18867
  * - Material Symbols Sharp: "mss:right_click"
18399
- * Falls back to classic Material Icons when prefix is omitted.
18868
+ * Falls back to Material Symbols Outlined when prefix is omitted.
18400
18869
  */
18401
18870
  class PraxisIconDirective {
18402
18871
  el;
@@ -18437,16 +18906,18 @@ class PraxisIconDirective {
18437
18906
  this.rd.addClass(host, 'material-symbols-sharp');
18438
18907
  break;
18439
18908
  case 'mi':
18440
- default:
18441
18909
  this.rd.addClass(host, 'material-icons');
18442
18910
  break;
18911
+ default:
18912
+ this.rd.addClass(host, 'material-symbols-outlined');
18913
+ break;
18443
18914
  }
18444
18915
  host.textContent = name;
18445
18916
  }
18446
18917
  parse(raw) {
18447
18918
  const colon = raw.indexOf(':');
18448
18919
  if (colon <= 0)
18449
- return { family: 'mi', name: raw };
18920
+ return { family: 'mso', name: raw };
18450
18921
  const prefix = raw.slice(0, colon).toLowerCase();
18451
18922
  const name = raw.slice(colon + 1).trim() || raw;
18452
18923
  if (prefix === 'ms' || prefix === 'mso')
@@ -19404,6 +19875,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19404
19875
  type: Output
19405
19876
  }] } });
19406
19877
 
19878
+ const WIDGET_SHELL_I18N_NAMESPACE = 'widgetShell';
19879
+ const WIDGET_SHELL_I18N_CONFIG = {
19880
+ namespaces: {
19881
+ [WIDGET_SHELL_I18N_NAMESPACE]: {
19882
+ 'pt-BR': {
19883
+ 'controls.moreActions': 'Mais ações',
19884
+ 'controls.expandContent': 'Expandir conteúdo',
19885
+ 'controls.collapseContent': 'Recolher conteúdo',
19886
+ 'controls.exitFullscreen': 'Sair da tela cheia',
19887
+ 'controls.enterFullscreen': 'Tela cheia',
19888
+ },
19889
+ 'en-US': {
19890
+ 'controls.moreActions': 'More actions',
19891
+ 'controls.expandContent': 'Expand content',
19892
+ 'controls.collapseContent': 'Collapse content',
19893
+ 'controls.exitFullscreen': 'Exit fullscreen',
19894
+ 'controls.enterFullscreen': 'Fullscreen',
19895
+ },
19896
+ },
19897
+ },
19898
+ };
19899
+
19407
19900
  const BUILTIN_SHELL_PRESETS = {
19408
19901
  'dark-glass': {
19409
19902
  card: {
@@ -19425,10 +19918,10 @@ const BUILTIN_SHELL_PRESETS = {
19425
19918
  },
19426
19919
  'light-neutral': {
19427
19920
  card: {
19428
- background: '#f7f8fb',
19429
- borderColor: '#e3e7ef',
19430
- borderRadius: '14px',
19431
- shadow: '0 6px 18px rgba(15, 23, 42, 0.08)',
19921
+ background: '#f8fafc',
19922
+ borderColor: '#d7dfeb',
19923
+ borderRadius: '12px',
19924
+ shadow: '0 4px 12px rgba(15, 23, 42, 0.06)',
19432
19925
  },
19433
19926
  header: {
19434
19927
  titleColor: '#1f2937',
@@ -19451,6 +19944,7 @@ const BUILTIN_SHELL_PRESETS = {
19451
19944
  },
19452
19945
  };
19453
19946
  class WidgetShellComponent {
19947
+ i18n = inject(PraxisI18nService);
19454
19948
  shell;
19455
19949
  context = null;
19456
19950
  dragSurfaceEnabled = false;
@@ -19471,7 +19965,6 @@ class WidgetShellComponent {
19471
19965
  this.collapsed = !!this.shell?.collapsed;
19472
19966
  this.expanded = !!this.shell?.expanded;
19473
19967
  this.fullscreen = !!this.shell?.fullscreen;
19474
- // no-op: debug logs removed
19475
19968
  }
19476
19969
  get shellEnabled() {
19477
19970
  return !!this.shell && this.shell.kind !== 'none';
@@ -19536,6 +20029,9 @@ class WidgetShellComponent {
19536
20029
  this.expanded = false;
19537
20030
  this.fullscreen = false;
19538
20031
  }
20032
+ moreActionsLabel() {
20033
+ return this.t('controls.moreActions', 'Mais ações');
20034
+ }
19539
20035
  handleWindowAction(action) {
19540
20036
  if (action.id === 'collapse') {
19541
20037
  this.collapsed = !this.collapsed;
@@ -19554,8 +20050,9 @@ class WidgetShellComponent {
19554
20050
  this.expanded = true;
19555
20051
  this.collapsed = false;
19556
20052
  }
19557
- else
20053
+ else {
19558
20054
  this.expanded = false;
20055
+ }
19559
20056
  return { payload: { fullscreen: this.fullscreen } };
19560
20057
  }
19561
20058
  return null;
@@ -19571,8 +20068,10 @@ class WidgetShellComponent {
19571
20068
  actions.push({
19572
20069
  id: 'collapse',
19573
20070
  placement: 'window',
19574
- icon: this.collapsed ? 'unfold_more' : 'unfold_less',
19575
- tooltip: this.collapsed ? 'Expandir conteúdo' : 'Recolher conteúdo',
20071
+ icon: this.collapsed ? 'ms:unfold_more' : 'ms:unfold_less',
20072
+ tooltip: this.collapsed
20073
+ ? this.t('controls.expandContent', 'Expandir conteúdo')
20074
+ : this.t('controls.collapseContent', 'Recolher conteúdo'),
19576
20075
  variant: 'icon',
19577
20076
  });
19578
20077
  }
@@ -19580,8 +20079,10 @@ class WidgetShellComponent {
19580
20079
  actions.push({
19581
20080
  id: 'fullscreen',
19582
20081
  placement: 'window',
19583
- icon: this.fullscreen ? 'close_fullscreen' : 'open_in_full',
19584
- tooltip: this.fullscreen ? 'Sair da tela cheia' : 'Tela cheia',
20082
+ icon: this.fullscreen ? 'ms:close_fullscreen' : 'ms:open_in_full',
20083
+ tooltip: this.fullscreen
20084
+ ? this.t('controls.exitFullscreen', 'Sair da tela cheia')
20085
+ : this.t('controls.enterFullscreen', 'Tela cheia'),
19585
20086
  variant: 'icon',
19586
20087
  });
19587
20088
  }
@@ -19621,8 +20122,11 @@ class WidgetShellComponent {
19621
20122
  ? !!target.closest('button, a, input, select, textarea, [role="button"], [mat-menu-trigger-for]')
19622
20123
  : false;
19623
20124
  }
20125
+ t(key, fallback) {
20126
+ return this.i18n.t(key, undefined, fallback, WIDGET_SHELL_I18N_NAMESPACE);
20127
+ }
19624
20128
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: WidgetShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19625
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: WidgetShellComponent, isStandalone: true, selector: "praxis-widget-shell", inputs: { shell: "shell", context: "context", dragSurfaceEnabled: "dragSurfaceEnabled", dragSurfaceLabel: "dragSurfaceLabel" }, outputs: { action: "action", dragSurfacePointerDown: "dragSurfacePointerDown", dragSurfaceKeydown: "dragSurfaceKeydown" }, queries: [{ propertyName: "loader", first: true, predicate: DynamicWidgetLoaderDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
20129
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: WidgetShellComponent, isStandalone: true, selector: "praxis-widget-shell", inputs: { shell: "shell", context: "context", dragSurfaceEnabled: "dragSurfaceEnabled", dragSurfaceLabel: "dragSurfaceLabel" }, outputs: { action: "action", dragSurfacePointerDown: "dragSurfacePointerDown", dragSurfaceKeydown: "dragSurfaceKeydown" }, providers: [providePraxisI18nConfig(WIDGET_SHELL_I18N_CONFIG)], queries: [{ propertyName: "loader", first: true, predicate: DynamicWidgetLoaderDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
19626
20130
  <section
19627
20131
  class="pdx-shell"
19628
20132
  [class.no-shell]="!shellEnabled"
@@ -19702,13 +20206,13 @@ class WidgetShellComponent {
19702
20206
  <button
19703
20207
  mat-icon-button
19704
20208
  type="button"
19705
- [matTooltip]="'Mais ações'"
20209
+ [matTooltip]="moreActionsLabel()"
19706
20210
  matTooltipPosition="below"
19707
- aria-label="Mais ações"
20211
+ [attr.aria-label]="moreActionsLabel()"
19708
20212
  [matMenuTriggerFor]="overflowMenu"
19709
20213
  (click)="$event.stopPropagation()"
19710
20214
  >
19711
- <mat-icon>more_horiz</mat-icon>
20215
+ <mat-icon praxisIcon="ms:more_horiz"></mat-icon>
19712
20216
  </button>
19713
20217
  }
19714
20218
  }
@@ -19754,11 +20258,11 @@ class WidgetShellComponent {
19754
20258
  @if (expanded || fullscreen) {
19755
20259
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
19756
20260
  }
19757
- `, isInline: true, styles: [":host{display:block;height:100%}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 14px);box-shadow:var(--pdx-shell-card-shadow, var(--mat-elevation-level2));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:12px;padding:10px 12px 8px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:10px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 14px);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 12px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:6px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 10px 12px 12px 12px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;top:50%;left:50%;width:95vw;height:95vh;transform:translate(-50%,-50%);z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
20261
+ `, isInline: true, styles: [":host{display:block;height:100%}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;top:50%;left:50%;width:95vw;height:95vh;transform:translate(-50%,-50%);z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19758
20262
  }
19759
20263
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: WidgetShellComponent, decorators: [{
19760
20264
  type: Component,
19761
- args: [{ selector: 'praxis-widget-shell', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatTooltipModule, PraxisIconDirective], template: `
20265
+ args: [{ selector: 'praxis-widget-shell', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatTooltipModule, PraxisIconDirective], providers: [providePraxisI18nConfig(WIDGET_SHELL_I18N_CONFIG)], template: `
19762
20266
  <section
19763
20267
  class="pdx-shell"
19764
20268
  [class.no-shell]="!shellEnabled"
@@ -19838,13 +20342,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19838
20342
  <button
19839
20343
  mat-icon-button
19840
20344
  type="button"
19841
- [matTooltip]="'Mais ações'"
20345
+ [matTooltip]="moreActionsLabel()"
19842
20346
  matTooltipPosition="below"
19843
- aria-label="Mais ações"
20347
+ [attr.aria-label]="moreActionsLabel()"
19844
20348
  [matMenuTriggerFor]="overflowMenu"
19845
20349
  (click)="$event.stopPropagation()"
19846
20350
  >
19847
- <mat-icon>more_horiz</mat-icon>
20351
+ <mat-icon praxisIcon="ms:more_horiz"></mat-icon>
19848
20352
  </button>
19849
20353
  }
19850
20354
  }
@@ -19890,7 +20394,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19890
20394
  @if (expanded || fullscreen) {
19891
20395
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
19892
20396
  }
19893
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 14px);box-shadow:var(--pdx-shell-card-shadow, var(--mat-elevation-level2));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:12px;padding:10px 12px 8px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:10px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 14px);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 12px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:6px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 10px 12px 12px 12px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;top:50%;left:50%;width:95vw;height:95vh;transform:translate(-50%,-50%);z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"] }]
20397
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;top:50%;left:50%;width:95vw;height:95vh;transform:translate(-50%,-50%);z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"] }]
19894
20398
  }], propDecorators: { shell: [{
19895
20399
  type: Input
19896
20400
  }], context: [{
@@ -22821,6 +23325,9 @@ const DYNAMIC_WIDGET_PAGE_I18N_CONFIG = {
22821
23325
  [DYNAMIC_WIDGET_PAGE_I18N_NAMESPACE]: {
22822
23326
  'pt-BR': {
22823
23327
  'controls.pageSettings': 'Configurar página',
23328
+ 'controls.widgetSettings': 'Configurar widget',
23329
+ 'controls.widgetSettingsTooltip': 'Abrir configurações do widget',
23330
+ 'controls.cardSettings': 'Configurar card',
22824
23331
  'controls.widgetLayoutToolbar': 'Ações de layout do widget',
22825
23332
  'controls.dragWidget': 'Arrastar widget',
22826
23333
  'controls.resizeWidget': 'Redimensionar widget',
@@ -22841,6 +23348,9 @@ const DYNAMIC_WIDGET_PAGE_I18N_CONFIG = {
22841
23348
  },
22842
23349
  'en-US': {
22843
23350
  'controls.pageSettings': 'Configure page',
23351
+ 'controls.widgetSettings': 'Configure widget',
23352
+ 'controls.widgetSettingsTooltip': 'Open widget settings',
23353
+ 'controls.cardSettings': 'Configure card',
22844
23354
  'controls.widgetLayoutToolbar': 'Widget layout actions',
22845
23355
  'controls.dragWidget': 'Drag widget',
22846
23356
  'controls.resizeWidget': 'Resize widget',
@@ -23116,13 +23626,19 @@ class DynamicWidgetPageComponent {
23116
23626
  return;
23117
23627
  }
23118
23628
  const page = this.ensurePageDefinition();
23119
- const cycle = this.dispatchWidgetEventToComposition(page, fromKey, evt);
23120
- if (!cycle || !cycle.matchedLinkIds.length)
23629
+ const widgetInputPatchResult = this.applyWidgetInputPatchToPage(page, fromKey, evt?.payload);
23630
+ const pageWithPatchedInputs = widgetInputPatchResult.page;
23631
+ const cycle = this.dispatchWidgetEventToComposition(pageWithPatchedInputs, fromKey, evt);
23632
+ if (!cycle || !cycle.matchedLinkIds.length) {
23633
+ if (widgetInputPatchResult.changed) {
23634
+ this.applyPageUpdate(pageWithPatchedInputs, true, undefined, false, true);
23635
+ }
23121
23636
  return;
23122
- const state = this.stateFromCompositionSnapshot(page.state, cycle.snapshot.state.primaryValues);
23637
+ }
23638
+ const state = this.stateFromCompositionSnapshot(pageWithPatchedInputs.state, cycle.snapshot.state.primaryValues);
23123
23639
  const runtimeStatePaths = Array.from(new Set((cycle.snapshot.state.changedPaths || []).filter((path) => typeof path === 'string')));
23124
23640
  const updatedPrimaryStatePaths = runtimeStatePaths.filter((path) => (!this.areStateValuesEqual(this.conn.extractByPath(this.stateRuntime.normalizeState(page.state).values || {}, path), this.conn.extractByPath(state.values || {}, path))));
23125
- let widgets = this.cloneWidgets(page.widgets || []);
23641
+ let widgets = this.cloneWidgets(pageWithPatchedInputs.widgets || []);
23126
23642
  const directDelivery = this.applyCompositionWidgetDeliveries(widgets, cycle);
23127
23643
  widgets = directDelivery.widgets;
23128
23644
  const projectedWidgets = this.compositionRuntime.projectStateWidgetInputs(this.compositionDefinition, {
@@ -23132,11 +23648,63 @@ class DynamicWidgetPageComponent {
23132
23648
  }).widgets;
23133
23649
  const stateProjectionChanged = !this.areStateValuesEqual(widgets, projectedWidgets);
23134
23650
  widgets = projectedWidgets;
23135
- const nextRuntime = this.buildStateRuntime(state, page.context);
23136
- if (!updatedPrimaryStatePaths.length && !directDelivery.changed && !stateProjectionChanged) {
23651
+ const nextRuntime = this.buildStateRuntime(state, pageWithPatchedInputs.context);
23652
+ if (!updatedPrimaryStatePaths.length && !directDelivery.changed && !stateProjectionChanged && !widgetInputPatchResult.changed) {
23137
23653
  return;
23138
23654
  }
23139
- this.applyPageUpdate({ ...page, widgets, state }, true, nextRuntime, false);
23655
+ this.applyPageUpdate({ ...pageWithPatchedInputs, widgets, state }, true, nextRuntime, false);
23656
+ }
23657
+ applyWidgetInputPatchToPage(page, widgetKey, payload) {
23658
+ const inputPatch = this.extractWidgetInputPatch(payload);
23659
+ if (!inputPatch) {
23660
+ return { page, changed: false };
23661
+ }
23662
+ const widgets = this.cloneWidgets(page.widgets || []);
23663
+ const widgetIndex = widgets.findIndex((widget) => widget.key === widgetKey);
23664
+ if (widgetIndex < 0) {
23665
+ return { page, changed: false };
23666
+ }
23667
+ const currentInputs = this.cloneStateValues(widgets[widgetIndex].definition.inputs || {});
23668
+ let nextInputs = currentInputs;
23669
+ let patchChanged = false;
23670
+ for (const [path, value] of Object.entries(inputPatch)) {
23671
+ const normalizedPath = typeof path === 'string' ? path.trim() : '';
23672
+ if (!normalizedPath) {
23673
+ continue;
23674
+ }
23675
+ const candidateInputs = this.conn.setValueAtPath(nextInputs, normalizedPath, this.cloneStateValues(value));
23676
+ if (!this.areStateValuesEqual(nextInputs, candidateInputs)) {
23677
+ nextInputs = candidateInputs;
23678
+ patchChanged = true;
23679
+ }
23680
+ }
23681
+ if (!patchChanged) {
23682
+ return { page, changed: false };
23683
+ }
23684
+ widgets[widgetIndex] = {
23685
+ ...widgets[widgetIndex],
23686
+ definition: {
23687
+ ...widgets[widgetIndex].definition,
23688
+ inputs: nextInputs,
23689
+ },
23690
+ };
23691
+ return {
23692
+ page: {
23693
+ ...page,
23694
+ widgets,
23695
+ },
23696
+ changed: true,
23697
+ };
23698
+ }
23699
+ extractWidgetInputPatch(payload) {
23700
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
23701
+ return null;
23702
+ }
23703
+ const candidate = payload.inputPatch;
23704
+ if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {
23705
+ return null;
23706
+ }
23707
+ return candidate;
23140
23708
  }
23141
23709
  buildStateRuntime(state, pageContext) {
23142
23710
  return this.stateRuntime.buildRuntimeSnapshot(state, this.buildStateContext(pageContext));
@@ -23523,7 +24091,7 @@ class DynamicWidgetPageComponent {
23523
24091
  const uiShell = page.context?.ui?.shell || {};
23524
24092
  const ref = this.settingsPanel.open({
23525
24093
  id: `dynamic-page-shell:${key}`,
23526
- title: 'Configurar Card',
24094
+ title: this.t('controls.cardSettings', 'Configurar card'),
23527
24095
  content: {
23528
24096
  component: editor,
23529
24097
  inputs: {
@@ -23548,7 +24116,7 @@ class DynamicWidgetPageComponent {
23548
24116
  const uiShell = page.context?.ui?.shell || {};
23549
24117
  const ref = this.settingsPanel.open({
23550
24118
  id: 'dynamic-page-settings',
23551
- title: 'Configurar Página',
24119
+ title: this.t('controls.pageSettings', 'Configurar página'),
23552
24120
  content: {
23553
24121
  component: editor,
23554
24122
  inputs: {
@@ -23610,27 +24178,29 @@ class DynamicWidgetPageComponent {
23610
24178
  themePreset: themePreset || undefined,
23611
24179
  }, persist);
23612
24180
  }
23613
- applyPageUpdate(next, persist = true, runtime = this.buildStateRuntime(next.state, next.context), syncCompositionAdapter = true) {
24181
+ applyPageUpdate(next, persist = true, runtime = this.buildStateRuntime(next.state, next.context), syncCompositionAdapter = true, skipStateWidgetProjection = false) {
23614
24182
  this.assertNoLegacyConnections(next);
23615
24183
  const normalized = { ...next, state: runtime.state };
23616
24184
  const normalizedWidgets = this.applyEditShellActions(normalized.widgets || []);
23617
24185
  const bootstrapSnapshot = syncCompositionAdapter
23618
24186
  ? this.bootstrapCompositionAdapter(normalized)
23619
24187
  : undefined;
23620
- const stateBoundWidgets = bootstrapSnapshot
23621
- ? this.applyBootstrapCompositionHydration(normalizedWidgets, bootstrapSnapshot)
23622
- : this.compositionDefinition
23623
- ? this.compositionRuntime.projectStateWidgetInputs(this.compositionDefinition, {
23624
- widgets: normalizedWidgets,
23625
- state: {
23626
- primaryValues: this.cloneStateValues(runtime.primaryValues),
23627
- derivedValues: this.cloneStateValues(runtime.derivedValues),
23628
- transientValues: {},
23629
- changedPaths: [],
23630
- diagnostics: [],
23631
- },
23632
- }).widgets
23633
- : normalizedWidgets;
24188
+ const stateBoundWidgets = skipStateWidgetProjection
24189
+ ? normalizedWidgets
24190
+ : bootstrapSnapshot
24191
+ ? this.applyBootstrapCompositionHydration(normalizedWidgets, bootstrapSnapshot)
24192
+ : this.compositionDefinition
24193
+ ? this.compositionRuntime.projectStateWidgetInputs(this.compositionDefinition, {
24194
+ widgets: normalizedWidgets,
24195
+ state: {
24196
+ primaryValues: this.cloneStateValues(runtime.primaryValues),
24197
+ derivedValues: this.cloneStateValues(runtime.derivedValues),
24198
+ transientValues: {},
24199
+ changedPaths: [],
24200
+ diagnostics: [],
24201
+ },
24202
+ }).widgets
24203
+ : normalizedWidgets;
23634
24204
  const hydrated = this.resolvePagePresets({ ...normalized, widgets: stateBoundWidgets });
23635
24205
  this.pageDefinition = hydrated;
23636
24206
  this.page = hydrated;
@@ -23915,6 +24485,12 @@ class DynamicWidgetPageComponent {
23915
24485
  isCanvasMode() {
23916
24486
  return !!this.canvas;
23917
24487
  }
24488
+ shouldAutoWireOutputs(widget) {
24489
+ if (this.enableCustomization) {
24490
+ return true;
24491
+ }
24492
+ return widget?.definition?.inputs?.['enableCustomization'] === true;
24493
+ }
23918
24494
  selectCanvasWidget(widgetKey) {
23919
24495
  if (this.selectedCanvasWidgetKey !== widgetKey) {
23920
24496
  this.selectedCanvasWidgetKey = widgetKey;
@@ -24727,7 +25303,7 @@ class DynamicWidgetPageComponent {
24727
25303
  [attr.aria-label]="pageSettingsLabel()"
24728
25304
  (click)="openPageSettings()"
24729
25305
  >
24730
- <mat-icon>settings</mat-icon>
25306
+ <mat-icon fontSet="material-symbols-outlined">settings</mat-icon>
24731
25307
  </button>
24732
25308
  }
24733
25309
  <div
@@ -24782,6 +25358,7 @@ class DynamicWidgetPageComponent {
24782
25358
  [ownerWidgetKey]="w.key"
24783
25359
  [context]="mergedContext"
24784
25360
  [strictValidation]="strictValidation"
25361
+ [autoWireOutputs]="shouldAutoWireOutputs(w)"
24785
25362
  (widgetEvent)="onWidgetEvent(w.key, $event)"
24786
25363
  (widgetDiagnostic)="onWidgetDiagnostic(w.key, $event)"
24787
25364
  ></ng-container>
@@ -24839,6 +25416,7 @@ class DynamicWidgetPageComponent {
24839
25416
  [ownerWidgetKey]="w.key"
24840
25417
  [context]="mergedContext"
24841
25418
  [strictValidation]="strictValidation"
25419
+ [autoWireOutputs]="shouldAutoWireOutputs(w)"
24842
25420
  (widgetEvent)="onWidgetEvent(w.key, $event)"
24843
25421
  (widgetDiagnostic)="onWidgetDiagnostic(w.key, $event)"
24844
25422
  ></ng-container>
@@ -24863,6 +25441,7 @@ class DynamicWidgetPageComponent {
24863
25441
  [ownerWidgetKey]="w.key"
24864
25442
  [context]="mergedContext"
24865
25443
  [strictValidation]="strictValidation"
25444
+ [autoWireOutputs]="shouldAutoWireOutputs(w)"
24866
25445
  (widgetEvent)="onWidgetEvent(w.key, $event)"
24867
25446
  (widgetDiagnostic)="onWidgetDiagnostic(w.key, $event)"
24868
25447
  ></ng-container>
@@ -24886,6 +25465,7 @@ class DynamicWidgetPageComponent {
24886
25465
  [ownerWidgetKey]="w.key"
24887
25466
  [context]="mergedContext"
24888
25467
  [strictValidation]="strictValidation"
25468
+ [autoWireOutputs]="shouldAutoWireOutputs(w)"
24889
25469
  (widgetEvent)="onWidgetEvent(w.key, $event)"
24890
25470
  (widgetDiagnostic)="onWidgetDiagnostic(w.key, $event)"
24891
25471
  ></ng-container>
@@ -24898,7 +25478,7 @@ class DynamicWidgetPageComponent {
24898
25478
  <div class="pdx-sr-only" aria-live="polite">{{ layoutAnnouncement }}</div>
24899
25479
  }
24900
25480
  </div>
24901
- `, isInline: true, styles: [".pdx-page-wrapper{position:relative;display:block}.pdx-page{display:grid;gap:16px;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:999px;margin-bottom:8px}.pdx-widget{position:relative;background:var(--pfx-surface, transparent);border-radius:8px;min-width:0;min-height:0}.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-selected:before{border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);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-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-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: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { 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"] }] });
25481
+ `, 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--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-selected:before{border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);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-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-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: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { 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"] }] });
24902
25482
  }
24903
25483
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DynamicWidgetPageComponent, decorators: [{
24904
25484
  type: Component,
@@ -24914,7 +25494,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
24914
25494
  [attr.aria-label]="pageSettingsLabel()"
24915
25495
  (click)="openPageSettings()"
24916
25496
  >
24917
- <mat-icon>settings</mat-icon>
25497
+ <mat-icon fontSet="material-symbols-outlined">settings</mat-icon>
24918
25498
  </button>
24919
25499
  }
24920
25500
  <div
@@ -24969,6 +25549,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
24969
25549
  [ownerWidgetKey]="w.key"
24970
25550
  [context]="mergedContext"
24971
25551
  [strictValidation]="strictValidation"
25552
+ [autoWireOutputs]="shouldAutoWireOutputs(w)"
24972
25553
  (widgetEvent)="onWidgetEvent(w.key, $event)"
24973
25554
  (widgetDiagnostic)="onWidgetDiagnostic(w.key, $event)"
24974
25555
  ></ng-container>
@@ -25026,6 +25607,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25026
25607
  [ownerWidgetKey]="w.key"
25027
25608
  [context]="mergedContext"
25028
25609
  [strictValidation]="strictValidation"
25610
+ [autoWireOutputs]="shouldAutoWireOutputs(w)"
25029
25611
  (widgetEvent)="onWidgetEvent(w.key, $event)"
25030
25612
  (widgetDiagnostic)="onWidgetDiagnostic(w.key, $event)"
25031
25613
  ></ng-container>
@@ -25050,6 +25632,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25050
25632
  [ownerWidgetKey]="w.key"
25051
25633
  [context]="mergedContext"
25052
25634
  [strictValidation]="strictValidation"
25635
+ [autoWireOutputs]="shouldAutoWireOutputs(w)"
25053
25636
  (widgetEvent)="onWidgetEvent(w.key, $event)"
25054
25637
  (widgetDiagnostic)="onWidgetDiagnostic(w.key, $event)"
25055
25638
  ></ng-container>
@@ -25073,6 +25656,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25073
25656
  [ownerWidgetKey]="w.key"
25074
25657
  [context]="mergedContext"
25075
25658
  [strictValidation]="strictValidation"
25659
+ [autoWireOutputs]="shouldAutoWireOutputs(w)"
25076
25660
  (widgetEvent)="onWidgetEvent(w.key, $event)"
25077
25661
  (widgetDiagnostic)="onWidgetDiagnostic(w.key, $event)"
25078
25662
  ></ng-container>
@@ -25085,7 +25669,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
25085
25669
  <div class="pdx-sr-only" aria-live="polite">{{ layoutAnnouncement }}</div>
25086
25670
  }
25087
25671
  </div>
25088
- `, styles: [".pdx-page-wrapper{position:relative;display:block}.pdx-page{display:grid;gap:16px;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:999px;margin-bottom:8px}.pdx-widget{position:relative;background:var(--pfx-surface, transparent);border-radius:8px;min-width:0;min-height:0}.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-selected:before{border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);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-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-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"] }]
25672
+ `, 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--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-selected:before{border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);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-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-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"] }]
25089
25673
  }], ctorParameters: () => [], propDecorators: { pageCanvasHost: [{
25090
25674
  type: ViewChild,
25091
25675
  args: ['pageCanvasHost']
@@ -26575,4 +27159,4 @@ function provideHookWhitelist(allowed) {
26575
27159
  * Generated bundle index. Do not edit.
26576
27160
  */
26577
27161
 
26578
- 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, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, 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$1 as GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_CATALOG as GLOBAL_ACTION_SPEC_CATALOG, 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, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, 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_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, 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, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisLayerScaleCss, buildSchemaId, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getGlobalActionCatalog, getGlobalActionUiSchema, getReferencedFieldMetadata, getTextTransformer, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isInlineFilterControlType, isRangeValidForFilter, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormMetadata, normalizePath, normalizePraxisDataQueryContext, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisDynamicPageMetadata, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisJsonLogicOperator, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveValuePresentation, resolveValuePresentationLocale, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, withMessage, withPraxisHttpLoading };
27162
+ 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, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, 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$1 as GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_CATALOG as GLOBAL_ACTION_SPEC_CATALOG, 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, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, 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_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, 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, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisLayerScaleCss, buildSchemaId, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getGlobalActionCatalog, getGlobalActionUiSchema, getReferencedFieldMetadata, getTextTransformer, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isInlineFilterControlType, isRangeValidForFilter, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormMetadata, normalizePath, normalizePraxisDataQueryContext, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisDynamicPageMetadata, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveValuePresentation, resolveValuePresentationLocale, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, withMessage, withPraxisHttpLoading };