@praxisui/list 1.0.0-beta.7 → 2.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -1,20 +1,76 @@
1
1
  import * as rxjs from 'rxjs';
2
2
  import { BehaviorSubject, Observable } from 'rxjs';
3
3
  import * as i0 from '@angular/core';
4
- import { OnInit, OnChanges, EventEmitter, SimpleChanges, DoCheck, Provider } from '@angular/core';
4
+ import { OnInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges, ChangeDetectorRef, DoCheck, Provider } from '@angular/core';
5
5
  import { MatSelectionListChange } from '@angular/material/list';
6
6
  import { FormGroup, FormControl } from '@angular/forms';
7
+ import { BaseAiAdapter, Capability as Capability$1, PatchResult } from '@praxisui/ai';
7
8
  import { SettingsValueProvider } from '@praxisui/settings-panel';
8
- import { ComponentDocMeta } from '@praxisui/core';
9
+ import { GlobalActionCatalogEntry, ComponentDocMeta, AiCapabilityCategory, AiValueKind, AiCapability, AiCapabilityCatalog } from '@praxisui/core';
9
10
 
10
- type TemplateType = 'text' | 'icon' | 'image' | 'chip' | 'rating' | 'currency' | 'date' | 'html' | 'slot';
11
+ type TemplateType = 'text' | 'icon' | 'image' | 'chip' | 'rating' | 'currency' | 'date' | 'html' | 'slot' | 'metric' | 'compose' | 'component';
11
12
  interface TemplateDef {
12
13
  type: TemplateType;
13
- expr: string;
14
+ expr?: string;
14
15
  class?: string;
15
16
  style?: string;
16
17
  color?: string;
17
18
  variant?: 'filled' | 'outlined';
19
+ props?: {
20
+ rating?: {
21
+ max?: number;
22
+ size?: number;
23
+ color?: string;
24
+ };
25
+ metric?: {
26
+ label?: string;
27
+ valueExpr?: string;
28
+ caption?: string;
29
+ subcaption?: string;
30
+ captionPosition?: 'below-value' | 'below-progress';
31
+ icon?: string;
32
+ iconExpr?: string;
33
+ tone?: string;
34
+ toneExpr?: string;
35
+ layout?: 'value-only' | 'value+caption' | 'icon+value+caption' | 'stacked-center';
36
+ align?: 'start' | 'center' | 'end';
37
+ progress?: {
38
+ valueExpr?: string;
39
+ max?: number;
40
+ mode?: 'determinate' | 'indeterminate';
41
+ color?: string;
42
+ colorExpr?: string;
43
+ trackColor?: string;
44
+ };
45
+ valueClass?: string;
46
+ valueStyle?: string;
47
+ showBar?: boolean;
48
+ barValueExpr?: string;
49
+ barColor?: string;
50
+ barVariant?: 'determinate' | 'indeterminate';
51
+ legendExpr?: string;
52
+ iconPosition?: 'left' | 'right' | 'top';
53
+ iconColorExpr?: string;
54
+ };
55
+ compose?: {
56
+ items?: TemplateDef[];
57
+ direction?: 'row' | 'column';
58
+ align?: 'start' | 'center' | 'end';
59
+ gap?: string;
60
+ wrap?: boolean;
61
+ class?: string;
62
+ style?: string;
63
+ nodes?: TemplateDef[];
64
+ separator?: string;
65
+ orientation?: 'horizontal' | 'vertical';
66
+ };
67
+ component?: {
68
+ id: string;
69
+ inputs?: Record<string, any>;
70
+ class?: string;
71
+ style?: string;
72
+ };
73
+ };
18
74
  imageAlt?: string;
19
75
  badge?: {
20
76
  expr: string;
@@ -28,6 +84,38 @@ interface ListFeatureDef {
28
84
  class?: string;
29
85
  style?: string;
30
86
  }
87
+ interface TemplateFeatureDef extends TemplateDef {
88
+ icon?: string;
89
+ }
90
+ type TemplatingFeatureDef = ListFeatureDef | TemplateFeatureDef;
91
+ type ListExpansionSectionType = 'info-list' | 'chip-list' | 'timeline' | 'key-value' | 'metadata' | 'component';
92
+ interface ListExpansionSectionDef {
93
+ id: string;
94
+ title?: string;
95
+ type: ListExpansionSectionType;
96
+ itemsExpr?: string;
97
+ emptyLabel?: string;
98
+ metadata?: {
99
+ orientation?: 'horizontal' | 'vertical';
100
+ columns?: 1 | 2 | 3;
101
+ gap?: string;
102
+ keyClass?: string;
103
+ valueClass?: string;
104
+ keyStyle?: string;
105
+ valueStyle?: string;
106
+ };
107
+ component?: {
108
+ id: string;
109
+ inputs?: Record<string, any>;
110
+ class?: string;
111
+ style?: string;
112
+ };
113
+ class?: string;
114
+ style?: string;
115
+ showIf?: string;
116
+ }
117
+ type ListTemplatingSlot = 'leading' | 'primary' | 'secondary' | 'meta' | 'trailing' | 'identity' | 'balance' | 'limit' | 'risk' | 'alerts' | 'owner';
118
+ type ListRowLayoutSlot = ListTemplatingSlot | 'actions' | 'expand';
31
119
  interface PraxisListConfig {
32
120
  id?: string;
33
121
  dataSource?: {
@@ -37,8 +125,9 @@ interface PraxisListConfig {
37
125
  sort?: string[];
38
126
  };
39
127
  layout?: {
40
- variant?: 'list' | 'cards';
128
+ variant?: 'list' | 'cards' | 'tiles';
41
129
  density?: 'default' | 'comfortable' | 'compact';
130
+ itemSpacing?: 'none' | 'tight' | 'default' | 'relaxed';
42
131
  lines?: 1 | 2 | 3;
43
132
  dividers?: 'none' | 'between' | 'all';
44
133
  model?: 'standard' | 'media' | 'hotel';
@@ -46,9 +135,27 @@ interface PraxisListConfig {
46
135
  stickySectionHeader?: boolean;
47
136
  virtualScroll?: boolean;
48
137
  pageSize?: number;
138
+ rowLayout?: {
139
+ type?: 'grid' | 'flex';
140
+ columns?: Array<{
141
+ slot: ListRowLayoutSlot;
142
+ width?: string;
143
+ minWidth?: string;
144
+ maxWidth?: string;
145
+ align?: 'start' | 'center' | 'end';
146
+ justify?: 'start' | 'center' | 'end' | 'stretch';
147
+ class?: string;
148
+ style?: string;
149
+ }>;
150
+ gap?: string;
151
+ align?: 'start' | 'center' | 'end' | 'stretch';
152
+ itemAlignY?: 'start' | 'center' | 'end' | 'stretch';
153
+ class?: string;
154
+ style?: string;
155
+ };
49
156
  };
50
157
  skin?: {
51
- type?: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'custom';
158
+ type?: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'outline' | 'flat' | 'neumorphism' | 'custom';
52
159
  gradient?: {
53
160
  from: string;
54
161
  to: string;
@@ -68,15 +175,31 @@ interface PraxisListConfig {
68
175
  compareBy?: string;
69
176
  return?: 'value' | 'item' | 'id';
70
177
  };
178
+ interaction?: {
179
+ expandable?: boolean;
180
+ expandTrigger?: 'row' | 'icon' | 'row+icon';
181
+ expandMode?: 'single' | 'multiple';
182
+ expandPlacement?: 'expand' | 'trailing';
183
+ };
71
184
  templating?: {
72
185
  leading?: TemplateDef;
73
186
  primary?: TemplateDef;
74
187
  secondary?: TemplateDef;
75
188
  meta?: TemplateDef;
76
189
  trailing?: TemplateDef;
190
+ identity?: TemplateDef;
191
+ balance?: TemplateDef;
192
+ limit?: TemplateDef;
193
+ risk?: TemplateDef;
194
+ alerts?: TemplateDef;
195
+ owner?: TemplateDef;
77
196
  metaPlacement?: 'side' | 'line';
78
197
  metaPrefixIcon?: string;
79
- features?: ListFeatureDef[];
198
+ statusPosition?: 'inline' | 'top-right';
199
+ chipColorMap?: Record<string, string>;
200
+ chipLabelMap?: Record<string, string>;
201
+ iconColorMap?: Record<string, string>;
202
+ features?: TemplatingFeatureDef[];
80
203
  featuresVisible?: boolean;
81
204
  featuresMode?: 'icons+labels' | 'icons-only' | 'labels-only';
82
205
  sectionHeader?: TemplateDef;
@@ -85,6 +208,65 @@ interface PraxisListConfig {
85
208
  count?: number;
86
209
  };
87
210
  };
211
+ rules?: {
212
+ itemStyles?: Array<{
213
+ id: string;
214
+ condition?: string;
215
+ class?: string;
216
+ style?: string;
217
+ border?: string;
218
+ background?: string;
219
+ }>;
220
+ slotOverrides?: Array<{
221
+ id: string;
222
+ slot: ListTemplatingSlot;
223
+ condition?: string;
224
+ template?: TemplateDef;
225
+ class?: string;
226
+ style?: string;
227
+ hide?: boolean;
228
+ }>;
229
+ };
230
+ expansion?: {
231
+ sections?: ListExpansionSectionDef[];
232
+ dataSource?: {
233
+ mode?: 'inline' | 'resource' | 'resourcePath';
234
+ resource?: {
235
+ kind: string;
236
+ id: string;
237
+ version: string;
238
+ };
239
+ resourcePath?: {
240
+ path: string;
241
+ method?: 'GET' | 'POST';
242
+ paramsMap?: Record<string, string>;
243
+ };
244
+ resourceAllowList?: string[];
245
+ fallbackMode?: 'none' | 'inline' | 'resource';
246
+ cache?: {
247
+ enabled?: boolean;
248
+ };
249
+ cancelOnCollapse?: boolean;
250
+ };
251
+ schemaContract?: {
252
+ kind: 'praxis.detail.schema';
253
+ version: string;
254
+ allowedNodes?: Array<'info-list' | 'chip-list' | 'timeline' | 'key-value' | 'metadata' | 'component'>;
255
+ maxSections?: number;
256
+ maxItemsPerSection?: number;
257
+ requireSectionIds?: boolean;
258
+ };
259
+ rendering?: {
260
+ shell?: 'attached' | 'detached' | 'modal';
261
+ columns?: 1 | 2 | 3;
262
+ gap?: string;
263
+ padding?: string;
264
+ class?: string;
265
+ style?: string;
266
+ loadingTemplate?: TemplateDef;
267
+ errorTemplate?: TemplateDef;
268
+ };
269
+ };
88
270
  actions?: Array<{
89
271
  id: string;
90
272
  icon?: string;
@@ -94,8 +276,29 @@ interface PraxisListConfig {
94
276
  buttonVariant?: 'stroked' | 'raised' | 'flat';
95
277
  showIf?: string;
96
278
  emitPayload?: 'item' | 'id' | 'value';
279
+ command?: string;
280
+ globalPayload?: any;
281
+ emitLocal?: boolean;
282
+ showLoading?: boolean;
283
+ placement?: 'actions' | 'trailing';
284
+ confirmation?: {
285
+ title?: string;
286
+ message?: string;
287
+ type?: 'danger' | 'warning' | 'info';
288
+ };
97
289
  }>;
98
290
  i18n?: Record<string, string>;
291
+ ui?: {
292
+ showSearch?: boolean;
293
+ searchField?: string;
294
+ searchPlaceholder?: string;
295
+ showSort?: boolean;
296
+ sortOptions?: Array<string | {
297
+ label: string;
298
+ value: string;
299
+ }>;
300
+ showRange?: boolean;
301
+ };
99
302
  a11y?: {
100
303
  ariaLabel?: string;
101
304
  ariaLabelledBy?: string;
@@ -131,13 +334,23 @@ interface ListSection<T = any> {
131
334
  items: T[];
132
335
  }
133
336
  declare class ListDataService<T = any> {
337
+ private readonly DEBUG;
134
338
  private config$;
135
339
  private refresh$;
136
340
  private pageable$;
137
341
  private query$;
138
342
  readonly loading$: BehaviorSubject<boolean>;
139
343
  readonly total$: BehaviorSubject<number>;
344
+ readonly pageState$: Observable<{
345
+ pageNumber: number;
346
+ pageSize: number;
347
+ sort?: string[];
348
+ }>;
140
349
  private lastSig;
350
+ private nextObjectId;
351
+ private readonly objectIds;
352
+ private readonly logger;
353
+ private readonly logContext;
141
354
  private readonly crud;
142
355
  setConfig(config: PraxisListConfig): void;
143
356
  refresh(): void;
@@ -149,13 +362,51 @@ declare class ListDataService<T = any> {
149
362
  setSort(sort: string[]): void;
150
363
  setQuery(q: Record<string, any>): void;
151
364
  groupedStream(): Observable<ListSection<T>[]>;
365
+ private buildConfigSignature;
366
+ private buildLocalDataSignature;
367
+ private ensureObjectId;
368
+ private safeSerialize;
369
+ private warnFilterFallbackOnce;
370
+ private buildLogOptions;
152
371
  static ɵfac: i0.ɵɵFactoryDeclaration<ListDataService<any>, never>;
153
372
  static ɵprov: i0.ɵɵInjectableDeclaration<ListDataService<any>>;
154
373
  }
155
374
 
156
- declare class PraxisList implements OnInit, OnChanges {
375
+ declare class ListAiAdapter extends BaseAiAdapter<PraxisListConfig> {
376
+ private list;
377
+ componentName: string;
378
+ constructor(list: PraxisList);
379
+ getCurrentConfig(): PraxisListConfig;
380
+ getCapabilities(): Capability$1[];
381
+ getRuntimeState(): Record<string, any>;
382
+ createSnapshot(): PraxisListConfig;
383
+ restoreSnapshot(snapshot: PraxisListConfig): Promise<void>;
384
+ applyPatch(patch: Partial<PraxisListConfig>, _intent?: string): Promise<PatchResult>;
385
+ private applyConfig;
386
+ private smartMergeListConfig;
387
+ private sanitizePatch;
388
+ private cloneConfig;
389
+ }
390
+
391
+ interface ListRowLayoutColumnViewModel {
392
+ slot: ListRowLayoutSlot;
393
+ width?: string;
394
+ minWidth?: string;
395
+ maxWidth?: string;
396
+ align?: 'start' | 'center' | 'end';
397
+ justify?: 'start' | 'center' | 'end' | 'stretch';
398
+ class?: string;
399
+ style?: string;
400
+ }
401
+ declare class PraxisList implements OnInit, OnChanges, OnDestroy {
402
+ private static nextSkinScopeId;
403
+ private customizationEnabled;
157
404
  config: PraxisListConfig;
405
+ listId: string;
406
+ componentInstanceId?: string;
158
407
  form?: FormGroup | null;
408
+ set enableCustomization(value: boolean);
409
+ get enableCustomization(): boolean;
159
410
  itemClick: EventEmitter<ListItemEvent>;
160
411
  actionClick: EventEmitter<ListActionEvent>;
161
412
  selectionChange: EventEmitter<ListSelectionEvent>;
@@ -163,36 +414,124 @@ declare class PraxisList implements OnInit, OnChanges {
163
414
  sections$: rxjs.Observable<ListSection<any>[]>;
164
415
  loading$: rxjs.Observable<boolean>;
165
416
  total$: rxjs.Observable<number>;
417
+ page$: rxjs.Observable<{
418
+ pageNumber: number;
419
+ pageSize: number;
420
+ sort?: string[];
421
+ }>;
422
+ private lastQuery;
423
+ private search$;
166
424
  get layoutLines(): number;
167
425
  boundControl: FormControl<unknown | unknown[] | null>;
426
+ readonly skinScopeId: string;
168
427
  skinClasses: string;
169
428
  inlineCss: string;
429
+ readonly cspNonce: string | null;
430
+ aiAdapter: ListAiAdapter;
170
431
  private readonly storage;
171
432
  private readonly skin;
172
433
  private inferredForPath;
434
+ private schemaInferenceInFlight;
435
+ private readonly schemaFieldsByPath;
436
+ private appliedRuntimeConfig?;
173
437
  private readonly data;
174
438
  private readonly settings;
175
439
  private readonly cdr;
440
+ private readonly componentKeys;
441
+ private readonly logger;
442
+ private readonly i18n;
443
+ private readonly logContext;
444
+ private readonly route;
445
+ private readonly globalActions;
446
+ private readonly dialog;
447
+ private warnedMissingId;
448
+ private hasHydratedPersistence;
449
+ private hydratedPersistenceKey;
450
+ private hydratingPersistenceKey;
451
+ private externalConfigRevision;
452
+ private nextActionItemObjectId;
453
+ private readonly actionItemObjectIds;
454
+ private nextExpansionItemObjectId;
455
+ private readonly expansionItemObjectIds;
456
+ private readonly destroy$;
457
+ actionLoadingState: Record<string, boolean>;
458
+ private expandedItemKeys;
176
459
  ngOnInit(): void;
177
460
  ngOnChanges(changes: SimpleChanges): void;
461
+ ngOnDestroy(): void;
178
462
  private applyPersistence;
463
+ private initializeDataStreams;
464
+ private setupSearch;
465
+ private persistConfig;
179
466
  private applySkins;
180
467
  isListVariant(): boolean;
468
+ isCardsVariant(): boolean;
469
+ isTilesVariant(): boolean;
181
470
  isSelectionEnabled(): boolean;
182
471
  private setupSelectionBinding;
183
- leading: (item: any) => any;
184
- primary: (item: any) => any;
185
- secondary: (item: any) => any;
186
- meta: (item: any) => any;
187
- trailing: (item: any) => any;
188
- sectionHeader: (key: string) => string;
189
- featureLabel(item: any, expr: string): string;
472
+ leading: (item: any) => Record<string, any> | null;
473
+ primary: (item: any) => Record<string, any> | null;
474
+ secondary: (item: any) => Record<string, any> | null;
475
+ meta: (item: any) => Record<string, any> | null;
476
+ trailing: (item: any) => Record<string, any> | null;
477
+ identity: (item: any) => Record<string, any> | null;
478
+ balance: (item: any) => Record<string, any> | null;
479
+ limit: (item: any) => Record<string, any> | null;
480
+ risk: (item: any) => Record<string, any> | null;
481
+ alerts: (item: any) => Record<string, any> | null;
482
+ owner: (item: any) => Record<string, any> | null;
483
+ sectionHeaderTemplate: (key: string) => Record<string, any>;
484
+ emptyStateTemplate: () => Record<string, any>;
485
+ itemRuleClass(item: any): string | undefined;
486
+ itemRuleStyle(item: any): string | undefined;
487
+ rowLayoutItemStyle(item: any): string | undefined;
488
+ rowLayoutItemClass(item: any): string | undefined;
489
+ hasRowLayoutGrid(): boolean;
490
+ rowLayoutColumns(): ListRowLayoutColumnViewModel[];
491
+ rowLayoutTrackColumn(index: number, column: ListRowLayoutColumnViewModel): string;
492
+ rowLayoutContentStyle(): string | undefined;
493
+ rowLayoutContentClass(): string | undefined;
494
+ rowLayoutColumnClass(column: ListRowLayoutColumnViewModel): string | undefined;
495
+ rowLayoutColumnStyle(column: ListRowLayoutColumnViewModel): string | undefined;
496
+ rowLayoutSlot(item: any, slot: string): Record<string, any> | null;
497
+ rowLayoutHasSlot(slot: ListRowLayoutSlot): boolean;
498
+ rowLayoutImageAlt(slot: string): string;
499
+ rowLayoutAlignItems(): 'start' | 'center' | 'end' | 'stretch';
500
+ private rowLayoutTemplateColumns;
501
+ private rowLayoutColumnWidth;
502
+ private rowLayoutTextAlign;
503
+ private cssVar;
504
+ private sanitizeCssToken;
505
+ featureLabel(item: any, expr?: string): string;
506
+ plainText(value: string | null | undefined): string | null;
507
+ itemAriaLabel(item: any): string | null;
508
+ private accessibleItemLabel;
509
+ private slotAriaLabel;
510
+ private nodeAriaLabel;
511
+ featureLabelLines(item: any, expr?: string): string[];
512
+ featureSemanticClass(item: any, expr?: string, featureClass?: string): string | null;
513
+ featureProgressPercent(item: any, expr?: string, featureClass?: string): number | null;
514
+ private metricText;
515
+ private metricToken;
516
+ private buildMetricView;
517
+ private buildComposeView;
518
+ private buildMetricProgress;
519
+ private metricLayout;
520
+ private metricAlign;
521
+ private metricIconPosition;
522
+ private metricToneClass;
523
+ private metricToneStyle;
524
+ private metricColorStyle;
525
+ private metricCssVar;
526
+ private resolveMetricColor;
527
+ private joinStyles;
528
+ private joinClasses;
190
529
  featuresVisible(): boolean;
191
530
  featuresMode(): 'icons+labels' | 'icons-only' | 'labels-only';
192
531
  hasSkeleton(): boolean;
193
532
  skeletonCount(): number;
194
533
  skeletonItems(): any[];
195
- visibleActions(item: any): {
534
+ visibleActions(item: any, placement?: 'actions' | 'trailing'): {
196
535
  id: string;
197
536
  icon?: string;
198
537
  label?: string;
@@ -201,28 +540,422 @@ declare class PraxisList implements OnInit, OnChanges {
201
540
  buttonVariant?: "stroked" | "raised" | "flat";
202
541
  showIf?: string;
203
542
  emitPayload?: "item" | "id" | "value";
543
+ command?: string;
544
+ globalPayload?: any;
545
+ emitLocal?: boolean;
546
+ showLoading?: boolean;
547
+ placement?: "actions" | "trailing";
548
+ confirmation?: {
549
+ title?: string;
550
+ message?: string;
551
+ type?: "danger" | "warning" | "info";
552
+ };
204
553
  }[];
205
554
  onItemClick(item: any, index: number, section?: string): void;
206
- onActionClick(ev: MouseEvent, actionId: string, item: any, index: number): void;
555
+ onRowActivate(item: any, index: number, section?: string): void;
556
+ onRowSpaceActivate(event: Event, clickable: boolean, item: any, index: number, section?: string): void;
557
+ onExpandToggle(event: Event, item: any, index: number): void;
558
+ onActionKeydown(ev: Event): void;
559
+ configEditorLabel(): string;
560
+ expandToggleAriaLabel(item: any, index: number): string;
561
+ expansionRegionAriaLabel(item: any): string;
562
+ emptyStateLabel(): string;
563
+ onActionClick(ev: MouseEvent, actionId: string, item: any, index: number): Promise<void>;
564
+ private isGlobalCommand;
565
+ private resolveActionPayload;
566
+ private resolveTemplate;
567
+ private resolveStringTemplate;
568
+ private lookup;
207
569
  onSelectionChange(_change: MatSelectionListChange): void;
208
570
  openConfigEditor(): void;
209
571
  nextPage(): void;
210
572
  prevPage(): void;
211
- private onEditorApplied;
573
+ setPageSize(ps: number): void;
574
+ onSortChange(val: string): void;
575
+ onSearchInput(val: string): void;
576
+ sortOptionValue(op: any): string;
577
+ sortOptionLabel(op: any): string;
578
+ rangeStart(ps: {
579
+ pageNumber: number;
580
+ pageSize: number;
581
+ }): number;
582
+ rangeEnd(currLen: number, ps: {
583
+ pageNumber: number;
584
+ pageSize: number;
585
+ }, total: number): number;
586
+ applyConfigFromAdapter(newCfg: PraxisListConfig): void;
587
+ private applyAuthoringPayload;
588
+ private buildListEditorRuntimeContext;
589
+ private executeListEditorApplyPlan;
590
+ private storageKey;
591
+ private componentKeyId;
592
+ private warnMissingId;
212
593
  private readonly crud;
213
- private tryInferTemplatingFromSchema;
594
+ private executeSchemaInferenceForPlan;
214
595
  private evalSlot;
596
+ private resolveSlotTemplate;
597
+ private evaluateTemplateNode;
598
+ private buildUnsupportedComposeNode;
599
+ private buildRuntimeComponentView;
600
+ private resolveComponentInputs;
601
+ private resolveComponentInputValue;
602
+ private resolveComponentStringInput;
603
+ isExpandable(): boolean;
604
+ expandableByRow(): boolean;
605
+ expansionOwnedByRow(): boolean;
606
+ expansionOwnedByIcon(): boolean;
607
+ showExpandIcon(placement?: 'expand' | 'trailing'): boolean;
608
+ expandPlacement(): 'expand' | 'trailing';
609
+ private actionPlacement;
610
+ isExpanded(item: any, index: number): boolean;
611
+ expandRegionId(item: any, index: number): string;
612
+ expansionSections(): ListExpansionSectionDef[];
613
+ expansionSectionItems(item: any, section: ListExpansionSectionDef, index?: number): any[];
614
+ expansionSectionHasContent(item: any, section: ListExpansionSectionDef, index?: number): boolean;
615
+ expansionItemLabel(value: any): string;
616
+ expansionInfoTitle(value: any): string;
617
+ expansionInfoValue(value: any): string;
618
+ expansionTimelineTitle(value: any): string;
619
+ expansionTimelineMeta(value: any): string;
620
+ expansionTimelineDescription(value: any): string;
621
+ expansionKeyValueKey(value: any): string;
622
+ expansionKeyValueValue(value: any): string;
215
623
  private splitPipe;
216
624
  private splitPipeName;
217
625
  private evalString;
218
626
  private parseTwoParams;
219
627
  private toBoolean;
628
+ private prettyLabel;
220
629
  private mapDateStyle;
221
630
  starIcon(index: number, ratingValue: string | number): string;
631
+ isThemeColor(color?: string): boolean;
632
+ chipStyle(color?: string, variant?: 'filled' | 'outlined'): string;
633
+ iconStyle(color?: string): string;
634
+ buttonStyle(color?: string, variant?: 'stroked' | 'raised' | 'flat'): string;
635
+ ratingMax(def?: any): number;
636
+ ratingThemeColor(def?: any): string | undefined;
637
+ ratingIconStyle(def?: any): string;
638
+ ratingRange(def?: any): number[];
222
639
  trackBySection: (_: number, s: ListSection<any>) => string | number;
223
640
  trackByItem: (i: number, it: any) => any;
641
+ isActionLoading(actionId: string, item: any, index: number): boolean;
642
+ private evaluateActionVisibility;
643
+ private evaluateRuntimeCondition;
644
+ private normalizeConditionExpression;
645
+ private resolveConditionOperand;
646
+ private looseEquals;
647
+ private warnInvalidConditionOnce;
648
+ private cloneTemplateDef;
649
+ private mergeTemplateDefs;
650
+ private mergePlainObjects;
651
+ private buildActionLoadingKey;
652
+ private ensureActionItemObjectId;
653
+ private warnGlobalCommandUnavailableOnce;
654
+ private buildLogOptions;
655
+ private toggleExpanded;
656
+ private syncExpansionState;
657
+ private itemExpansionKey;
658
+ private t;
659
+ private ensureExpansionItemObjectId;
660
+ private sanitizeDomId;
661
+ private evaluateExpansionExpr;
662
+ private normalizeExpansionItems;
663
+ private normalizeKeyValueItems;
224
664
  static ɵfac: i0.ɵɵFactoryDeclaration<PraxisList, never>;
225
- static ɵcmp: i0.ɵɵComponentDeclaration<PraxisList, "praxis-list", never, { "config": { "alias": "config"; "required": false; }; "form": { "alias": "form"; "required": false; }; }, { "itemClick": "itemClick"; "actionClick": "actionClick"; "selectionChange": "selectionChange"; }, never, never, true, never>;
665
+ static ɵcmp: i0.ɵɵComponentDeclaration<PraxisList, "praxis-list", never, { "config": { "alias": "config"; "required": false; }; "listId": { "alias": "listId"; "required": true; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "form": { "alias": "form"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; }, { "itemClick": "itemClick"; "actionClick": "actionClick"; "selectionChange": "selectionChange"; }, never, never, true, never>;
666
+ static ngAcceptInputType_enableCustomization: unknown;
667
+ }
668
+
669
+ /**
670
+ * Executive badge component for displaying account segment classification.
671
+ *
672
+ * This component replaces legacy HTML string-based badges with a type-safe,
673
+ * encapsulated solution that bypasses Angular's DomSanitizer restrictions.
674
+ *
675
+ * @remarks
676
+ * - Fully WCAG 2.1 AA compliant with proper ARIA attributes
677
+ * - Uses OnPush change detection for optimal performance
678
+ * - Supports three segment variants: enterprise, corporate, middle
679
+ * - Colors follow corporate branding guidelines
680
+ * - Input validation prevents invalid runtime values
681
+ *
682
+ * @example Basic usage
683
+ * ```html
684
+ * <praxis-executive-badge variant="enterprise">
685
+ * Enterprise
686
+ * </praxis-executive-badge>
687
+ * ```
688
+ *
689
+ * @example Dynamic variant with custom label
690
+ * ```html
691
+ * <praxis-executive-badge
692
+ * [variant]="account.segmentType"
693
+ * [ariaLabel]="'Account segment: ' + account.segmentLabel">
694
+ * {{ account.segmentLabel }}
695
+ * </praxis-executive-badge>
696
+ * ```
697
+ *
698
+ * @see {@link ExecutiveAlertsComponent} for related alert component
699
+ * @see WCAG 2.1 Level AA - Guideline 4.1.2 (Name, Role, Value)
700
+ *
701
+ * @public
702
+ */
703
+ declare class ExecutiveBadgeComponent {
704
+ /**
705
+ * Custom ARIA label for screen readers.
706
+ * If not provided, defaults to "Segment badge: {variant}"
707
+ */
708
+ ariaLabel?: string;
709
+ private _variant;
710
+ /**
711
+ * Badge variant type with runtime validation.
712
+ * Valid values: 'enterprise', 'corporate', 'middle'
713
+ * Invalid values will default to 'enterprise' with console warning.
714
+ */
715
+ set variant(value: 'enterprise' | 'corporate' | 'middle');
716
+ get variant(): 'enterprise' | 'corporate' | 'middle';
717
+ get variantClass(): string;
718
+ /**
719
+ * Computed ARIA label for accessibility.
720
+ * Uses custom ariaLabel if provided, otherwise generates default.
721
+ */
722
+ get computedAriaLabel(): string;
723
+ static ɵfac: i0.ɵɵFactoryDeclaration<ExecutiveBadgeComponent, never>;
724
+ static ɵcmp: i0.ɵɵComponentDeclaration<ExecutiveBadgeComponent, "praxis-executive-badge", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; }, {}, never, ["*"], true, never>;
725
+ }
726
+
727
+ /**
728
+ * Alert data interface for executive alerts component.
729
+ *
730
+ * @property type - Alert severity level (warning or critical)
731
+ * @property count - Number of alerts of this type (must be >= 0)
732
+ */
733
+ interface ExecutiveAlert {
734
+ type: 'warning' | 'critical';
735
+ count: number;
736
+ }
737
+ /**
738
+ * Executive alerts component for displaying warning and critical account flags.
739
+ *
740
+ * This component replaces legacy HTML string-based alerts with a fully
741
+ * accessible, WCAG 2.1 AA compliant solution.
742
+ *
743
+ * @remarks
744
+ * **Accessibility Features:**
745
+ * - WCAG 1.3.1: Semantic structure with proper roles
746
+ * - WCAG 1.4.1: Does not rely on color alone (uses icons + text)
747
+ * - WCAG 4.1.3: Status messages properly announced to screen readers
748
+ * - aria-live regions for dynamic updates
749
+ * - Screen-reader only text for full context
750
+ *
751
+ * **Performance:**
752
+ * - OnPush change detection strategy
753
+ * - Input validation prevents invalid data
754
+ * - Optimized trackBy function
755
+ *
756
+ * @example Basic usage
757
+ * ```html
758
+ * <praxis-executive-alerts [alerts]="[
759
+ * { type: 'warning', count: 1 },
760
+ * { type: 'critical', count: 2 }
761
+ * ]"></praxis-executive-alerts>
762
+ * ```
763
+ *
764
+ * @example Empty state (renders nothing)
765
+ * ```html
766
+ * <praxis-executive-alerts [alerts]="[]"></praxis-executive-alerts>
767
+ * ```
768
+ *
769
+ * @see WCAG 2.1 Level AA - Guidelines 1.3.1, 1.4.1, 4.1.3
770
+ * @public
771
+ */
772
+ declare class ExecutiveAlertsComponent implements OnChanges {
773
+ alerts: ExecutiveAlert[];
774
+ /**
775
+ * Validated and filtered alerts.
776
+ * Only valid alerts (correct type and count >= 0) are included.
777
+ */
778
+ validAlerts: ExecutiveAlert[];
779
+ ngOnChanges(changes: SimpleChanges): void;
780
+ /**
781
+ * Validates alerts array and filters out invalid entries.
782
+ * Logs warnings for invalid data in development mode.
783
+ */
784
+ private validateAndFilterAlerts;
785
+ /**
786
+ * TrackBy function for optimal rendering performance.
787
+ * Uses combination of type and count for unique identification.
788
+ */
789
+ trackByAlert(index: number, alert: ExecutiveAlert): string;
790
+ /**
791
+ * Generates ARIA label for alert badge.
792
+ * Provides concise description for screen readers.
793
+ */
794
+ getAlertAriaLabel(alert: ExecutiveAlert): string;
795
+ /**
796
+ * Generates detailed description for screen readers.
797
+ * Provides full context including severity and actionability.
798
+ */
799
+ getAlertDescription(alert: ExecutiveAlert): string;
800
+ static ɵfac: i0.ɵɵFactoryDeclaration<ExecutiveAlertsComponent, never>;
801
+ static ɵcmp: i0.ɵɵComponentDeclaration<ExecutiveAlertsComponent, "praxis-executive-alerts", never, { "alerts": { "alias": "alerts"; "required": false; }; }, {}, never, never, true, never>;
802
+ }
803
+
804
+ /**
805
+ * Executive owner component displaying account owner with accessible avatar.
806
+ *
807
+ * This component replaces legacy HTML string-based owner displays with a
808
+ * fully accessible, WCAG 2.1 AA compliant solution featuring an inline SVG avatar.
809
+ *
810
+ * @remarks
811
+ * **Accessibility Features:**
812
+ * - WCAG 1.1.1: Non-text content has text alternative (SVG with role and aria-label)
813
+ * - SVG includes <title> element for tooltips
814
+ * - Handles empty/undefined names gracefully
815
+ * - Screen reader announces owner information clearly
816
+ *
817
+ * **Performance:**
818
+ * - OnPush change detection strategy
819
+ * - Input validation for name
820
+ * - Lightweight inline SVG (no external dependencies)
821
+ *
822
+ * @example Basic usage
823
+ * ```html
824
+ * <praxis-executive-owner name="Ana Carolina"></praxis-executive-owner>
825
+ * ```
826
+ *
827
+ * @example With empty name (shows fallback)
828
+ * ```html
829
+ * <praxis-executive-owner name=""></praxis-executive-owner>
830
+ * <!-- Displays: "Unassigned" -->
831
+ * ```
832
+ *
833
+ * @see WCAG 2.1 Level AA - Guideline 1.1.1 (Non-text Content)
834
+ * @public
835
+ */
836
+ declare class ExecutiveOwnerComponent {
837
+ private _name;
838
+ /**
839
+ * Owner name with automatic validation and sanitization.
840
+ * - Empty strings default to "Unassigned"
841
+ * - Trimmed and limited to 50 characters
842
+ * - Null/undefined converted to empty string
843
+ */
844
+ set name(value: string);
845
+ get name(): string;
846
+ /**
847
+ * Display name with fallback for empty values.
848
+ * Returns "Unassigned" if name is empty.
849
+ */
850
+ get displayName(): string;
851
+ /**
852
+ * ARIA label for SVG avatar.
853
+ * Provides context for screen readers.
854
+ */
855
+ get avatarAriaLabel(): string;
856
+ /**
857
+ * SVG title element content for tooltip.
858
+ * Shows on hover in most browsers.
859
+ */
860
+ get avatarTitle(): string;
861
+ static ɵfac: i0.ɵɵFactoryDeclaration<ExecutiveOwnerComponent, never>;
862
+ static ɵcmp: i0.ɵɵComponentDeclaration<ExecutiveOwnerComponent, "praxis-executive-owner", never, { "name": { "alias": "name"; "required": false; }; }, {}, never, never, true, never>;
863
+ }
864
+
865
+ interface EditorDocument<TConfig, TBindings = unknown> {
866
+ kind: string;
867
+ version: number;
868
+ config: TConfig;
869
+ bindings?: TBindings;
870
+ }
871
+ interface ListAuthoringDocument extends EditorDocument<PraxisListConfig, Record<string, never>> {
872
+ kind: 'praxis.list.editor';
873
+ version: 1;
874
+ }
875
+ interface EditorDiagnostic {
876
+ level: 'error' | 'warning' | 'info';
877
+ code: string;
878
+ message: string;
879
+ path?: string;
880
+ }
881
+ interface ListValidationContext {
882
+ schemaFieldNames?: string[];
883
+ }
884
+ interface ListProjectionContext {
885
+ schemaFieldNames?: string[];
886
+ }
887
+ interface ListSchemaInferencePlan {
888
+ resourcePath: string;
889
+ sourceDocument: ListAuthoringDocument;
890
+ targetDocument: ListAuthoringDocument;
891
+ }
892
+ interface ListRuntimeContext {
893
+ currentConfig?: PraxisListConfig;
894
+ schemaFieldNames?: string[];
895
+ }
896
+ interface ListApplyPlan {
897
+ canonicalConfig: PraxisListConfig;
898
+ canonicalDocument?: ListAuthoringDocument;
899
+ persistence?: {
900
+ saveConfig?: boolean;
901
+ };
902
+ runtime?: {
903
+ applyConfig?: boolean;
904
+ rebindSelection?: boolean;
905
+ reapplySkin?: boolean;
906
+ schemaInference?: ListSchemaInferencePlan;
907
+ markForCheck?: boolean;
908
+ };
909
+ diff?: {
910
+ configChanged?: boolean;
911
+ dataSourceChanged?: boolean;
912
+ selectionChanged?: boolean;
913
+ skinChanged?: boolean;
914
+ templatingChanged?: boolean;
915
+ schemaInferenceRequested?: boolean;
916
+ };
917
+ diagnostics: EditorDiagnostic[];
918
+ }
919
+
920
+ interface JsonValidationResult {
921
+ isValid: boolean;
922
+ error?: string;
923
+ document?: ListAuthoringDocument;
924
+ diagnostics?: EditorDiagnostic[];
925
+ }
926
+ interface JsonEditorEvent {
927
+ type: 'apply' | 'format' | 'validation';
928
+ payload: JsonValidationResult;
929
+ }
930
+ declare class PraxisListJsonConfigEditorComponent implements OnInit, OnChanges, OnDestroy {
931
+ private readonly cdr;
932
+ document: ListAuthoringDocument | null;
933
+ documentChange: EventEmitter<ListAuthoringDocument>;
934
+ validationChange: EventEmitter<JsonValidationResult>;
935
+ editorEvent: EventEmitter<JsonEditorEvent>;
936
+ jsonText: string;
937
+ isValidJson: boolean;
938
+ jsonError: string;
939
+ unknownTopKeys: string[];
940
+ hasPendingExternalUpdate: boolean;
941
+ private readonly destroy$;
942
+ private readonly jsonTextChanges$;
943
+ private lastSyncedJsonText;
944
+ constructor(cdr: ChangeDetectorRef);
945
+ ngOnInit(): void;
946
+ ngOnChanges(changes: SimpleChanges): void;
947
+ ngOnDestroy(): void;
948
+ onJsonTextChange(text: string): void;
949
+ applyJsonChanges(): void;
950
+ formatJson(): void;
951
+ updateJsonFromDocument(document: ListAuthoringDocument, force?: boolean): void;
952
+ reloadFromDocument(): void;
953
+ private validateJson;
954
+ private updateValidationState;
955
+ private syncJsonText;
956
+ private hasUnsavedLocalChanges;
957
+ static ɵfac: i0.ɵɵFactoryDeclaration<PraxisListJsonConfigEditorComponent, never>;
958
+ static ɵcmp: i0.ɵɵComponentDeclaration<PraxisListJsonConfigEditorComponent, "praxis-list-json-config-editor", never, { "document": { "alias": "document"; "required": false; }; }, { "documentChange": "documentChange"; "validationChange": "validationChange"; "editorEvent": "editorEvent"; }, never, never, true, never>;
226
959
  }
227
960
 
228
961
  type NormalizedListConfig = Omit<PraxisListConfig, 'dataSource' | 'layout' | 'selection' | 'skin' | 'i18n'> & {
@@ -233,8 +966,9 @@ type NormalizedListConfig = Omit<PraxisListConfig, 'dataSource' | 'layout' | 'se
233
966
  sort?: string[];
234
967
  };
235
968
  layout: {
236
- variant: 'list' | 'cards';
969
+ variant: 'list' | 'cards' | 'tiles';
237
970
  density?: 'default' | 'comfortable' | 'compact';
971
+ itemSpacing?: 'none' | 'tight' | 'default' | 'relaxed';
238
972
  lines: 1 | 2 | 3;
239
973
  dividers?: 'none' | 'between' | 'all';
240
974
  model?: 'standard' | 'media' | 'hotel';
@@ -244,7 +978,7 @@ type NormalizedListConfig = Omit<PraxisListConfig, 'dataSource' | 'layout' | 'se
244
978
  pageSize?: number;
245
979
  };
246
980
  skin: {
247
- type: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'custom';
981
+ type: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'outline' | 'flat' | 'neumorphism' | 'custom';
248
982
  gradient: {
249
983
  from: string;
250
984
  to: string;
@@ -269,10 +1003,16 @@ type NormalizedListConfig = Omit<PraxisListConfig, 'dataSource' | 'layout' | 'se
269
1003
  currency?: string;
270
1004
  };
271
1005
  actions?: PraxisListConfig['actions'];
1006
+ ui: NonNullable<PraxisListConfig['ui']>;
1007
+ a11y?: PraxisListConfig['a11y'];
1008
+ events?: PraxisListConfig['events'];
272
1009
  };
1010
+ type SkinType = NormalizedListConfig['skin']['type'];
1011
+ type SkinPreset = Exclude<SkinType, 'custom'>;
273
1012
  declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
274
1013
  config: PraxisListConfig;
275
1014
  listId?: string;
1015
+ document: ListAuthoringDocument;
276
1016
  working: NormalizedListConfig;
277
1017
  isDirty$: BehaviorSubject<boolean>;
278
1018
  isValid$: BehaviorSubject<boolean>;
@@ -285,25 +1025,27 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
285
1025
  sortDir: 'asc' | 'desc';
286
1026
  mappingPrimary: {
287
1027
  field?: string;
288
- type: 'text' | 'currency' | 'date';
1028
+ type: 'text' | 'currency' | 'date' | 'html';
289
1029
  currencyCode?: string;
290
1030
  locale?: string;
291
1031
  dateStyle?: 'short' | 'medium' | 'long' | 'full';
292
1032
  class?: string;
293
1033
  style?: string;
1034
+ extraPipe?: string;
294
1035
  };
295
1036
  mappingSecondary: {
296
1037
  field?: string;
297
- type: 'text' | 'currency' | 'date';
1038
+ type: 'text' | 'currency' | 'date' | 'html';
298
1039
  currencyCode?: string;
299
1040
  locale?: string;
300
1041
  dateStyle?: 'short' | 'medium' | 'long' | 'full';
301
1042
  class?: string;
302
1043
  style?: string;
1044
+ extraPipe?: string;
303
1045
  };
304
1046
  mappingMeta: {
305
1047
  field?: string;
306
- type: 'text' | 'currency' | 'date' | 'chip' | 'rating';
1048
+ type: 'text' | 'currency' | 'date' | 'chip' | 'rating' | 'icon' | 'image' | 'html';
307
1049
  currencyCode?: string;
308
1050
  locale?: string;
309
1051
  dateStyle?: 'short' | 'medium' | 'long' | 'full';
@@ -312,31 +1054,106 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
312
1054
  placement?: 'side' | 'line';
313
1055
  chipColor?: string;
314
1056
  chipVariant?: 'filled' | 'outlined';
1057
+ ratingColor?: string;
1058
+ ratingSize?: number;
1059
+ ratingMax?: number;
1060
+ iconColor?: string;
1061
+ imageAlt?: string;
1062
+ extraPipe?: string;
315
1063
  };
316
1064
  mappingMetaPrefixIcon?: string;
317
1065
  mappingTrailing: {
318
1066
  field?: string;
319
- type?: 'text' | 'currency' | 'date' | 'chip';
1067
+ type?: 'text' | 'currency' | 'date' | 'chip' | 'icon' | 'rating' | 'html' | 'image';
320
1068
  class?: string;
321
1069
  style?: string;
322
1070
  chipColor?: string;
323
1071
  chipVariant?: 'filled' | 'outlined';
1072
+ ratingColor?: string;
1073
+ ratingSize?: number;
1074
+ ratingMax?: number;
1075
+ iconColor?: string;
1076
+ imageUrl?: string;
1077
+ imageAlt?: string;
324
1078
  currencyCode?: string;
325
1079
  locale?: string;
326
1080
  dateStyle?: 'short' | 'medium' | 'long' | 'full';
1081
+ extraPipe?: string;
327
1082
  };
328
1083
  mappingLeading: {
329
- type: 'icon' | 'image';
1084
+ field?: string;
1085
+ type: 'icon' | 'image' | 'text' | 'chip' | 'rating' | 'html';
330
1086
  icon?: string;
331
1087
  imageUrl?: string;
1088
+ imageAlt?: string;
332
1089
  badgeText?: string;
333
1090
  badgeColor?: string;
334
1091
  badgeVariant?: 'filled' | 'outlined';
1092
+ class?: string;
1093
+ style?: string;
1094
+ chipColor?: string;
1095
+ chipVariant?: 'filled' | 'outlined';
1096
+ ratingColor?: string;
1097
+ ratingSize?: number;
1098
+ ratingMax?: number;
1099
+ iconColor?: string;
1100
+ extraPipe?: string;
1101
+ };
1102
+ mappingSectionHeader: {
1103
+ type: 'text' | 'chip' | 'icon' | 'image' | 'rating' | 'html';
1104
+ expr?: string;
1105
+ class?: string;
1106
+ style?: string;
1107
+ chipColor?: string;
1108
+ chipVariant?: 'filled' | 'outlined';
1109
+ ratingColor?: string;
1110
+ ratingSize?: number;
1111
+ ratingMax?: number;
1112
+ iconColor?: string;
1113
+ imageUrl?: string;
1114
+ imageAlt?: string;
1115
+ extraPipe?: string;
1116
+ };
1117
+ mappingEmptyState: {
1118
+ type: 'text' | 'chip' | 'icon' | 'image' | 'rating' | 'html';
1119
+ expr?: string;
1120
+ class?: string;
1121
+ style?: string;
1122
+ chipColor?: string;
1123
+ chipVariant?: 'filled' | 'outlined';
1124
+ ratingColor?: string;
1125
+ ratingSize?: number;
1126
+ ratingMax?: number;
1127
+ iconColor?: string;
1128
+ imageUrl?: string;
1129
+ imageAlt?: string;
1130
+ extraPipe?: string;
335
1131
  };
336
1132
  mapping: {
337
1133
  leadingIcon?: string;
338
1134
  };
339
1135
  private mappingDirty;
1136
+ private appliedMappingSnapshot;
1137
+ statusPosition: 'inline' | 'top-right' | undefined;
1138
+ iconColorMapEntries: Array<{
1139
+ key: string;
1140
+ color?: string;
1141
+ }>;
1142
+ chipColorMapEntries: Array<{
1143
+ key: string;
1144
+ color?: string;
1145
+ }>;
1146
+ chipLabelMapEntries: Array<{
1147
+ key: string;
1148
+ label?: string;
1149
+ }>;
1150
+ globalActionCatalog: GlobalActionCatalogEntry[];
1151
+ selectedGlobalActionId?: string;
1152
+ uiSortRows: Array<{
1153
+ label?: string;
1154
+ field?: string;
1155
+ dir?: 'asc' | 'desc';
1156
+ }>;
340
1157
  mappingMetaFields: string[];
341
1158
  mappingMetaSeparator: string;
342
1159
  mappingMetaWrapSecondInParens: boolean;
@@ -349,6 +1166,9 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
349
1166
  }>;
350
1167
  featuresVisible: boolean;
351
1168
  featuresMode: 'icons+labels' | 'icons-only' | 'labels-only';
1169
+ skeletonCountInput: number;
1170
+ queryJson: string;
1171
+ queryError: string;
352
1172
  private crud;
353
1173
  private resourcePathChanges;
354
1174
  constructor(injected?: any);
@@ -358,10 +1178,19 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
358
1178
  pickMetaPrefixIcon(): Promise<void>;
359
1179
  getSettingsValue(): any;
360
1180
  onSave(): any;
361
- private normalize;
1181
+ onJsonConfigChange(newValue: PraxisListConfig | ListAuthoringDocument): void;
1182
+ onJsonValidationChange(result: JsonValidationResult): void;
1183
+ onJsonEditorEvent(event: JsonEditorEvent): void;
1184
+ buildJsonAuthoringDocument(): ListAuthoringDocument;
1185
+ private applyIncomingDocument;
1186
+ private buildCurrentDocument;
1187
+ private snapshotCurrentDocument;
1188
+ private syncSortStateFromWorking;
1189
+ private resetVisualMappingState;
362
1190
  private setupSchemaWatcher;
363
1191
  onResourcePathChange(value: string): void;
364
- applySkinPreset(preset: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'outline' | 'flat' | 'neumorphism'): void;
1192
+ applySkinPreset(preset: SkinPreset): void;
1193
+ applyLayoutPreset(preset: 'tiles-modern'): void;
365
1194
  previewData: {
366
1195
  title: string;
367
1196
  subtitle: string;
@@ -369,25 +1198,122 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
369
1198
  salary: number;
370
1199
  hireDate: string;
371
1200
  rating: number;
1201
+ name: string;
1202
+ status: string;
1203
+ price: number;
1204
+ imageUrl: string;
372
1205
  }[];
373
1206
  skinPreviewTheme: 'light' | 'dark' | 'grid';
1207
+ readonly metaTypeConfigs: Array<{
1208
+ type: 'text' | 'chip' | 'rating' | 'currency' | 'date' | 'icon' | 'image' | 'html';
1209
+ label: string;
1210
+ icon: string;
1211
+ props?: string[];
1212
+ }>;
1213
+ readonly primaryTypeConfigs: {
1214
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
1215
+ label: string;
1216
+ icon: string;
1217
+ props?: string[];
1218
+ }[];
1219
+ readonly secondaryTypeConfigs: {
1220
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
1221
+ label: string;
1222
+ icon: string;
1223
+ props?: string[];
1224
+ }[];
1225
+ readonly leadingTypeConfigs: {
1226
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
1227
+ label: string;
1228
+ icon: string;
1229
+ props?: string[];
1230
+ }[];
1231
+ readonly trailingTypeConfigs: {
1232
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
1233
+ label: string;
1234
+ icon: string;
1235
+ props?: string[];
1236
+ }[];
1237
+ readonly sectionHeaderTypeConfigs: {
1238
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
1239
+ label: string;
1240
+ icon: string;
1241
+ props?: string[];
1242
+ }[];
1243
+ readonly emptyStateTypeConfigs: {
1244
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
1245
+ label: string;
1246
+ icon: string;
1247
+ props?: string[];
1248
+ }[];
1249
+ readonly paletteOptions: Array<{
1250
+ value?: string;
1251
+ label: string;
1252
+ }>;
1253
+ isThemeColor(value?: string): boolean;
1254
+ isM3Color(value?: string): boolean;
1255
+ isCustomColor(value?: string): boolean;
1256
+ iconStyle(color?: string): string;
1257
+ buttonStyle(color?: string, variant?: 'stroked' | 'raised' | 'flat'): string;
1258
+ colorDotBackground(value?: string): string;
1259
+ enableCustomColor(obj: any, prop: string, fallback?: string): void;
1260
+ enableCustomActionColor(action: any, fallback?: string): void;
374
1261
  addAction(): void;
375
1262
  removeAction(idx: number): void;
376
1263
  onActionsChanged(): void;
1264
+ ensureConfirmation(action: any): void;
1265
+ setConfirmationField(action: any, field: 'title' | 'message', value: string): void;
1266
+ applyConfirmationPreset(action: any, type?: 'danger' | 'warning' | 'info' | ''): void;
1267
+ isGlobalPayloadInvalid(payload: any): boolean;
1268
+ applyGlobalPayloadExample(action: any): void;
1269
+ globalPayloadExampleHint(action: any): string;
1270
+ globalPayloadSchemaTooltip(action: any): string;
1271
+ onGlobalActionSelected(id?: string): void;
1272
+ private addGlobalActionFromCatalog;
1273
+ metaTypeConfig(type?: string): {
1274
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
1275
+ label: string;
1276
+ icon: string;
1277
+ props?: string[];
1278
+ } | undefined;
1279
+ metaSupports(prop: string): boolean;
377
1280
  ngDoCheck(): void;
378
1281
  reset(): void;
379
1282
  onLayoutChanged(): void;
380
1283
  onSelectionChanged(): void;
1284
+ onSkinGradientChanged(prop: 'from' | 'to' | 'angle', value: string | number): void;
1285
+ onSkinTypeChanged(type: SkinType): void;
381
1286
  onSkinChanged(): void;
1287
+ private ensureSkinGradient;
1288
+ onQueryChanged(value: string): void;
382
1289
  onPageSizeChange(value: any): void;
1290
+ onUiChanged(): void;
1291
+ onSkeletonChanged(value: any): void;
1292
+ addUiSortRow(): void;
1293
+ removeUiSortRow(i: number): void;
1294
+ onUiSortRowsChanged(): void;
1295
+ isUiSortRowDuplicate(index: number): boolean;
1296
+ isIconColorDuplicate(index: number): boolean;
1297
+ private hydrateUiEditorFromConfig;
383
1298
  private loadFieldsIfNeeded;
384
1299
  updateSortConfig(): void;
385
1300
  applyTemplate(): void;
1301
+ private composeWorkingFromVisualState;
386
1302
  private ensureMappingApplied;
387
1303
  onMappingChanged(): void;
388
1304
  addFeature(): void;
389
1305
  removeFeature(idx: number): void;
390
1306
  onFeaturesChanged(): void;
1307
+ addIconColorEntry(): void;
1308
+ removeIconColorEntry(i: number): void;
1309
+ onIconColorMapChanged(): void;
1310
+ addChipColorEntry(): void;
1311
+ removeChipColorEntry(i: number): void;
1312
+ onChipColorMapChanged(): void;
1313
+ addChipLabelEntry(): void;
1314
+ removeChipLabelEntry(i: number): void;
1315
+ onChipLabelMapChanged(): void;
1316
+ setPipe(target: any, spec: string): void;
391
1317
  insertFeatureToken(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, field: string): void;
392
1318
  insertLiteralAt(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, text: string): void;
393
1319
  wrapSelectionAt(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, left: string, right: string): void;
@@ -395,15 +1321,41 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
395
1321
  private updateFeatureExpr;
396
1322
  private hydrateMappingFromTemplating;
397
1323
  markDirty(): void;
1324
+ private getMappingSnapshot;
1325
+ private updateMappingDirty;
1326
+ private resolveGlobalActionCatalog;
398
1327
  verify(): void;
399
1328
  inferFromFields(): void;
400
1329
  generateFeaturesFromMetaComposition(): void;
401
1330
  metaComposePreview(): string;
1331
+ private splitTopLevelPipe;
1332
+ private validateImageUrl;
1333
+ isImageUrlInvalid(url?: string): boolean;
1334
+ isImageUrlRequiredInvalid(url?: string): boolean;
1335
+ isRatingSizeInvalid(value?: number): boolean;
1336
+ isRatingMaxInvalid(value?: number): boolean;
402
1337
  private suggestIcon;
403
- static ɵfac: i0.ɵɵFactoryDeclaration<PraxisListConfigEditor, never>;
1338
+ getTypeIcon(type: string): string;
1339
+ static ɵfac: i0.ɵɵFactoryDeclaration<PraxisListConfigEditor, [{ optional: true; }]>;
404
1340
  static ɵcmp: i0.ɵɵComponentDeclaration<PraxisListConfigEditor, "praxis-list-config-editor", never, { "config": { "alias": "config"; "required": false; }; "listId": { "alias": "listId"; "required": false; }; }, {}, never, never, true, never>;
405
1341
  }
406
1342
 
1343
+ declare function createListAuthoringDocument(source: {
1344
+ config?: unknown;
1345
+ }): ListAuthoringDocument;
1346
+ declare function parseLegacyOrListDocument(raw: unknown): ListAuthoringDocument;
1347
+ declare function normalizeListAuthoringDocument(doc: ListAuthoringDocument): ListAuthoringDocument;
1348
+ declare function projectListAuthoringDocument(doc: ListAuthoringDocument, context?: ListProjectionContext): ListAuthoringDocument;
1349
+ declare function inferListAuthoringDocument(doc: ListAuthoringDocument, context?: ListProjectionContext): ListAuthoringDocument;
1350
+ declare function normalizeListConfig(config: PraxisListConfig | undefined): PraxisListConfig;
1351
+ declare function normalizeListActionPayloads(actions: PraxisListConfig['actions']): PraxisListConfig['actions'];
1352
+ declare function validateListAuthoringDocument(doc: ListAuthoringDocument, context?: ListValidationContext): EditorDiagnostic[];
1353
+ declare function toCanonicalListConfig(doc: ListAuthoringDocument, context?: ListProjectionContext): PraxisListConfig;
1354
+ declare function buildListApplyPlan(doc: ListAuthoringDocument, runtime?: ListRuntimeContext, options?: {
1355
+ saveConfig?: boolean;
1356
+ }): ListApplyPlan;
1357
+ declare function serializeListAuthoringDocument(doc: ListAuthoringDocument): unknown;
1358
+
407
1359
  /**
408
1360
  * Infer templating slots (primary/secondary/trailing) from field names.
409
1361
  * - Does not override existing primary if already defined.
@@ -413,7 +1365,8 @@ declare function inferTemplatingFromSchema(cfg: PraxisListConfig, fieldNames: st
413
1365
 
414
1366
  declare class ListSkinService {
415
1367
  toHostClasses(config?: PraxisListConfig): string[];
416
- toInlineStyle(config?: PraxisListConfig): string;
1368
+ toCssVars(config?: PraxisListConfig): Record<string, string>;
1369
+ toInlineStyle(config?: PraxisListConfig, rootSelector?: string, includeVars?: boolean): string;
417
1370
  static ɵfac: i0.ɵɵFactoryDeclaration<ListSkinService, never>;
418
1371
  static ɵprov: i0.ɵɵInjectableDeclaration<ListSkinService>;
419
1372
  }
@@ -447,5 +1400,381 @@ declare function adaptSelection(config: PraxisListConfig | undefined, items: any
447
1400
  declare const PRAXIS_LIST_COMPONENT_METADATA: ComponentDocMeta;
448
1401
  declare function providePraxisListMetadata(): Provider;
449
1402
 
450
- export { ListDataService, ListSkinService, PRAXIS_LIST_COMPONENT_METADATA, PraxisList, PraxisListConfigEditor, adaptSelection, evalExpr, evaluateTemplate, inferTemplatingFromSchema, providePraxisListMetadata };
451
- export type { ListActionEvent, ListFeatureDef, ListItemEvent, ListSection, ListSelectionEvent, PraxisListConfig, TemplateDef, TemplateType };
1403
+ /**
1404
+ * Capabilities catalog for PraxisListConfig.
1405
+ * Uses paths compatible with AiConfigAgentService (patch is merged into config).
1406
+ */
1407
+
1408
+ declare module '@praxisui/core' {
1409
+ interface AiCapabilityCategoryMap {
1410
+ meta: true;
1411
+ skin: true;
1412
+ selection: true;
1413
+ templating: true;
1414
+ actions: true;
1415
+ ui: true;
1416
+ i18n: true;
1417
+ a11y: true;
1418
+ }
1419
+ }
1420
+ type CapabilityCategory = AiCapabilityCategory;
1421
+ type ValueKind = AiValueKind;
1422
+ interface Capability extends AiCapability {
1423
+ category: CapabilityCategory;
1424
+ }
1425
+ interface CapabilityCatalog extends AiCapabilityCatalog {
1426
+ capabilities: Capability[];
1427
+ }
1428
+ declare const LIST_AI_CAPABILITIES: CapabilityCatalog;
1429
+
1430
+ type DemoScenario = 'operations' | 'executive-expansion' | 'catalog' | 'empty';
1431
+ type DemoVariant = 'list' | 'cards' | 'tiles';
1432
+ type DemoDensity = 'default' | 'comfortable' | 'compact';
1433
+ type DemoFeaturesMode = 'icons+labels' | 'icons-only' | 'labels-only';
1434
+ type DemoSelectionMode = 'none' | 'single' | 'multiple';
1435
+ type DemoSkin = 'elevated' | 'outline' | 'flat' | 'neumorphism' | 'pill-soft' | 'glass' | 'gradient-tile' | 'custom';
1436
+ type CodeTab = 'template' | 'ts' | 'config' | 'remote';
1437
+ interface ScenarioOption {
1438
+ id: DemoScenario;
1439
+ label: string;
1440
+ helper: string;
1441
+ }
1442
+ interface VariantOption {
1443
+ id: DemoVariant;
1444
+ label: string;
1445
+ }
1446
+ interface DensityOption {
1447
+ id: DemoDensity;
1448
+ label: string;
1449
+ }
1450
+ interface FeaturesModeOption {
1451
+ id: DemoFeaturesMode;
1452
+ label: string;
1453
+ }
1454
+ interface SelectionModeOption {
1455
+ id: DemoSelectionMode;
1456
+ label: string;
1457
+ }
1458
+ interface SkinOption {
1459
+ id: DemoSkin;
1460
+ label: string;
1461
+ }
1462
+ interface CodeTabOption {
1463
+ id: CodeTab;
1464
+ label: string;
1465
+ }
1466
+ interface CoverageTopic {
1467
+ title: string;
1468
+ details: string;
1469
+ }
1470
+ interface EventLogEntry {
1471
+ id: number;
1472
+ message: string;
1473
+ }
1474
+ interface DemoItem {
1475
+ id: number;
1476
+ title: string;
1477
+ subtitle: string;
1478
+ department: string;
1479
+ status: string;
1480
+ statusIcon: string;
1481
+ priority: string;
1482
+ budget: number;
1483
+ updatedAt: string;
1484
+ rating: number;
1485
+ owner: string;
1486
+ city: string;
1487
+ trend: string;
1488
+ cover: string;
1489
+ accountCode?: string;
1490
+ balanceDisplay?: string;
1491
+ limitDisplay?: string;
1492
+ usageLabel?: string;
1493
+ usagePercent?: number;
1494
+ riskDisplay?: string;
1495
+ riskLabel?: string;
1496
+ segmentVariant?: 'enterprise' | 'corporate' | 'middle';
1497
+ segmentLabel?: string;
1498
+ accountType?: string;
1499
+ since?: number;
1500
+ alertsData?: ExecutiveAlert[];
1501
+ ownerName?: string;
1502
+ executiveMarkerIcon?: string;
1503
+ riskIcon?: string;
1504
+ alerts?: Array<{
1505
+ title: string;
1506
+ value: string;
1507
+ }>;
1508
+ products?: string[];
1509
+ events?: Array<{
1510
+ title: string;
1511
+ meta: string;
1512
+ description: string;
1513
+ }>;
1514
+ }
1515
+ declare class PraxisListDocPageComponent {
1516
+ readonly form: FormGroup<{
1517
+ selectedItems: FormControl<unknown>;
1518
+ }>;
1519
+ readonly scenario: i0.WritableSignal<DemoScenario>;
1520
+ readonly variant: i0.WritableSignal<DemoVariant>;
1521
+ readonly density: i0.WritableSignal<DemoDensity>;
1522
+ readonly lines: i0.WritableSignal<1 | 2 | 3>;
1523
+ readonly skin: i0.WritableSignal<DemoSkin>;
1524
+ readonly featuresMode: i0.WritableSignal<DemoFeaturesMode>;
1525
+ readonly selectionMode: i0.WritableSignal<DemoSelectionMode>;
1526
+ readonly customizationEnabled: i0.WritableSignal<boolean>;
1527
+ readonly activeTab: i0.WritableSignal<CodeTab>;
1528
+ readonly eventLog: i0.WritableSignal<EventLogEntry[]>;
1529
+ private nextLogId;
1530
+ readonly scenarioOptions: ReadonlyArray<ScenarioOption>;
1531
+ readonly variantOptions: ReadonlyArray<VariantOption>;
1532
+ readonly densityOptions: ReadonlyArray<DensityOption>;
1533
+ readonly featuresModeOptions: ReadonlyArray<FeaturesModeOption>;
1534
+ readonly selectionOptions: ReadonlyArray<SelectionModeOption>;
1535
+ readonly skinOptions: ReadonlyArray<SkinOption>;
1536
+ readonly codeTabs: ReadonlyArray<CodeTabOption>;
1537
+ readonly featureCoverage: ReadonlyArray<CoverageTopic>;
1538
+ readonly liveItems: i0.Signal<DemoItem[]>;
1539
+ readonly activeScenarioMeta: i0.Signal<ScenarioOption | null>;
1540
+ readonly liveConfig: i0.Signal<PraxisListConfig>;
1541
+ readonly skinPreviewItems: DemoItem[];
1542
+ readonly skinPreviewConfigs: i0.Signal<{
1543
+ type: DemoSkin;
1544
+ config: {
1545
+ layout: {
1546
+ variant: "cards";
1547
+ lines: 2;
1548
+ density: "compact";
1549
+ model: "hotel";
1550
+ groupBy: undefined;
1551
+ itemSpacing?: "none" | "tight" | "default" | "relaxed";
1552
+ dividers?: "none" | "between" | "all";
1553
+ stickySectionHeader?: boolean;
1554
+ virtualScroll?: boolean;
1555
+ pageSize?: number;
1556
+ rowLayout?: {
1557
+ type?: "grid" | "flex";
1558
+ columns?: Array<{
1559
+ slot: ListRowLayoutSlot;
1560
+ width?: string;
1561
+ minWidth?: string;
1562
+ maxWidth?: string;
1563
+ align?: "start" | "center" | "end";
1564
+ justify?: "start" | "center" | "end" | "stretch";
1565
+ class?: string;
1566
+ style?: string;
1567
+ }>;
1568
+ gap?: string;
1569
+ align?: "start" | "center" | "end" | "stretch";
1570
+ itemAlignY?: "start" | "center" | "end" | "stretch";
1571
+ class?: string;
1572
+ style?: string;
1573
+ };
1574
+ };
1575
+ selection: {
1576
+ mode: "none";
1577
+ };
1578
+ dataSource: {
1579
+ data: DemoItem[];
1580
+ };
1581
+ skin: {
1582
+ type?: "pill-soft" | "gradient-tile" | "glass" | "elevated" | "outline" | "flat" | "neumorphism" | "custom";
1583
+ gradient?: {
1584
+ from: string;
1585
+ to: string;
1586
+ angle?: number;
1587
+ };
1588
+ radius?: string;
1589
+ shadow?: string;
1590
+ border?: string;
1591
+ backdropBlur?: string;
1592
+ class?: string;
1593
+ inlineStyle?: string;
1594
+ } | undefined;
1595
+ id?: string;
1596
+ interaction?: {
1597
+ expandable?: boolean;
1598
+ expandTrigger?: "row" | "icon" | "row+icon";
1599
+ expandMode?: "single" | "multiple";
1600
+ expandPlacement?: "expand" | "trailing";
1601
+ };
1602
+ templating?: {
1603
+ leading?: TemplateDef;
1604
+ primary?: TemplateDef;
1605
+ secondary?: TemplateDef;
1606
+ meta?: TemplateDef;
1607
+ trailing?: TemplateDef;
1608
+ identity?: TemplateDef;
1609
+ balance?: TemplateDef;
1610
+ limit?: TemplateDef;
1611
+ risk?: TemplateDef;
1612
+ alerts?: TemplateDef;
1613
+ owner?: TemplateDef;
1614
+ metaPlacement?: "side" | "line";
1615
+ metaPrefixIcon?: string;
1616
+ statusPosition?: "inline" | "top-right";
1617
+ chipColorMap?: Record<string, string>;
1618
+ chipLabelMap?: Record<string, string>;
1619
+ iconColorMap?: Record<string, string>;
1620
+ features?: TemplatingFeatureDef[];
1621
+ featuresVisible?: boolean;
1622
+ featuresMode?: "icons+labels" | "icons-only" | "labels-only";
1623
+ sectionHeader?: TemplateDef;
1624
+ emptyState?: TemplateDef;
1625
+ skeleton?: {
1626
+ count?: number;
1627
+ };
1628
+ };
1629
+ rules?: {
1630
+ itemStyles?: Array<{
1631
+ id: string;
1632
+ condition?: string;
1633
+ class?: string;
1634
+ style?: string;
1635
+ border?: string;
1636
+ background?: string;
1637
+ }>;
1638
+ slotOverrides?: Array<{
1639
+ id: string;
1640
+ slot: ListTemplatingSlot;
1641
+ condition?: string;
1642
+ template?: TemplateDef;
1643
+ class?: string;
1644
+ style?: string;
1645
+ hide?: boolean;
1646
+ }>;
1647
+ };
1648
+ expansion?: {
1649
+ sections?: ListExpansionSectionDef[];
1650
+ dataSource?: {
1651
+ mode?: "inline" | "resource" | "resourcePath";
1652
+ resource?: {
1653
+ kind: string;
1654
+ id: string;
1655
+ version: string;
1656
+ };
1657
+ resourcePath?: {
1658
+ path: string;
1659
+ method?: "GET" | "POST";
1660
+ paramsMap?: Record<string, string>;
1661
+ };
1662
+ resourceAllowList?: string[];
1663
+ fallbackMode?: "none" | "inline" | "resource";
1664
+ cache?: {
1665
+ enabled?: boolean;
1666
+ };
1667
+ cancelOnCollapse?: boolean;
1668
+ };
1669
+ schemaContract?: {
1670
+ kind: "praxis.detail.schema";
1671
+ version: string;
1672
+ allowedNodes?: Array<"info-list" | "chip-list" | "timeline" | "key-value" | "metadata" | "component">;
1673
+ maxSections?: number;
1674
+ maxItemsPerSection?: number;
1675
+ requireSectionIds?: boolean;
1676
+ };
1677
+ rendering?: {
1678
+ shell?: "attached" | "detached" | "modal";
1679
+ columns?: 1 | 2 | 3;
1680
+ gap?: string;
1681
+ padding?: string;
1682
+ class?: string;
1683
+ style?: string;
1684
+ loadingTemplate?: TemplateDef;
1685
+ errorTemplate?: TemplateDef;
1686
+ };
1687
+ };
1688
+ actions?: Array<{
1689
+ id: string;
1690
+ icon?: string;
1691
+ label?: string;
1692
+ color?: string;
1693
+ kind?: "icon" | "button";
1694
+ buttonVariant?: "stroked" | "raised" | "flat";
1695
+ showIf?: string;
1696
+ emitPayload?: "item" | "id" | "value";
1697
+ command?: string;
1698
+ globalPayload?: any;
1699
+ emitLocal?: boolean;
1700
+ showLoading?: boolean;
1701
+ placement?: "actions" | "trailing";
1702
+ confirmation?: {
1703
+ title?: string;
1704
+ message?: string;
1705
+ type?: "danger" | "warning" | "info";
1706
+ };
1707
+ }>;
1708
+ i18n?: Record<string, string>;
1709
+ ui?: {
1710
+ showSearch?: boolean;
1711
+ searchField?: string;
1712
+ searchPlaceholder?: string;
1713
+ showSort?: boolean;
1714
+ sortOptions?: Array<string | {
1715
+ label: string;
1716
+ value: string;
1717
+ }>;
1718
+ showRange?: boolean;
1719
+ };
1720
+ a11y?: {
1721
+ ariaLabel?: string;
1722
+ ariaLabelledBy?: string;
1723
+ highContrast?: boolean;
1724
+ reduceMotion?: boolean;
1725
+ };
1726
+ events?: {
1727
+ itemClick?: string;
1728
+ actionClick?: string;
1729
+ selectionChange?: string;
1730
+ loaded?: string;
1731
+ };
1732
+ };
1733
+ }[]>;
1734
+ readonly configPreview: i0.Signal<string>;
1735
+ readonly selectedSnippet: i0.Signal<string>;
1736
+ readonly templateSnippet = "<praxis-list-doc-page></praxis-list-doc-page>";
1737
+ readonly tsSnippet = "import { Component } from '@angular/core';\nimport { PraxisListDocPageComponent } from '@praxisui/list';\n\n@Component({\n selector: 'app-list-doc',\n standalone: true,\n imports: [PraxisListDocPageComponent],\n template: '<praxis-list-doc-page />',\n})\nexport class ListDocHostComponent {}";
1738
+ readonly remoteSnippet = "const config = {\n id: 'employees-remote',\n dataSource: {\n resourcePath: 'employees',\n query: { active: true },\n sort: ['updatedAt,desc']\n },\n layout: { variant: 'list', pageSize: 12, lines: 2 },\n templating: {\n primary: { type: 'text', expr: '${item.name}' },\n secondary: { type: 'text', expr: '${item.role}' },\n meta: { type: 'date', expr: '${item.updatedAt}|pt-BR:short' },\n trailing: { type: 'chip', expr: '${item.status}' }\n },\n ui: {\n showSearch: true,\n searchField: 'name',\n showSort: true,\n sortOptions: [{ label: 'Nome A-Z', value: 'name,asc' }]\n }\n} as const;";
1739
+ setScenario(next: DemoScenario): void;
1740
+ setVariant(next: DemoVariant): void;
1741
+ setDensity(next: DemoDensity): void;
1742
+ setLines(next: 1 | 2 | 3): void;
1743
+ setSkin(next: DemoSkin): void;
1744
+ setFeaturesMode(next: DemoFeaturesMode): void;
1745
+ setSelectionMode(next: DemoSelectionMode): void;
1746
+ setCodeTab(next: CodeTab): void;
1747
+ setCustomizationMode(enabled: boolean): void;
1748
+ clearLog(): void;
1749
+ handleItemClick(event: ListItemEvent): void;
1750
+ handleActionClick(event: ListActionEvent): void;
1751
+ handleSelectionChange(event: ListSelectionEvent): void;
1752
+ isExecutiveExpansionScenario(): boolean;
1753
+ private buildSkinConfig;
1754
+ private buildTemplatingConfig;
1755
+ private pushLog;
1756
+ static ɵfac: i0.ɵɵFactoryDeclaration<PraxisListDocPageComponent, never>;
1757
+ static ɵcmp: i0.ɵɵComponentDeclaration<PraxisListDocPageComponent, "praxis-list-doc-page", never, {}, {}, never, never, true, never>;
1758
+ }
1759
+
1760
+ declare const PRAXIS_LIST_EN_US: {
1761
+ readonly configEdit: "Edit configuration";
1762
+ readonly expandDetails: "Expand details";
1763
+ readonly collapseDetails: "Collapse details";
1764
+ readonly itemDetails: "Item details";
1765
+ readonly emptyState: "No items available";
1766
+ };
1767
+
1768
+ declare const PRAXIS_LIST_I18N_NAMESPACE = "praxis-list";
1769
+ declare function providePraxisListI18n(): i0.Provider;
1770
+
1771
+ declare const PRAXIS_LIST_PT_BR: {
1772
+ readonly configEdit: "Editar configurações";
1773
+ readonly expandDetails: "Expandir detalhes";
1774
+ readonly collapseDetails: "Recolher detalhes";
1775
+ readonly itemDetails: "Detalhes do item";
1776
+ readonly emptyState: "Nenhum item disponível";
1777
+ };
1778
+
1779
+ export { ExecutiveAlertsComponent, ExecutiveBadgeComponent, ExecutiveOwnerComponent, LIST_AI_CAPABILITIES, ListDataService, ListSkinService, PRAXIS_LIST_COMPONENT_METADATA, PRAXIS_LIST_EN_US, PRAXIS_LIST_I18N_NAMESPACE, PRAXIS_LIST_PT_BR, PraxisList, PraxisListConfigEditor, PraxisListDocPageComponent, PraxisListJsonConfigEditorComponent, adaptSelection, buildListApplyPlan, createListAuthoringDocument, evalExpr, evaluateTemplate, inferListAuthoringDocument, inferTemplatingFromSchema, normalizeListActionPayloads, normalizeListAuthoringDocument, normalizeListConfig, parseLegacyOrListDocument, projectListAuthoringDocument, providePraxisListI18n, providePraxisListMetadata, serializeListAuthoringDocument, toCanonicalListConfig, validateListAuthoringDocument };
1780
+ export type { Capability, CapabilityCatalog, CapabilityCategory, EditorDiagnostic, EditorDocument, ExecutiveAlert, JsonEditorEvent, JsonValidationResult, ListActionEvent, ListApplyPlan, ListAuthoringDocument, ListExpansionSectionDef, ListExpansionSectionType, ListFeatureDef, ListItemEvent, ListProjectionContext, ListRowLayoutSlot, ListRuntimeContext, ListSchemaInferencePlan, ListSection, ListSelectionEvent, ListTemplatingSlot, ListValidationContext, PraxisListConfig, TemplateDef, TemplateFeatureDef, TemplateType, TemplatingFeatureDef, ValueKind };