@praxisui/core 1.0.0-beta.5 → 1.0.0-beta.52

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.
package/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Provider, Type, EnvironmentProviders, OnInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges, ElementRef, Renderer2 } from '@angular/core';
3
- import { HttpHeaders, HttpClient, HttpParams } from '@angular/common/http';
2
+ import { InjectionToken, Type, Provider, ErrorHandler, EnvironmentProviders, OnInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges, ElementRef, Renderer2 } from '@angular/core';
4
3
  import * as rxjs from 'rxjs';
5
4
  import { Observable, BehaviorSubject } from 'rxjs';
5
+ import { HttpHeaders, HttpContext, HttpClient, HttpParams, HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpContextToken } from '@angular/common/http';
6
6
  import { ValidationErrors, ValidatorFn, AsyncValidatorFn, FormControl, FormGroup } from '@angular/forms';
7
- import { ThemePalette } from '@angular/material/core';
7
+ import { ThemePalette, DateAdapter } from '@angular/material/core';
8
+ import { ActivatedRoute } from '@angular/router';
8
9
  import { MatDialogRef } from '@angular/material/dialog';
9
10
 
10
11
  declare class PraxisCore {
@@ -12,6 +13,219 @@ declare class PraxisCore {
12
13
  static ɵcmp: i0.ɵɵComponentDeclaration<PraxisCore, "praxis-praxis-core", never, {}, {}, never, never, true, never>;
13
14
  }
14
15
 
16
+ interface HateoasLink {
17
+ href: string;
18
+ templated?: boolean;
19
+ type?: string;
20
+ deprecation?: string;
21
+ profile?: string;
22
+ name?: string;
23
+ title?: string;
24
+ hreflang?: string;
25
+ [prop: string]: any;
26
+ }
27
+ interface RestApiLinks {
28
+ [rel: string]: HateoasLink | HateoasLink[];
29
+ }
30
+ interface RestApiResponse<T> {
31
+ status?: string;
32
+ message?: string;
33
+ data: T;
34
+ _links?: RestApiLinks;
35
+ errors?: any;
36
+ timestamp?: string;
37
+ }
38
+
39
+ interface Page<T> {
40
+ content: T[];
41
+ totalElements: number;
42
+ totalPages: number;
43
+ size: number;
44
+ number: number;
45
+ }
46
+ interface CursorPage<T> {
47
+ content: T[];
48
+ next?: string | null;
49
+ prev?: string | null;
50
+ size: number;
51
+ }
52
+
53
+ interface OptionDTO<ID = string | number> {
54
+ id: ID;
55
+ label: string;
56
+ extra?: Record<string, unknown>;
57
+ }
58
+
59
+ interface PageableRequest {
60
+ pageNumber: number;
61
+ pageSize: number;
62
+ sort?: string[];
63
+ }
64
+ interface FilterOptions<ID = string | number> {
65
+ includeIds?: ID[];
66
+ observeVersionHeader?: boolean;
67
+ }
68
+ interface CursorRequest {
69
+ size?: number;
70
+ sort?: string[];
71
+ after?: string | null;
72
+ before?: string | null;
73
+ }
74
+ interface LocateRequest {
75
+ size: number;
76
+ sort?: string[];
77
+ }
78
+
79
+ /**
80
+ * Contrato de saída do normalizador de esquema (SchemaNormalizerService):
81
+ * - Converte metadados `x-ui` em FieldDefinition tipado.
82
+ * - Todas as funções expostas são funções reais (nunca strings):
83
+ * - conditionalDisplay: () => boolean
84
+ * - conditionalRequired: () => boolean
85
+ * - transformValueFunction: (val: any) => any
86
+ * - Suporte completo a ValidatorOptions (sincronos e assíncronos),
87
+ * incluindo mensagens e comportamento de validação (gatilhos, debounce, exibição de erros).
88
+ */
89
+ interface FieldDefinition {
90
+ name: string;
91
+ label?: string;
92
+ description?: string;
93
+ type?: string;
94
+ controlType?: string;
95
+ mode?: string;
96
+ placeholder?: string;
97
+ defaultValue?: any;
98
+ group?: string;
99
+ order?: number;
100
+ width?: number | string;
101
+ isFlex?: boolean;
102
+ displayOrientation?: string;
103
+ disabled?: boolean;
104
+ readOnly?: boolean;
105
+ multiple?: boolean;
106
+ editable?: boolean;
107
+ validationMode?: string;
108
+ unique?: boolean;
109
+ mask?: string;
110
+ sortable?: boolean;
111
+ /** Função que define obrigatoriedade condicional. */
112
+ conditionalRequired?: () => boolean;
113
+ viewOnlyStyle?: string;
114
+ /** Lista de gatilhos de validação, ex.: ["blur", "change"]. */
115
+ validationTriggers?: string[];
116
+ hidden?: boolean;
117
+ tableHidden?: boolean;
118
+ formHidden?: boolean;
119
+ filterable?: boolean;
120
+ /** Função que controla se o campo é exibido. */
121
+ conditionalDisplay?: () => boolean;
122
+ dependentField?: string;
123
+ resetOnDependentChange?: boolean;
124
+ inlineEditing?: boolean;
125
+ /** Função de transformação de valor antes de salvar/exibir. */
126
+ transformValueFunction?: (val: any) => any;
127
+ debounceTime?: number;
128
+ helpText?: string;
129
+ hint?: string;
130
+ hiddenCondition?: any;
131
+ tooltipOnHover?: boolean;
132
+ icon?: string;
133
+ iconPosition?: string;
134
+ iconSize?: string | number;
135
+ iconColor?: string;
136
+ iconClass?: string;
137
+ iconStyle?: string;
138
+ iconFontSize?: string | number;
139
+ valueField?: string;
140
+ displayField?: string;
141
+ endpoint?: string;
142
+ resourcePath?: string;
143
+ emptyOptionText?: string;
144
+ options?: {
145
+ key: string;
146
+ value: string;
147
+ }[];
148
+ filter?: any;
149
+ filterCriteria?: any;
150
+ searchable?: boolean;
151
+ selectAll?: boolean;
152
+ maxSelections?: number;
153
+ optionLabelKey?: string;
154
+ optionValueKey?: string;
155
+ filterOptions?: any[];
156
+ filterControlType?: string;
157
+ numericFormat?: string;
158
+ numericStep?: number;
159
+ numericMin?: number;
160
+ numericMax?: number;
161
+ numericMaxLength?: number;
162
+ optionGroups?: {
163
+ key: string;
164
+ value: string;
165
+ }[];
166
+ disabledOptions?: string[];
167
+ buttons?: any[];
168
+ /** Obrigatório. */
169
+ required?: boolean;
170
+ requiredMessage?: string;
171
+ /** Tamanho mínimo/máximo (strings). */
172
+ minLength?: number;
173
+ minLengthMessage?: string;
174
+ maxLength?: number;
175
+ maxLengthMessage?: string;
176
+ /** Limites numéricos. */
177
+ min?: number;
178
+ max?: number;
179
+ /** Mensagens dedicadas para min/max numéricos. */
180
+ minMessage?: string;
181
+ maxMessage?: string;
182
+ /** Mensagem quando ambos limites (range) são aplicados. */
183
+ rangeMessage?: string;
184
+ /** Padrão (regex). Aceita pattern/regex. */
185
+ pattern?: string;
186
+ patternMessage?: string;
187
+ /** Validação de e-mail. */
188
+ email?: boolean;
189
+ emailMessage?: string;
190
+ /** Validação de URL. */
191
+ url?: boolean;
192
+ urlMessage?: string;
193
+ /** Requer que valor combine com outro campo. */
194
+ matchField?: string;
195
+ matchFieldMessage?: string;
196
+ /** Requer que o checkbox esteja marcado. */
197
+ requiredChecked?: boolean;
198
+ /** Tipos de arquivo permitidos e tamanho máximo. */
199
+ allowedFileTypes?: string[];
200
+ fileTypeMessage?: string;
201
+ maxFileSize?: number;
202
+ /** Validador customizado síncrono. */
203
+ customValidator?: (value: any, model?: any) => any;
204
+ /** Validador customizado assíncrono. */
205
+ asyncValidator?: (value: any, model?: any) => Promise<any>;
206
+ /** Validador de unicidade (ex.: consulta ao backend). */
207
+ uniqueValidator?: (value: any, model?: any) => boolean | Promise<boolean>;
208
+ uniqueMessage?: string;
209
+ /** Validação condicional baseada em outro(s) campos/estado. */
210
+ conditionalValidation?: (value: any, model?: any) => boolean | string | Promise<boolean | string>;
211
+ /** Mínimo de palavras (para textos longos). */
212
+ minWords?: number;
213
+ /** Gatilho(s) de validação (alias de validationTriggers). */
214
+ /** Tempo de debounce (ms) para executar validação. */
215
+ validationDebounce?: number;
216
+ /** Exibir erros inline no campo. */
217
+ showInlineErrors?: boolean;
218
+ /** Posição preferida da mensagem de erro (ex.: below, right). */
219
+ errorPosition?: string;
220
+ [key: string]: any;
221
+ }
222
+
223
+ declare enum ApiEndpoint {
224
+ Default = "default",
225
+ HumanResources = "humanResources",
226
+ UiWrappersTest = "uiWrappersTest"
227
+ }
228
+
15
229
  interface ApiUrlEntry {
16
230
  baseUrl?: string;
17
231
  path?: string;
@@ -27,17 +241,102 @@ declare function buildApiUrl(entry: ApiUrlEntry): string;
27
241
  declare function buildHeaders(entry: ApiUrlEntry): HttpHeaders | undefined;
28
242
 
29
243
  /**
30
- * Nova arquitetura modular do TableConfig v2.0
31
- * Preparada para crescimento exponencial e alinhada com as 5 abas do editor
244
+ * SchemaNormalizerService
245
+ * -----------------------
246
+ * Serviço responsável por converter um esquema bruto (OpenAPI + x-ui) em uma
247
+ * lista tipada de FieldDefinition consumida pelo restante do sistema
248
+ * (mapeadores de metadata, criador de FormGroup, carregador de campos dinâmicos, etc.).
249
+ *
250
+ * Entrada esperada
251
+ * - Objeto JSON no formato OpenAPI/JSON Schema contendo:
252
+ * - properties: { [name: string]: { type, title, description, ... , 'x-ui': { ... } } }
253
+ * - Em cada propriedade, o objeto 'x-ui' define aspectos de UI/validação.
254
+ *
255
+ * Saída (FieldDefinition[])
256
+ * - Tipagem forte de campos com funções reais (nunca strings) para regras condicionais e validadores customizados.
257
+ * - Todas as propriedades de validação e comportamento consolidadas no mesmo objeto do campo.
258
+ *
259
+ * Segurança e observações
260
+ * - Este serviço aceita funções em formato string dentro do x-ui (ex.: uniqueValidator, conditionalValidation),
261
+ * e as converte via new Function. Isso exige backend confiável e controlado.
262
+ * Em ambientes não confiáveis, evite funções como string ou implemente um sandbox/whitelist.
263
+ * - Valores booleanos/numéricos são normalizados para tipos nativos.
264
+ * - Arrays de opções são convertidos para pares { key, value } previsíveis.
265
+ *
266
+ * Exemplo mínimo de entrada
267
+ * const schema = {
268
+ * properties: {
269
+ * email: {
270
+ * type: 'string',
271
+ * title: 'E-mail',
272
+ * 'x-ui': { controlType: 'input', type: 'string', required: true, email: true }
273
+ * }
274
+ * }
275
+ * };
276
+ * const fields = normalizer.normalizeSchema(schema);
277
+ * // fields: [{ name: 'email', label: 'E-mail', type: 'string', controlType: 'input', required: true, email: true }]
32
278
  */
33
- interface ColumnDefinition {
34
- /** Campo da fonte de dados */
35
- field: string;
36
- /** Cabeçalho da coluna */
37
- header: string;
38
- /** Tipo de dados para formatação */
39
- type?: 'string' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'custom';
40
- /** Largura da coluna */
279
+ declare class SchemaNormalizerService {
280
+ /** Convert value to boolean. Accepts boolean, string or number. */
281
+ private parseBoolean;
282
+ /** Ensure an array of strings from various inputs. */
283
+ private parseStringArray;
284
+ /** Parse option arrays into `{ key, value }` objects. */
285
+ private parseOptions;
286
+ /**
287
+ * Converte string/Function em função real.
288
+ * Atenção: usa `new Function` para avaliar strings – requer backend confiável.
289
+ */
290
+ private parseFunction;
291
+ /** Parse a predicate function: () => boolean */
292
+ private parsePredicateFunction;
293
+ /** Parse a transform function: (val: any) => any */
294
+ private parseTransformFunction;
295
+ /**
296
+ * Parse de validador condicional: (value: any, model?: any) => boolean | string | Promise<boolean | string>
297
+ */
298
+ private parseConditionalValidator;
299
+ /**
300
+ * Extrai e normaliza propriedades de validação a partir do objeto x-ui.
301
+ * Suporta: required, min/max, minLength/maxLength, pattern/regex, email, url,
302
+ * matchField, uniqueValidator (+message), conditionalValidation, requiredChecked,
303
+ * arquivos (allowedFileTypes, fileTypeMessage, maxFileSize), custom/async validators,
304
+ * minWords e comportamento (validationTrigger(s), validationDebounce, showInlineErrors, errorPosition).
305
+ */
306
+ private parseValidators;
307
+ /** Parse array of button definitions. */
308
+ private parseButtons;
309
+ private resolveNonEmptyStringToken;
310
+ private isNumericSchemaType;
311
+ private resolveNumericFormatToken;
312
+ /**
313
+ * Converte o schema bruto do backend (OpenAPI + x-ui) em FieldDefinition[] tipado.
314
+ * Regras:
315
+ * - Ignora propriedades sem x-ui.
316
+ * - Garante ordenação por 'order' quando presente.
317
+ * - Funções condicionais/transformações sempre viram funções reais.
318
+ *
319
+ * @param schema Objeto OpenAPI/JSON Schema com properties e x-ui por propriedade.
320
+ * @returns FieldDefinition[] prontos para mapeamento/uso no restante do sistema.
321
+ */
322
+ normalizeSchema(schema: any): FieldDefinition[];
323
+ private resolveFieldType;
324
+ static ɵfac: i0.ɵɵFactoryDeclaration<SchemaNormalizerService, never>;
325
+ static ɵprov: i0.ɵɵInjectableDeclaration<SchemaNormalizerService>;
326
+ }
327
+
328
+ /**
329
+ * Nova arquitetura modular do TableConfig v2.0
330
+ * Preparada para crescimento exponencial e alinhada com as 5 abas do editor
331
+ */
332
+ interface ColumnDefinition {
333
+ /** Campo da fonte de dados */
334
+ field: string;
335
+ /** Cabeçalho da coluna */
336
+ header: string;
337
+ /** Tipo de dados para formatação */
338
+ type?: 'string' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'custom';
339
+ /** Largura da coluna */
41
340
  width?: string;
42
341
  /** Visibilidade da coluna */
43
342
  visible?: boolean;
@@ -65,12 +364,24 @@ interface ColumnDefinition {
65
364
  headerCssClass?: string;
66
365
  /** Formato de exibição dos dados */
67
366
  format?: any;
367
+ /** Coluna calculada baseada em expressão */
368
+ computed?: {
369
+ /** Expressão segura baseada em campos da linha */
370
+ expression: string;
371
+ /** Tipo do valor calculado para formatação */
372
+ outputType?: ColumnDefinition['type'];
373
+ /** Formato opcional do valor calculado */
374
+ format?: string;
375
+ /** Campos usados na expressão (opcional) */
376
+ dependencies?: string[];
377
+ };
68
378
  /** Mapeamento de valores para exibição */
69
379
  valueMapping?: {
70
380
  [key: string | number]: string;
71
381
  };
72
382
  /**
73
383
  * Renderizador de célula (Fase 1): opções básicas para ícone, imagem ou badge.
384
+ * Fase 2: expandido com tipos interativos/ricos (link, button, chip, progress, avatar, toggle, menu, html).
74
385
  * Mantém compatibilidade com type/format/valueMapping; quando definido, tem precedência na exibição.
75
386
  */
76
387
  renderer?: {
@@ -79,7 +390,7 @@ interface ColumnDefinition {
79
390
  expr: string;
80
391
  };
81
392
  /** Tipo do renderizador */
82
- type: 'icon' | 'image' | 'badge';
393
+ type: 'icon' | 'image' | 'badge' | 'link' | 'button' | 'chip' | 'progress' | 'avatar' | 'toggle' | 'menu' | 'rating' | 'html' | 'compose';
83
394
  /** Configuração de ícone (Material/SVG por nome) */
84
395
  icon?: {
85
396
  /** Nome fixo do ícone (ex.: 'check_circle') */
@@ -126,7 +437,222 @@ interface ColumnDefinition {
126
437
  /** Ícone opcional dentro do badge */
127
438
  icon?: string;
128
439
  };
440
+ /** Link (sanitizado) */
441
+ link?: {
442
+ text?: string;
443
+ textField?: string;
444
+ href?: string;
445
+ hrefField?: string;
446
+ target?: '_blank' | '_self' | '_parent' | '_top';
447
+ rel?: string;
448
+ };
449
+ /** Botão (ação por linha) */
450
+ button?: {
451
+ label?: string;
452
+ labelField?: string;
453
+ icon?: string;
454
+ color?: 'primary' | 'accent' | 'warn' | string;
455
+ variant?: 'filled' | 'outlined' | 'text';
456
+ size?: 'sm' | 'md' | 'lg';
457
+ ariaLabel?: string;
458
+ disabledCondition?: string;
459
+ action?: {
460
+ id: string;
461
+ payloadExpr?: string;
462
+ };
463
+ };
464
+ /** Chip (etiqueta leve) */
465
+ chip?: {
466
+ text?: string;
467
+ textField?: string;
468
+ color?: string;
469
+ icon?: string;
470
+ variant?: 'filled' | 'outlined' | 'soft';
471
+ };
472
+ /** Barra de progresso leve */
473
+ progress?: {
474
+ valueExpr: string;
475
+ color?: string;
476
+ showLabel?: boolean;
477
+ };
478
+ /** Avaliação por estrelas (read-only em tabelas) */
479
+ rating?: {
480
+ valueExpr?: string;
481
+ max?: number;
482
+ color?: string;
483
+ outlineColor?: string;
484
+ size?: 'small' | 'medium' | 'large';
485
+ ariaLabel?: string;
486
+ readonly?: boolean;
487
+ };
488
+ /** Avatar (imagem ou iniciais) */
489
+ avatar?: {
490
+ src?: string;
491
+ srcField?: string;
492
+ alt?: string;
493
+ altField?: string;
494
+ initialsExpr?: string;
495
+ shape?: 'square' | 'rounded' | 'circle';
496
+ size?: number;
497
+ };
498
+ /** Alternância (toggle) com ação */
499
+ toggle?: {
500
+ stateExpr: string;
501
+ disabledCondition?: string;
502
+ action?: {
503
+ id: string;
504
+ payloadExpr?: string;
505
+ };
506
+ ariaLabel?: string;
507
+ };
508
+ /** Menu de ações
509
+ * itemsExpr → Array<{ label: string; icon?: string; id: string; payloadExpr?: string; visibleCondition?: string }> */
510
+ menu?: {
511
+ itemsExpr: string;
512
+ ariaLabel?: string;
513
+ };
514
+ /** HTML (sanitizado) com tokens [[field]] */
515
+ html?: {
516
+ template: string;
517
+ sanitize?: 'strict' | 'basic';
518
+ emptyFallback?: string;
519
+ };
520
+ /** Compose (multi-itens) */
521
+ compose?: {
522
+ items: Array<{
523
+ type: 'icon';
524
+ icon?: {
525
+ name?: string;
526
+ nameField?: string;
527
+ color?: string;
528
+ size?: number;
529
+ ariaLabel?: string;
530
+ };
531
+ } | {
532
+ type: 'image';
533
+ image?: {
534
+ src?: string;
535
+ srcField?: string;
536
+ alt?: string;
537
+ altField?: string;
538
+ width?: number;
539
+ height?: number;
540
+ shape?: 'square' | 'rounded' | 'circle';
541
+ fit?: 'cover' | 'contain';
542
+ lazy?: boolean;
543
+ };
544
+ } | {
545
+ type: 'badge';
546
+ badge?: {
547
+ text?: string;
548
+ textField?: string;
549
+ color?: string;
550
+ variant?: 'filled' | 'outlined' | 'soft';
551
+ icon?: string;
552
+ };
553
+ } | {
554
+ type: 'link';
555
+ link?: {
556
+ text?: string;
557
+ textField?: string;
558
+ href?: string;
559
+ hrefField?: string;
560
+ target?: '_blank' | '_self' | '_parent' | '_top';
561
+ rel?: string;
562
+ };
563
+ } | {
564
+ type: 'button';
565
+ button?: {
566
+ label?: string;
567
+ labelField?: string;
568
+ icon?: string;
569
+ color?: string;
570
+ variant?: 'filled' | 'outlined' | 'text';
571
+ size?: 'sm' | 'md' | 'lg';
572
+ disabledCondition?: string;
573
+ action?: {
574
+ id: string;
575
+ payloadExpr?: string;
576
+ };
577
+ };
578
+ } | {
579
+ type: 'chip';
580
+ chip?: {
581
+ text?: string;
582
+ textField?: string;
583
+ color?: string;
584
+ icon?: string;
585
+ variant?: 'filled' | 'outlined' | 'soft';
586
+ };
587
+ } | {
588
+ type: 'progress';
589
+ progress?: {
590
+ valueExpr: string;
591
+ color?: string;
592
+ showLabel?: boolean;
593
+ };
594
+ } | {
595
+ type: 'avatar';
596
+ avatar?: {
597
+ src?: string;
598
+ srcField?: string;
599
+ alt?: string;
600
+ altField?: string;
601
+ initialsExpr?: string;
602
+ shape?: 'square' | 'rounded' | 'circle';
603
+ size?: number;
604
+ };
605
+ } | {
606
+ type: 'toggle';
607
+ toggle?: {
608
+ stateExpr: string;
609
+ disabledCondition?: string;
610
+ action?: {
611
+ id: string;
612
+ payloadExpr?: string;
613
+ };
614
+ };
615
+ } | {
616
+ type: 'menu';
617
+ menu?: {
618
+ itemsExpr: string;
619
+ ariaLabel?: string;
620
+ };
621
+ } | {
622
+ type: 'rating';
623
+ rating?: {
624
+ valueExpr?: string;
625
+ max?: number;
626
+ color?: string;
627
+ outlineColor?: string;
628
+ size?: 'small' | 'medium' | 'large';
629
+ ariaLabel?: string;
630
+ readonly?: boolean;
631
+ };
632
+ } | {
633
+ type: 'html';
634
+ html?: {
635
+ template: string;
636
+ sanitize?: 'strict' | 'basic';
637
+ emptyFallback?: string;
638
+ };
639
+ }>;
640
+ layout?: {
641
+ direction?: 'row' | 'column';
642
+ gap?: number;
643
+ align?: 'start' | 'center' | 'end';
644
+ wrap?: boolean;
645
+ ellipsis?: boolean;
646
+ };
647
+ };
129
648
  };
649
+ /** Overrides condicionais do renderer por linha (first‑match wins) */
650
+ conditionalRenderers?: Array<{
651
+ condition: string;
652
+ renderer: Partial<ColumnDefinition['renderer']>;
653
+ description?: string;
654
+ enabled?: boolean;
655
+ }>;
130
656
  /**
131
657
  * Regras de estilo condicionais por coluna (experimental)
132
658
  * Cada regra contém uma expressão/DSL em `condition` e o efeito visual a aplicar.
@@ -165,6 +691,8 @@ interface ConfigMetadata {
165
691
  updatedAt?: string;
166
692
  /** Autor da configuração */
167
693
  author?: string;
694
+ /** Ambiente de execução esperado para política de runtime (ex.: dev, hml, prod) */
695
+ environment?: 'dev' | 'hml' | 'prod' | 'qa' | 'staging' | string;
168
696
  /** Se é um template ou configuração específica */
169
697
  isTemplate?: boolean;
170
698
  /** Configuração derivada de outra (parent ID) */
@@ -206,6 +734,163 @@ interface TableBehaviorConfig {
206
734
  resizing?: ResizingConfig;
207
735
  /** Configurações de reorganização por drag & drop */
208
736
  dragging?: DraggingConfig;
737
+ /** Configurações do modo local via input `[data]` */
738
+ localDataMode?: TableLocalDataModeConfig;
739
+ /** Configurações de linhas expansíveis (detail rows) */
740
+ expansion?: TableExpansionConfig;
741
+ }
742
+ interface TableLocalDataModeConfig {
743
+ /** Habilita a trilha de modo local via input `[data]` */
744
+ enabled?: boolean;
745
+ }
746
+ interface TableExpansionConfig {
747
+ /** Habilita o recurso de expansão de linhas */
748
+ enabled?: boolean;
749
+ /** Versão local do contrato de expansão */
750
+ contractVersion?: '1.0.0' | string;
751
+ /** Identidade e rastreabilidade de linha expandível */
752
+ identity?: {
753
+ rowKeySource?: 'table.idField';
754
+ requireStableIdField?: boolean;
755
+ };
756
+ /** Governança de estado (controlado vs não-controlado) */
757
+ state?: {
758
+ mode?: 'controlled' | 'uncontrolled';
759
+ expandedRowKeys?: string[];
760
+ emitChanges?: boolean;
761
+ sourceOfTruth?: 'input' | 'runtime';
762
+ onSetExpandedKeys?: 'emitOnly' | 'mutateInternal';
763
+ };
764
+ /** Regras de interação para abrir/fechar detalhes */
765
+ interaction?: {
766
+ trigger?: 'icon' | 'row' | 'both';
767
+ toggleOnRowClick?: boolean;
768
+ keyboard?: {
769
+ profile?: 'disclosure' | 'grid';
770
+ enterSpace?: boolean;
771
+ arrowLeftRight?: boolean;
772
+ };
773
+ };
774
+ /** Limites de expansão simultânea */
775
+ limits?: {
776
+ allowMultiple?: boolean;
777
+ maxExpandedRows?: number;
778
+ onOverflow?: 'collapseOldest' | 'denyNew' | 'collapseAll';
779
+ };
780
+ /** Eventos estruturais que colapsam os detalhes */
781
+ collapseOn?: {
782
+ sortChange?: boolean;
783
+ pageChange?: boolean;
784
+ filterChange?: boolean;
785
+ dataRefresh?: boolean;
786
+ };
787
+ /** Condição para permitir expansão por linha */
788
+ rowExpandableWhen?: {
789
+ expr?: string;
790
+ onError?: 'deny' | 'allow';
791
+ context?: Array<'row' | 'computed' | 'user' | 'env'>;
792
+ };
793
+ /** Detalhe schema-driven (fonte + renderização) */
794
+ detail?: {
795
+ schemaContract?: {
796
+ kind?: 'praxis.detail.schema';
797
+ version?: string;
798
+ compat?: 'semver' | 'strict';
799
+ allowedNodes?: Array<'layout' | 'stack' | 'tabs' | 'tab' | 'card' | 'value' | 'action' | 'list' | 'formRef' | 'tableRef' | 'chartRef' | 'richText' | 'templateRef'>;
800
+ sanitization?: 'strict';
801
+ };
802
+ source?: {
803
+ mode?: 'inline' | 'resource' | 'resourcePath';
804
+ inlineSchema?: Record<string, unknown>;
805
+ resource?: {
806
+ kind?: 'ui-composition' | 'form-schema' | 'table-schema' | 'dashboard-schema';
807
+ id?: string;
808
+ version?: string;
809
+ };
810
+ resourcePath?: {
811
+ path?: string;
812
+ paramsMap?: Record<string, string>;
813
+ method?: 'GET' | 'POST';
814
+ };
815
+ contextMap?: Record<string, string>;
816
+ resourceAllowList?: string[];
817
+ fallbackMode?: 'none' | 'inline' | 'resource';
818
+ };
819
+ rendering?: {
820
+ strategy?: 'registry';
821
+ registryId?: string;
822
+ hostLayout?: 'auto' | 'stack' | 'tabs';
823
+ fallbackNodePolicy?: 'failClosed' | 'renderPlaceholder';
824
+ };
825
+ height?: {
826
+ mode?: 'fixed' | 'dynamic';
827
+ px?: number;
828
+ };
829
+ lazyLoad?: {
830
+ enabled?: boolean;
831
+ actionId?: string;
832
+ cache?: {
833
+ enabled?: boolean;
834
+ ttlMs?: number;
835
+ };
836
+ retry?: {
837
+ maxAttempts?: number;
838
+ };
839
+ cancelOnCollapse?: boolean;
840
+ dedupeByRowKey?: boolean;
841
+ };
842
+ };
843
+ /** Política extra para coexistência com virtualização */
844
+ virtualization?: {
845
+ policy?: 'fixed-height-only' | 'allow-dynamic-under-flag';
846
+ };
847
+ /** Persistência de estado expandido */
848
+ persistence?: {
849
+ enabled?: boolean;
850
+ storageKey?: string;
851
+ storageKeyStrategy?: {
852
+ namespace?: string;
853
+ version?: string;
854
+ hashScope?: boolean;
855
+ };
856
+ scope?: Array<'tableId' | 'componentInstance' | 'user' | 'tenant'>;
857
+ clearOn?: Array<'resetPreferences' | 'logout' | 'tenantChange'>;
858
+ };
859
+ /** Segurança de payload/evento */
860
+ security?: {
861
+ eventExposureDefault?: {
862
+ rowId?: 'redacted' | 'hashed' | 'raw';
863
+ expandedKeys?: 'none' | 'hashed' | 'raw';
864
+ };
865
+ allowRawExposure?: boolean;
866
+ };
867
+ /** Deep-link de expansão (P1+) */
868
+ deepLink?: {
869
+ enabled?: boolean;
870
+ queryParam?: string;
871
+ encoding?: 'csv';
872
+ keyFormat?: string;
873
+ maxKeys?: number;
874
+ maxLength?: number;
875
+ parsing?: {
876
+ duplicateParams?: 'firstWins' | 'reject';
877
+ decodePasses?: 1;
878
+ trimWhitespace?: boolean;
879
+ sortKeysBeforeApply?: boolean;
880
+ };
881
+ integrity?: {
882
+ mode?: 'opaqueToken';
883
+ exchange?: {
884
+ endpointId?: string;
885
+ ttlMs?: number;
886
+ errors?: Array<'expired' | 'invalid' | 'rate_limited'>;
887
+ };
888
+ };
889
+ privacy?: {
890
+ mode?: 'denyByDefault' | 'allowByDefault';
891
+ allowListTables?: string[];
892
+ };
893
+ };
209
894
  }
210
895
  interface PaginationConfig {
211
896
  /** Habilitar paginação */
@@ -289,20 +974,54 @@ interface FilteringConfig {
289
974
  savePresets?: boolean;
290
975
  /** Configurações específicas do componente praxis-filter */
291
976
  settings?: {
292
- /** Campo de busca rápida */
293
- quickField?: string;
294
977
  /** Campos sempre visíveis */
295
978
  alwaysVisibleFields?: string[];
296
- /** Placeholder da busca */
297
- placeholder?: string;
979
+ /** Overrides de metadata por campo sempre visível (merge sobre o DTO de filtro) */
980
+ alwaysVisibleFieldMetadataOverrides?: Record<string, Record<string, any>>;
981
+ /** Campos extras selecionados pelo usuário */
982
+ selectedFieldIds?: string[];
298
983
  /** Exibir opções avançadas por padrão */
299
984
  showAdvanced?: boolean;
300
985
  /** Permitir salvar tags/atalhos de filtro */
301
986
  allowSaveTags?: boolean;
302
987
  /** Debounce de alterações para auto-aplicar filtros (ms) */
303
988
  changeDebounceMs?: number;
304
- /** Modo de exibição do componente de filtro */
305
- mode?: 'auto' | 'filter' | 'card';
989
+ /** Modo de exibição do componente de filtro (modo único) */
990
+ mode?: 'filter';
991
+ /** UX: move booleans para ações */
992
+ placeBooleansInActions?: boolean;
993
+ /** UX: mostrar labels dos toggles */
994
+ showToggleLabels?: boolean;
995
+ /** Largura mínima para campos sempre visíveis */
996
+ alwaysMinWidth?: number;
997
+ /** Colunas md para campos sempre visíveis */
998
+ alwaysColsMd?: number;
999
+ /** Colunas lg para campos sempre visíveis */
1000
+ alwaysColsLg?: number;
1001
+ /** Confirma remoção de tags */
1002
+ confirmTagDelete?: boolean;
1003
+ /** Tema das tags */
1004
+ tagColor?: 'primary' | 'accent' | 'warn' | 'basic';
1005
+ /** Variante das tags */
1006
+ tagVariant?: 'filled' | 'outlined';
1007
+ /** Cor do botão das tags */
1008
+ tagButtonColor?: 'primary' | 'accent' | 'warn' | 'basic';
1009
+ /** Cor dos botões de ação */
1010
+ actionsButtonColor?: 'primary' | 'accent' | 'warn' | 'basic';
1011
+ /** Variante dos botões de ação */
1012
+ actionsVariant?: 'standard' | 'outlined';
1013
+ /** Aparência do overlay */
1014
+ overlayVariant?: 'card' | 'frosted';
1015
+ /** Backdrop do overlay */
1016
+ overlayBackdrop?: boolean;
1017
+ /** Modo de abertura do painel avançado */
1018
+ advancedOpenMode?: 'overlay' | 'modal' | 'drawer';
1019
+ /** Botão de limpar nos campos do formulário avançado */
1020
+ advancedClearButtonsEnabled?: boolean;
1021
+ /** Nível de log */
1022
+ logLevel?: 'none' | 'error' | 'warn' | 'info' | 'debug';
1023
+ /** Métricas de performance */
1024
+ enablePerformanceMetrics?: boolean;
306
1025
  };
307
1026
  };
308
1027
  /** Estratégia de filtragem */
@@ -605,6 +1324,10 @@ interface ToolbarConfig {
605
1324
  visible: boolean;
606
1325
  /** Posição da toolbar */
607
1326
  position: 'top' | 'bottom' | 'both';
1327
+ /** Posição das ações da toolbar */
1328
+ actionsPosition?: 'top' | 'bottom' | 'both';
1329
+ /** Cor de fundo da barra de ações */
1330
+ actionsBackgroundColor?: string;
608
1331
  /** Configurações de layout */
609
1332
  layout?: ToolbarLayoutConfig;
610
1333
  /** Título da tabela */
@@ -651,6 +1374,8 @@ interface ToolbarAction {
651
1374
  tooltip?: string;
652
1375
  /** Tecla de atalho */
653
1376
  shortcut?: string;
1377
+ /** Escopo do atalho: somente toolbar ativa ou global */
1378
+ shortcutScope?: 'toolbar' | 'global';
654
1379
  /** Posição na toolbar */
655
1380
  position: 'start' | 'end';
656
1381
  /** Ordem de exibição */
@@ -1441,6 +2166,9 @@ interface GlobalDialogAction {
1441
2166
  role?: 'primary' | 'secondary' | 'danger' | 'close' | 'custom';
1442
2167
  close?: boolean;
1443
2168
  icon?: string | null;
2169
+ svgIcon?: string | null;
2170
+ fillMode?: 'solid' | 'flat' | 'outline';
2171
+ themeColor?: 'primary' | 'accent' | 'warn' | 'neutral';
1444
2172
  cssClass?: string | string[] | Record<string, boolean>;
1445
2173
  }
1446
2174
  interface GlobalDialogAnimation {
@@ -1456,443 +2184,196 @@ interface GlobalDialogStyles {
1456
2184
  containerMaxWidth?: string;
1457
2185
  containerMinWidth?: string;
1458
2186
  containerShape?: string;
2187
+ containerBorderColor?: string;
1459
2188
  containerSmallMaxWidth?: string;
1460
2189
  contentPadding?: string;
1461
- headlinePadding?: string;
1462
- withActionsContentPadding?: string;
1463
- containerColor?: string;
1464
- subheadColor?: string;
1465
- supportingTextColor?: string;
1466
- subheadFont?: string;
1467
- subheadLineHeight?: string;
1468
- subheadSize?: string;
1469
- subheadTracking?: string;
1470
- subheadWeight?: string | number;
1471
- supportingTextFont?: string;
1472
- supportingTextLineHeight?: string;
1473
- supportingTextSize?: string;
1474
- supportingTextTracking?: string;
1475
- supportingTextWeight?: string | number;
1476
- }
1477
- interface GlobalDialogConfigEntry {
1478
- title?: string;
1479
- ariaRole?: GlobalDialogAriaRole;
1480
- message?: string;
1481
- icon?: string | null;
1482
- width?: string | number | null;
1483
- height?: string | number | null;
1484
- minWidth?: string | number | null;
1485
- maxWidth?: string | number | null;
1486
- minHeight?: string | number | null;
1487
- maxHeight?: string | number | null;
1488
- disableClose?: boolean;
1489
- hasBackdrop?: boolean;
1490
- closeOnBackdropClick?: boolean;
1491
- panelClass?: string | string[] | Record<string, boolean>;
1492
- backdropClass?: string | string[] | Record<string, boolean>;
1493
- position?: GlobalDialogPosition;
1494
- animation?: boolean | GlobalDialogAnimation;
1495
- styles?: GlobalDialogStyles;
1496
- actions?: GlobalDialogAction[];
1497
- }
1498
- interface GlobalDialogConfig {
1499
- defaults?: {
1500
- confirm?: GlobalDialogConfigEntry;
1501
- alert?: GlobalDialogConfigEntry;
1502
- prompt?: GlobalDialogConfigEntry;
1503
- };
1504
- variants?: Record<string, GlobalDialogConfigEntry>;
1505
- }
1506
-
1507
- type FormOpenMode = 'route' | 'modal' | 'drawer';
1508
- interface GlobalCrudActionDefaults {
1509
- openMode?: FormOpenMode;
1510
- route?: string;
1511
- formId?: string;
1512
- }
1513
- interface GlobalCrudDefaults {
1514
- openMode?: FormOpenMode;
1515
- modal?: Record<string, any>;
1516
- back?: Record<string, any>;
1517
- header?: Record<string, any>;
1518
- }
1519
- interface GlobalCrudConfig {
1520
- defaults?: GlobalCrudDefaults;
1521
- actionDefaults?: Record<string, GlobalCrudActionDefaults>;
1522
- }
1523
- interface GlobalDynamicFieldsAsyncSelectConfig {
1524
- loadOn?: 'open' | 'init' | 'none';
1525
- pageSize?: number;
1526
- useCursor?: boolean;
1527
- }
1528
- interface GlobalDynamicFieldsCascadeConfig {
1529
- enable?: boolean;
1530
- loadOnChange?: 'respectLoadOn' | 'immediate' | 'manual';
1531
- debounceMs?: number;
1532
- }
1533
- interface GlobalDynamicFieldsConfig {
1534
- asyncSelect?: GlobalDynamicFieldsAsyncSelectConfig;
1535
- cascade?: GlobalDynamicFieldsCascadeConfig;
1536
- }
1537
- type GlobalTableConfig = (Partial<Pick<TableConfig, 'behavior' | 'appearance' | 'toolbar' | 'actions' | 'messages' | 'localization' | 'performance'>> & {
1538
- /** UI defaults specific to the PraxisFilter (above the table) */
1539
- filteringUi?: {
1540
- overlayVariant?: 'card' | 'frosted';
1541
- overlayBackdrop?: boolean;
1542
- advancedOpenMode?: 'overlay' | 'modal' | 'drawer';
1543
- };
1544
- });
1545
- interface GlobalConfig {
1546
- crud?: GlobalCrudConfig;
1547
- dynamicFields?: GlobalDynamicFieldsConfig;
1548
- table?: GlobalTableConfig;
1549
- dialog?: GlobalDialogConfig;
1550
- }
1551
-
1552
- declare const GLOBAL_CONFIG: InjectionToken<Partial<GlobalConfig>>;
1553
- declare function provideGlobalConfig(partial: Partial<GlobalConfig>): Provider;
1554
-
1555
- /** Set the current tenant for GlobalConfigService at app boot. */
1556
- declare function provideGlobalConfigTenant(tenantId: string): Provider;
1557
- /** Seed global config once when no storage exists yet (idempotent). */
1558
- declare function provideGlobalConfigSeed(seed: Partial<GlobalConfig>): Provider;
1559
- /** Fetch remote JSON and merge as global config at boot. */
1560
- declare function provideRemoteGlobalConfig(url: string): Provider;
1561
-
1562
- interface SettingsPanelRef<T = any> {
1563
- applied$: Observable<T>;
1564
- saved$: Observable<T>;
1565
- }
1566
- interface SettingsPanelOpenContent<TInputs = any> {
1567
- component: Type<any>;
1568
- inputs?: TInputs;
1569
- }
1570
- interface SettingsPanelOpenOptions<TInputs = any> {
1571
- id: string;
1572
- title: string;
1573
- content: SettingsPanelOpenContent<TInputs>;
1574
- }
1575
- interface SettingsPanelBridge {
1576
- open<TInputs = any, TOut = any>(opts: SettingsPanelOpenOptions<TInputs>): SettingsPanelRef<TOut>;
1577
- }
1578
- declare const SETTINGS_PANEL_BRIDGE: InjectionToken<SettingsPanelBridge>;
1579
- declare const SETTINGS_PANEL_DATA: InjectionToken<any>;
1580
- interface SettingsValueProvider {
1581
- isDirty$: Observable<boolean>;
1582
- isValid$: Observable<boolean>;
1583
- isBusy$: Observable<boolean>;
1584
- getSettingsValue(): any;
1585
- onSave?(): any;
1586
- reset?(): void;
1587
- }
1588
-
1589
- declare const TABLE_CONFIG_EDITOR: InjectionToken<Type<any>>;
1590
- declare const STEPPER_CONFIG_EDITOR: InjectionToken<Type<any>>;
1591
-
1592
- interface HateoasLink {
1593
- href: string;
1594
- templated?: boolean;
1595
- type?: string;
1596
- deprecation?: string;
1597
- profile?: string;
1598
- name?: string;
1599
- title?: string;
1600
- hreflang?: string;
1601
- [prop: string]: any;
1602
- }
1603
- interface RestApiLinks {
1604
- [rel: string]: HateoasLink | HateoasLink[];
1605
- }
1606
- interface RestApiResponse<T> {
1607
- status?: string;
1608
- message?: string;
1609
- data: T;
1610
- _links?: RestApiLinks;
1611
- errors?: any;
1612
- timestamp?: string;
1613
- }
1614
-
1615
- interface Page<T> {
1616
- content: T[];
1617
- totalElements: number;
1618
- totalPages: number;
1619
- size: number;
1620
- number: number;
1621
- }
1622
- interface CursorPage<T> {
1623
- content: T[];
1624
- next?: string | null;
1625
- prev?: string | null;
1626
- size: number;
1627
- }
1628
-
1629
- interface OptionDTO<ID = string | number> {
1630
- id: ID;
1631
- label: string;
1632
- extra?: Record<string, unknown>;
1633
- }
1634
-
1635
- interface PageableRequest {
1636
- pageNumber: number;
1637
- pageSize: number;
1638
- sort?: string[];
1639
- }
1640
- interface FilterOptions<ID = string | number> {
1641
- includeIds?: ID[];
1642
- observeVersionHeader?: boolean;
1643
- }
1644
- interface CursorRequest {
1645
- size?: number;
1646
- sort?: string[];
1647
- after?: string | null;
1648
- before?: string | null;
1649
- }
1650
- interface LocateRequest {
1651
- size: number;
1652
- sort?: string[];
1653
- }
1654
-
1655
- /**
1656
- * Contrato de saída do normalizador de esquema (SchemaNormalizerService):
1657
- * - Converte metadados `x-ui` em FieldDefinition tipado.
1658
- * - Todas as funções expostas são funções reais (nunca strings):
1659
- * - conditionalDisplay: () => boolean
1660
- * - conditionalRequired: () => boolean
1661
- * - transformValueFunction: (val: any) => any
1662
- * - Suporte completo a ValidatorOptions (sincronos e assíncronos),
1663
- * incluindo mensagens e comportamento de validação (gatilhos, debounce, exibição de erros).
1664
- */
1665
- interface FieldDefinition {
1666
- name: string;
1667
- label?: string;
1668
- description?: string;
1669
- type?: string;
1670
- controlType?: string;
1671
- placeholder?: string;
1672
- defaultValue?: any;
1673
- group?: string;
1674
- order?: number;
1675
- width?: number | string;
1676
- isFlex?: boolean;
1677
- displayOrientation?: string;
1678
- disabled?: boolean;
1679
- readOnly?: boolean;
1680
- multiple?: boolean;
1681
- editable?: boolean;
1682
- validationMode?: string;
1683
- unique?: boolean;
1684
- mask?: string;
1685
- sortable?: boolean;
1686
- /** Função que define obrigatoriedade condicional. */
1687
- conditionalRequired?: () => boolean;
1688
- viewOnlyStyle?: string;
1689
- /** Lista de gatilhos de validação, ex.: ["blur", "change"]. */
1690
- validationTriggers?: string[];
1691
- hidden?: boolean;
1692
- tableHidden?: boolean;
1693
- formHidden?: boolean;
1694
- filterable?: boolean;
1695
- /** Função que controla se o campo é exibido. */
1696
- conditionalDisplay?: () => boolean;
1697
- dependentField?: string;
1698
- resetOnDependentChange?: boolean;
1699
- inlineEditing?: boolean;
1700
- /** Função de transformação de valor antes de salvar/exibir. */
1701
- transformValueFunction?: (val: any) => any;
1702
- debounceTime?: number;
1703
- helpText?: string;
1704
- hint?: string;
1705
- hiddenCondition?: any;
1706
- tooltipOnHover?: boolean;
1707
- icon?: string;
1708
- iconPosition?: string;
1709
- iconSize?: string | number;
1710
- iconColor?: string;
1711
- iconClass?: string;
1712
- iconStyle?: string;
1713
- iconFontSize?: string | number;
1714
- valueField?: string;
1715
- displayField?: string;
1716
- endpoint?: string;
1717
- resourcePath?: string;
1718
- emptyOptionText?: string;
1719
- options?: {
1720
- key: string;
1721
- value: string;
1722
- }[];
1723
- filter?: any;
1724
- filterCriteria?: any;
1725
- searchable?: boolean;
1726
- selectAll?: boolean;
1727
- maxSelections?: number;
1728
- optionLabelKey?: string;
1729
- optionValueKey?: string;
1730
- filterOptions?: any[];
1731
- filterControlType?: string;
1732
- numericFormat?: string;
1733
- numericStep?: number;
1734
- numericMin?: number;
1735
- numericMax?: number;
1736
- numericMaxLength?: number;
1737
- optionGroups?: {
1738
- key: string;
1739
- value: string;
1740
- }[];
1741
- disabledOptions?: string[];
1742
- buttons?: any[];
1743
- /** Obrigatório. */
1744
- required?: boolean;
1745
- requiredMessage?: string;
1746
- /** Tamanho mínimo/máximo (strings). */
1747
- minLength?: number;
1748
- minLengthMessage?: string;
1749
- maxLength?: number;
1750
- maxLengthMessage?: string;
1751
- /** Limites numéricos. */
1752
- min?: number;
1753
- max?: number;
1754
- /** Mensagens dedicadas para min/max numéricos. */
1755
- minMessage?: string;
1756
- maxMessage?: string;
1757
- /** Mensagem quando ambos limites (range) são aplicados. */
1758
- rangeMessage?: string;
1759
- /** Padrão (regex). Aceita pattern/regex. */
1760
- pattern?: string;
1761
- patternMessage?: string;
1762
- /** Validação de e-mail. */
1763
- email?: boolean;
1764
- emailMessage?: string;
1765
- /** Validação de URL. */
1766
- url?: boolean;
1767
- urlMessage?: string;
1768
- /** Requer que valor combine com outro campo. */
1769
- matchField?: string;
1770
- matchFieldMessage?: string;
1771
- /** Requer que o checkbox esteja marcado. */
1772
- requiredChecked?: boolean;
1773
- /** Tipos de arquivo permitidos e tamanho máximo. */
1774
- allowedFileTypes?: string[];
1775
- fileTypeMessage?: string;
1776
- maxFileSize?: number;
1777
- /** Validador customizado síncrono. */
1778
- customValidator?: (value: any, model?: any) => any;
1779
- /** Validador customizado assíncrono. */
1780
- asyncValidator?: (value: any, model?: any) => Promise<any>;
1781
- /** Validador de unicidade (ex.: consulta ao backend). */
1782
- uniqueValidator?: (value: any, model?: any) => boolean | Promise<boolean>;
1783
- uniqueMessage?: string;
1784
- /** Validação condicional baseada em outro(s) campos/estado. */
1785
- conditionalValidation?: (value: any, model?: any) => boolean | string | Promise<boolean | string>;
1786
- /** Mínimo de palavras (para textos longos). */
1787
- minWords?: number;
1788
- /** Gatilho(s) de validação (alias de validationTriggers). */
1789
- /** Tempo de debounce (ms) para executar validação. */
1790
- validationDebounce?: number;
1791
- /** Exibir erros inline no campo. */
1792
- showInlineErrors?: boolean;
1793
- /** Posição preferida da mensagem de erro (ex.: below, right). */
1794
- errorPosition?: string;
1795
- [key: string]: any;
2190
+ headlinePadding?: string;
2191
+ withActionsContentPadding?: string;
2192
+ backdropColor?: string;
2193
+ actionButtonRadius?: string;
2194
+ actionButtonMinHeight?: string;
2195
+ actionButtonPadding?: string;
2196
+ containerColor?: string;
2197
+ subheadColor?: string;
2198
+ supportingTextColor?: string;
2199
+ subheadFont?: string;
2200
+ subheadLineHeight?: string;
2201
+ subheadSize?: string;
2202
+ subheadTracking?: string;
2203
+ subheadWeight?: string | number;
2204
+ supportingTextFont?: string;
2205
+ supportingTextLineHeight?: string;
2206
+ supportingTextSize?: string;
2207
+ supportingTextTracking?: string;
2208
+ supportingTextWeight?: string | number;
1796
2209
  }
1797
-
1798
- declare enum ApiEndpoint {
1799
- Default = "default",
1800
- HumanResources = "humanResources",
1801
- UiWrappersTest = "uiWrappersTest"
2210
+ interface GlobalDialogConfigEntry {
2211
+ title?: string;
2212
+ themeColor?: 'primary' | 'light' | 'dark';
2213
+ ariaRole?: GlobalDialogAriaRole;
2214
+ message?: string;
2215
+ icon?: string | null;
2216
+ width?: string | number | null;
2217
+ height?: string | number | null;
2218
+ minWidth?: string | number | null;
2219
+ maxWidth?: string | number | null;
2220
+ minHeight?: string | number | null;
2221
+ maxHeight?: string | number | null;
2222
+ disableClose?: boolean;
2223
+ hasBackdrop?: boolean;
2224
+ closeOnBackdropClick?: boolean;
2225
+ panelClass?: string | string[] | Record<string, boolean>;
2226
+ backdropClass?: string | string[] | Record<string, boolean>;
2227
+ position?: GlobalDialogPosition;
2228
+ animation?: boolean | GlobalDialogAnimation;
2229
+ styles?: GlobalDialogStyles;
2230
+ actions?: GlobalDialogAction[];
2231
+ }
2232
+ interface GlobalDialogConfig {
2233
+ defaults?: {
2234
+ confirm?: GlobalDialogConfigEntry;
2235
+ alert?: GlobalDialogConfigEntry;
2236
+ prompt?: GlobalDialogConfigEntry;
2237
+ };
2238
+ variants?: Record<string, GlobalDialogConfigEntry>;
1802
2239
  }
1803
2240
 
1804
- /**
1805
- * SchemaNormalizerService
1806
- * -----------------------
1807
- * Serviço responsável por converter um esquema bruto (OpenAPI + x-ui) em uma
1808
- * lista tipada de FieldDefinition consumida pelo restante do sistema
1809
- * (mapeadores de metadata, criador de FormGroup, carregador de campos dinâmicos, etc.).
1810
- *
1811
- * Entrada esperada
1812
- * - Objeto JSON no formato OpenAPI/JSON Schema contendo:
1813
- * - properties: { [name: string]: { type, title, description, ... , 'x-ui': { ... } } }
1814
- * - Em cada propriedade, o objeto 'x-ui' define aspectos de UI/validação.
1815
- *
1816
- * Saída (FieldDefinition[])
1817
- * - Tipagem forte de campos com funções reais (nunca strings) para regras condicionais e validadores customizados.
1818
- * - Todas as propriedades de validação e comportamento consolidadas no mesmo objeto do campo.
1819
- *
1820
- * Segurança e observações
1821
- * - Este serviço aceita funções em formato string dentro do x-ui (ex.: uniqueValidator, conditionalValidation),
1822
- * e as converte via new Function. Isso exige backend confiável e controlado.
1823
- * Em ambientes não confiáveis, evite funções como string ou implemente um sandbox/whitelist.
1824
- * - Valores booleanos/numéricos são normalizados para tipos nativos.
1825
- * - Arrays de opções são convertidos para pares { key, value } previsíveis.
1826
- *
1827
- * Exemplo mínimo de entrada
1828
- * const schema = {
1829
- * properties: {
1830
- * email: {
1831
- * type: 'string',
1832
- * title: 'E-mail',
1833
- * 'x-ui': { controlType: 'input', type: 'string', required: true, email: true }
1834
- * }
1835
- * }
1836
- * };
1837
- * const fields = normalizer.normalizeSchema(schema);
1838
- * // fields: [{ name: 'email', label: 'E-mail', type: 'string', controlType: 'input', required: true, email: true }]
1839
- */
1840
- declare class SchemaNormalizerService {
1841
- /** Convert value to boolean. Accepts boolean, string or number. */
1842
- private parseBoolean;
1843
- /** Ensure an array of strings from various inputs. */
1844
- private parseStringArray;
1845
- /** Parse option arrays into `{ key, value }` objects. */
1846
- private parseOptions;
1847
- /**
1848
- * Converte string/Function em função real.
1849
- * Atenção: usa `new Function` para avaliar strings – requer backend confiável.
1850
- */
1851
- private parseFunction;
1852
- /** Parse a predicate function: () => boolean */
1853
- private parsePredicateFunction;
1854
- /** Parse a transform function: (val: any) => any */
1855
- private parseTransformFunction;
2241
+ type FormOpenMode = 'route' | 'modal' | 'drawer';
2242
+ interface GlobalCrudActionDefaults {
2243
+ openMode?: FormOpenMode;
2244
+ route?: string;
2245
+ formId?: string;
2246
+ }
2247
+ interface GlobalCrudDefaults {
2248
+ openMode?: FormOpenMode;
2249
+ modal?: Record<string, any>;
2250
+ back?: Record<string, any>;
2251
+ header?: Record<string, any>;
1856
2252
  /**
1857
- * Parse de validador condicional: (value: any, model?: any) => boolean | string | Promise<boolean | string>
2253
+ * Quando usado via <praxis-crud>, habilita automaticamente a coluna de ações por linha
2254
+ * com base nas ações declaradas (ex.: view/edit). Desligue para controlar manualmente.
2255
+ * Default: true
1858
2256
  */
1859
- private parseConditionalValidator;
2257
+ autoRowActions?: boolean;
1860
2258
  /**
1861
- * Extrai e normaliza propriedades de validação a partir do objeto x-ui.
1862
- * Suporta: required, min/max, minLength/maxLength, pattern/regex, email, url,
1863
- * matchField, uniqueValidator (+message), conditionalValidation, requiredChecked,
1864
- * arquivos (allowedFileTypes, fileTypeMessage, maxFileSize), custom/async validators,
1865
- * minWords e comportamento (validationTrigger(s), validationDebounce, showInlineErrors, errorPosition).
2259
+ * Formato padrão para exibição das ações de linha geradas automaticamente.
2260
+ * Default: 'icons'
1866
2261
  */
1867
- private parseValidators;
1868
- /** Parse array of button definitions. */
1869
- private parseButtons;
2262
+ rowActionsDisplay?: 'icons' | 'buttons' | 'menu';
1870
2263
  /**
1871
- * Converte o schema bruto do backend (OpenAPI + x-ui) em FieldDefinition[] tipado.
1872
- * Regras:
1873
- * - Ignora propriedades sem x-ui.
1874
- * - Garante ordenação por 'order' quando presente.
1875
- * - Funções condicionais/transformações sempre viram funções reais.
1876
- *
1877
- * @param schema Objeto OpenAPI/JSON Schema com properties e x-ui por propriedade.
1878
- * @returns FieldDefinition[] prontos para mapeamento/uso no restante do sistema.
2264
+ * Inclui ação de delete na coluna de ações quando houver ação 'delete' declarada.
2265
+ * Por padrão permanece desabilitado para evitar comportamentos não intencionais.
1879
2266
  */
1880
- normalizeSchema(schema: any): FieldDefinition[];
1881
- static ɵfac: i0.ɵɵFactoryDeclaration<SchemaNormalizerService, never>;
1882
- static ɵprov: i0.ɵɵInjectableDeclaration<SchemaNormalizerService>;
2267
+ includeDeleteInRow?: boolean;
2268
+ }
2269
+ interface GlobalCrudConfig {
2270
+ defaults?: GlobalCrudDefaults;
2271
+ actionDefaults?: Record<string, GlobalCrudActionDefaults>;
2272
+ }
2273
+ interface GlobalDynamicFieldsAsyncSelectConfig {
2274
+ loadOn?: 'open' | 'init' | 'none';
2275
+ pageSize?: number;
2276
+ useCursor?: boolean;
2277
+ }
2278
+ interface GlobalDynamicFieldsCascadeConfig {
2279
+ enable?: boolean;
2280
+ loadOnChange?: 'respectLoadOn' | 'immediate' | 'manual';
2281
+ debounceMs?: number;
2282
+ }
2283
+ interface GlobalDynamicFieldsConfig {
2284
+ asyncSelect?: GlobalDynamicFieldsAsyncSelectConfig;
2285
+ cascade?: GlobalDynamicFieldsCascadeConfig;
2286
+ }
2287
+ type GlobalTableConfig = (Partial<Pick<TableConfig, 'behavior' | 'appearance' | 'toolbar' | 'actions' | 'messages' | 'localization' | 'performance'>> & {
2288
+ /** UI defaults specific to the PraxisFilter (above the table) */
2289
+ filteringUi?: {
2290
+ overlayVariant?: 'card' | 'frosted';
2291
+ overlayBackdrop?: boolean;
2292
+ advancedOpenMode?: 'overlay' | 'modal' | 'drawer';
2293
+ };
2294
+ });
2295
+ type GlobalAiProvider = 'gemini' | 'openai' | 'xai' | 'mock';
2296
+ interface GlobalAiEmbeddingConfig {
2297
+ useSameAsLlm?: boolean;
2298
+ provider?: GlobalAiProvider;
2299
+ apiKey?: string;
2300
+ apiKeyLast4?: string;
2301
+ hasApiKey?: boolean;
2302
+ model?: string;
2303
+ dimensions?: number;
2304
+ }
2305
+ interface GlobalAiConfig {
2306
+ provider?: GlobalAiProvider;
2307
+ /** Policy for UI confirmation on risky AI patches. */
2308
+ riskPolicy?: 'strict' | 'standard';
2309
+ apiKey?: string;
2310
+ apiKeyLast4?: string;
2311
+ hasApiKey?: boolean;
2312
+ model?: string;
2313
+ temperature?: number;
2314
+ maxTokens?: number;
2315
+ embedding?: GlobalAiEmbeddingConfig;
2316
+ }
2317
+ interface GlobalCacheConfig {
2318
+ /**
2319
+ * Se verdadeiro, desabilita o cache persistente (LocalStorage) para schemas de metadados.
2320
+ * Isso força o download do schema a cada recarga da aplicação, útil quando se deseja
2321
+ * priorizar a configuração vinda do servidor ou durante desenvolvimento intenso de API.
2322
+ * Default: false
2323
+ */
2324
+ disableSchemaCache?: boolean;
2325
+ }
2326
+ interface GlobalConfig {
2327
+ crud?: GlobalCrudConfig;
2328
+ dynamicFields?: GlobalDynamicFieldsConfig;
2329
+ table?: GlobalTableConfig;
2330
+ dialog?: GlobalDialogConfig;
2331
+ /** Dynamic routes registered at runtime (host-resolved). */
2332
+ routes?: {
2333
+ dynamic?: Array<{
2334
+ path: string;
2335
+ componentId?: string;
2336
+ loadChildren?: any;
2337
+ data?: Record<string, any>;
2338
+ resolve?: Record<string, any>;
2339
+ guards?: string[];
2340
+ canMatch?: string[];
2341
+ canActivateChild?: string[];
2342
+ replace?: boolean;
2343
+ position?: 'append' | 'prepend' | 'before-wildcard';
2344
+ }>;
2345
+ };
2346
+ ai?: GlobalAiConfig;
2347
+ cache?: GlobalCacheConfig;
1883
2348
  }
1884
2349
 
1885
2350
  declare class GlobalConfigService {
1886
2351
  private readonly storage;
2352
+ private readonly bootstrapReady;
2353
+ private readonly tenantResolver;
2354
+ private readonly bootstrapOptions;
1887
2355
  private tenant;
2356
+ private configCache;
2357
+ private configCacheKey;
2358
+ private configLoadPromise;
2359
+ private configLoadKey;
2360
+ private storageSnapshot;
2361
+ private storageSnapshotKey;
1888
2362
  private readonly providerPartials;
1889
2363
  private readonly changes$;
1890
2364
  /** Emits when the global configuration changes (e.g., saved to storage). */
1891
2365
  readonly configChanges$: rxjs.Observable<GlobalConfig | null>;
2366
+ constructor();
1892
2367
  /** Returns merged global configuration using precedence: defaults < providers < storage */
1893
2368
  private buildConfig;
2369
+ /** Blocks until the current global configuration (for the active tenant) is loaded. */
2370
+ ready(): Promise<GlobalConfig | null>;
2371
+ /** Ensure config cache is populated (fire-and-forget); resolves with last merged config. */
2372
+ ensureConfigLoaded(opts?: {
2373
+ silent?: boolean;
2374
+ }): Promise<GlobalConfig | null>;
1894
2375
  /** Persist and broadcast a new global configuration, merged on top of providers. */
1895
- saveGlobalConfig(partial: Partial<GlobalConfig>): void;
2376
+ saveGlobalConfig(partial: Partial<GlobalConfig>): Promise<void>;
1896
2377
  /**
1897
2378
  * Retrieve value at a dot-path (e.g., 'crud.defaults.openMode').
1898
2379
  * When no path is provided, returns the entire merged configuration.
@@ -1906,8 +2387,13 @@ declare class GlobalConfigService {
1906
2387
  setTenant(tenantId?: string): void;
1907
2388
  /** Get current tenant id (if any). */
1908
2389
  getTenant(): string | undefined;
2390
+ clearGlobalConfig(): Promise<void>;
2391
+ hasStoredConfig(): boolean;
1909
2392
  /** Compute the storage key considering current tenant */
1910
2393
  private storageKey;
2394
+ private shouldFail;
2395
+ private waitForBootstrap;
2396
+ private updateStorageSnapshot;
1911
2397
  /**
1912
2398
  * Read global schema verification preferences.
1913
2399
  * Returns undefined when not set to allow callers to fallback to library defaults.
@@ -1969,6 +2455,7 @@ interface CrudOperationOptions {
1969
2455
  parentPath?: string;
1970
2456
  /** Chave do endpoint configurado via ApiUrlConfig */
1971
2457
  endpointKey?: ApiEndpoint;
2458
+ httpContext?: HttpContext;
1972
2459
  }
1973
2460
  interface BatchDeleteProgress<ID = string | number> {
1974
2461
  id: ID;
@@ -2018,7 +2505,10 @@ declare class GenericCrudService<T, ID extends string | number = string | number
2018
2505
  private _schemaUrl;
2019
2506
  private configured;
2020
2507
  private _filterSchemaCache;
2021
- private _schemaCache;
2508
+ private _rangeFilterFieldHints;
2509
+ private _filterSchemaLoaded;
2510
+ private _schemaCache?;
2511
+ private schemaCacheReady?;
2022
2512
  private _lastResourceMeta;
2023
2513
  private _lastSchemaInfo;
2024
2514
  /**
@@ -2029,6 +2519,7 @@ declare class GenericCrudService<T, ID extends string | number = string | number
2029
2519
  * @param apiUrlInjected URL base da API (via token de injeção).
2030
2520
  */
2031
2521
  constructor(http: HttpClient, schemaNormalizer: SchemaNormalizerService, globalConfig: GlobalConfigService, apiUrlInjected: ApiUrlConfig);
2522
+ private ensureSchemaCacheReady;
2032
2523
  private get errorMessages();
2033
2524
  configure(resourcePath: string, endpointKey?: ApiEndpoint): void;
2034
2525
  /**
@@ -2118,6 +2609,8 @@ declare class GenericCrudService<T, ID extends string | number = string | number
2118
2609
  operation?: string;
2119
2610
  includeInternalSchemas?: boolean;
2120
2611
  schemaType?: string;
2612
+ endpointKey?: ApiEndpoint;
2613
+ httpContext?: HttpContext;
2121
2614
  }): Observable<FieldDefinition[]>;
2122
2615
  /**
2123
2616
  * Retorna todos os registros do recurso.
@@ -2322,6 +2815,31 @@ declare class GenericCrudService<T, ID extends string | number = string | number
2322
2815
  * Resolve `/schemas/filtered` base URL honoring ApiUrlConfig (supports APIs on another origin).
2323
2816
  */
2324
2817
  getSchemasFilteredBaseUrl(endpointKey?: ApiEndpoint): string;
2818
+ private normalizeRangeCriteria;
2819
+ private normalizeRangeNode;
2820
+ private tryCollapseRangeObject;
2821
+ private coerceBoundsArray;
2822
+ private buildCanonicalBounds;
2823
+ private shouldSwapBounds;
2824
+ private tryParseNumeric;
2825
+ private tryParseDateMillis;
2826
+ private isRangeOnlyObject;
2827
+ private resolveRangeAliases;
2828
+ private findExistingKey;
2829
+ private normalizeRangeBound;
2830
+ private isRangeValue;
2831
+ private isPlainObject;
2832
+ private updateRangeFieldHints;
2833
+ private hasRangeFieldMetadata;
2834
+ private normalizeControlTypeToken;
2835
+ private isRangeControlType;
2836
+ private looksLikeRangeFieldName;
2837
+ private lowerDateAliases;
2838
+ private upperDateAliases;
2839
+ private lowerMoneyAliases;
2840
+ private upperMoneyAliases;
2841
+ private lowerGenericAliases;
2842
+ private upperGenericAliases;
2325
2843
  /**
2326
2844
  * Manipula erros de requisição HTTP.
2327
2845
  */
@@ -2491,36 +3009,307 @@ interface ConfigStorage {
2491
3009
  saveConfig<T>(key: string, config: T): void;
2492
3010
  clearConfig(key: string): void;
2493
3011
  }
3012
+ /**
3013
+ * Async contract for config storage (HTTP-friendly).
3014
+ */
3015
+ interface AsyncConfigStorage {
3016
+ /**
3017
+ * Reads config for a key.
3018
+ *
3019
+ * Success contract:
3020
+ * - emit one `next` value (can be `null`) and complete.
3021
+ * Failure contract:
3022
+ * - emit `error`.
3023
+ */
3024
+ loadConfig<T>(key: string): Observable<T | null>;
3025
+ /**
3026
+ * Persists config for a key.
3027
+ *
3028
+ * Success contract (strong ack):
3029
+ * - emit at least one `next` (typically `void 0`) and then complete.
3030
+ * Not-acknowledged contract (soft-fail path):
3031
+ * - complete without any `next`.
3032
+ * Hard-failure contract:
3033
+ * - emit `error`.
3034
+ *
3035
+ * Important:
3036
+ * - table runtime treats complete without `next` as
3037
+ * "persistence not acknowledged".
3038
+ */
3039
+ saveConfig<T>(key: string, config: T): Observable<void>;
3040
+ /**
3041
+ * Clears config for a key.
3042
+ *
3043
+ * Success contract (strong ack):
3044
+ * - emit at least one `next` (typically `void 0`) and then complete.
3045
+ * Not-acknowledged contract (soft-fail path):
3046
+ * - complete without any `next`.
3047
+ * Hard-failure contract:
3048
+ * - emit `error`.
3049
+ *
3050
+ * Important:
3051
+ * - table runtime treats complete without `next` as
3052
+ * "clear not acknowledged".
3053
+ */
3054
+ clearConfig(key: string): Observable<void>;
3055
+ }
2494
3056
  declare class LocalStorageConfigService implements ConfigStorage {
2495
3057
  loadConfig<T>(key: string): T | null;
2496
3058
  saveConfig<T>(key: string, config: T): void;
2497
3059
  clearConfig(key: string): void;
3060
+ trySaveConfig<T>(key: string, config: T): boolean;
3061
+ tryClearConfig(key: string): boolean;
2498
3062
  static ɵfac: i0.ɵɵFactoryDeclaration<LocalStorageConfigService, never>;
2499
3063
  static ɵprov: i0.ɵɵInjectableDeclaration<LocalStorageConfigService>;
2500
3064
  }
2501
- declare const CONFIG_STORAGE: InjectionToken<ConfigStorage>;
2502
-
2503
- interface ConnectionConfigV1 {
2504
- resourcePath: string;
2505
- version: 1;
2506
- updatedAt: string;
2507
- origin?: 'quick-connect' | 'editor' | 'input';
3065
+ /**
3066
+ * Async adapter over the sync LocalStorage service.
3067
+ */
3068
+ declare class LocalStorageAsyncAdapter implements AsyncConfigStorage {
3069
+ private readonly delegate;
3070
+ constructor(delegate: LocalStorageConfigService);
3071
+ loadConfig<T>(key: string): Observable<T | null>;
3072
+ saveConfig<T>(key: string, config: T): Observable<void>;
3073
+ clearConfig(key: string): Observable<void>;
3074
+ static ɵfac: i0.ɵɵFactoryDeclaration<LocalStorageAsyncAdapter, never>;
3075
+ static ɵprov: i0.ɵɵInjectableDeclaration<LocalStorageAsyncAdapter>;
3076
+ }
3077
+ /**
3078
+ * Defers async storage operations until a gate resolves.
3079
+ * Useful to ensure auth/tenant context is ready before HTTP requests.
3080
+ */
3081
+ declare class DeferredAsyncConfigStorage implements AsyncConfigStorage {
3082
+ private readonly delegate;
3083
+ private readonly gate?;
3084
+ constructor(delegate: AsyncConfigStorage, gate?: (() => Promise<void>) | undefined);
3085
+ loadConfig<T>(key: string): Observable<T | null>;
3086
+ saveConfig<T>(key: string, config: T): Observable<void>;
3087
+ clearConfig(key: string): Observable<void>;
3088
+ }
3089
+ declare const ASYNC_CONFIG_STORAGE: InjectionToken<AsyncConfigStorage>;
3090
+ declare class RemoteConfigStorage implements ConfigStorage {
3091
+ private readonly asyncStorage;
3092
+ private readonly localStorage;
3093
+ private readonly cache;
3094
+ private readonly inflight;
3095
+ loadConfig<T>(key: string): T | null;
3096
+ saveConfig<T>(key: string, config: T): void;
3097
+ clearConfig(key: string): void;
3098
+ private refreshRemote;
3099
+ static ɵfac: i0.ɵɵFactoryDeclaration<RemoteConfigStorage, never>;
3100
+ static ɵprov: i0.ɵɵInjectableDeclaration<RemoteConfigStorage>;
3101
+ }
3102
+ declare const CONFIG_STORAGE: InjectionToken<ConfigStorage>;
3103
+ /**
3104
+ * Options for ApiConfigStorage.
3105
+ */
3106
+ interface ApiConfigStorageOptions {
3107
+ baseUrl?: string;
3108
+ /** Factory to supply headers (tenant/user/env/updatedBy) per request. */
3109
+ headersFactory?: () => Record<string, string | undefined>;
3110
+ /** Default headers applied when the headersFactory omits them. */
3111
+ defaultHeaders?: Record<string, string>;
3112
+ /** Resolve componentType from the storage key (use the component selector, e.g. praxis-table). */
3113
+ componentTypeResolver?: (key: string) => string;
3114
+ /** Controls whether load errors for global config should propagate. */
3115
+ errorPolicy?: 'fail' | 'ignore';
3116
+ }
3117
+ declare const API_CONFIG_STORAGE_OPTIONS: InjectionToken<ApiConfigStorageOptions>;
3118
+ /**
3119
+ * HTTP-based storage that talks to praxis-config-starter user-config API.
3120
+ */
3121
+ declare class ApiConfigStorage implements AsyncConfigStorage {
3122
+ private readonly http;
3123
+ private readonly opts;
3124
+ private readonly baseUrl;
3125
+ private readonly headersFactory;
3126
+ private readonly defaultHeaders;
3127
+ private readonly componentTypeResolver;
3128
+ private readonly cache;
3129
+ constructor();
3130
+ loadConfig<T>(key: string): Observable<T | null>;
3131
+ saveConfig<T>(key: string, config: T): Observable<void>;
3132
+ private shouldPropagateSaveError;
3133
+ private shouldPropagateClearError;
3134
+ private shouldPropagateLoadError;
3135
+ private isCriticalPersistenceKey;
3136
+ clearConfig(key: string): Observable<void>;
3137
+ private buildHeaders;
3138
+ private buildParams;
3139
+ private resolveKey;
3140
+ private inferComponentType;
3141
+ private looksLikePageKey;
3142
+ private stripQuotes;
3143
+ private formatEtag;
3144
+ static ɵfac: i0.ɵɵFactoryDeclaration<ApiConfigStorage, never>;
3145
+ static ɵprov: i0.ɵɵInjectableDeclaration<ApiConfigStorage>;
3146
+ }
3147
+
3148
+ type GlobalActionResult = {
3149
+ success: boolean;
3150
+ data?: any;
3151
+ error?: string;
3152
+ };
3153
+ type GlobalActionContext = {
3154
+ sourceId?: string;
3155
+ widgetKey?: string;
3156
+ output?: string;
3157
+ payload?: any;
3158
+ pageContext?: Record<string, any> | null;
3159
+ meta?: Record<string, any>;
3160
+ };
3161
+ type GlobalActionHandler = (payload?: any, context?: GlobalActionContext) => Promise<GlobalActionResult> | GlobalActionResult;
3162
+ interface GlobalActionHandlerEntry {
3163
+ id: string;
3164
+ handler: GlobalActionHandler;
3165
+ }
3166
+ interface GlobalDialogService {
3167
+ alert: (payload: {
3168
+ title?: string;
3169
+ message?: string;
3170
+ variant?: string;
3171
+ }) => Promise<any> | any;
3172
+ confirm: (payload: {
3173
+ title?: string;
3174
+ message?: string;
3175
+ confirmLabel?: string;
3176
+ cancelLabel?: string;
3177
+ type?: 'danger' | 'warning' | 'info';
3178
+ }) => Promise<boolean> | boolean;
3179
+ prompt: (payload: {
3180
+ title?: string;
3181
+ message?: string;
3182
+ placeholder?: string;
3183
+ defaultValue?: string;
3184
+ }) => Promise<any> | any;
3185
+ open: (payload: {
3186
+ componentId?: string;
3187
+ inputs?: any;
3188
+ size?: any;
3189
+ data?: any;
3190
+ }) => Promise<any> | any;
3191
+ }
3192
+ interface GlobalToastService {
3193
+ success: (message: string, opts?: any) => void;
3194
+ error: (message: string, opts?: any) => void;
3195
+ }
3196
+ interface GlobalAnalyticsService {
3197
+ track: (eventName: string, payload?: any) => void;
3198
+ }
3199
+ interface GlobalApiClient {
3200
+ get: (url: string, params?: Record<string, any>) => Promise<any> | any;
3201
+ post: (url: string, body?: any) => Promise<any> | any;
3202
+ patch: (url: string, body?: any) => Promise<any> | any;
3203
+ }
3204
+ interface GlobalRouteGuardResolver {
3205
+ resolve: (guardId: string) => any;
3206
+ }
3207
+
3208
+ declare class GlobalActionService {
3209
+ private readonly handlers;
3210
+ private readonly router;
3211
+ private readonly location;
3212
+ private readonly registry;
3213
+ private readonly globalConfig;
3214
+ private readonly dialog;
3215
+ private readonly toast;
3216
+ private readonly analytics;
3217
+ private readonly api;
3218
+ private readonly guardResolver;
3219
+ constructor();
3220
+ register(id: string, handler: GlobalActionHandler): void;
3221
+ has(id: string): boolean;
3222
+ execute(id: string, payload?: any, context?: GlobalActionContext): Promise<GlobalActionResult>;
3223
+ private registerBuiltins;
3224
+ private handleApi;
3225
+ private handleRouteRegister;
3226
+ static ɵfac: i0.ɵɵFactoryDeclaration<GlobalActionService, never>;
3227
+ static ɵprov: i0.ɵɵInjectableDeclaration<GlobalActionService>;
3228
+ }
3229
+
3230
+ interface ConnectionConfigV1 {
3231
+ resourcePath: string;
3232
+ version: 1;
3233
+ updatedAt: string;
3234
+ origin?: 'quick-connect' | 'editor' | 'input';
3235
+ }
3236
+ interface ConnectionStorage {
3237
+ loadConnection(key: string): Observable<ConnectionConfigV1 | null>;
3238
+ saveConnection(key: string, cfg: ConnectionConfigV1): Observable<void>;
3239
+ clearConnection(key: string): Observable<void>;
3240
+ }
3241
+ declare class LocalConnectionStorage implements ConnectionStorage {
3242
+ private storage;
3243
+ constructor(storage: AsyncConfigStorage);
3244
+ loadConnection(key: string): Observable<ConnectionConfigV1 | null>;
3245
+ saveConnection(key: string, cfg: ConnectionConfigV1): Observable<void>;
3246
+ clearConnection(key: string): Observable<void>;
3247
+ static ɵfac: i0.ɵɵFactoryDeclaration<LocalConnectionStorage, never>;
3248
+ static ɵprov: i0.ɵɵInjectableDeclaration<LocalConnectionStorage>;
3249
+ }
3250
+ declare const CONNECTION_STORAGE: InjectionToken<ConnectionStorage>;
3251
+
3252
+ type DeviceKind = 'mobile' | 'tablet' | 'desktop';
3253
+ type OverlayPattern = 'modal' | 'drawer' | 'page' | 'bottom-sheet' | 'full-screen-dialog';
3254
+ interface OverlayDecisionContext {
3255
+ device: DeviceKind;
3256
+ fieldCount: number;
3257
+ dependencyCount: number;
3258
+ }
3259
+ interface OverlayDecision {
3260
+ pattern: OverlayPattern;
3261
+ config?: Record<string, unknown>;
3262
+ reason?: string;
3263
+ }
3264
+ interface OverlayRange {
3265
+ min?: number;
3266
+ max?: number;
3267
+ }
3268
+ interface OverlayRuleMatch {
3269
+ device?: DeviceKind[];
3270
+ fieldCount?: OverlayRange;
3271
+ dependencyCount?: OverlayRange;
3272
+ any?: OverlayRuleMatch[];
3273
+ }
3274
+ interface OverlayRule {
3275
+ match: OverlayRuleMatch;
3276
+ use: OverlayDecision;
3277
+ }
3278
+ interface OverlayThresholds {
3279
+ fieldCount: {
3280
+ small_max: number;
3281
+ medium_max: number;
3282
+ };
3283
+ dependencyCount: {
3284
+ low_max: number;
3285
+ medium_max: number;
3286
+ };
2508
3287
  }
2509
- interface ConnectionStorage {
2510
- loadConnection(key: string): ConnectionConfigV1 | null;
2511
- saveConnection(key: string, cfg: ConnectionConfigV1): void;
2512
- clearConnection(key: string): void;
3288
+ interface OverlayDecisionMatrix {
3289
+ version: string;
3290
+ description?: string;
3291
+ thresholds: OverlayThresholds;
3292
+ rules_ordered: OverlayRule[];
3293
+ fallback: OverlayDecision;
3294
+ ui_hints?: Record<string, unknown>;
2513
3295
  }
2514
- declare class LocalConnectionStorage implements ConnectionStorage {
2515
- private storage;
2516
- constructor(storage: ConfigStorage);
2517
- loadConnection(key: string): ConnectionConfigV1 | null;
2518
- saveConnection(key: string, cfg: ConnectionConfigV1): void;
2519
- clearConnection(key: string): void;
2520
- static ɵfac: i0.ɵɵFactoryDeclaration<LocalConnectionStorage, never>;
2521
- static ɵprov: i0.ɵɵInjectableDeclaration<LocalConnectionStorage>;
3296
+ interface OverlayDecider {
3297
+ decide(ctx: OverlayDecisionContext): OverlayDecision;
3298
+ explain?(ctx: OverlayDecisionContext): string;
3299
+ }
3300
+
3301
+ declare const OVERLAY_DECIDER_DEBUG: InjectionToken<boolean>;
3302
+ declare class OverlayDeciderService {
3303
+ private readonly matrix;
3304
+ private readonly debug;
3305
+ decide(ctx: OverlayDecisionContext): OverlayDecision;
3306
+ explain(ctx: OverlayDecisionContext): string;
3307
+ private evaluate;
3308
+ private matches;
3309
+ private log;
3310
+ static ɵfac: i0.ɵɵFactoryDeclaration<OverlayDeciderService, never>;
3311
+ static ɵprov: i0.ɵɵInjectableDeclaration<OverlayDeciderService>;
2522
3312
  }
2523
- declare const CONNECTION_STORAGE: InjectionToken<ConnectionStorage>;
2524
3313
 
2525
3314
  /**
2526
3315
  * Enum que define os tipos de dados (`TYPE`) disponíveis para configuração dos campos de formulário.
@@ -2551,6 +3340,7 @@ declare const FieldControlType: {
2551
3340
  readonly APP_BAR: "appBar";
2552
3341
  readonly ARC_GAUGE: "arcGauge";
2553
3342
  readonly ARRAY_INPUT: "array";
3343
+ readonly ASYNC_SELECT: "async-select";
2554
3344
  readonly AUTO_COMPLETE: "autoComplete";
2555
3345
  readonly AVATAR: "avatar";
2556
3346
  readonly BARCODE_GENERATOR: "barcodeGenerator";
@@ -2624,6 +3414,7 @@ declare const FieldControlType: {
2624
3414
  readonly RIPPLE: "ripple";
2625
3415
  readonly SCROLL_VIEW: "scrollView";
2626
3416
  readonly SEARCH_INPUT: "search";
3417
+ readonly SEARCHABLE_SELECT: "searchable-select";
2627
3418
  readonly SELECTION_LIST: "selectionList";
2628
3419
  readonly SELECT: "select";
2629
3420
  readonly SIGNATURE: "signature";
@@ -2945,6 +3736,10 @@ interface FieldMetadata extends ComponentMetadata {
2945
3736
  suffixIcon?: string;
2946
3737
  iconPosition?: 'start' | 'end';
2947
3738
  iconSize?: 'small' | 'medium' | 'large';
3739
+ /** Tooltip for suffix icon (used for help actions) */
3740
+ suffixIconTooltip?: string;
3741
+ /** ARIA label for suffix icon when used as help */
3742
+ suffixIconAriaLabel?: string;
2948
3743
  /** Input masking pattern */
2949
3744
  mask?: string;
2950
3745
  /** Format for display values */
@@ -3087,19 +3882,6 @@ type CoreFieldMetadata = Pick<FieldMetadata, 'name' | 'label' | 'controlType'>;
3087
3882
  /** Helper type for field metadata without computed properties */
3088
3883
  type SerializableFieldMetadata = Omit<FieldMetadata, 'conditionalRequired' | 'conditionalDisplay' | 'transformDisplayValue' | 'transformSaveValue'>;
3089
3884
 
3090
- /**
3091
- * @fileoverview Specialized metadata interfaces for Angular Material components
3092
- *
3093
- * This file extends the base FieldMetadata interface with component-specific
3094
- * properties for each Material Design component type.
3095
- *
3096
- * Each interface follows the pattern:
3097
- * - Extends FieldMetadata
3098
- * - Adds component-specific properties
3099
- * - Maintains type safety with literal types
3100
- * - Supports Material Design 3 specifications
3101
- */
3102
-
3103
3885
  /**
3104
3886
  * Enhanced validation context with type safety
3105
3887
  * Provides comprehensive context for custom validation functions
@@ -3309,6 +4091,8 @@ interface MaterialInputMetadata extends BaseMaterialInputMetadata {
3309
4091
  enabled: boolean;
3310
4092
  /** Nome do ícone Material (default: 'clear') */
3311
4093
  icon?: string;
4094
+ /** Cor do ícone (tema ou CSS) */
4095
+ iconColor?: string;
3312
4096
  /** Posição fixa no 'end' conforme Material Design */
3313
4097
  position?: 'end';
3314
4098
  /** Tooltip text for accessibility */
@@ -3696,6 +4480,36 @@ interface MaterialNumericMetadata extends BaseMaterialInputMetadata {
3696
4480
  min?: number;
3697
4481
  /** Maximum allowed value */
3698
4482
  max?: number;
4483
+ /** Minimum allowed value for start input */
4484
+ startMin?: number;
4485
+ /** Maximum allowed value for start input */
4486
+ startMax?: number;
4487
+ /** Minimum allowed value for end input */
4488
+ endMin?: number;
4489
+ /** Maximum allowed value for end input */
4490
+ endMax?: number;
4491
+ /** Custom message for start min validation */
4492
+ startMinMessage?: string;
4493
+ /** Custom message for start max validation */
4494
+ startMaxMessage?: string;
4495
+ /** Custom message for end min validation */
4496
+ endMinMessage?: string;
4497
+ /** Custom message for end max validation */
4498
+ endMaxMessage?: string;
4499
+ /**
4500
+ * Offset mínimo do fim em relação ao início.
4501
+ * Ex.: 10 => fim >= início + 10
4502
+ */
4503
+ endMinOffset?: number;
4504
+ /**
4505
+ * Offset máximo do início em relação ao fim.
4506
+ * Ex.: 10 => início <= fim - 10
4507
+ */
4508
+ startMaxOffset?: number;
4509
+ /** Custom message for endMinOffset validation */
4510
+ endMinOffsetMessage?: string;
4511
+ /** Custom message for startMaxOffset validation */
4512
+ startMaxOffsetMessage?: string;
3699
4513
  /** Step increment for number controls */
3700
4514
  step?: number;
3701
4515
  /** Number formatting options */
@@ -3741,6 +4555,18 @@ interface MaterialSelectMetadata extends FieldMetadata {
3741
4555
  selectAll?: boolean;
3742
4556
  /** Maximum number of selections (for multiple) */
3743
4557
  maxSelections?: number;
4558
+ /** Inline/runtime compatibility for panel search icon. */
4559
+ panelSearchIcon?: string;
4560
+ /** Inline/runtime compatibility for panel search icon color. */
4561
+ panelSearchIconColor?: string;
4562
+ /** Inline/runtime compatibility for panel reset icon. */
4563
+ panelResetIcon?: string;
4564
+ /** Inline/runtime compatibility for panel reset icon color. */
4565
+ panelResetIconColor?: string;
4566
+ /** Inline/runtime compatibility for selected option icon. */
4567
+ optionSelectedIcon?: string;
4568
+ /** Inline/runtime compatibility for selected option icon color. */
4569
+ optionSelectedIconColor?: string;
3744
4570
  }
3745
4571
  /**
3746
4572
  * Metadata for Material Autocomplete components.
@@ -3990,6 +4816,57 @@ interface MaterialDateRangeMetadata extends FieldMetadata {
3990
4816
  endAriaLabel?: string;
3991
4817
  /** Start view (month, year, multi-year) */
3992
4818
  startView?: 'month' | 'year' | 'multi-year';
4819
+ /** Enable sidebar shortcuts overlay (phase 1). */
4820
+ showShortcuts?: boolean;
4821
+ /**
4822
+ * Shortcuts configuration. Accepts built-in identifiers or custom presets.
4823
+ * Example: ['thisMonth', 'lastMonth', { id: 'last7', label: 'Últimos 7 dias', calculateRange: fn }]
4824
+ */
4825
+ shortcuts?: (string | DateRangePreset)[];
4826
+ /**
4827
+ * Inline quick presets for compact filters (`filter-date-range-inline`).
4828
+ * - `true`: enabled with defaults
4829
+ * - `false`: disabled
4830
+ * - object: fine-grained control
4831
+ */
4832
+ inlineQuickPresets?: boolean | {
4833
+ enabled?: boolean;
4834
+ maxVisible?: number;
4835
+ };
4836
+ /** Accessibility label for the inline quick presets group. */
4837
+ inlineQuickPresetsAriaLabel?: string;
4838
+ /** Action label shown in the overlay footer for cancel. */
4839
+ inlineQuickPresetsCancelLabel?: string;
4840
+ /** Accessibility label for the cancel action in overlay footer. */
4841
+ inlineQuickPresetsCancelAriaLabel?: string;
4842
+ /** Action label shown in the overlay footer for apply. */
4843
+ inlineQuickPresetsApplyLabel?: string;
4844
+ /** Accessibility label for the apply action in overlay footer. */
4845
+ inlineQuickPresetsApplyAriaLabel?: string;
4846
+ /**
4847
+ * Apply behavior for inline quick presets:
4848
+ * - `auto`: applies immediately and closes the overlay
4849
+ * - `confirm`: keeps selection as draft and only commits on explicit confirmation
4850
+ */
4851
+ inlineQuickPresetsApplyMode?: 'auto' | 'confirm';
4852
+ /** Position of shortcuts sidebar relative to the form field. */
4853
+ shortcutsPosition?: 'left' | 'right';
4854
+ /** Apply immediately when clicking a shortcut. Defaults to true. */
4855
+ applyOnShortcutClick?: boolean;
4856
+ /** Timezone identifier (e.g., 'America/Sao_Paulo') for normalization. */
4857
+ timezone?: string;
4858
+ /** First day of week override; otherwise use DateAdapter.getFirstDayOfWeek(). */
4859
+ startOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
4860
+ /**
4861
+ * Localized labels for built-in shortcuts.
4862
+ * Keys: today, yesterday, thisWeek, lastWeek, thisMonth, lastMonth, thisYear, lastYear
4863
+ */
4864
+ i18nShortcuts?: Partial<Record<'today' | 'yesterday' | 'thisWeek' | 'lastWeek' | 'thisMonth' | 'lastMonth' | 'thisYear' | 'lastYear', string>>;
4865
+ /**
4866
+ * Now provider for deterministic testing and reporting alignment.
4867
+ * Defaults to () => new Date().
4868
+ */
4869
+ nowProvider?: () => Date;
3993
4870
  }
3994
4871
  /**
3995
4872
  * Metadata for a price range input using two currency fields.
@@ -4024,10 +4901,104 @@ interface MaterialPriceRangeMetadata extends FieldMetadata {
4024
4901
  startLabel?: string;
4025
4902
  /** Label for end input */
4026
4903
  endLabel?: string;
4904
+ /** Hide labels for start/end sub-inputs (compact mode). */
4905
+ hideSubLabels?: boolean;
4906
+ /** Layout dos inputs (lado a lado ou em linhas). */
4907
+ layout?: 'row' | 'column';
4908
+ /** Espaçamento entre os inputs (px ou CSS). */
4909
+ gap?: number | string;
4910
+ /** Onde exibir o botão clear: no grupo ou em cada subinput. */
4911
+ clearButtonPlacement?: 'group' | 'subinputs';
4912
+ /**
4913
+ * Configuração do botão de limpar a faixa.
4914
+ * Aceita boolean para compatibilidade ou objeto detalhado.
4915
+ */
4916
+ clearButton?: boolean | {
4917
+ enabled: boolean;
4918
+ icon?: string;
4919
+ iconColor?: string;
4920
+ tooltip?: string;
4921
+ ariaLabel?: string;
4922
+ showOnlyWhenFilled?: boolean;
4923
+ };
4924
+ /**
4925
+ * Optional mini histogram/bars rendered above the inline range slider track.
4926
+ * Accepts array shorthand, object config, or JSON string for editor compatibility.
4927
+ */
4928
+ inlineDistribution?: InlineRangeDistributionConfig | Array<number | InlineRangeDistributionBin> | string;
4929
+ /**
4930
+ * Alias accepted by inline range components for legacy payloads.
4931
+ */
4932
+ distribution?: InlineRangeDistributionConfig | Array<number | InlineRangeDistributionBin> | string;
4027
4933
  }
4028
4934
  /**
4029
4935
  * Metadata for the generic numeric range slider component.
4030
4936
  */
4937
+ interface InlineRangeDistributionBin {
4938
+ /** Optional unique identifier */
4939
+ id?: string;
4940
+ /** Primary numeric amount for the bin */
4941
+ value?: number;
4942
+ /** Alias for `value` used by analytics payloads */
4943
+ count?: number;
4944
+ /** Alias for `value` used by finance payloads */
4945
+ amount?: number;
4946
+ /** Optional custom bar color */
4947
+ color?: string;
4948
+ /** Optional label for accessibility/reporting */
4949
+ label?: string;
4950
+ }
4951
+ interface InlineRangeDistributionConfig {
4952
+ /**
4953
+ * Histogram bins as numeric shorthand or rich objects.
4954
+ * Accepts array or JSON string for editor compatibility.
4955
+ */
4956
+ bins?: Array<number | InlineRangeDistributionBin> | string;
4957
+ /** Optional normalization ceiling; defaults to the highest bin value. */
4958
+ maxValue?: number;
4959
+ /** Optional minimum visible ratio in the [0..1] range for non-zero bars. */
4960
+ minBarRatio?: number;
4961
+ /** Alias for `minBarRatio`. */
4962
+ minVisibleRatio?: number;
4963
+ /** Optional container height in px. */
4964
+ height?: number;
4965
+ /** Optional gap between bars in px. */
4966
+ gap?: number;
4967
+ /** Optional top border radius for bars in px. */
4968
+ radius?: number;
4969
+ /** Optional global opacity multiplier in the [0..1] range. */
4970
+ opacity?: number;
4971
+ /** Optional accessibility label for the bars group. */
4972
+ ariaLabel?: string;
4973
+ }
4974
+ interface RangeSliderQuickPreset {
4975
+ /** Optional unique identifier */
4976
+ id?: string;
4977
+ /** Label shown in the inline preset chip/button */
4978
+ label: string;
4979
+ /** Optional icon (Material icon name) */
4980
+ icon?: string;
4981
+ /** Preset for single mode */
4982
+ value?: number | null;
4983
+ /** Preset start for range mode */
4984
+ start?: number | null;
4985
+ /** Preset end for range mode */
4986
+ end?: number | null;
4987
+ }
4988
+ interface RangeSliderInlineTexts {
4989
+ minLabel?: string;
4990
+ maxLabel?: string;
4991
+ valueLabel?: string;
4992
+ quickPresetsLabel?: string;
4993
+ }
4994
+ interface RangeSliderQuickPresetLabels {
4995
+ low?: string;
4996
+ middle?: string;
4997
+ high?: string;
4998
+ uptoMid?: string;
4999
+ fromMid?: string;
5000
+ full?: string;
5001
+ }
4031
5002
  interface MaterialRangeSliderMetadata extends FieldMetadata {
4032
5003
  controlType: typeof FieldControlType.RANGE_SLIDER;
4033
5004
  /** Slider mode */
@@ -4056,6 +5027,64 @@ interface MaterialRangeSliderMetadata extends FieldMetadata {
4056
5027
  displayWith?: (value: number) => string;
4057
5028
  /** Show numeric input boxes */
4058
5029
  showInputs?: boolean;
5030
+ /**
5031
+ * Optional mini histogram/bars rendered above the inline slider track.
5032
+ * Accepts array shorthand, object config, or JSON string for editor compatibility.
5033
+ */
5034
+ inlineDistribution?: InlineRangeDistributionConfig | Array<number | InlineRangeDistributionBin> | string;
5035
+ /**
5036
+ * Alias accepted by inline range components for legacy payloads.
5037
+ */
5038
+ distribution?: InlineRangeDistributionConfig | Array<number | InlineRangeDistributionBin> | string;
5039
+ /**
5040
+ * Quick presets shown in compact inline variant.
5041
+ * Accepts a typed array or JSON string for editor/backward compatibility.
5042
+ */
5043
+ quickPresets?: RangeSliderQuickPreset[] | string;
5044
+ /** Enables auto-generated quick presets when `quickPresets` is not provided. */
5045
+ quickPresetsAuto?: boolean;
5046
+ /**
5047
+ * Optional labels for auto-generated presets.
5048
+ * Accepts object or JSON string for editor/backward compatibility.
5049
+ */
5050
+ quickPresetsLabels?: RangeSliderQuickPresetLabels | string;
5051
+ /**
5052
+ * Compact inline textual labels (inputs and quick presets group).
5053
+ * Accepts object or JSON string for editor/backward compatibility.
5054
+ */
5055
+ inlineTexts?: RangeSliderInlineTexts | string;
5056
+ /**
5057
+ * Enables half-step interactions for inline rating ranges.
5058
+ * When `true`, the rating range defaults to step `0.5` unless an explicit step is set.
5059
+ */
5060
+ allowHalf?: boolean;
5061
+ /**
5062
+ * Legacy alias for `allowHalf` used by some integrations.
5063
+ */
5064
+ ratingAllowHalf?: boolean;
5065
+ /**
5066
+ * Optional precision hint for rating-range interpretation (`0.5` enables half-step).
5067
+ */
5068
+ ratingPrecision?: number;
5069
+ /**
5070
+ * Optional precision token for rating-range interpretation (`half` enables half-step).
5071
+ */
5072
+ precision?: string | number;
5073
+ /**
5074
+ * Optional aliases consumed by inline rating implementations.
5075
+ * `ratingMin` and `ratingMax` are fallbacks when `min`/`max` are omitted.
5076
+ */
5077
+ ratingMin?: number;
5078
+ ratingMax?: number;
5079
+ ratingStep?: number;
5080
+ itemsCount?: number;
5081
+ /**
5082
+ * Optional visual customization for inline rating tone colors.
5083
+ */
5084
+ ratingToneLowColor?: string;
5085
+ ratingToneMidColor?: string;
5086
+ ratingToneHighColor?: string;
5087
+ ratingBadgeColor?: string;
4059
5088
  /** Custom validator messages */
4060
5089
  validators?: FieldMetadata['validators'] & {
4061
5090
  minMessage?: string;
@@ -4197,6 +5226,18 @@ interface MaterialColorPickerMetadata extends FieldMetadata {
4197
5226
  showInput?: boolean;
4198
5227
  /** Show color preview */
4199
5228
  showPreview?: boolean;
5229
+ /**
5230
+ * Configuração do botão de limpar no painel do color picker.
5231
+ * Aceita boolean para compatibilidade ou objeto detalhado.
5232
+ */
5233
+ clearButton?: boolean | {
5234
+ enabled: boolean;
5235
+ icon?: string;
5236
+ iconColor?: string;
5237
+ tooltip?: string;
5238
+ ariaLabel?: string;
5239
+ showOnlyWhenFilled?: boolean;
5240
+ };
4200
5241
  }
4201
5242
  /**
4202
5243
  * Specialized metadata for Material Currency Input components.
@@ -4324,6 +5365,19 @@ interface MaterialPhoneMetadata extends BaseMaterialInputMetadata {
4324
5365
  interface MaterialPasswordMetadata extends BaseMaterialInputMetadata {
4325
5366
  controlType: typeof FieldControlType.PASSWORD;
4326
5367
  inputType: 'password';
5368
+ /**
5369
+ * Optional reveal toggle (show/hide password).
5370
+ * Use style: 'icon' for eye icon, 'text' for a small text button.
5371
+ */
5372
+ revealToggle?: {
5373
+ enabled?: boolean;
5374
+ style?: 'icon' | 'text';
5375
+ showLabel?: string;
5376
+ hideLabel?: string;
5377
+ iconShow?: string;
5378
+ iconHide?: string;
5379
+ ariaLabel?: string;
5380
+ };
4327
5381
  }
4328
5382
  /**
4329
5383
  * Metadata for Material URL Input components.
@@ -4434,6 +5488,22 @@ interface MaterialTimeInputMetadata extends BaseMaterialInputMetadata {
4434
5488
  max?: string;
4435
5489
  /** Step for minute increments in seconds. */
4436
5490
  step?: number;
5491
+ /** Inline/runtime compatibility for compact filter variant. */
5492
+ interval?: number | string;
5493
+ /** Inline/runtime compatibility for compact filter variant. */
5494
+ timeOptions?: string[];
5495
+ /** Inline/runtime compatibility for compact filter variant. */
5496
+ showSeconds?: boolean;
5497
+ /** Inline/runtime compatibility for compact filter variant. */
5498
+ stepMinute?: number;
5499
+ /** Inline/runtime compatibility for compact filter variant. */
5500
+ stepSecond?: number;
5501
+ /** Inline/runtime compatibility for compact filter variant. */
5502
+ inlineTimeMode?: 'auto' | 'list' | 'columns';
5503
+ /** Inline/runtime compatibility for compact filter variant. */
5504
+ inlineListMaxOptions?: number;
5505
+ /** Inline/runtime compatibility for compact filter variant. */
5506
+ inlineTexts?: MaterialTimepickerMetadata['inlineTexts'];
4437
5507
  }
4438
5508
  /**
4439
5509
  * Metadata for Material Timepicker components.
@@ -4450,7 +5520,7 @@ interface MaterialTimepickerMetadata extends BaseMaterialInputMetadata {
4450
5520
  /**
4451
5521
  * Interval between options in the timepicker.
4452
5522
  * Can be a number of seconds or a string with units like '30m'.
4453
- * Ignored if `options` is provided.
5523
+ * Ignored if `timeOptions` is provided.
4454
5524
  */
4455
5525
  interval?: number | string;
4456
5526
  /** Specific selectable time options. Takes precedence over `interval`. */
@@ -4467,6 +5537,39 @@ interface MaterialTimepickerMetadata extends BaseMaterialInputMetadata {
4467
5537
  stepMinute?: number;
4468
5538
  /** Second increment when entering time manually. */
4469
5539
  stepSecond?: number;
5540
+ /**
5541
+ * Rendering mode for inline filter variant:
5542
+ * - `list`: single list of options
5543
+ * - `columns`: independent columns for hour/minute(/second)
5544
+ * - `auto`: chooses best mode based on metadata/options
5545
+ */
5546
+ inlineTimeMode?: 'auto' | 'list' | 'columns';
5547
+ /**
5548
+ * Max options threshold for `inlineTimeMode: 'auto'` to still prefer list.
5549
+ * Values outside range are clamped by the component.
5550
+ */
5551
+ inlineListMaxOptions?: number;
5552
+ /**
5553
+ * Text overrides for inline time variant.
5554
+ */
5555
+ inlineTexts?: {
5556
+ hourLabel?: string;
5557
+ minuteLabel?: string;
5558
+ secondLabel?: string;
5559
+ emptyStateLabel?: string;
5560
+ openPanelAriaLabel?: string;
5561
+ closePanelAriaLabel?: string;
5562
+ };
5563
+ /** Inline/runtime compatibility for panel toggle icon when closed. */
5564
+ panelToggleCloseIcon?: string;
5565
+ /** Inline/runtime compatibility for panel toggle icon when open. */
5566
+ panelToggleOpenIcon?: string;
5567
+ /** Inline/runtime compatibility for panel toggle icon color. */
5568
+ panelToggleIconColor?: string;
5569
+ /** Inline/runtime compatibility for selected option icon. */
5570
+ optionSelectedIcon?: string;
5571
+ /** Inline/runtime compatibility for selected option icon color. */
5572
+ optionSelectedIconColor?: string;
4470
5573
  /** Identifier of a custom filter function to disable specific times. */
4471
5574
  timeFilter?: string;
4472
5575
  }
@@ -4504,6 +5607,28 @@ interface MaterialTreeSelectMetadata extends FieldMetadata {
4504
5607
  controlType: typeof FieldControlType.TREE_SELECT;
4505
5608
  /** Tree nodes to display */
4506
5609
  nodes?: MaterialTreeNode[];
5610
+ /** Enable search input */
5611
+ searchable?: boolean;
5612
+ /** Placeholder text for tree search input */
5613
+ searchPlaceholder?: string;
5614
+ /** Empty state message for filtered tree */
5615
+ emptyStateText?: string;
5616
+ /** Inline/runtime compatibility for panel search icon. */
5617
+ panelSearchIcon?: string;
5618
+ /** Inline/runtime compatibility for panel search icon color. */
5619
+ panelSearchIconColor?: string;
5620
+ /** Inline/runtime compatibility for panel toggle icon when closed. */
5621
+ panelToggleCloseIcon?: string;
5622
+ /** Inline/runtime compatibility for panel toggle icon when open. */
5623
+ panelToggleOpenIcon?: string;
5624
+ /** Inline/runtime compatibility for panel toggle icon color. */
5625
+ panelToggleIconColor?: string;
5626
+ /** Inline/runtime compatibility for expanded tree node icon. */
5627
+ treeNodeExpandedIcon?: string;
5628
+ /** Inline/runtime compatibility for collapsed tree node icon. */
5629
+ treeNodeCollapsedIcon?: string;
5630
+ /** Inline/runtime compatibility for tree node toggle icon color. */
5631
+ treeNodeIconColor?: string;
4507
5632
  /** Whether only leaf nodes can be selected */
4508
5633
  leafOnly?: boolean;
4509
5634
  /** Auto expand matches when searching */
@@ -4556,7 +5681,7 @@ declare function buildValidatorsFromValidatorOptions(opts?: ValidatorOptions): B
4556
5681
  * - Injetar validadores específicos de UI conforme o controlType:
4557
5682
  * - DATE_PICKER: minDate/maxDate (datas limites).
4558
5683
  * - DATE_RANGE: verificação de ordem (start <= end) e min/max date.
4559
- * - RANGE_SLIDER: verificação de ordem e min/max numérico.
5684
+ * - RANGE_SLIDER/PRICE_RANGE: verificação de ordem e min/max numérico.
4560
5685
  * - Tratar campos múltiplos (checkbox/multi-select): valor inicial [] quando não informado.
4561
5686
  * - Reconfigurar controles existentes (validators, asyncValidators, enabled/disabled, defaultValue).
4562
5687
  *
@@ -4712,6 +5837,10 @@ declare class ErrorMessageService {
4712
5837
  interface ComponentDocMeta {
4713
5838
  /** Unique identifier used by the registry */
4714
5839
  id: string;
5840
+ /** Canonical component type for AI registry (ex: praxis-table) */
5841
+ componentType?: string;
5842
+ /** Display name used by AI docs/catalogs */
5843
+ displayName?: string;
4715
5844
  /** Angular component selector */
4716
5845
  selector: string;
4717
5846
  /** Component class reference */
@@ -4739,6 +5868,50 @@ interface ComponentDocMeta {
4739
5868
  /** Optional friendly label for UI (diagram/builders) */
4740
5869
  label?: string;
4741
5870
  }>;
5871
+ /** Optional reusable actions catalog (shell/toolbar/context/etc). */
5872
+ actions?: Array<{
5873
+ id: string;
5874
+ label: string;
5875
+ /** Optional icon name for UI suggestions. */
5876
+ icon?: string;
5877
+ description?: string;
5878
+ /** Optional command name to dispatch to the component. */
5879
+ command?: string;
5880
+ /** Optional output name to emit by default. */
5881
+ emit?: string;
5882
+ /** Optional payload schema for validation/UI. */
5883
+ payloadSchema?: {
5884
+ type: 'object' | 'string' | 'number' | 'boolean' | 'array';
5885
+ properties?: Record<string, {
5886
+ type: string;
5887
+ description?: string;
5888
+ required?: boolean;
5889
+ }>;
5890
+ required?: string[];
5891
+ example?: any;
5892
+ };
5893
+ /** Optional scope hint for UI placement. */
5894
+ scope?: 'shell' | 'toolbar' | 'context' | 'any';
5895
+ }>;
5896
+ /** Optional commands catalog for advanced actions. */
5897
+ commands?: Array<{
5898
+ name: string;
5899
+ label: string;
5900
+ /** Optional icon name for UI suggestions. */
5901
+ icon?: string;
5902
+ description?: string;
5903
+ /** Optional payload schema for validation/UI. */
5904
+ payloadSchema?: {
5905
+ type: 'object' | 'string' | 'number' | 'boolean' | 'array';
5906
+ properties?: Record<string, {
5907
+ type: string;
5908
+ description?: string;
5909
+ required?: boolean;
5910
+ }>;
5911
+ required?: string[];
5912
+ example?: any;
5913
+ };
5914
+ }>;
4742
5915
  /** Tags or categories for search */
4743
5916
  tags?: string[];
4744
5917
  /** Source library for the component */
@@ -4762,360 +5935,569 @@ interface ComponentDocMeta {
4762
5935
  */
4763
5936
  declare class ComponentMetadataRegistry {
4764
5937
  private readonly metadataMap;
5938
+ private readonly componentTypeAliases;
4765
5939
  /** Register a component metadata entry. */
4766
5940
  register(meta: ComponentDocMeta): void;
4767
5941
  /** Retrieve metadata by its unique id. */
4768
- get(id: string): ComponentDocMeta | undefined;
4769
- /** List all registered metadata entries. */
4770
- getAll(): ComponentDocMeta[];
4771
- /**
4772
- * Ensure friendly labels/descriptions for common inputs/outputs when missing.
4773
- * This helps diagrams/builders present consistent naming across components.
4774
- */
4775
- private normalizeMeta;
4776
- static ɵfac: i0.ɵɵFactoryDeclaration<ComponentMetadataRegistry, never>;
4777
- static ɵprov: i0.ɵɵInjectableDeclaration<ComponentMetadataRegistry>;
4778
- }
4779
-
4780
- interface TelemetryEvent {
4781
- name: string;
4782
- payload?: any;
4783
- timestamp: string;
4784
- }
4785
- declare class TelemetryService {
4786
- record(name: string, payload?: any): void;
4787
- static ɵfac: i0.ɵɵFactoryDeclaration<TelemetryService, never>;
4788
- static ɵprov: i0.ɵɵInjectableDeclaration<TelemetryService>;
4789
- }
4790
-
4791
- interface Specification<T extends object = any> {
4792
- isSatisfiedBy(obj: T): boolean;
4793
- }
4794
-
4795
- interface FormActionButton {
4796
- id?: string;
4797
- visible: boolean;
4798
- label: string;
4799
- icon?: string;
4800
- color?: 'primary' | 'accent' | 'warn' | 'basic';
4801
- disabled?: boolean;
4802
- type?: 'button' | 'submit' | 'reset';
4803
- action?: string;
4804
- tooltip?: string;
4805
- loading?: boolean;
4806
- size?: 'small' | 'medium' | 'large';
4807
- variant?: 'raised' | 'stroked' | 'flat' | 'fab';
4808
- shortcut?: string;
4809
- }
4810
- interface FormActionsLayout {
4811
- /**
4812
- * Configuration for the submit button
4813
- */
4814
- submit: FormActionButton;
4815
- /**
4816
- * Configuration for the cancel button
4817
- */
4818
- cancel: FormActionButton;
4819
- /**
4820
- * Configuration for the reset button
4821
- */
4822
- reset: FormActionButton;
4823
- /**
4824
- * Custom buttons
4825
- */
4826
- custom?: FormActionButton[];
4827
- /**
4828
- * Layout and behavior
4829
- */
4830
- position?: 'left' | 'center' | 'right' | 'justified' | 'split';
4831
- orientation?: 'horizontal' | 'vertical';
4832
- spacing?: 'compact' | 'normal' | 'spacious';
4833
- sticky?: boolean;
4834
- /**
4835
- * Structural placement of the actions bar within the form layout.
4836
- * - insideLastSection: render inside the last section's container (default)
4837
- * - afterSections: render once after all sections
4838
- * - top: render once before all sections
4839
- */
4840
- placement?: 'insideLastSection' | 'afterSections' | 'top';
4841
- /**
4842
- * Responsive settings
4843
- */
4844
- mobile?: {
4845
- position?: 'left' | 'center' | 'right' | 'justified';
4846
- orientation?: 'horizontal' | 'vertical';
4847
- collapseToMenu?: boolean;
4848
- };
4849
- containerClassName?: string;
4850
- containerStyles?: {
4851
- [key: string]: any;
4852
- };
4853
- showSaveButton?: boolean;
4854
- submitButtonLabel?: string;
4855
- showCancelButton?: boolean;
4856
- cancelButtonLabel?: string;
4857
- showResetButton?: boolean;
4858
- resetButtonLabel?: string;
4859
- }
4860
- interface FormApiLayout {
4861
- saveEndpoint?: string;
4862
- loadEndpoint?: string;
4863
- saveMethod?: 'POST' | 'PUT' | 'PATCH';
4864
- timeout?: number;
4865
- headers?: Record<string, string>;
4866
- idField?: string;
4867
- beforeSave?: string;
4868
- afterLoad?: string;
4869
- }
4870
- interface FormBehaviorLayout {
4871
- confirmOnUnsavedChanges?: boolean;
4872
- trackHistory?: boolean;
4873
- focusFirstError?: boolean;
4874
- scrollToErrors?: boolean;
4875
- clearAfterSave?: boolean;
4876
- redirectAfterSave?: string;
5942
+ get(id: string): ComponentDocMeta | undefined;
5943
+ /** List all registered metadata entries. */
5944
+ getAll(): ComponentDocMeta[];
4877
5945
  /**
4878
- * Enables afterValidate hooks to run reactively on form.valueChanges.
4879
- * Default is false.
5946
+ * Ensure friendly labels/descriptions for common inputs/outputs when missing.
5947
+ * This helps diagrams/builders present consistent naming across components.
4880
5948
  */
4881
- reactiveValidation?: boolean;
4882
- /** Debounce for reactive afterValidate hooks (ms). Default 150ms. */
4883
- reactiveValidationDebounceMs?: number;
5949
+ private normalizeMeta;
5950
+ private normalizeComponentType;
5951
+ static ɵfac: i0.ɵɵFactoryDeclaration<ComponentMetadataRegistry, never>;
5952
+ static ɵprov: i0.ɵɵInjectableDeclaration<ComponentMetadataRegistry>;
4884
5953
  }
4885
- interface FormMetadataLayout {
4886
- formCode?: string;
4887
- version?: string;
4888
- [key: string]: any;
5954
+
5955
+ type ComponentKeyParams = {
5956
+ componentType: string;
5957
+ componentId?: string | null;
5958
+ resourcePath?: string | null;
5959
+ instanceKey?: string | null;
5960
+ componentRef?: object;
5961
+ route?: ActivatedRoute | null;
5962
+ requireComponentId?: boolean;
5963
+ useResourcePathFallback?: boolean;
5964
+ };
5965
+ declare class ComponentKeyService {
5966
+ private readonly router;
5967
+ buildComponentId(params: ComponentKeyParams): string | null;
5968
+ private resolveRouteKey;
5969
+ private resolveRouteOverride;
5970
+ private buildRoutePath;
5971
+ private normalizeRouteKey;
5972
+ private stripQueryAndFragment;
5973
+ private normalizeResourcePath;
5974
+ private sanitizeSegment;
5975
+ private buildScopeKey;
5976
+ private resolveInstanceKey;
5977
+ private hashIfNeeded;
5978
+ private shortSegment;
5979
+ static ɵfac: i0.ɵɵFactoryDeclaration<ComponentKeyService, never>;
5980
+ static ɵprov: i0.ɵɵInjectableDeclaration<ComponentKeyService>;
4889
5981
  }
4890
- interface FormMessagesLayout {
4891
- updateRegistrySuccess?: string;
4892
- createRegistrySuccess?: string;
4893
- updateRegistryError?: string;
4894
- createRegistryError?: string;
4895
- confirmations?: {
4896
- submit?: string;
4897
- cancel?: string;
4898
- reset?: string;
4899
- [customAction: string]: string | undefined;
4900
- };
4901
- customActions?: {
4902
- [actionId: string]: {
4903
- success?: string;
4904
- error?: string;
4905
- confirmation?: string;
4906
- };
4907
- };
4908
- loading?: {
4909
- submit?: string;
4910
- cancel?: string;
4911
- reset?: string;
4912
- [customAction: string]: string | undefined;
4913
- };
4914
- [key: string]: any;
5982
+
5983
+ interface TelemetryEvent {
5984
+ name: string;
5985
+ payload?: unknown;
5986
+ timestamp: string;
4915
5987
  }
4916
- interface FormRowLayout {
4917
- id: string;
4918
- name?: string;
5988
+ interface TelemetryTransport {
5989
+ emit(event: TelemetryEvent): void;
5990
+ }
5991
+ declare const PRAXIS_TELEMETRY_TRANSPORT: InjectionToken<TelemetryTransport>;
5992
+ declare class TelemetryService {
5993
+ private readonly transport;
5994
+ private readonly eventsSubject;
5995
+ readonly events$: Observable<TelemetryEvent>;
5996
+ record(name: string, payload?: unknown): void;
5997
+ emit(event: TelemetryEvent): void;
5998
+ static ɵfac: i0.ɵɵFactoryDeclaration<TelemetryService, never>;
5999
+ static ɵprov: i0.ɵɵInjectableDeclaration<TelemetryService>;
6000
+ }
6001
+
6002
+ type FieldSelectorRegistryMap = Record<string, FieldControlType>;
6003
+ declare const FIELD_SELECTOR_REGISTRY_BASE: InjectionToken<FieldSelectorRegistryMap>;
6004
+ declare const FIELD_SELECTOR_REGISTRY_OVERRIDES: InjectionToken<FieldSelectorRegistryMap[]>;
6005
+ declare const FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS: InjectionToken<boolean>;
6006
+ declare function provideFieldSelectorRegistryBase(map: FieldSelectorRegistryMap): Provider;
6007
+ declare function provideFieldSelectorRegistryOverride(map: FieldSelectorRegistryMap): Provider;
6008
+
6009
+ declare class FieldSelectorRegistry {
6010
+ private readonly baseMap;
6011
+ private readonly overrideMaps;
6012
+ private readonly registry;
6013
+ constructor();
6014
+ register(map: FieldSelectorRegistryMap, opts?: {
6015
+ overwrite?: boolean;
6016
+ }): void;
6017
+ resolve(selector: string | undefined | null): FieldControlType | undefined;
6018
+ getAll(): FieldSelectorRegistryMap;
6019
+ private applyMap;
6020
+ private normalizeSelector;
6021
+ static ɵfac: i0.ɵɵFactoryDeclaration<FieldSelectorRegistry, never>;
6022
+ static ɵprov: i0.ɵɵInjectableDeclaration<FieldSelectorRegistry>;
6023
+ }
6024
+
6025
+ type LoadingPhase$1 = 'schema' | 'mount' | 'data' | 'action';
6026
+ interface LoadingScope {
6027
+ componentType: string;
6028
+ componentId: string;
6029
+ routeKey?: string;
6030
+ }
6031
+ interface LoadingContext {
6032
+ scope: LoadingScope;
6033
+ phase: LoadingPhase$1;
4919
6034
  label?: string;
4920
- orientation: 'horizontal' | 'vertical';
4921
- fields: FieldMetadata[];
4922
- styles?: {
4923
- [key: string]: any;
4924
- };
4925
- hiddenCondition?: string | Specification<any> | null;
4926
- visibilityCondition?: string | Specification<any> | null;
6035
+ blocking?: boolean;
6036
+ priority?: 'low' | 'normal' | 'high';
4927
6037
  }
4928
- interface NestedFieldsetLayout extends FormRowLayout {
4929
- fieldsets?: FieldsetLayout[];
6038
+
6039
+ declare class LoadingOrchestrator {
6040
+ private readonly counters;
6041
+ private readonly state$;
6042
+ begin(ctx: LoadingContext): string;
6043
+ end(ctx: LoadingContext): void;
6044
+ watch(): Observable<LoadingContext[]>;
6045
+ private keyOf;
6046
+ static ɵfac: i0.ɵɵFactoryDeclaration<LoadingOrchestrator, never>;
6047
+ static ɵprov: i0.ɵɵInjectableDeclaration<LoadingOrchestrator>;
4930
6048
  }
4931
- interface FieldsetLayout {
4932
- id: string;
4933
- title: string;
4934
- titleNew?: string;
4935
- titleView?: string;
4936
- titleEdit?: string;
4937
- orientation: 'horizontal' | 'vertical';
4938
- rows: FormRowLayout[];
4939
- hiddenCondition?: string | Specification<any> | null;
6049
+
6050
+ interface PraxisLoadingRenderer {
6051
+ show(ctx: LoadingContext): void;
6052
+ update?(ctx: LoadingContext): void;
6053
+ hide(ctx: LoadingContext): void;
4940
6054
  }
4941
- type FormRuleContext = 'visibility' | 'readOnly' | 'style' | 'validation' | 'notification';
4942
- interface FormLayoutRule {
4943
- id: string;
6055
+ declare const PRAXIS_LOADING_RENDERER: InjectionToken<PraxisLoadingRenderer>;
6056
+
6057
+ declare class PraxisLoadingInterceptor implements HttpInterceptor {
6058
+ private orchestrator;
6059
+ private renderer?;
6060
+ constructor(orchestrator: LoadingOrchestrator, renderer?: PraxisLoadingRenderer | undefined);
6061
+ intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
6062
+ static ɵfac: i0.ɵɵFactoryDeclaration<PraxisLoadingInterceptor, [null, { optional: true; }]>;
6063
+ static ɵprov: i0.ɵɵInjectableDeclaration<PraxisLoadingInterceptor>;
6064
+ }
6065
+
6066
+ declare class DefaultLoadingRenderer implements PraxisLoadingRenderer {
6067
+ private readonly rootId;
6068
+ private readonly styleId;
6069
+ show(ctx: LoadingContext): void;
6070
+ update(ctx: LoadingContext): void;
6071
+ hide(ctx: LoadingContext): void;
6072
+ private keyOf;
6073
+ private defaultLabel;
6074
+ private ensureRoot;
6075
+ private ensureStyles;
6076
+ private getDocument;
6077
+ static ɵfac: i0.ɵɵFactoryDeclaration<DefaultLoadingRenderer, never>;
6078
+ static ɵprov: i0.ɵɵInjectableDeclaration<DefaultLoadingRenderer>;
6079
+ }
6080
+
6081
+ declare function provideFieldSelectorRegistryRuntime(map: FieldSelectorRegistryMap, opts?: {
6082
+ overwrite?: boolean;
6083
+ }): Provider;
6084
+
6085
+ type PraxisToastOptions = {
6086
+ successDurationMs?: number;
6087
+ errorDurationMs?: number;
6088
+ successPanelClass?: string | string[];
6089
+ errorPanelClass?: string | string[];
6090
+ };
6091
+ declare function providePraxisToastGlobalActions(opts?: PraxisToastOptions): Provider;
6092
+
6093
+ type PraxisAnalyticsOptions = {
6094
+ prefix?: string;
6095
+ };
6096
+ declare function providePraxisAnalyticsGlobalActions(opts?: PraxisAnalyticsOptions): Provider;
6097
+
6098
+ declare function providePraxisLoadingDefaults(): Provider[];
6099
+
6100
+ type LoggerLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';
6101
+ type PraxisLoggingEnvironment = 'prod' | 'qa' | 'hml' | 'dev';
6102
+ interface LoggerContext {
6103
+ lib?: string;
6104
+ component?: string;
6105
+ actionId?: string;
6106
+ correlationId?: string;
6107
+ feature?: string;
6108
+ [key: string]: unknown;
6109
+ }
6110
+ interface LoggerEvent {
6111
+ level: LoggerLevel;
6112
+ message: string;
6113
+ timestamp: string;
6114
+ environment: PraxisLoggingEnvironment;
6115
+ context?: LoggerContext;
6116
+ data?: unknown;
6117
+ }
6118
+ interface LoggerThrottleConfig {
6119
+ enabled: boolean;
6120
+ windowMs: number;
6121
+ maxOccurrences: number;
6122
+ }
6123
+ interface LoggerPIIConfig {
6124
+ enabled: boolean;
6125
+ sensitiveKeys: string[];
6126
+ redactionText: string;
6127
+ }
6128
+ interface LoggerConfig {
6129
+ environment: PraxisLoggingEnvironment;
6130
+ minLevel: LoggerLevel;
6131
+ warnOnceEnabled: boolean;
6132
+ throttle: LoggerThrottleConfig;
6133
+ pii: LoggerPIIConfig;
6134
+ defaultContext?: LoggerContext;
6135
+ }
6136
+ interface LoggerLogOptions {
6137
+ context?: LoggerContext;
6138
+ data?: unknown;
6139
+ dedupeKey?: string;
6140
+ throttleKey?: string;
6141
+ skipThrottle?: boolean;
6142
+ }
6143
+ interface LoggerSink {
6144
+ log(event: LoggerEvent): void;
6145
+ }
6146
+ interface LoggerNormalizedError {
4944
6147
  name: string;
4945
- context: FormRuleContext;
4946
- targetFields: string[];
4947
- description?: string;
4948
- effect: {
4949
- condition: string | Specification<any> | null;
4950
- styleClass?: string;
4951
- style?: {
4952
- [key: string]: any;
4953
- };
4954
- /** Optional validation overrides to apply when condition is satisfied */
4955
- validatorOverrides?: Partial<ValidatorOptions>;
4956
- };
6148
+ message: string;
6149
+ stack?: string;
4957
6150
  }
4958
- interface FormLayout {
4959
- formTitle?: string;
4960
- formDescription?: string;
4961
- formTitleCreate?: string;
4962
- formDescriptionCreate?: string;
4963
- formTitleView?: string;
4964
- formDescriptionView?: string;
4965
- formTitleEdit?: string;
4966
- formDescriptionEdit?: string;
4967
- className?: string;
4968
- styles?: {
4969
- [key: string]: any;
6151
+ interface LoggerTelemetryPayload {
6152
+ timestamp: string;
6153
+ level: LoggerLevel;
6154
+ message: string;
6155
+ environment: PraxisLoggingEnvironment;
6156
+ context: {
6157
+ lib: string;
6158
+ component: string;
6159
+ actionId?: string;
6160
+ correlationId?: string;
4970
6161
  };
4971
- actions?: FormActionsLayout;
4972
- api?: FormApiLayout;
4973
- behavior?: FormBehaviorLayout;
4974
- metadata?: FormMetadataLayout;
4975
- messages?: FormMessagesLayout;
4976
- fieldsets: FieldsetLayout[];
4977
- formRules?: FormLayoutRule[];
6162
+ error?: LoggerNormalizedError;
6163
+ data?: unknown;
6164
+ }
6165
+ interface PraxisLoggingOptions {
6166
+ environment?: PraxisLoggingEnvironment;
6167
+ minLevel?: LoggerLevel;
6168
+ warnOnceEnabled?: boolean;
6169
+ throttle?: Partial<LoggerThrottleConfig>;
6170
+ pii?: Partial<LoggerPIIConfig>;
6171
+ defaultContext?: LoggerContext;
6172
+ enableConsoleSink?: boolean;
6173
+ enableTelemetrySink?: boolean;
6174
+ telemetryEventName?: string;
6175
+ enableGlobalErrorHandler?: boolean;
6176
+ sinks?: ReadonlyArray<LoggerSink>;
4978
6177
  }
4979
6178
 
4980
- interface FormValueChangeEvent {
4981
- formData: any;
4982
- changedField?: string;
4983
- previousValue?: any;
4984
- currentValue?: any;
4985
- changedFields: string[];
4986
- isValid: boolean;
4987
- entityId?: string | number;
6179
+ declare const LOGGER_LEVEL_PRIORITY: Record<LoggerLevel, number>;
6180
+ declare const LOGGER_LEVEL_BY_ENV: Record<PraxisLoggingEnvironment, LoggerLevel>;
6181
+ declare const PRAXIS_CORPORATE_SENSITIVE_KEYS: string[];
6182
+ declare function createCorporateLoggerConfig(environment?: PraxisLoggingEnvironment): LoggerConfig;
6183
+ declare function resolveLoggerConfig(options?: PraxisLoggingOptions): LoggerConfig;
6184
+
6185
+ declare const PRAXIS_LOGGER_CONFIG: InjectionToken<LoggerConfig>;
6186
+ declare const PRAXIS_LOGGER_SINKS: InjectionToken<readonly LoggerSink[]>;
6187
+
6188
+ declare class LoggerService {
6189
+ private readonly config;
6190
+ private readonly sinks;
6191
+ private readonly warnOnceTracker;
6192
+ private readonly throttleTracker;
6193
+ private readonly sensitiveKeys;
6194
+ constructor(config: LoggerConfig, sinks: ReadonlyArray<LoggerSink>);
6195
+ error(message: string, options?: LoggerLogOptions): void;
6196
+ warn(message: string, options?: LoggerLogOptions): void;
6197
+ info(message: string, options?: LoggerLogOptions): void;
6198
+ debug(message: string, options?: LoggerLogOptions): void;
6199
+ trace(message: string, options?: LoggerLogOptions): void;
6200
+ warnOnce(message: string, options?: LoggerLogOptions): void;
6201
+ log(level: LoggerLevel, message: string, options?: LoggerLogOptions): void;
6202
+ private isLevelEnabled;
6203
+ private shouldEmitByThrottle;
6204
+ private composeKey;
6205
+ private buildContext;
6206
+ private sanitizeContext;
6207
+ private sanitizeData;
6208
+ private sanitizeValue;
6209
+ static ɵfac: i0.ɵɵFactoryDeclaration<LoggerService, never>;
6210
+ static ɵprov: i0.ɵɵInjectableDeclaration<LoggerService>;
4988
6211
  }
4989
- interface ValidationError {
4990
- field: string;
4991
- type: 'required' | 'pattern' | 'min' | 'max' | 'email' | 'custom';
6212
+
6213
+ declare class PraxisGlobalErrorHandler implements ErrorHandler {
6214
+ private readonly logger;
6215
+ private handlingError;
6216
+ constructor(logger: LoggerService);
6217
+ handleError(error: unknown): void;
6218
+ private safeFallback;
6219
+ static ɵfac: i0.ɵɵFactoryDeclaration<PraxisGlobalErrorHandler, never>;
6220
+ static ɵprov: i0.ɵɵInjectableDeclaration<PraxisGlobalErrorHandler>;
6221
+ }
6222
+
6223
+ declare function providePraxisLogging(options?: PraxisLoggingOptions): Provider[];
6224
+
6225
+ interface NormalizedError {
6226
+ name: string;
4992
6227
  message: string;
4993
- currentValue?: any;
4994
- expectedValue?: any;
6228
+ stack?: string;
4995
6229
  }
4996
- interface FormSubmitEvent {
4997
- stage: 'before' | 'after' | 'error';
4998
- formData: any;
4999
- isValid: boolean;
5000
- validationErrors?: ValidationError[];
5001
- entityId?: string | number;
5002
- operation: 'create' | 'update';
5003
- result?: any;
5004
- error?: any;
6230
+ declare function normalizeUnknownError(rawError: unknown): NormalizedError;
6231
+ declare function extractNormalizedError(data: unknown): NormalizedError | undefined;
6232
+
6233
+ declare class LoggerWarnOnceTracker {
6234
+ private readonly emittedKeys;
6235
+ shouldEmit(key: string): boolean;
6236
+ clear(): void;
5005
6237
  }
5006
- interface FormValidationEvent {
5007
- isValid: boolean;
5008
- errors: {
5009
- [fieldName: string]: ValidationError[];
6238
+
6239
+ declare class LoggerThrottleTracker {
6240
+ private readonly config;
6241
+ private readonly windows;
6242
+ constructor(config: LoggerThrottleConfig);
6243
+ shouldEmit(key: string, now?: number): boolean;
6244
+ clear(): void;
6245
+ }
6246
+
6247
+ type ObservabilityAlertSeverity = 'warn' | 'error' | 'critical';
6248
+ type ObservabilityAlertGroupBy = 'global' | 'lib' | 'component' | 'actionId';
6249
+ interface ObservabilityAlertRule {
6250
+ id: string;
6251
+ name: string;
6252
+ severity: ObservabilityAlertSeverity;
6253
+ level: LoggerLevel;
6254
+ threshold: number;
6255
+ windowMs: number;
6256
+ groupBy: ObservabilityAlertGroupBy;
6257
+ throttleMs?: number;
6258
+ }
6259
+ interface ObservabilityCountBucket {
6260
+ key: string;
6261
+ count: number;
6262
+ }
6263
+ interface ObservabilityMetricsSnapshot {
6264
+ generatedAt: string;
6265
+ windowMs: number;
6266
+ totalEvents: number;
6267
+ bySeverity: Record<LoggerLevel, number>;
6268
+ byLib: ReadonlyArray<ObservabilityCountBucket>;
6269
+ byComponent: ReadonlyArray<ObservabilityCountBucket>;
6270
+ topActionIds: ReadonlyArray<ObservabilityCountBucket>;
6271
+ }
6272
+ interface ObservabilityAlert {
6273
+ severity: ObservabilityAlertSeverity;
6274
+ rule: {
6275
+ id: string;
6276
+ name: string;
6277
+ level: LoggerLevel;
6278
+ groupBy: ObservabilityAlertGroupBy;
6279
+ threshold: number;
6280
+ windowMs: number;
6281
+ };
6282
+ timestamp: string;
6283
+ observedCount: number;
6284
+ context: {
6285
+ lib?: string;
6286
+ component?: string;
6287
+ actionId?: string;
6288
+ correlationId?: string;
5010
6289
  };
5011
- validatedFields: string[];
5012
- invalidFields: string[];
5013
- formStatus: 'VALID' | 'INVALID' | 'PENDING' | 'DISABLED';
5014
6290
  }
5015
- interface FormEntityEvent {
5016
- operation: 'load' | 'create' | 'update' | 'delete';
5017
- entityId?: string | number;
5018
- entityData?: any;
5019
- success: boolean;
5020
- result?: any;
5021
- error?: any;
5022
- timestamp: Date;
6291
+ interface ObservabilityDashboardOptions {
6292
+ enabled: boolean;
6293
+ telemetryEventNames: ReadonlyArray<string>;
6294
+ defaultWindowMs: number;
6295
+ maxStoredEvents: number;
6296
+ maxStoredAlerts: number;
6297
+ topActionsLimit: number;
6298
+ defaultAlertThrottleMs: number;
6299
+ alertRules: ReadonlyArray<ObservabilityAlertRule>;
6300
+ nowProvider?: () => number;
6301
+ }
6302
+ interface ObservabilityIngestInput {
6303
+ payload: LoggerTelemetryPayload;
5023
6304
  }
5024
- interface FormReadyEvent {
5025
- formGroup: FormGroup;
5026
- fieldsMetadata: FieldMetadata[];
5027
- layout?: FormLayout;
5028
- hasEntity: boolean;
5029
- entityId?: string | number;
6305
+
6306
+ declare const PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES: ReadonlyArray<ObservabilityAlertRule>;
6307
+ declare function createCorporateObservabilityOptions(): ObservabilityDashboardOptions;
6308
+ declare function resolveObservabilityOptions(options?: Partial<ObservabilityDashboardOptions>): ObservabilityDashboardOptions;
6309
+
6310
+ declare const PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS: InjectionToken<ObservabilityDashboardOptions>;
6311
+
6312
+ declare class ObservabilityDashboardService {
6313
+ private readonly options;
6314
+ private readonly trackedEventNames;
6315
+ private readonly retentionWindowMs;
6316
+ private readonly recentAlerts;
6317
+ private readonly alertThrottleMap;
6318
+ private readonly records;
6319
+ private readonly alertsSubject;
6320
+ private readonly metricsSubject;
6321
+ readonly alerts$: Observable<ObservabilityAlert>;
6322
+ readonly metrics$: Observable<ObservabilityMetricsSnapshot>;
6323
+ constructor(options: ObservabilityDashboardOptions, telemetryService: TelemetryService | null);
6324
+ ingestPayload(payload: LoggerTelemetryPayload): void;
6325
+ ingestTelemetryEvent(event: TelemetryEvent): void;
6326
+ getSnapshot(windowMs?: number): ObservabilityMetricsSnapshot;
6327
+ getRecentAlerts(limit?: number): ReadonlyArray<ObservabilityAlert>;
6328
+ clear(): void;
6329
+ private evaluateAlerts;
6330
+ private buildAlertContext;
6331
+ private groupRecordsByRule;
6332
+ private trimRecords;
6333
+ private buildSnapshot;
6334
+ private incrementCounter;
6335
+ private toSortedBuckets;
6336
+ private normalizePayload;
6337
+ private toLoggerTelemetryPayload;
6338
+ private toTimestampMs;
6339
+ private normalizeWindowMs;
6340
+ private now;
6341
+ static ɵfac: i0.ɵɵFactoryDeclaration<ObservabilityDashboardService, [null, { optional: true; }]>;
6342
+ static ɵprov: i0.ɵɵInjectableDeclaration<ObservabilityDashboardService>;
5030
6343
  }
5031
- interface FormInitializationError {
5032
- stage: 'config-load' | 'schema-fetch' | 'sync' | 'form-build';
5033
- error: Error;
5034
- context?: {
5035
- formId?: string;
5036
- resourcePath?: string;
5037
- hasLocalConfig?: boolean;
5038
- };
5039
- recoverable: boolean;
5040
- userMessage: string;
6344
+
6345
+ declare class ConsoleLoggerSink implements LoggerSink {
6346
+ log(event: LoggerEvent): void;
6347
+ private resolveMethod;
5041
6348
  }
5042
- interface FormCustomActionEvent {
5043
- actionId: string;
5044
- formData: any;
5045
- isValid: boolean;
5046
- source: 'button' | 'shortcut';
6349
+
6350
+ interface TelemetryLoggerSinkOptions {
6351
+ eventName?: string;
6352
+ sensitiveKeys?: string[];
6353
+ redactionText?: string;
6354
+ }
6355
+ declare class TelemetryLoggerSink implements LoggerSink {
6356
+ private readonly telemetry;
6357
+ private readonly options;
6358
+ private readonly sensitiveKeys;
6359
+ private readonly redactionText;
6360
+ constructor(telemetry: TelemetryService, options?: TelemetryLoggerSinkOptions);
6361
+ log(event: LoggerEvent): void;
6362
+ private buildPayload;
6363
+ private sanitizeValue;
6364
+ private sanitizeText;
5047
6365
  }
5048
- interface FormActionConfirmationEvent {
5049
- actionId: 'submit' | 'cancel' | 'reset' | string;
5050
- message: string;
5051
- confirmed: boolean;
6366
+
6367
+ declare const OVERLAY_DECISION_MATRIX: InjectionToken<OverlayDecisionMatrix>;
6368
+ declare function provideOverlayDecisionMatrix(matrix?: OverlayDecisionMatrix): EnvironmentProviders;
6369
+
6370
+ declare const GLOBAL_CONFIG: InjectionToken<Partial<GlobalConfig>>;
6371
+ interface PraxisAuthContext {
6372
+ ready?: () => Promise<void>;
6373
+ token?: () => string | undefined;
6374
+ tenant?: () => string | undefined;
6375
+ locale?: () => string | undefined;
6376
+ }
6377
+ interface PraxisGlobalConfigBootstrapOptions {
6378
+ auth?: PraxisAuthContext;
6379
+ remote?: {
6380
+ baseUrl?: string;
6381
+ apiPath?: string;
6382
+ };
6383
+ headers?: Record<string, string>;
6384
+ headersFactory?: () => Record<string, string>;
6385
+ includeDefaultHeaders?: boolean;
6386
+ blocking?: 'auth+global' | 'global' | 'none';
6387
+ errorPolicy?: 'fail' | 'ignore';
6388
+ timeoutMs?: number;
6389
+ }
6390
+ declare const PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS: InjectionToken<PraxisGlobalConfigBootstrapOptions>;
6391
+ declare const PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY: InjectionToken<() => Promise<void>>;
6392
+ declare const PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER: InjectionToken<() => string | undefined>;
6393
+ declare function provideGlobalConfig(partial: Partial<GlobalConfig>): Provider;
6394
+
6395
+ /** Set the current tenant for GlobalConfigService at app boot. */
6396
+ declare function provideGlobalConfigTenant(tenantId: string): Provider;
6397
+ /** Block app bootstrap until the global config is loaded for the active tenant. */
6398
+ declare function provideGlobalConfigReady(): Provider;
6399
+ /** Seed global config once when no storage exists yet (idempotent). */
6400
+ declare function provideGlobalConfigSeed(seed: Partial<GlobalConfig>): Provider;
6401
+ /** Fetch remote JSON and merge as global config at boot. */
6402
+ declare function provideRemoteGlobalConfig(url: string): Provider;
6403
+ declare function providePraxisGlobalConfigBootstrap(options?: PraxisGlobalConfigBootstrapOptions): Provider[];
6404
+
6405
+ type PraxisGlobalActionsOptions = {
6406
+ dialog?: boolean | GlobalDialogService;
6407
+ toast?: boolean | GlobalToastService;
6408
+ analytics?: boolean | GlobalAnalyticsService;
6409
+ api?: boolean | GlobalApiClient;
6410
+ guards?: boolean | GlobalRouteGuardResolver;
6411
+ };
6412
+ declare function providePraxisGlobalActions(opts?: PraxisGlobalActionsOptions): Provider[];
6413
+
6414
+ declare const GLOBAL_ACTION_HANDLERS: InjectionToken<GlobalActionHandlerEntry[]>;
6415
+ declare const GLOBAL_DIALOG_SERVICE: InjectionToken<GlobalDialogService>;
6416
+ declare const GLOBAL_TOAST_SERVICE: InjectionToken<GlobalToastService>;
6417
+ declare const GLOBAL_ANALYTICS_SERVICE: InjectionToken<GlobalAnalyticsService>;
6418
+ declare const GLOBAL_API_CLIENT: InjectionToken<GlobalApiClient>;
6419
+ declare const GLOBAL_ROUTE_GUARD_RESOLVER: InjectionToken<GlobalRouteGuardResolver>;
6420
+ declare function provideGlobalActionHandler(entry: GlobalActionHandlerEntry): Provider;
6421
+
6422
+ type GlobalActionCatalogEntry = {
6423
+ id: string;
6424
+ label: string;
6425
+ description?: string;
6426
+ icon?: string;
6427
+ payloadSchema?: {
6428
+ type: 'object' | 'string' | 'number' | 'boolean' | 'array';
6429
+ properties?: Record<string, {
6430
+ type: string;
6431
+ description?: string;
6432
+ required?: boolean;
6433
+ }>;
6434
+ required?: string[];
6435
+ example?: any;
6436
+ };
6437
+ };
6438
+ declare const GLOBAL_ACTION_CATALOG$1: InjectionToken<readonly GlobalActionCatalogEntry[][]>;
6439
+ declare function provideGlobalActionCatalog(entries: GlobalActionCatalogEntry[]): Provider;
6440
+ declare function getGlobalActionCatalog(catalog: ReadonlyArray<GlobalActionCatalogEntry[]> | null | undefined): GlobalActionCatalogEntry[];
6441
+ declare const PRAXIS_GLOBAL_ACTION_CATALOG: GlobalActionCatalogEntry[];
6442
+ declare function providePraxisGlobalActionCatalog(): Provider[];
6443
+
6444
+ type GlobalActionId = 'navigate' | 'openUrl' | 'showAlert' | 'log' | 'openDialog' | 'confirm' | 'alert' | 'prompt' | 'submitForm' | 'resetForm' | 'validateForm' | 'clearValidation' | 'saveFormDraft' | 'loadFormDraft' | 'clearFormDraft' | 'apiCall' | 'download' | 'copyToClipboard' | 'refreshOptions' | 'loadDependentData';
6445
+ type GlobalActionParam = {
6446
+ required?: boolean;
6447
+ label?: string;
6448
+ placeholder?: string;
6449
+ hint?: string;
6450
+ example?: string;
6451
+ };
6452
+ interface GlobalActionSpec {
6453
+ id: GlobalActionId;
6454
+ label: string;
6455
+ description: string;
6456
+ param?: GlobalActionParam;
5052
6457
  }
6458
+ declare const GLOBAL_ACTION_CATALOG: GlobalActionSpec[];
5053
6459
 
5054
- type DeviceKind = 'mobile' | 'tablet' | 'desktop';
5055
- type OverlayPattern = 'modal' | 'drawer' | 'page' | 'bottom-sheet' | 'full-screen-dialog';
5056
- interface OverlayDecisionContext {
5057
- device: DeviceKind;
5058
- fieldCount: number;
5059
- dependencyCount: number;
5060
- }
5061
- interface OverlayDecision {
5062
- pattern: OverlayPattern;
5063
- config?: Record<string, unknown>;
5064
- reason?: string;
5065
- }
5066
- interface OverlayRange {
5067
- min?: number;
5068
- max?: number;
5069
- }
5070
- interface OverlayRuleMatch {
5071
- device?: DeviceKind[];
5072
- fieldCount?: OverlayRange;
5073
- dependencyCount?: OverlayRange;
5074
- any?: OverlayRuleMatch[];
6460
+ interface SettingsPanelRef<T = any> {
6461
+ applied$: Observable<T>;
6462
+ saved$: Observable<T>;
5075
6463
  }
5076
- interface OverlayRule {
5077
- match: OverlayRuleMatch;
5078
- use: OverlayDecision;
6464
+ interface SettingsPanelOpenContent<TInputs = any> {
6465
+ component: Type<any>;
6466
+ inputs?: TInputs;
5079
6467
  }
5080
- interface OverlayThresholds {
5081
- fieldCount: {
5082
- small_max: number;
5083
- medium_max: number;
5084
- };
5085
- dependencyCount: {
5086
- low_max: number;
5087
- medium_max: number;
5088
- };
6468
+ interface SettingsPanelOpenOptions<TInputs = any> {
6469
+ id: string;
6470
+ title: string;
6471
+ content: SettingsPanelOpenContent<TInputs>;
5089
6472
  }
5090
- interface OverlayDecisionMatrix {
5091
- version: string;
5092
- description?: string;
5093
- thresholds: OverlayThresholds;
5094
- rules_ordered: OverlayRule[];
5095
- fallback: OverlayDecision;
5096
- ui_hints?: Record<string, unknown>;
6473
+ interface SettingsPanelBridge {
6474
+ open<TInputs = any, TOut = any>(opts: SettingsPanelOpenOptions<TInputs>): SettingsPanelRef<TOut>;
5097
6475
  }
5098
- interface OverlayDecider {
5099
- decide(ctx: OverlayDecisionContext): OverlayDecision;
5100
- explain?(ctx: OverlayDecisionContext): string;
6476
+ declare const SETTINGS_PANEL_BRIDGE: InjectionToken<SettingsPanelBridge>;
6477
+ declare const SETTINGS_PANEL_DATA: InjectionToken<any>;
6478
+ interface SettingsValueProvider {
6479
+ isDirty$: Observable<boolean>;
6480
+ isValid$: Observable<boolean>;
6481
+ isBusy$: Observable<boolean>;
6482
+ getSettingsValue(): any;
6483
+ onSave?(): any;
6484
+ reset?(): void;
5101
6485
  }
5102
6486
 
5103
- declare const OVERLAY_DECIDER_DEBUG: InjectionToken<boolean>;
5104
- declare class OverlayDeciderService {
5105
- private readonly matrix;
5106
- private readonly debug;
5107
- decide(ctx: OverlayDecisionContext): OverlayDecision;
5108
- explain(ctx: OverlayDecisionContext): string;
5109
- private evaluate;
5110
- private matches;
5111
- private log;
5112
- static ɵfac: i0.ɵɵFactoryDeclaration<OverlayDeciderService, never>;
5113
- static ɵprov: i0.ɵɵInjectableDeclaration<OverlayDeciderService>;
5114
- }
6487
+ declare const TABLE_CONFIG_EDITOR: InjectionToken<Type<any>>;
6488
+ declare const STEPPER_CONFIG_EDITOR: InjectionToken<Type<any>>;
6489
+ declare const DYNAMIC_PAGE_SHELL_EDITOR: InjectionToken<Type<any>>;
6490
+ declare const DYNAMIC_PAGE_CONFIG_EDITOR: InjectionToken<Type<any>>;
5115
6491
 
5116
- declare const OVERLAY_DECISION_MATRIX: InjectionToken<OverlayDecisionMatrix>;
5117
- declare function provideOverlayDecisionMatrix(matrix?: OverlayDecisionMatrix): EnvironmentProviders;
6492
+ declare const PRAXIS_LOADING_CTX: HttpContextToken<LoadingContext | null>;
5118
6493
 
6494
+ interface MaterialTimeTrackShift {
6495
+ id?: string;
6496
+ label?: string;
6497
+ start?: string | number;
6498
+ end?: string | number;
6499
+ color?: string;
6500
+ }
5119
6501
  interface MaterialTimeRangeMetadata extends FieldMetadata {
5120
6502
  controlType: typeof FieldControlType.TIME_RANGE;
5121
6503
  showSeconds?: boolean;
@@ -5129,6 +6511,8 @@ interface MaterialTimeRangeMetadata extends FieldMetadata {
5129
6511
  endPlaceholder?: string;
5130
6512
  startLabel?: string;
5131
6513
  endLabel?: string;
6514
+ /** Inline gradient segments for turn/shift visualization in range slider track. */
6515
+ inlineTimeTrackShifts?: Array<string | MaterialTimeTrackShift>;
5132
6516
  validators?: ValidatorOptions & {
5133
6517
  rangeMessage?: string;
5134
6518
  minDistanceMessage?: string;
@@ -5209,14 +6593,227 @@ interface FormHookDeclarationLite {
5209
6593
  timeoutMs?: number;
5210
6594
  args?: any;
5211
6595
  }
5212
- interface FormHooksLayout {
5213
- beforeInit?: FormHookDeclarationLite[];
5214
- afterInit?: FormHookDeclarationLite[];
5215
- beforeValidate?: FormHookDeclarationLite[];
5216
- afterValidate?: FormHookDeclarationLite[];
5217
- beforeSubmit?: FormHookDeclarationLite[];
5218
- afterSubmit?: FormHookDeclarationLite[];
5219
- onError?: FormHookDeclarationLite[];
6596
+ interface FormHooksLayout {
6597
+ beforeInit?: FormHookDeclarationLite[];
6598
+ afterInit?: FormHookDeclarationLite[];
6599
+ beforeValidate?: FormHookDeclarationLite[];
6600
+ afterValidate?: FormHookDeclarationLite[];
6601
+ beforeSubmit?: FormHookDeclarationLite[];
6602
+ afterSubmit?: FormHookDeclarationLite[];
6603
+ onError?: FormHookDeclarationLite[];
6604
+ }
6605
+
6606
+ interface Specification<T extends object = any> {
6607
+ isSatisfiedBy(obj: T): boolean;
6608
+ }
6609
+
6610
+ interface FormActionButton {
6611
+ id?: string;
6612
+ visible: boolean;
6613
+ label: string;
6614
+ icon?: string;
6615
+ className?: string;
6616
+ style?: Record<string, any>;
6617
+ color?: 'primary' | 'accent' | 'warn' | 'basic';
6618
+ disabled?: boolean;
6619
+ type?: 'button' | 'submit' | 'reset';
6620
+ action?: string;
6621
+ tooltip?: string;
6622
+ loading?: boolean;
6623
+ size?: 'small' | 'medium' | 'large';
6624
+ variant?: 'raised' | 'stroked' | 'flat' | 'fab';
6625
+ shortcut?: string;
6626
+ }
6627
+ interface FormActionsLayout {
6628
+ /**
6629
+ * Configuration for the submit button
6630
+ */
6631
+ submit: FormActionButton;
6632
+ /**
6633
+ * Configuration for the cancel button
6634
+ */
6635
+ cancel: FormActionButton;
6636
+ /**
6637
+ * Configuration for the reset button
6638
+ */
6639
+ reset: FormActionButton;
6640
+ /**
6641
+ * Custom buttons
6642
+ */
6643
+ custom?: FormActionButton[];
6644
+ /**
6645
+ * Layout and behavior
6646
+ */
6647
+ position?: 'left' | 'center' | 'right' | 'justified' | 'split';
6648
+ orientation?: 'horizontal' | 'vertical';
6649
+ spacing?: 'compact' | 'normal' | 'spacious';
6650
+ sticky?: boolean;
6651
+ /** Exibir divisor superior (linha) acima da barra de ações */
6652
+ divider?: boolean;
6653
+ /**
6654
+ * Structural placement of the actions bar within the form layout.
6655
+ * - afterSections: render once after all sections (default)
6656
+ * - insideLastSection: render inside the last section's container
6657
+ * - top: render once before all sections
6658
+ */
6659
+ placement?: 'insideLastSection' | 'afterSections' | 'top';
6660
+ /**
6661
+ * Responsive settings
6662
+ */
6663
+ mobile?: {
6664
+ position?: 'left' | 'center' | 'right' | 'justified';
6665
+ orientation?: 'horizontal' | 'vertical';
6666
+ collapseToMenu?: boolean;
6667
+ };
6668
+ containerClassName?: string;
6669
+ containerStyles?: {
6670
+ [key: string]: any;
6671
+ };
6672
+ showSaveButton?: boolean;
6673
+ submitButtonLabel?: string;
6674
+ showCancelButton?: boolean;
6675
+ cancelButtonLabel?: string;
6676
+ showResetButton?: boolean;
6677
+ resetButtonLabel?: string;
6678
+ }
6679
+ interface FormApiLayout {
6680
+ saveEndpoint?: string;
6681
+ loadEndpoint?: string;
6682
+ saveMethod?: 'POST' | 'PUT' | 'PATCH';
6683
+ timeout?: number;
6684
+ headers?: Record<string, string>;
6685
+ idField?: string;
6686
+ beforeSave?: string;
6687
+ afterLoad?: string;
6688
+ }
6689
+ interface FormBehaviorLayout {
6690
+ confirmOnUnsavedChanges?: boolean;
6691
+ trackHistory?: boolean;
6692
+ focusFirstError?: boolean;
6693
+ scrollToErrors?: boolean;
6694
+ clearAfterSave?: boolean;
6695
+ redirectAfterSave?: string;
6696
+ /** Disable subtle mount animation on initial render. */
6697
+ disableMountAnimation?: boolean;
6698
+ /** Optional mount animation tuning (ms/px). */
6699
+ mountAnimation?: {
6700
+ durationMs?: number;
6701
+ offsetPx?: number;
6702
+ staggerMs?: number;
6703
+ };
6704
+ /**
6705
+ * Enables afterValidate hooks to run reactively on form.valueChanges.
6706
+ * Default is false.
6707
+ */
6708
+ reactiveValidation?: boolean;
6709
+ /** Debounce for reactive afterValidate hooks (ms). Default 150ms. */
6710
+ reactiveValidationDebounceMs?: number;
6711
+ }
6712
+ interface FormMetadataLayout {
6713
+ formCode?: string;
6714
+ version?: string;
6715
+ [key: string]: any;
6716
+ }
6717
+ interface FormMessagesLayout {
6718
+ updateRegistrySuccess?: string;
6719
+ createRegistrySuccess?: string;
6720
+ updateRegistryError?: string;
6721
+ createRegistryError?: string;
6722
+ confirmations?: {
6723
+ submit?: string;
6724
+ cancel?: string;
6725
+ reset?: string;
6726
+ [customAction: string]: string | undefined;
6727
+ };
6728
+ customActions?: {
6729
+ [actionId: string]: {
6730
+ success?: string;
6731
+ error?: string;
6732
+ confirmation?: string;
6733
+ };
6734
+ };
6735
+ loading?: {
6736
+ submit?: string;
6737
+ cancel?: string;
6738
+ reset?: string;
6739
+ [customAction: string]: string | undefined;
6740
+ };
6741
+ [key: string]: any;
6742
+ }
6743
+ interface FormRowLayout {
6744
+ id: string;
6745
+ name?: string;
6746
+ label?: string;
6747
+ orientation: 'horizontal' | 'vertical';
6748
+ fields: FieldMetadata[];
6749
+ styles?: {
6750
+ [key: string]: any;
6751
+ };
6752
+ hiddenCondition?: string | Specification<any> | null;
6753
+ visibilityCondition?: string | Specification<any> | null;
6754
+ }
6755
+ interface NestedFieldsetLayout extends FormRowLayout {
6756
+ fieldsets?: FieldsetLayout[];
6757
+ }
6758
+ interface FieldsetLayout {
6759
+ id: string;
6760
+ title: string;
6761
+ titleNew?: string;
6762
+ titleView?: string;
6763
+ titleEdit?: string;
6764
+ orientation: 'horizontal' | 'vertical';
6765
+ rows: FormRowLayout[];
6766
+ hiddenCondition?: string | Specification<any> | null;
6767
+ }
6768
+ type FormRuleTargetType = 'field' | 'section' | 'action' | 'row' | 'column';
6769
+ interface FormLayoutRule {
6770
+ id: string;
6771
+ name: string;
6772
+ description?: string;
6773
+ /**
6774
+ * Tipo de alvo. Ausente em regras legadas — deve ser inferido como 'field'.
6775
+ */
6776
+ targetType?: FormRuleTargetType;
6777
+ /**
6778
+ * IDs canônicos dos alvos (sem prefixo). Para compatibilidade, `targets` pode
6779
+ * vir vazio e deve ser inferido a partir de `targetFields` legados.
6780
+ */
6781
+ targets?: string[];
6782
+ /**
6783
+ * Alias legado para alvos de campo (mantido para retrocompatibilidade).
6784
+ */
6785
+ targetFields?: string[];
6786
+ /**
6787
+ * Contexto legado (ex.: visibility/readOnly/validation). O runtime deve
6788
+ * inferir propriedades a partir dele quando `properties` não for informado.
6789
+ */
6790
+ context?: 'visibility' | 'readOnly' | 'style' | 'validation' | 'notification';
6791
+ effect: {
6792
+ condition: string | Specification<any> | null;
6793
+ properties?: Record<string, any>;
6794
+ propertiesWhenFalse?: Record<string, any>;
6795
+ };
6796
+ }
6797
+ interface FormLayout {
6798
+ formTitle?: string;
6799
+ formDescription?: string;
6800
+ formTitleCreate?: string;
6801
+ formDescriptionCreate?: string;
6802
+ formTitleView?: string;
6803
+ formDescriptionView?: string;
6804
+ formTitleEdit?: string;
6805
+ formDescriptionEdit?: string;
6806
+ className?: string;
6807
+ styles?: {
6808
+ [key: string]: any;
6809
+ };
6810
+ actions?: FormActionsLayout;
6811
+ api?: FormApiLayout;
6812
+ behavior?: FormBehaviorLayout;
6813
+ metadata?: FormMetadataLayout;
6814
+ messages?: FormMessagesLayout;
6815
+ fieldsets: FieldsetLayout[];
6816
+ formRules?: FormLayoutRule[];
5220
6817
  }
5221
6818
 
5222
6819
  type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
@@ -5277,6 +6874,10 @@ interface FormSection {
5277
6874
  /** Optional icon name (Material Icons ligature or SVG name) */
5278
6875
  icon?: string;
5279
6876
  description?: string;
6877
+ /** When true, allows the section content to be collapsed/expanded in the UI. */
6878
+ collapsible?: boolean;
6879
+ /** Initial collapsed state when `collapsible` is true. */
6880
+ collapsed?: boolean;
5280
6881
  /** Optional extra space after the entire section (px). */
5281
6882
  gapBottom?: number;
5282
6883
  /** Optional gap below the title (px) */
@@ -5287,6 +6888,13 @@ interface FormSection {
5287
6888
  titleStyle?: string;
5288
6889
  /** Optional typography preset for the description */
5289
6890
  descriptionStyle?: string;
6891
+ /** Optional colors for title/description (CSS color or token) */
6892
+ titleColor?: string;
6893
+ descriptionColor?: string;
6894
+ /** Optional alignment for the header content */
6895
+ headerAlign?: 'start' | 'center';
6896
+ /** Optional tooltip for the section header */
6897
+ headerTooltip?: string;
5290
6898
  rows: FormRow[];
5291
6899
  }
5292
6900
  interface FormConfig {
@@ -5313,6 +6921,24 @@ interface FormConfig {
5313
6921
  formRulesState?: unknown;
5314
6922
  /** Optional lifecycle hooks declared per stage */
5315
6923
  hooks?: FormHooksLayout;
6924
+ /**
6925
+ * Dicas e tooltips para modos de dados e modos globais de UI.
6926
+ * Útil para padronizar mensagens didáticas no host.
6927
+ */
6928
+ hints?: FormModeHints;
6929
+ }
6930
+ interface FormModeHints {
6931
+ dataModes: {
6932
+ create: string;
6933
+ edit: string;
6934
+ view: string;
6935
+ };
6936
+ uiModes: {
6937
+ presentation: string;
6938
+ readonly: string;
6939
+ disabled: string;
6940
+ visible: string;
6941
+ };
5316
6942
  }
5317
6943
  interface FormConfigMetadata {
5318
6944
  /** Configuration version for migration support */
@@ -5367,6 +6993,10 @@ declare function isValidFormConfig(config: any): config is FormConfig;
5367
6993
  * Cria configuração vazia para inicialização
5368
6994
  */
5369
6995
  declare function createEmptyFormConfig(): FormConfig;
6996
+ /**
6997
+ * Default hint texts for data and UI modes.
6998
+ */
6999
+ declare function getDefaultFormHints(): FormModeHints;
5370
7000
  /**
5371
7001
  * Merges field metadata into a FormConfig
5372
7002
  * Useful when combining layout with server-loaded metadata
@@ -5412,8 +7042,99 @@ declare function syncWithServerMetadata(localConfig: FormConfig, serverMetadata:
5412
7042
  */
5413
7043
  declare function convertFormLayoutToConfig(formLayout: any): FormConfig;
5414
7044
 
7045
+ interface FormValueChangeEvent {
7046
+ formData: any;
7047
+ changedField?: string;
7048
+ previousValue?: any;
7049
+ currentValue?: any;
7050
+ changedFields: string[];
7051
+ isValid: boolean;
7052
+ entityId?: string | number;
7053
+ }
7054
+ interface ValidationError {
7055
+ field: string;
7056
+ type: 'required' | 'pattern' | 'min' | 'max' | 'email' | 'custom';
7057
+ message: string;
7058
+ currentValue?: any;
7059
+ expectedValue?: any;
7060
+ }
7061
+ interface FormSubmitEvent {
7062
+ stage: 'before' | 'after' | 'error';
7063
+ formData: any;
7064
+ isValid: boolean;
7065
+ validationErrors?: ValidationError[];
7066
+ entityId?: string | number;
7067
+ operation: 'create' | 'update';
7068
+ result?: any;
7069
+ error?: any;
7070
+ }
7071
+ interface FormValidationEvent {
7072
+ isValid: boolean;
7073
+ errors: {
7074
+ [fieldName: string]: ValidationError[];
7075
+ };
7076
+ validatedFields: string[];
7077
+ invalidFields: string[];
7078
+ formStatus: 'VALID' | 'INVALID' | 'PENDING' | 'DISABLED';
7079
+ }
7080
+ interface FormEntityEvent {
7081
+ operation: 'load' | 'create' | 'update' | 'delete';
7082
+ entityId?: string | number;
7083
+ entityData?: any;
7084
+ success: boolean;
7085
+ result?: any;
7086
+ error?: any;
7087
+ timestamp: Date;
7088
+ }
7089
+ interface FormReadyEvent {
7090
+ formGroup: FormGroup;
7091
+ fieldsMetadata: FieldMetadata[];
7092
+ layout?: FormLayout;
7093
+ hasEntity: boolean;
7094
+ entityId?: string | number;
7095
+ }
7096
+ interface FormInitializationError {
7097
+ stage: 'config-load' | 'schema-fetch' | 'sync' | 'form-build';
7098
+ error: Error;
7099
+ context?: {
7100
+ formId?: string;
7101
+ resourcePath?: string;
7102
+ hasLocalConfig?: boolean;
7103
+ };
7104
+ recoverable: boolean;
7105
+ userMessage: string;
7106
+ }
7107
+ interface FormCustomActionEvent {
7108
+ actionId: string;
7109
+ formData: any;
7110
+ isValid: boolean;
7111
+ source: 'button' | 'shortcut';
7112
+ }
7113
+ interface FormActionConfirmationEvent {
7114
+ actionId: 'submit' | 'cancel' | 'reset' | string;
7115
+ message: string;
7116
+ confirmed: boolean;
7117
+ }
7118
+
7119
+ type RulePropertyType = 'string' | 'boolean' | 'object' | 'enum' | 'number';
7120
+ interface RulePropertyDefinition {
7121
+ name: string;
7122
+ type: RulePropertyType;
7123
+ label: string;
7124
+ description?: string;
7125
+ enumValues?: Array<{
7126
+ value: string;
7127
+ label: string;
7128
+ }>;
7129
+ category?: 'content' | 'appearance' | 'behavior' | 'layout' | 'validation';
7130
+ }
7131
+ type RulePropertySchema = Record<'field' | 'section' | 'action' | 'row' | 'column', RulePropertyDefinition[]>;
7132
+ declare const RULE_PROPERTY_SCHEMA: RulePropertySchema;
7133
+
5415
7134
  type ActionDefinition = {
7135
+ /** Global action id to execute (e.g., 'navigation.back', 'dialog.alert'). */
5416
7136
  type?: string;
7137
+ /** Optional payload template for the action. */
5417
7138
  params?: Record<string, any>;
5418
7139
  };
5419
7140
  interface WidgetDefinition {
@@ -5421,7 +7142,7 @@ interface WidgetDefinition {
5421
7142
  id: string;
5422
7143
  /** Inputs to bind into the component instance */
5423
7144
  inputs?: Record<string, any>;
5424
- /** Map of component output name to action (currently forwarded as widgetEvent) */
7145
+ /** Map of component output name to action (global action or 'emit'). */
5425
7146
  outputs?: Record<string, ActionDefinition | 'emit'>;
5426
7147
  /**
5427
7148
  * Optional explicit order for applying inputs. Keys listed here are applied first
@@ -5430,6 +7151,100 @@ interface WidgetDefinition {
5430
7151
  bindingOrder?: string[];
5431
7152
  }
5432
7153
 
7154
+ type WidgetShellActionPlacement = 'header' | 'window';
7155
+ interface WidgetShellAction {
7156
+ /** Unique action id used for tracking and default emit name. */
7157
+ id: string;
7158
+ /** Optional label for text or outlined buttons. */
7159
+ label?: string;
7160
+ /** Optional icon name (Material or Praxis icon registry). */
7161
+ icon?: string;
7162
+ /** Tooltip text for the action. */
7163
+ tooltip?: string;
7164
+ /** Visual style of the action button. */
7165
+ variant?: 'icon' | 'text' | 'outlined';
7166
+ /** Placement inside the shell header. Defaults to 'header'. */
7167
+ placement?: WidgetShellActionPlacement;
7168
+ /** Output name to emit to the page builder (defaults to `shell:${id}`). */
7169
+ emit?: string;
7170
+ /** Optional command name to dispatch to the inner widget. */
7171
+ command?: string;
7172
+ /** Optional payload for action dispatch/emit. */
7173
+ payload?: any;
7174
+ /** Whether the action is disabled. */
7175
+ disabled?: boolean;
7176
+ /** Whether the action is visible. */
7177
+ visible?: boolean;
7178
+ }
7179
+ interface WidgetShellWindowActions {
7180
+ /** Show collapse/expand control in the header. */
7181
+ collapsible?: boolean;
7182
+ /** Show fullscreen toggle in the header. */
7183
+ fullscreen?: boolean;
7184
+ }
7185
+ interface WidgetShellConfig {
7186
+ /** Shell type. 'dashboard-card' enables the default dashboard styling. */
7187
+ kind?: 'dashboard-card' | 'none';
7188
+ /** Optional preset id to resolve appearance defaults. */
7189
+ preset?: string;
7190
+ /** Header icon name. */
7191
+ icon?: string;
7192
+ /** Header title. */
7193
+ title?: string;
7194
+ /** Header subtitle. */
7195
+ subtitle?: string;
7196
+ /** Whether to show the header; defaults to true when title/icon/actions exist. */
7197
+ showHeader?: boolean;
7198
+ /** Header + window actions. */
7199
+ actions?: WidgetShellAction[];
7200
+ /** Built-in window actions configuration. */
7201
+ windowActions?: WidgetShellWindowActions;
7202
+ /** Initial collapsed state. */
7203
+ collapsed?: boolean;
7204
+ /** Initial expanded (fullscreen) state. */
7205
+ expanded?: boolean;
7206
+ /** Initial fullscreen state. */
7207
+ fullscreen?: boolean;
7208
+ /** Optional appearance overrides for card, header, and typography. */
7209
+ appearance?: {
7210
+ card?: {
7211
+ background?: string;
7212
+ borderColor?: string;
7213
+ borderRadius?: string;
7214
+ shadow?: string;
7215
+ };
7216
+ header?: {
7217
+ background?: string;
7218
+ borderColor?: string;
7219
+ titleColor?: string;
7220
+ subtitleColor?: string;
7221
+ iconColor?: string;
7222
+ };
7223
+ body?: {
7224
+ background?: string;
7225
+ textColor?: string;
7226
+ padding?: string;
7227
+ };
7228
+ typography?: {
7229
+ titleSize?: string;
7230
+ titleWeight?: string;
7231
+ subtitleSize?: string;
7232
+ };
7233
+ };
7234
+ }
7235
+ interface WidgetShellActionEvent {
7236
+ /** Action id. */
7237
+ id: string;
7238
+ /** Optional command name to dispatch to the inner widget. */
7239
+ command?: string;
7240
+ /** Optional emit name to propagate to the page builder. */
7241
+ emit?: string;
7242
+ /** Optional payload for the action. */
7243
+ payload?: any;
7244
+ /** Original action definition, when available. */
7245
+ action?: WidgetShellAction;
7246
+ }
7247
+
5433
7248
  interface GridItemLayout {
5434
7249
  /** 1-based column start */
5435
7250
  col: number;
@@ -5445,6 +7260,7 @@ interface GridWidgetInstance {
5445
7260
  definition: WidgetDefinition;
5446
7261
  layout: GridItemLayout;
5447
7262
  className?: string;
7263
+ shell?: WidgetShellConfig;
5448
7264
  }
5449
7265
  interface GridPageDefinition {
5450
7266
  widgets: GridWidgetInstance[];
@@ -5573,6 +7389,24 @@ interface BackConfig {
5573
7389
  confirmOnDirty?: boolean;
5574
7390
  }
5575
7391
 
7392
+ type LoadingPhase = 'config' | 'schema' | 'render' | 'data' | 'idle';
7393
+ type LoadingStatus = 'loading' | 'success' | 'error';
7394
+ interface LoadingState {
7395
+ phase: LoadingPhase;
7396
+ status: LoadingStatus;
7397
+ message?: string;
7398
+ percent?: number;
7399
+ error?: unknown;
7400
+ context?: {
7401
+ componentType?: string;
7402
+ componentId?: string;
7403
+ resourcePath?: string;
7404
+ };
7405
+ timestamp?: string;
7406
+ }
7407
+
7408
+ declare const DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP: Record<string, FieldControlType>;
7409
+
5576
7410
  declare const AllowedFileTypes: {
5577
7411
  readonly ALL: "*/*";
5578
7412
  readonly IMAGES: "image/*";
@@ -5761,6 +7595,12 @@ declare function resolveOffset(offset?: ColumnOffset): Required<ColumnOffset>;
5761
7595
  declare function resolveOrder(order?: ColumnOrder): Required<ColumnOrder>;
5762
7596
  declare function resolveHidden(hidden?: ColumnHidden): Required<ColumnHidden>;
5763
7597
 
7598
+ /**
7599
+ * Migra regras legadas (context/targetFields) para o formato canônico
7600
+ * `targetType/targets/effect.properties`.
7601
+ */
7602
+ declare function migrateFormLayoutRule(rule: any): FormLayoutRule;
7603
+
5764
7604
  /**
5765
7605
  * Text transformation utilities for display and persistence.
5766
7606
  *
@@ -5800,6 +7640,265 @@ declare function deepMerge<T>(left: T, right: Partial<T> | undefined): T;
5800
7640
  */
5801
7641
  declare function fillUndefined<T>(target: T, defaults: Partial<T> | undefined): T;
5802
7642
 
7643
+ interface ResolvePresetOptions {
7644
+ timezone?: string;
7645
+ startOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
7646
+ now?: Date;
7647
+ /** If true, require every day in range to pass filter, else only start/end. */
7648
+ strictFilter?: boolean;
7649
+ /** Optional date filter to validate computed ranges. */
7650
+ dateFilter?: (d: Date | null) => boolean;
7651
+ /** Optional min/max clamp. */
7652
+ minDate?: Date | null;
7653
+ maxDate?: Date | null;
7654
+ }
7655
+ /** Normalize a date to start of day (00:00:00.000) respecting timezone if provided. */
7656
+ declare function normalizeStart(date: Date, timezone?: string): Date;
7657
+ /** Normalize a date to end of day (23:59:59.999) respecting timezone if provided. */
7658
+ declare function normalizeEnd(date: Date, timezone?: string): Date;
7659
+ declare function clampRange(range: DateRangeValue, minDate?: Date | null, maxDate?: Date | null, timezone?: string): DateRangeValue;
7660
+ declare function isRangeValidForFilter(range: DateRangeValue, dateFilter?: (d: Date | null) => boolean, strict?: boolean): boolean;
7661
+ /** Build built-in presets based on locale and DateAdapter. */
7662
+ declare function resolveBuiltinPresets(locale: string, dateAdapter: DateAdapter<Date>, opts?: ResolvePresetOptions): Record<string, DateRangePreset>;
7663
+
7664
+ type FieldControlTypeValue$1 = (typeof FieldControlType)[keyof typeof FieldControlType];
7665
+ declare function normalizeControlTypeToken(value: unknown): string;
7666
+ declare function normalizeControlTypeKey(value: unknown): string;
7667
+ declare function resolveControlTypeAlias(value: unknown, fallback?: FieldControlTypeValue$1 | string): FieldControlTypeValue$1 | string;
7668
+
7669
+ type FieldControlTypeValue = (typeof FieldControlType)[keyof typeof FieldControlType];
7670
+ declare const INLINE_FILTER_CONTROL_TYPES: Readonly<{
7671
+ readonly SELECT: "filter-select-inline";
7672
+ readonly SEARCHABLE_SELECT: "filter-searchable-select-inline";
7673
+ readonly ASYNC_SELECT: "filter-async-select-inline";
7674
+ readonly ENTITY_LOOKUP: "filter-entity-lookup-inline";
7675
+ readonly AUTOCOMPLETE: "filter-autocomplete-inline";
7676
+ readonly NUMBER: "filter-number-inline";
7677
+ readonly CURRENCY: "filter-currency-inline";
7678
+ readonly CURRENCY_RANGE: "filter-currency-range-inline";
7679
+ readonly MULTI_SELECT: "filter-multiselect-inline";
7680
+ readonly INPUT: "filter-input-inline";
7681
+ readonly TOGGLE: "filter-toggle-inline";
7682
+ readonly RANGE: "filter-range-inline";
7683
+ readonly DATE: "filter-date-inline";
7684
+ readonly DATE_RANGE: "filter-date-range-inline";
7685
+ readonly TIME: "filter-time-inline";
7686
+ readonly TIME_RANGE: "filter-time-range-inline";
7687
+ readonly TREE_SELECT: "filter-tree-select-inline";
7688
+ readonly RATING: "filter-rating-inline";
7689
+ readonly DISTANCE_RADIUS: "filter-distance-radius-inline";
7690
+ readonly PIPELINE_STATUS: "filter-pipeline-status-inline";
7691
+ readonly SCORE_PRIORITY: "filter-score-priority-inline";
7692
+ readonly RELATIVE_PERIOD: "filter-relative-period-inline";
7693
+ readonly SENTIMENT: "filter-sentiment-inline";
7694
+ readonly COLOR_LABEL: "filter-color-label-inline";
7695
+ }>;
7696
+ type InlineFilterControlType = (typeof INLINE_FILTER_CONTROL_TYPES)[keyof typeof INLINE_FILTER_CONTROL_TYPES];
7697
+ declare const INLINE_FILTER_CONTROL_TYPE_VALUES: readonly InlineFilterControlType[];
7698
+ declare const INLINE_FILTER_CONTROL_TYPE_SET: ReadonlySet<InlineFilterControlType>;
7699
+ declare const INLINE_FILTER_ALIAS_TOKEN_TO_CONTROL_TYPE: Readonly<Record<string, InlineFilterControlType>>;
7700
+ declare const INLINE_FILTER_ALIAS_TOKENS: readonly string[];
7701
+ declare const INLINE_FILTER_ALIAS_TOKEN_TO_BASE_CONTROL_TYPE: Readonly<Record<string, FieldControlTypeValue>>;
7702
+ declare function resolveInlineFilterControlTypeAlias(value: unknown): InlineFilterControlType | undefined;
7703
+ declare function resolveInlineFilterAliasToBaseControlType(value: unknown): FieldControlTypeValue | undefined;
7704
+ declare function isInlineFilterControlType(value: unknown): value is InlineFilterControlType;
7705
+
7706
+ type GlobalActionFieldType = 'text' | 'textarea' | 'number' | 'select' | 'toggle' | 'json';
7707
+ interface GlobalActionFieldOption {
7708
+ value: string;
7709
+ label: string;
7710
+ }
7711
+ interface GlobalActionField {
7712
+ key: string;
7713
+ label: string;
7714
+ type: GlobalActionFieldType;
7715
+ hint?: string;
7716
+ placeholder?: string;
7717
+ required?: boolean;
7718
+ options?: GlobalActionFieldOption[];
7719
+ rows?: number;
7720
+ dependsOnKey?: string;
7721
+ dependsOnValue?: string;
7722
+ }
7723
+ interface GlobalActionUiSchema {
7724
+ id: GlobalActionId;
7725
+ label: string;
7726
+ fields: GlobalActionField[];
7727
+ }
7728
+ declare const GLOBAL_ACTION_UI_SCHEMAS: GlobalActionUiSchema[];
7729
+ declare function getGlobalActionUiSchema(id: string | undefined): GlobalActionUiSchema | undefined;
7730
+
7731
+ type AiValueKind = 'boolean' | 'string' | 'number' | 'enum' | 'expression' | 'object' | 'array';
7732
+ interface AiCapabilityCategoryMap {
7733
+ identity: true;
7734
+ appearance: true;
7735
+ validation: true;
7736
+ data: true;
7737
+ behavior: true;
7738
+ layout: true;
7739
+ accessibility: true;
7740
+ dependency: true;
7741
+ transform: true;
7742
+ form_config: true;
7743
+ events: true;
7744
+ misc: true;
7745
+ }
7746
+ type AiCapabilityCategory = keyof AiCapabilityCategoryMap;
7747
+ interface AiCapability {
7748
+ /** Path com [] para arrays (ex.: fieldMetadata[].label) */
7749
+ path: string;
7750
+ /** Categoria lógica para agrupamento */
7751
+ category: AiCapabilityCategory;
7752
+ /** Tipo de dado esperado */
7753
+ valueKind: AiValueKind;
7754
+ /** Valores permitidos para enums */
7755
+ allowedValues?: Array<string | number>;
7756
+ /** Descrição semântica para a IA */
7757
+ description?: string;
7758
+ /** Se true, exige confirmação extra por ser destrutivo ou impactante */
7759
+ critical?: boolean;
7760
+ /** Exemplos de intenção do usuário (Few-Shot) */
7761
+ intentExamples?: string[];
7762
+ /** Dependência condicional (ex.: requer outro campo) */
7763
+ dependsOn?: string;
7764
+ /** Exemplo de valor */
7765
+ example?: string;
7766
+ /** Observações de segurança */
7767
+ safetyNotes?: string;
7768
+ }
7769
+ interface AiCapabilityCatalog {
7770
+ version: string;
7771
+ capabilities: AiCapability[];
7772
+ notes: string[];
7773
+ enums: Record<string, Array<string | number>>;
7774
+ targets?: string[];
7775
+ }
7776
+ interface AiConcept {
7777
+ id: string;
7778
+ title: string;
7779
+ description: string;
7780
+ rules: string[];
7781
+ syntax?: string;
7782
+ examples: string[];
7783
+ antiPatterns?: string[];
7784
+ }
7785
+ type AiConceptPack = Record<string, AiConcept>;
7786
+
7787
+ /**
7788
+ * Catálogo de capacidades genéricas de FieldMetadata para uso da IA.
7789
+ * Baseado em projects/praxis-core/src/lib/models/component-metadata.interface.ts
7790
+ */
7791
+
7792
+ type CapabilityCategory$1 = AiCapabilityCategory;
7793
+ type ValueKind$1 = AiValueKind;
7794
+ interface Capability$1 extends AiCapability {
7795
+ category: CapabilityCategory$1;
7796
+ }
7797
+ interface CapabilityCatalog$1 extends AiCapabilityCatalog {
7798
+ capabilities: Capability$1[];
7799
+ }
7800
+ declare const FIELD_METADATA_CAPABILITIES: CapabilityCatalog$1;
7801
+ declare function getFieldMetadataCapabilities(): Capability$1[];
7802
+
7803
+ /**
7804
+ * Capabilities catalog for Praxis Dynamic Page (praxis-dynamic-page).
7805
+ * Paths follow WidgetPageDefinition shape under "page".
7806
+ */
7807
+
7808
+ declare module "./index" {
7809
+ interface AiCapabilityCategoryMap {
7810
+ page: true;
7811
+ layout: true;
7812
+ widgets: true;
7813
+ shell: true;
7814
+ connections: true;
7815
+ context: true;
7816
+ }
7817
+ }
7818
+ type CapabilityCategory = AiCapabilityCategory;
7819
+ type ValueKind = AiValueKind;
7820
+ interface Capability extends AiCapability {
7821
+ category: CapabilityCategory;
7822
+ }
7823
+ interface CapabilityCatalog extends AiCapabilityCatalog {
7824
+ capabilities: Capability[];
7825
+ }
7826
+ declare const DYNAMIC_PAGE_AI_CAPABILITIES: CapabilityCatalog;
7827
+
7828
+ type ComponentContextOptionMode = 'enum' | 'suggested';
7829
+ interface ComponentContextOption {
7830
+ value: string | number;
7831
+ label?: string;
7832
+ example?: string;
7833
+ }
7834
+ interface ComponentContextOptionsByPathEntry {
7835
+ mode: ComponentContextOptionMode;
7836
+ options: ComponentContextOption[];
7837
+ }
7838
+ interface ComponentActionParam {
7839
+ name: string;
7840
+ type: 'ENUM' | 'BOOLEAN' | 'STRING' | 'NUMBER';
7841
+ options?: string[];
7842
+ description?: string;
7843
+ }
7844
+ interface ComponentContextAction {
7845
+ id: string;
7846
+ keywords?: string[];
7847
+ patchTemplate: any;
7848
+ safetyNotes?: string;
7849
+ /**
7850
+ * Define o tipo de operação associado à ação.
7851
+ * Usado para diferenciar criação/edição/remoção em fluxos determinísticos.
7852
+ */
7853
+ operation?: 'create' | 'update' | 'delete' | 'read';
7854
+ /**
7855
+ * Indica se o target deve existir antes de aplicar a ação.
7856
+ * Ex: criar coluna nova não exige target pré-existente.
7857
+ */
7858
+ requiresExistingTarget?: boolean;
7859
+ /**
7860
+ * Escopo da ação para resolução determinística.
7861
+ * - GLOBAL: Ação afeta todo o componente (não exige target).
7862
+ * - COLUMN: Ação afeta uma coluna específica (exige target).
7863
+ * - ROW: Ação afeta uma linha ou configuração de linhas.
7864
+ */
7865
+ scope?: 'GLOBAL' | 'COLUMN' | 'ROW';
7866
+ /**
7867
+ * Tipo esperado para o valor da ação.
7868
+ * Ajuda a decidir se exibe toggle, select ou input.
7869
+ */
7870
+ valueType?: 'BOOLEAN' | 'ENUM' | 'STRING' | 'NUMBER' | 'OBJECT';
7871
+ /**
7872
+ * Valor padrão caso o usuário não especifique (ex: true para enables).
7873
+ */
7874
+ defaultValue?: any;
7875
+ /**
7876
+ * Definição dos parâmetros utilizados no template ({{params.X}}).
7877
+ * Usado para popular opções em clarificações.
7878
+ */
7879
+ params?: ComponentActionParam[];
7880
+ /**
7881
+ * IDs de conceitos (AiConcepts) que devem ser carregados no prompt
7882
+ * quando esta ação for candidata. Ex: ['computed-logic'].
7883
+ */
7884
+ relatedConcepts?: string[];
7885
+ }
7886
+ interface ComponentContextPack {
7887
+ version: string;
7888
+ optionsByPath: Record<string, ComponentContextOptionsByPathEntry>;
7889
+ actionCatalog: ComponentContextAction[];
7890
+ fieldResolvers: Record<string, string[]>;
7891
+ hints?: string[];
7892
+ }
7893
+ interface ComponentMergePatch<TConfig extends Record<string, unknown> = Record<string, unknown>> {
7894
+ mode: 'merge';
7895
+ patch: Partial<TConfig>;
7896
+ intent?: string;
7897
+ planRef?: string;
7898
+ }
7899
+
7900
+ declare const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK: ComponentContextPack;
7901
+
5803
7902
  /**
5804
7903
  * Carrega dinamicamente um componente "widget" (de página) a partir de um id registrado
5805
7904
  * no ComponentMetadataRegistry e aplica bindings declarados em JSON (WidgetDefinition).
@@ -5821,6 +7920,8 @@ declare class DynamicWidgetLoaderDirective implements OnInit, OnChanges, OnDestr
5821
7920
  private compRef?;
5822
7921
  private currentId?;
5823
7922
  private outputSubs;
7923
+ /** Dispatch a shell action to the inner widget instance when supported. */
7924
+ dispatchAction(action: WidgetShellActionEvent): boolean;
5824
7925
  ngOnInit(): void;
5825
7926
  ngOnChanges(changes: SimpleChanges): void;
5826
7927
  ngOnDestroy(): void;
@@ -5833,8 +7934,41 @@ declare class DynamicWidgetLoaderDirective implements OnInit, OnChanges, OnDestr
5833
7934
  private resolveValue;
5834
7935
  private lookup;
5835
7936
  private validateAgainstMetadata;
7937
+ private coercePrimitive;
5836
7938
  static ɵfac: i0.ɵɵFactoryDeclaration<DynamicWidgetLoaderDirective, never>;
5837
- static ɵdir: i0.ɵɵDirectiveDeclaration<DynamicWidgetLoaderDirective, "[dynamicWidgetLoader]", never, { "widget": { "alias": "dynamicWidgetLoader"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "autoWireOutputs": { "alias": "autoWireOutputs"; "required": false; }; }, { "widgetEvent": "widgetEvent"; }, never, never, true, never>;
7939
+ static ɵdir: i0.ɵɵDirectiveDeclaration<DynamicWidgetLoaderDirective, "[dynamicWidgetLoader]", ["dynamicWidgetLoader"], { "widget": { "alias": "dynamicWidgetLoader"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "autoWireOutputs": { "alias": "autoWireOutputs"; "required": false; }; }, { "widgetEvent": "widgetEvent"; }, never, never, true, never>;
7940
+ }
7941
+
7942
+ type ActionList = WidgetShellAction[];
7943
+ type Appearance = WidgetShellConfig['appearance'];
7944
+ declare const BUILTIN_SHELL_PRESETS: Record<string, NonNullable<Appearance>>;
7945
+ declare class WidgetShellComponent implements OnChanges {
7946
+ shell?: WidgetShellConfig | null;
7947
+ context?: Record<string, any> | null;
7948
+ action: EventEmitter<WidgetShellActionEvent>;
7949
+ loader?: DynamicWidgetLoaderDirective;
7950
+ get appearance(): WidgetShellConfig['appearance'];
7951
+ collapsed: boolean;
7952
+ expanded: boolean;
7953
+ fullscreen: boolean;
7954
+ ngOnChanges(): void;
7955
+ get shellEnabled(): boolean;
7956
+ get showHeader(): boolean;
7957
+ get headerActions(): ActionList;
7958
+ get visibleHeaderActions(): ActionList;
7959
+ get overflowHeaderActions(): ActionList;
7960
+ private get maxHeaderActions();
7961
+ get windowActions(): ActionList;
7962
+ onAction(action: WidgetShellAction, ev: MouseEvent): void;
7963
+ stopIfExpanded(ev: MouseEvent): void;
7964
+ closeOverlay(): void;
7965
+ private handleWindowAction;
7966
+ private buildWindowActions;
7967
+ private isVisible;
7968
+ private resolvePresetAppearance;
7969
+ private mergeAppearance;
7970
+ static ɵfac: i0.ɵɵFactoryDeclaration<WidgetShellComponent, never>;
7971
+ static ɵcmp: i0.ɵɵComponentDeclaration<WidgetShellComponent, "praxis-widget-shell", never, { "shell": { "alias": "shell"; "required": false; }; "context": { "alias": "context"; "required": false; }; }, { "action": "action"; }, ["loader"], ["*"], true, never>;
5838
7972
  }
5839
7973
 
5840
7974
  interface WidgetInstance {
@@ -5842,6 +7976,8 @@ interface WidgetInstance {
5842
7976
  definition: WidgetDefinition;
5843
7977
  /** Optional CSS classes or layout hints */
5844
7978
  className?: string;
7979
+ /** Optional shell config for standardized widget framing. */
7980
+ shell?: WidgetShellConfig;
5845
7981
  }
5846
7982
  interface WidgetConnection {
5847
7983
  from: {
@@ -5869,11 +8005,29 @@ interface WidgetConnection {
5869
8005
  distinctBy?: string;
5870
8006
  };
5871
8007
  }
8008
+ type WidgetPageOrientation = 'vertical' | 'columns';
8009
+ interface WidgetPageLayout {
8010
+ /** Layout orientation for widget grid. */
8011
+ orientation?: WidgetPageOrientation;
8012
+ /** Column count when using columns orientation. */
8013
+ columns?: number;
8014
+ /** CSS gap value for grid spacing (e.g., '16px'). */
8015
+ gap?: string;
8016
+ /** Optional responsive columns by breakpoint (sm/md/lg/xl). */
8017
+ breakpoints?: {
8018
+ sm?: number;
8019
+ md?: number;
8020
+ lg?: number;
8021
+ xl?: number;
8022
+ };
8023
+ }
5872
8024
  interface WidgetPageDefinition {
5873
8025
  widgets: WidgetInstance[];
5874
8026
  connections?: WidgetConnection[];
5875
8027
  /** Optional page-wide context available to all widgets */
5876
8028
  context?: Record<string, any>;
8029
+ /** Optional layout configuration for the widget grid */
8030
+ layout?: WidgetPageLayout;
5877
8031
  }
5878
8032
 
5879
8033
  declare class ConnectionManagerService {
@@ -5907,31 +8061,91 @@ declare class ConnectionManagerService {
5907
8061
 
5908
8062
  declare class DynamicWidgetPageComponent implements OnChanges {
5909
8063
  private conn;
8064
+ private settingsPanel;
8065
+ private defaultShellEditor;
8066
+ private defaultPageEditor;
5910
8067
  page?: WidgetPageDefinition | string;
5911
8068
  context?: Record<string, any> | null;
5912
8069
  strictValidation: boolean;
5913
- debug: boolean;
8070
+ /** Enables lightweight editing affordances (shell + page layout). */
8071
+ editModeEnabled: boolean;
8072
+ /** Shows page settings button when edit mode is enabled. */
8073
+ showPageSettingsButton: boolean;
8074
+ /** Optional editor component override for widget shell settings. */
8075
+ shellEditorComponent?: Type<any>;
8076
+ /** Optional editor component override for page settings. */
8077
+ pageEditorComponent?: Type<any>;
8078
+ /** Enables automatic persistence (load/save) for the page definition. */
8079
+ autoPersist: boolean;
8080
+ /** Optional identity to scope persistence (tenant/user/route). */
8081
+ pageIdentity?: PageIdentity;
8082
+ /** Optional instance key for pages rendered multiple times. */
8083
+ componentInstanceId?: string;
8084
+ pageChange: EventEmitter<WidgetPageDefinition>;
5914
8085
  widgets: i0.WritableSignal<WidgetInstance[]>;
5915
8086
  mergedContext: Record<string, any>;
5916
- constructor(conn: ConnectionManagerService);
8087
+ pageGap: string;
8088
+ gridTemplateColumns: string;
8089
+ private pageDefinition?;
8090
+ private layout?;
8091
+ private appliedPersisted;
8092
+ private isHydrating;
8093
+ private persistenceReady;
8094
+ private warnedMissingKey;
8095
+ private readonly globalActions;
8096
+ private readonly storage;
8097
+ private readonly componentKeys;
8098
+ private readonly route;
8099
+ constructor(conn: ConnectionManagerService, settingsPanel: SettingsPanelBridge | null, defaultShellEditor: Type<any> | null, defaultPageEditor: Type<any> | null);
5917
8100
  ngOnChanges(changes: SimpleChanges): void;
5918
8101
  onWidgetEvent(fromKey: string, evt: {
5919
8102
  sourceId: string;
5920
8103
  output?: string;
5921
8104
  payload?: any;
5922
8105
  }): void;
8106
+ onShellAction(fromKey: string, evt: WidgetShellActionEvent): void;
8107
+ private handleSetInputCommand;
5923
8108
  private mergeOrder;
8109
+ private maybeExecuteMappedAction;
8110
+ private maybeExecuteGlobalCommand;
8111
+ private resolveActionPayload;
8112
+ private resolveTemplate;
8113
+ private lookup;
8114
+ openWidgetShellSettings(key: string): void;
8115
+ openPageSettings(): void;
8116
+ private applyWidgetShell;
8117
+ private applyPageLayout;
8118
+ private applyPageUpdate;
8119
+ private applyLayout;
8120
+ private mergeContext;
8121
+ onWindowResize(): void;
8122
+ private resolveColumns;
8123
+ private ensurePageDefinition;
5924
8124
  private parsePage;
5925
- static ɵfac: i0.ɵɵFactoryDeclaration<DynamicWidgetPageComponent, never>;
5926
- static ɵcmp: i0.ɵɵComponentDeclaration<DynamicWidgetPageComponent, "praxis-dynamic-page", never, { "page": { "alias": "page"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "debug": { "alias": "debug"; "required": false; }; }, {}, never, never, true, never>;
8125
+ private applyEditShellActions;
8126
+ private savePage;
8127
+ private loadPersistedPage;
8128
+ private storageKey;
8129
+ private componentKeyId;
8130
+ private buildPageScopeId;
8131
+ private warnMissingKey;
8132
+ private sanitizeSegment;
8133
+ static ɵfac: i0.ɵɵFactoryDeclaration<DynamicWidgetPageComponent, [null, { optional: true; }, { optional: true; }, { optional: true; }]>;
8134
+ static ɵcmp: i0.ɵɵComponentDeclaration<DynamicWidgetPageComponent, "praxis-dynamic-page", never, { "page": { "alias": "page"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "editModeEnabled": { "alias": "editModeEnabled"; "required": false; }; "showPageSettingsButton": { "alias": "showPageSettingsButton"; "required": false; }; "shellEditorComponent": { "alias": "shellEditorComponent"; "required": false; }; "pageEditorComponent": { "alias": "pageEditorComponent"; "required": false; }; "autoPersist": { "alias": "autoPersist"; "required": false; }; "pageIdentity": { "alias": "pageIdentity"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; }, { "pageChange": "pageChange"; }, never, never, true, never>;
5927
8135
  }
5928
8136
 
8137
+ /** Metadata for Praxis Dynamic Page component */
8138
+ declare const PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA: ComponentDocMeta;
8139
+ /**
8140
+ * Provider que registra o metadata no ComponentMetadataRegistry durante o bootstrap.
8141
+ */
8142
+ declare function providePraxisDynamicPageMetadata(): Provider;
8143
+
5929
8144
  declare class DynamicGridPageComponent implements OnChanges {
5930
8145
  private conn;
5931
8146
  page?: GridPageDefinition | string;
5932
8147
  context?: Record<string, any> | null;
5933
8148
  strictValidation: boolean;
5934
- debug: boolean;
5935
8149
  /** Optional code-level grid options. Editor (page.options) takes precedence over these. */
5936
8150
  gridOptions?: Partial<{
5937
8151
  cols: number;
@@ -5942,6 +8156,7 @@ declare class DynamicGridPageComponent implements OnChanges {
5942
8156
  editModeEnabled: boolean;
5943
8157
  widgets: i0.WritableSignal<GridWidgetInstance[]>;
5944
8158
  mergedContext: Record<string, any>;
8159
+ private readonly globalActions;
5945
8160
  private selectedKey;
5946
8161
  private cols;
5947
8162
  private _rowHeight;
@@ -5959,12 +8174,18 @@ declare class DynamicGridPageComponent implements OnChanges {
5959
8174
  output?: string;
5960
8175
  payload?: any;
5961
8176
  }): void;
8177
+ onShellAction(fromKey: string, evt: WidgetShellActionEvent): void;
5962
8178
  isSelected(key?: string): boolean;
5963
8179
  onTileClick(key?: string, ev?: Event): void;
5964
8180
  private mergeOrder;
8181
+ private maybeExecuteMappedAction;
8182
+ private maybeExecuteGlobalCommand;
8183
+ private resolveActionPayload;
8184
+ private resolveTemplate;
8185
+ private lookup;
5965
8186
  private parsePage;
5966
8187
  static ɵfac: i0.ɵɵFactoryDeclaration<DynamicGridPageComponent, never>;
5967
- static ɵcmp: i0.ɵɵComponentDeclaration<DynamicGridPageComponent, "praxis-dynamic-grid-page", never, { "page": { "alias": "page"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "debug": { "alias": "debug"; "required": false; }; "gridOptions": { "alias": "gridOptions"; "required": false; }; "editModeEnabled": { "alias": "editModeEnabled"; "required": false; }; }, {}, never, never, true, never>;
8188
+ static ɵcmp: i0.ɵɵComponentDeclaration<DynamicGridPageComponent, "praxis-dynamic-grid-page", never, { "page": { "alias": "page"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "gridOptions": { "alias": "gridOptions"; "required": false; }; "editModeEnabled": { "alias": "editModeEnabled"; "required": false; }; }, {}, never, never, true, never>;
5968
8189
  }
5969
8190
 
5970
8191
  interface EmptyAction {
@@ -5980,8 +8201,9 @@ declare class EmptyStateCardComponent {
5980
8201
  primaryAction?: EmptyAction;
5981
8202
  secondaryActions: EmptyAction[];
5982
8203
  inline: boolean;
8204
+ tone: 'neutral' | 'primary' | 'secondary';
5983
8205
  static ɵfac: i0.ɵɵFactoryDeclaration<EmptyStateCardComponent, never>;
5984
- static ɵcmp: i0.ɵɵComponentDeclaration<EmptyStateCardComponent, "praxis-empty-state-card", never, { "icon": { "alias": "icon"; "required": false; }; "title": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "primaryAction": { "alias": "primaryAction"; "required": false; }; "secondaryActions": { "alias": "secondaryActions"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; }, {}, never, never, true, never>;
8206
+ static ɵcmp: i0.ɵɵComponentDeclaration<EmptyStateCardComponent, "praxis-empty-state-card", never, { "icon": { "alias": "icon"; "required": false; }; "title": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "primaryAction": { "alias": "primaryAction"; "required": false; }; "secondaryActions": { "alias": "secondaryActions"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "tone": { "alias": "tone"; "required": false; }; }, {}, never, never, true, never>;
5985
8207
  }
5986
8208
 
5987
8209
  declare class ResourceQuickConnectComponent implements SettingsValueProvider {
@@ -5992,6 +8214,9 @@ declare class ResourceQuickConnectComponent implements SettingsValueProvider {
5992
8214
  updateState(): void;
5993
8215
  getSettingsValue(): any;
5994
8216
  onSave(): any;
8217
+ showInvalid(): boolean;
8218
+ normalizedPath(): string;
8219
+ private isValidPath;
5995
8220
  static ɵfac: i0.ɵɵFactoryDeclaration<ResourceQuickConnectComponent, never>;
5996
8221
  static ɵcmp: i0.ɵɵComponentDeclaration<ResourceQuickConnectComponent, "praxis-resource-quick-connect", never, { "resourcePath": { "alias": "resourcePath"; "required": false; }; }, {}, never, never, true, never>;
5997
8222
  }
@@ -6003,6 +8228,7 @@ declare class PraxisIconPickerComponent {
6003
8228
  icons: string[];
6004
8229
  selected: EventEmitter<string>;
6005
8230
  cancel: EventEmitter<void>;
8231
+ searchInput?: ElementRef<HTMLInputElement>;
6006
8232
  query: string;
6007
8233
  filtered: string[];
6008
8234
  selectedFamily: 'mi' | 'mso' | 'ms' | 'msr' | 'mss';
@@ -6010,13 +8236,16 @@ declare class PraxisIconPickerComponent {
6010
8236
  onFilter(): void;
6011
8237
  choose(icon: string): void;
6012
8238
  onEsc(ev: Event): void;
8239
+ onGlobalKey(ev: KeyboardEvent): void;
6013
8240
  confirmTyped(): void;
8241
+ isSelectedIcon(icon: string): boolean;
6014
8242
  onFamilyChange(val: any): void;
6015
8243
  clear(): void;
6016
8244
  onCancel(): void;
6017
8245
  buildValue(name: string): string;
6018
8246
  previewValue(): string;
6019
8247
  iconClassForFamily(fam: string): string;
8248
+ private focusSearch;
6020
8249
  familyFromValue(v?: string): {
6021
8250
  family: 'mi' | 'mso' | 'msr' | 'mss';
6022
8251
  name: string;
@@ -6076,6 +8305,70 @@ declare function normalizeFormMetadata(list: FieldMetadata[] | undefined | null)
6076
8305
  /** Normalize a full FormConfig object */
6077
8306
  declare function normalizeFormConfig(config: FormConfig): FormConfig;
6078
8307
 
8308
+ /** Minimal metadata about the backend schema source. */
8309
+ interface SchemaMetaInfo {
8310
+ /** API path used to resolve the schema (e.g., /api/employees/all or /filter) */
8311
+ path: string;
8312
+ /** Operation used when fetching the schema (get|post) */
8313
+ operation: string;
8314
+ /** Schema type requested (response|request) */
8315
+ schemaType: string;
8316
+ /** Optional strong hash returned by server (X-Schema-Hash/ETag) */
8317
+ schemaHash?: string;
8318
+ /** Optional resource id field name provided by server */
8319
+ idField?: string;
8320
+ /** API origin used to fetch (useful when not same-origin) */
8321
+ apiOrigin?: string;
8322
+ /** Client-side composed id (path|operation|schemaType|...) */
8323
+ schemaId?: string;
8324
+ }
8325
+ /** Context consumed by SchemaViewer to present component/config/schema metadata. */
8326
+ interface SchemaViewerContext {
8327
+ /** Registered component id (ComponentMetadataRegistry) */
8328
+ componentId: string;
8329
+ /** Optional user-friendly title for the viewer */
8330
+ title?: string;
8331
+ /** Config JSON used by the example (e.g., TabsMetadata, TableConfig) */
8332
+ rawConfig?: unknown;
8333
+ /** Optional pre-computed effective config (raw + defaults) */
8334
+ effectiveConfig?: unknown;
8335
+ /** Raw backend schema JSON (OpenAPI/JSON Schema + x-ui) */
8336
+ backendSchema?: unknown;
8337
+ /** Optional meta associated with backendSchema */
8338
+ schemaMeta?: SchemaMetaInfo;
8339
+ /** Optional already normalized field definitions */
8340
+ normalizedFields?: FieldDefinition[];
8341
+ /** Free-form notes shown on top of the viewer */
8342
+ notes?: string;
8343
+ }
8344
+
8345
+ declare class SchemaViewerComponent implements OnChanges {
8346
+ private readonly registry;
8347
+ private readonly normalizer;
8348
+ private readonly injected;
8349
+ context?: SchemaViewerContext;
8350
+ private _ctx;
8351
+ ctx: i0.Signal<SchemaViewerContext | undefined>;
8352
+ private _componentMeta;
8353
+ componentMeta: i0.Signal<ComponentDocMeta | undefined>;
8354
+ private _normalizedFields;
8355
+ normalizedFields: i0.Signal<FieldDefinition[]>;
8356
+ private _copyNote;
8357
+ copyNote: i0.Signal<string | null>;
8358
+ ngOnChanges(changes: SimpleChanges): void;
8359
+ private refresh;
8360
+ hasAnyData(): boolean;
8361
+ copyAll(): void;
8362
+ copySection(kind: 'component' | 'config' | 'backend' | 'fields'): void;
8363
+ private copyPayload;
8364
+ private flashNote;
8365
+ static ɵfac: i0.ɵɵFactoryDeclaration<SchemaViewerComponent, never>;
8366
+ static ɵcmp: i0.ɵɵComponentDeclaration<SchemaViewerComponent, "praxis-schema-viewer", never, { "context": { "alias": "context"; "required": false; }; }, {}, never, never, true, never>;
8367
+ }
8368
+
8369
+ /** Optional DI token used by SchemaViewer when input is not provided. */
8370
+ declare const SCHEMA_VIEWER_CONTEXT: InjectionToken<SchemaViewerContext>;
8371
+
6079
8372
  interface SchemaIdParams {
6080
8373
  path: string;
6081
8374
  operation?: string;
@@ -6104,6 +8397,7 @@ type FetchWithEtagResult = {
6104
8397
  schema: any;
6105
8398
  schemaHash: string;
6106
8399
  };
8400
+ declare function parseJsonResponseOrEmpty(res: Response, context?: string): Promise<any>;
6107
8401
  declare function fetchWithETag(params: FetchWithEtagParams): Promise<FetchWithEtagResult>;
6108
8402
 
6109
8403
  interface CacheEntry {
@@ -6167,6 +8461,13 @@ declare class LocalStorageCacheAdapter implements CacheAdapter {
6167
8461
  private broadcast;
6168
8462
  }
6169
8463
 
8464
+ declare class MemoryCacheAdapter implements CacheAdapter {
8465
+ private mem;
8466
+ get(schemaId: string): Promise<CacheEntry | undefined>;
8467
+ set(schemaId: string, entry: CacheEntry): Promise<void>;
8468
+ remove(schemaId: string): Promise<void>;
8469
+ }
8470
+
6170
8471
  interface GetSchemaParams extends SchemaIdParams {
6171
8472
  baseUrl: string;
6172
8473
  }
@@ -6259,5 +8560,5 @@ declare function provideFormHookPresets(presets: Array<FormHookPreset>): Provide
6259
8560
  /** Register a whitelist of allowed hook ids/patterns. */
6260
8561
  declare function provideHookWhitelist(allowed: Array<string | RegExp>): Provider[];
6261
8562
 
6262
- export { API_URL, AllowedFileTypes, ApiEndpoint, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentMetadataRegistry, ConnectionManagerService, DEFAULT_TABLE_CONFIG, DynamicFormService, DynamicGridPageComponent, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EmptyStateCardComponent, ErrorMessageService, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FormHooksRegistry, GLOBAL_CONFIG, GenericCrudService, GlobalConfigService, IconPickerService, IconPosition, IconSize, LocalConnectionStorage, LocalStorageCacheAdapter, LocalStorageConfigService, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, OverlayDeciderService, PraxisCore, PraxisIconDirective, PraxisIconPickerComponent, ResourceQuickConnectComponent, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SchemaMetadataClient, SchemaNormalizerService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryService, ValidationPattern, applyLocalCustomizations$1 as applyLocalCustomizations, applyLocalCustomizations as applyLocalFormCustomizations, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildHeaders, buildPageKey, buildSchemaId, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getEssentialConfig, getReferencedFieldMetadata, getTextTransformer, isCssTextTransform, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergeTableConfigs, minWordsValidator, normalizeFieldConstraints, normalizeFormConfig, normalizeFormMetadata, normalizePath, notifySuccessHook, prefillFromContextHook, provideDefaultFormHooks, provideFormHookPresets, provideFormHooks, provideGlobalConfig, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, provideRemoteGlobalConfig, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveHidden, resolveOffset, resolveOrder, resolveSpan, slugify, stripMasksHook, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, trim, uniqueAsyncValidator, urlValidator, withMessage };
6263
- export type { AccessibilityConfig, ActionDefinition, ActionMessagesConfig, AnimationConfig, AnnouncementConfig, ApiUrlConfig, ApiUrlEntry, BackConfig, BaseMaterialInputMetadata, BatchDeleteOptions, BatchDeleteProgress, BatchDeleteResult, BorderConfig, Breakpoint, BuiltValidators, BulkAction, BulkActionsConfig, CacheAdapter, CacheConfig, CacheEntry, ColorConfig, ColumnAlign, ColumnDefinition, ColumnHidden, ColumnOffset, ColumnOrder, ColumnSpan, ComponentDocMeta, ComponentMetadata, ConfigMetadata, ConfigStorage, ConfirmationConfig, ConnectionConfigV1, ConnectionStorage, ContextAction, ContextActionsConfig, BackConfig as CoreBackConfig, CoreFieldMetadata, CrudOperationOptions, CsvExportConfig, CurrencyLocaleConfig, CursorPage, CursorRequest, CustomizationLog, DataConfig, DataTransformation, DataValidationConfig, DateRangePreset, DateRangeValue, DateTimeLocaleConfig, DebounceConfig, DeviceKind, DraggingConfig, ElevationConfig, EmptyAction, EmptyStateConfig, EndpointConfig, EnhancedValidationConfig, ExcelExportConfig, ExcelStylingConfig, ExportConfig, ExportFormat, ExportMessagesConfig, ExportTemplate, FetchWithEtagParams, FetchWithEtagResult, FieldConflict, FieldDefinition, FieldMetadata, FieldModification, FieldOption, FieldsetLayout, FilterOptions, FilteringConfig, FormActionButton, FormActionConfirmationEvent, FormActionsLayout, FormApiLayout, FormBehaviorLayout, FormColumn, FormConfig, FormConfigMetadata, FormConfigState, FormCustomActionEvent, FormEntityEvent, FormHook, FormHookContext, FormHookDeclaration, FormHookDeclarationLite, FormHookOutcome, FormHookPreset, FormHookPresetMatch, FormHookStage, FormHookStatus, FormHooksLayout, FormInitializationError, FormLayout, FormLayoutRule, FormMessagesLayout, FormMetadataLayout, FormOpenMode, FormReadyEvent, FormRow, FormRowLayout, FormRuleContext, FormSection, FormSubmitEvent, FormValidationEvent, FormValueChangeEvent, FormattingLocaleConfig, GeneralExportConfig, GetSchemaParams, GlobalConfig, GlobalCrudActionDefaults, GlobalCrudConfig, GlobalCrudDefaults, GlobalDialogAction, GlobalDialogAnimation, GlobalDialogAriaRole, GlobalDialogConfig, GlobalDialogConfigEntry, GlobalDialogPosition, GlobalDialogStyles, GlobalDynamicFieldsAsyncSelectConfig, GlobalDynamicFieldsCascadeConfig, GlobalDynamicFieldsConfig, GlobalTableConfig, GridItemLayout, GridPageDefinition, GridPageDefinitionWithIds, GridWidgetInstance, HookResolver, InteractionConfig, JsonExportConfig, KeyboardAccessibilityConfig, LazyLoadingConfig, LegacyTableConfig, LoadingConfig, LocalizationConfig, LocateRequest, MarginConfig, MaterialAutocompleteMetadata, MaterialButtonMetadata, MaterialButtonToggleMetadata, MaterialCheckboxMetadata, MaterialChipsMetadata, MaterialColorInputMetadata, MaterialColorPickerMetadata, MaterialCpfCnpjMetadata, MaterialCurrencyMetadata, MaterialDateInputMetadata, MaterialDateRangeMetadata, MaterialDatepickerMetadata, MaterialDatetimeLocalInputMetadata, MaterialDesignConfig, MaterialEmailInputMetadata, MaterialEmailMetadata, MaterialInputMetadata, MaterialMonthInputMetadata, MaterialMultiSelectTreeMetadata, MaterialNumericMetadata, MaterialPasswordMetadata, MaterialPhoneMetadata, MaterialPriceRangeMetadata, MaterialRadioMetadata, MaterialRangeSliderMetadata, MaterialRatingMetadata, MaterialSearchInputMetadata, MaterialSelectMetadata, MaterialSelectionListMetadata, MaterialSliderMetadata, MaterialTextareaMetadata, MaterialTimeInputMetadata, MaterialTimeRangeMetadata, MaterialTimepickerMetadata, MaterialToggleMetadata, MaterialTransferListMetadata, MaterialTreeNode, MaterialTreeSelectMetadata, MaterialUrlInputMetadata, MaterialWeekInputMetadata, MaterialYearInputMetadata, MemoryConfig, MessageTemplate, MessagesConfig, NestedFieldsetLayout, NumberLocaleConfig, OptionDTO, OverlayDecider, OverlayDecision, OverlayDecisionContext, OverlayDecisionMatrix, OverlayPattern, OverlayRange, OverlayRule, OverlayRuleMatch, OverlayThresholds, Page, PageIdentity, PageableRequest, PaginationConfig, PartialFieldMetadata, PdfExportConfig, PerformanceConfig, PersistedPageConfig, PersistedWidgetInstance, PlainObject, PluginConfig, PollingConfig, PriceRangeValue, RangeSliderValue, RenderingConfig, ResizingConfig, ResponsiveConfig, RowAction, RowActionsConfig, RunHooksResult, SchemaIdParams, SelectionConfig, SerializableFieldMetadata, SettingsPanelBridge, SettingsPanelOpenContent, SettingsPanelOpenOptions, SettingsPanelRef, SettingsValueProvider, SortingConfig, SpacingConfig, StateMessagesConfig, SyncConfig, SyncResult, TableActionsConfig, TableAppearanceConfig, TableBehaviorConfig, TableConfig, TableConfigV2 as TableConfigModern, TableConfigState, TableConfigV2, TelemetryEvent, TextTransformApply, TextTransformName, ThemeConfig, ToolbarAction, ToolbarConfig, ToolbarFilterConfig, ToolbarLayoutConfig, ToolbarSettingsConfig, TypographyConfig, ValidationContext, ValidationError, ValidationMessagesConfig, ValidationResult, ValidationRule, ValidatorFunction, ValidatorOptions, VirtualizationConfig, WidgetConnection, WidgetDefinition, WidgetInstance, WidgetPageDefinition };
8563
+ export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, ApiConfigStorage, ApiEndpoint, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, ConnectionManagerService, ConsoleLoggerSink, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_TABLE_CONFIG, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DynamicFormService, DynamicGridPageComponent, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, 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_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_ALIAS_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_ALIAS_TOKEN_TO_CONTROL_TYPE, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, 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_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_TELEMETRY_TRANSPORT, PraxisCore, PraxisGlobalErrorHandler, PraxisIconDirective, PraxisIconPickerComponent, PraxisLoadingInterceptor, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceQuickConnectComponent, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetShellComponent, applyLocalCustomizations$1 as applyLocalCustomizations, applyLocalCustomizations as applyLocalFormCustomizations, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildHeaders, buildPageKey, 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, getEssentialConfig, getFieldMetadataCapabilities, getGlobalActionCatalog, getGlobalActionUiSchema, getReferencedFieldMetadata, getTextTransformer, isCssTextTransform, isInlineFilterControlType, isRangeValidForFilter, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergeTableConfigs, migrateFormLayoutRule, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEnd, normalizeFieldConstraints, normalizeFormConfig, normalizeFormMetadata, normalizePath, normalizeStart, normalizeUnknownError, notifySuccessHook, parseJsonResponseOrEmpty, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisDynamicPageMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisLoadingDefaults, providePraxisLogging, providePraxisToastGlobalActions, provideRemoteGlobalConfig, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveHidden, resolveInlineFilterAliasToBaseControlType, resolveInlineFilterControlTypeAlias, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolveSpan, slugify, stripMasksHook, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, trim, uniqueAsyncValidator, urlValidator, withMessage };
8564
+ export type { AccessibilityConfig, ActionDefinition, ActionMessagesConfig, AiCapability, AiCapabilityCatalog, AiCapabilityCategory, AiCapabilityCategoryMap, AiConcept, AiConceptPack, AiValueKind, AnimationConfig, AnnouncementConfig, ApiConfigStorageOptions, ApiUrlConfig, ApiUrlEntry, AsyncConfigStorage, BackConfig, BaseMaterialInputMetadata, BatchDeleteOptions, BatchDeleteProgress, BatchDeleteResult, BorderConfig, Breakpoint, BuiltValidators, BulkAction, BulkActionsConfig, CacheAdapter, CacheConfig, CacheEntry, Capability$1 as Capability, CapabilityCatalog$1 as CapabilityCatalog, CapabilityCategory$1 as CapabilityCategory, ColorConfig, ColumnAlign, ColumnDefinition, ColumnHidden, ColumnOffset, ColumnOrder, ColumnSpan, ComponentActionParam, ComponentContextAction, ComponentContextOption, ComponentContextOptionMode, ComponentContextOptionsByPathEntry, ComponentContextPack, ComponentDocMeta, ComponentKeyParams, ComponentMergePatch, ComponentMetadata, ConfigMetadata, ConfigStorage, ConfirmationConfig, ConnectionConfigV1, ConnectionStorage, ContextAction, ContextActionsConfig, BackConfig as CoreBackConfig, CoreFieldMetadata, CrudOperationOptions, CsvExportConfig, CurrencyLocaleConfig, CursorPage, CursorRequest, CustomizationLog, DataConfig, DataTransformation, DataValidationConfig, DateRangePreset, DateRangeValue, DateTimeLocaleConfig, DebounceConfig, DeviceKind, DraggingConfig, Capability as DynamicPageCapability, CapabilityCatalog as DynamicPageCapabilityCatalog, CapabilityCategory as DynamicPageCapabilityCategory, ValueKind as DynamicPageValueKind, ElevationConfig, EmptyAction, EmptyStateConfig, EndpointConfig, EnhancedValidationConfig, ExcelExportConfig, ExcelStylingConfig, ExportConfig, ExportFormat, ExportMessagesConfig, ExportTemplate, FetchWithEtagParams, FetchWithEtagResult, FieldConflict, FieldDefinition, FieldMetadata, FieldModification, FieldOption, FieldSelectorRegistryMap, FieldsetLayout, FilterOptions, FilteringConfig, FormActionButton, FormActionConfirmationEvent, FormActionsLayout, FormApiLayout, FormBehaviorLayout, FormColumn, FormConfig, FormConfigMetadata, FormConfigState, FormCustomActionEvent, FormEntityEvent, FormHook, FormHookContext, FormHookDeclaration, FormHookDeclarationLite, FormHookOutcome, FormHookPreset, FormHookPresetMatch, FormHookStage, FormHookStatus, FormHooksLayout, FormInitializationError, FormLayout, FormLayoutRule, FormMessagesLayout, FormMetadataLayout, FormModeHints, FormOpenMode, FormReadyEvent, FormRow, FormRowLayout, FormRuleTargetType, FormSection, FormSubmitEvent, FormValidationEvent, FormValueChangeEvent, FormattingLocaleConfig, GeneralExportConfig, GetSchemaParams, GlobalActionCatalogEntry, GlobalActionContext, GlobalActionField, GlobalActionFieldOption, GlobalActionFieldType, GlobalActionHandler, GlobalActionHandlerEntry, GlobalActionId, GlobalActionParam, GlobalActionResult, GlobalActionSpec, GlobalActionUiSchema, GlobalAiConfig, GlobalAiEmbeddingConfig, GlobalAiProvider, GlobalAnalyticsService, GlobalApiClient, GlobalCacheConfig, GlobalConfig, GlobalCrudActionDefaults, GlobalCrudConfig, GlobalCrudDefaults, GlobalDialogAction, GlobalDialogAnimation, GlobalDialogAriaRole, GlobalDialogConfig, GlobalDialogConfigEntry, GlobalDialogPosition, GlobalDialogService, GlobalDialogStyles, GlobalDynamicFieldsAsyncSelectConfig, GlobalDynamicFieldsCascadeConfig, GlobalDynamicFieldsConfig, GlobalRouteGuardResolver, GlobalTableConfig, GlobalToastService, GridItemLayout, GridPageDefinition, GridPageDefinitionWithIds, GridWidgetInstance, HookResolver, InlineFilterControlType, InlineRangeDistributionBin, InlineRangeDistributionConfig, InteractionConfig, JsonExportConfig, KeyboardAccessibilityConfig, LazyLoadingConfig, LegacyTableConfig, LoadingConfig, LoadingContext, LoadingPhase$1 as LoadingPhase, LoadingScope, LoadingState, LoadingPhase as LoadingStatePhase, LocalizationConfig, LocateRequest, LoggerConfig, LoggerContext, LoggerEvent, LoggerLevel, LoggerLogOptions, LoggerNormalizedError, LoggerPIIConfig, LoggerSink, LoggerTelemetryPayload, LoggerThrottleConfig, MarginConfig, MaterialAutocompleteMetadata, MaterialButtonMetadata, MaterialButtonToggleMetadata, MaterialCheckboxMetadata, MaterialChipsMetadata, MaterialColorInputMetadata, MaterialColorPickerMetadata, MaterialCpfCnpjMetadata, MaterialCurrencyMetadata, MaterialDateInputMetadata, MaterialDateRangeMetadata, MaterialDatepickerMetadata, MaterialDatetimeLocalInputMetadata, MaterialDesignConfig, MaterialEmailInputMetadata, MaterialEmailMetadata, MaterialInputMetadata, MaterialMonthInputMetadata, MaterialMultiSelectTreeMetadata, MaterialNumericMetadata, MaterialPasswordMetadata, MaterialPhoneMetadata, MaterialPriceRangeMetadata, MaterialRadioMetadata, MaterialRangeSliderMetadata, MaterialRatingMetadata, MaterialSearchInputMetadata, MaterialSelectMetadata, MaterialSelectionListMetadata, MaterialSliderMetadata, MaterialTextareaMetadata, MaterialTimeInputMetadata, MaterialTimeRangeMetadata, MaterialTimeTrackShift, MaterialTimepickerMetadata, MaterialToggleMetadata, MaterialTransferListMetadata, MaterialTreeNode, MaterialTreeSelectMetadata, MaterialUrlInputMetadata, MaterialWeekInputMetadata, MaterialYearInputMetadata, MemoryConfig, MessageTemplate, MessagesConfig, NestedFieldsetLayout, NormalizedError, NumberLocaleConfig, ObservabilityAlert, ObservabilityAlertGroupBy, ObservabilityAlertRule, ObservabilityAlertSeverity, ObservabilityCountBucket, ObservabilityDashboardOptions, ObservabilityIngestInput, ObservabilityMetricsSnapshot, OptionDTO, OverlayDecider, OverlayDecision, OverlayDecisionContext, OverlayDecisionMatrix, OverlayPattern, OverlayRange, OverlayRule, OverlayRuleMatch, OverlayThresholds, Page, PageIdentity, PageableRequest, PaginationConfig, PartialFieldMetadata, PdfExportConfig, PerformanceConfig, PersistedPageConfig, PersistedWidgetInstance, PlainObject, PluginConfig, PollingConfig, PraxisAnalyticsOptions, PraxisAuthContext, PraxisGlobalActionsOptions, PraxisGlobalConfigBootstrapOptions, PraxisLoadingRenderer, PraxisLoggingEnvironment, PraxisLoggingOptions, PraxisToastOptions, PriceRangeValue, RangeSliderInlineTexts, RangeSliderQuickPreset, RangeSliderQuickPresetLabels, RangeSliderValue, RenderingConfig, ResizingConfig, ResolvePresetOptions, ResponsiveConfig, RowAction, RowActionsConfig, RulePropertyDefinition, RulePropertySchema, RulePropertyType, RunHooksResult, SchemaIdParams, SchemaMetaInfo, SchemaViewerContext, SelectionConfig, SerializableFieldMetadata, SettingsPanelBridge, SettingsPanelOpenContent, SettingsPanelOpenOptions, SettingsPanelRef, SettingsValueProvider, SortingConfig, SpacingConfig, StateMessagesConfig, SyncConfig, SyncResult, TableActionsConfig, TableAppearanceConfig, TableBehaviorConfig, TableConfig, TableConfigV2 as TableConfigModern, TableConfigState, TableConfigV2, TableExpansionConfig, TableLocalDataModeConfig, TelemetryEvent, TelemetryLoggerSinkOptions, TelemetryTransport, TextTransformApply, TextTransformName, ThemeConfig, ToolbarAction, ToolbarConfig, ToolbarFilterConfig, ToolbarLayoutConfig, ToolbarSettingsConfig, TypographyConfig, ValidationContext, ValidationError, ValidationMessagesConfig, ValidationResult, ValidationRule, ValidatorFunction, ValidatorOptions, ValueKind$1 as ValueKind, VirtualizationConfig, WidgetConnection, WidgetDefinition, WidgetInstance, WidgetPageDefinition, WidgetPageLayout, WidgetPageOrientation, WidgetShellAction, WidgetShellActionEvent, WidgetShellActionPlacement, WidgetShellConfig, WidgetShellWindowActions };