@praxisui/list 1.0.0-beta.4 → 1.0.0-beta.41

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,11 +1,12 @@
1
1
  import * as rxjs from 'rxjs';
2
2
  import { BehaviorSubject, Observable } from 'rxjs';
3
- import * as i0 from '@angular/core';
4
- import { OnInit, OnChanges, EventEmitter, SimpleChanges, DoCheck, Provider } from '@angular/core';
3
+ import * as _angular_core from '@angular/core';
4
+ import { OnInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges, 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
11
  type TemplateType = 'text' | 'icon' | 'image' | 'chip' | 'rating' | 'currency' | 'date' | 'html' | 'slot';
11
12
  interface TemplateDef {
@@ -15,6 +16,13 @@ interface TemplateDef {
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
+ };
18
26
  imageAlt?: string;
19
27
  badge?: {
20
28
  expr: string;
@@ -37,7 +45,7 @@ interface PraxisListConfig {
37
45
  sort?: string[];
38
46
  };
39
47
  layout?: {
40
- variant?: 'list' | 'cards';
48
+ variant?: 'list' | 'cards' | 'tiles';
41
49
  density?: 'default' | 'comfortable' | 'compact';
42
50
  lines?: 1 | 2 | 3;
43
51
  dividers?: 'none' | 'between' | 'all';
@@ -48,7 +56,7 @@ interface PraxisListConfig {
48
56
  pageSize?: number;
49
57
  };
50
58
  skin?: {
51
- type?: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'custom';
59
+ type?: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'outline' | 'flat' | 'neumorphism' | 'custom';
52
60
  gradient?: {
53
61
  from: string;
54
62
  to: string;
@@ -76,6 +84,10 @@ interface PraxisListConfig {
76
84
  trailing?: TemplateDef;
77
85
  metaPlacement?: 'side' | 'line';
78
86
  metaPrefixIcon?: string;
87
+ statusPosition?: 'inline' | 'top-right';
88
+ chipColorMap?: Record<string, string>;
89
+ chipLabelMap?: Record<string, string>;
90
+ iconColorMap?: Record<string, string>;
79
91
  features?: ListFeatureDef[];
80
92
  featuresVisible?: boolean;
81
93
  featuresMode?: 'icons+labels' | 'icons-only' | 'labels-only';
@@ -94,8 +106,28 @@ interface PraxisListConfig {
94
106
  buttonVariant?: 'stroked' | 'raised' | 'flat';
95
107
  showIf?: string;
96
108
  emitPayload?: 'item' | 'id' | 'value';
109
+ command?: string;
110
+ globalPayload?: any;
111
+ emitLocal?: boolean;
112
+ showLoading?: boolean;
113
+ confirmation?: {
114
+ title?: string;
115
+ message?: string;
116
+ type?: 'danger' | 'warning' | 'info';
117
+ };
97
118
  }>;
98
119
  i18n?: Record<string, string>;
120
+ ui?: {
121
+ showSearch?: boolean;
122
+ searchField?: string;
123
+ searchPlaceholder?: string;
124
+ showSort?: boolean;
125
+ sortOptions?: Array<string | {
126
+ label: string;
127
+ value: string;
128
+ }>;
129
+ showRange?: boolean;
130
+ };
99
131
  a11y?: {
100
132
  ariaLabel?: string;
101
133
  ariaLabelledBy?: string;
@@ -131,13 +163,23 @@ interface ListSection<T = any> {
131
163
  items: T[];
132
164
  }
133
165
  declare class ListDataService<T = any> {
166
+ private readonly DEBUG;
134
167
  private config$;
135
168
  private refresh$;
136
169
  private pageable$;
137
170
  private query$;
138
171
  readonly loading$: BehaviorSubject<boolean>;
139
172
  readonly total$: BehaviorSubject<number>;
173
+ readonly pageState$: Observable<{
174
+ pageNumber: number;
175
+ pageSize: number;
176
+ sort?: string[];
177
+ }>;
140
178
  private lastSig;
179
+ private nextObjectId;
180
+ private readonly objectIds;
181
+ private readonly logger;
182
+ private readonly logContext;
141
183
  private readonly crud;
142
184
  setConfig(config: PraxisListConfig): void;
143
185
  refresh(): void;
@@ -149,13 +191,39 @@ declare class ListDataService<T = any> {
149
191
  setSort(sort: string[]): void;
150
192
  setQuery(q: Record<string, any>): void;
151
193
  groupedStream(): Observable<ListSection<T>[]>;
152
- static ɵfac: i0.ɵɵFactoryDeclaration<ListDataService<any>, never>;
153
- static ɵprov: i0.ɵɵInjectableDeclaration<ListDataService<any>>;
194
+ private buildConfigSignature;
195
+ private buildLocalDataSignature;
196
+ private ensureObjectId;
197
+ private safeSerialize;
198
+ private warnFilterFallbackOnce;
199
+ private buildLogOptions;
200
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ListDataService<any>, never>;
201
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ListDataService<any>>;
202
+ }
203
+
204
+ declare class ListAiAdapter extends BaseAiAdapter<PraxisListConfig> {
205
+ private list;
206
+ componentName: string;
207
+ constructor(list: PraxisList);
208
+ getCurrentConfig(): PraxisListConfig;
209
+ getCapabilities(): Capability$1[];
210
+ getRuntimeState(): Record<string, any>;
211
+ createSnapshot(): PraxisListConfig;
212
+ restoreSnapshot(snapshot: PraxisListConfig): Promise<void>;
213
+ applyPatch(patch: Partial<PraxisListConfig>, _intent?: string): Promise<PatchResult>;
214
+ private applyConfig;
215
+ private smartMergeListConfig;
216
+ private sanitizePatch;
217
+ private cloneConfig;
154
218
  }
155
219
 
156
- declare class PraxisList implements OnInit, OnChanges {
220
+ declare class PraxisList implements OnInit, OnChanges, OnDestroy {
221
+ private static nextSkinScopeId;
157
222
  config: PraxisListConfig;
223
+ listId: string;
224
+ componentInstanceId?: string;
158
225
  form?: FormGroup | null;
226
+ enableCustomization: boolean;
159
227
  itemClick: EventEmitter<ListItemEvent>;
160
228
  actionClick: EventEmitter<ListActionEvent>;
161
229
  selectionChange: EventEmitter<ListSelectionEvent>;
@@ -163,21 +231,52 @@ declare class PraxisList implements OnInit, OnChanges {
163
231
  sections$: rxjs.Observable<ListSection<any>[]>;
164
232
  loading$: rxjs.Observable<boolean>;
165
233
  total$: rxjs.Observable<number>;
234
+ page$: rxjs.Observable<{
235
+ pageNumber: number;
236
+ pageSize: number;
237
+ sort?: string[];
238
+ }>;
239
+ private lastQuery;
240
+ private search$;
166
241
  get layoutLines(): number;
167
242
  boundControl: FormControl<unknown | unknown[] | null>;
243
+ readonly skinScopeId: string;
168
244
  skinClasses: string;
169
245
  inlineCss: string;
246
+ readonly cspNonce: string | null;
247
+ aiAdapter: ListAiAdapter;
170
248
  private readonly storage;
171
249
  private readonly skin;
172
250
  private inferredForPath;
173
251
  private readonly data;
174
252
  private readonly settings;
175
253
  private readonly cdr;
254
+ private readonly componentKeys;
255
+ private readonly logger;
256
+ private readonly logContext;
257
+ private readonly route;
258
+ private readonly globalActions;
259
+ private readonly dialog;
260
+ private warnedMissingId;
261
+ private hasHydratedPersistence;
262
+ private hydratedPersistenceKey;
263
+ private hydratingPersistenceKey;
264
+ private externalConfigRevision;
265
+ private nextActionItemObjectId;
266
+ private readonly actionItemObjectIds;
267
+ private readonly destroy$;
268
+ actionLoadingState: Record<string, boolean>;
176
269
  ngOnInit(): void;
177
270
  ngOnChanges(changes: SimpleChanges): void;
271
+ ngOnDestroy(): void;
178
272
  private applyPersistence;
273
+ private applyConfigChange;
274
+ private setupSearch;
275
+ private persistConfig;
179
276
  private applySkins;
180
277
  isListVariant(): boolean;
278
+ isCardsVariant(): boolean;
279
+ isTilesVariant(): boolean;
181
280
  isSelectionEnabled(): boolean;
182
281
  private setupSelectionBinding;
183
282
  leading: (item: any) => any;
@@ -185,7 +284,8 @@ declare class PraxisList implements OnInit, OnChanges {
185
284
  secondary: (item: any) => any;
186
285
  meta: (item: any) => any;
187
286
  trailing: (item: any) => any;
188
- sectionHeader: (key: string) => string;
287
+ sectionHeaderTemplate: (key: string) => any;
288
+ emptyStateTemplate: () => any;
189
289
  featureLabel(item: any, expr: string): string;
190
290
  featuresVisible(): boolean;
191
291
  featuresMode(): 'icons+labels' | 'icons-only' | 'labels-only';
@@ -201,14 +301,46 @@ declare class PraxisList implements OnInit, OnChanges {
201
301
  buttonVariant?: "stroked" | "raised" | "flat";
202
302
  showIf?: string;
203
303
  emitPayload?: "item" | "id" | "value";
304
+ command?: string;
305
+ globalPayload?: any;
306
+ emitLocal?: boolean;
307
+ showLoading?: boolean;
308
+ confirmation?: {
309
+ title?: string;
310
+ message?: string;
311
+ type?: "danger" | "warning" | "info";
312
+ };
204
313
  }[];
205
314
  onItemClick(item: any, index: number, section?: string): void;
206
- onActionClick(ev: MouseEvent, actionId: string, item: any, index: number): void;
315
+ onActionKeydown(ev: Event): void;
316
+ onActionClick(ev: MouseEvent, actionId: string, item: any, index: number): Promise<void>;
317
+ private isGlobalCommand;
318
+ private resolveActionPayload;
319
+ private resolveTemplate;
320
+ private resolveStringTemplate;
321
+ private lookup;
207
322
  onSelectionChange(_change: MatSelectionListChange): void;
208
323
  openConfigEditor(): void;
209
324
  nextPage(): void;
210
325
  prevPage(): void;
326
+ setPageSize(ps: number): void;
327
+ onSortChange(val: string): void;
328
+ onSearchInput(val: string): void;
329
+ sortOptionValue(op: any): string;
330
+ sortOptionLabel(op: any): string;
331
+ rangeStart(ps: {
332
+ pageNumber: number;
333
+ pageSize: number;
334
+ }): number;
335
+ rangeEnd(currLen: number, ps: {
336
+ pageNumber: number;
337
+ pageSize: number;
338
+ }, total: number): number;
339
+ applyConfigFromAdapter(newCfg: PraxisListConfig): void;
211
340
  private onEditorApplied;
341
+ private storageKey;
342
+ private componentKeyId;
343
+ private warnMissingId;
212
344
  private readonly crud;
213
345
  private tryInferTemplatingFromSchema;
214
346
  private evalSlot;
@@ -217,12 +349,30 @@ declare class PraxisList implements OnInit, OnChanges {
217
349
  private evalString;
218
350
  private parseTwoParams;
219
351
  private toBoolean;
352
+ private prettyLabel;
220
353
  private mapDateStyle;
221
354
  starIcon(index: number, ratingValue: string | number): string;
355
+ isThemeColor(color?: string): boolean;
356
+ chipStyle(color?: string, variant?: 'filled' | 'outlined'): string;
357
+ iconStyle(color?: string): string;
358
+ buttonStyle(color?: string, variant?: 'stroked' | 'raised' | 'flat'): string;
359
+ ratingMax(def?: any): number;
360
+ ratingThemeColor(def?: any): string | undefined;
361
+ ratingIconStyle(def?: any): string;
362
+ ratingRange(def?: any): number[];
222
363
  trackBySection: (_: number, s: ListSection<any>) => string | number;
223
364
  trackByItem: (i: number, it: any) => any;
224
- 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>;
365
+ isActionLoading(actionId: string, item: any, index: number): boolean;
366
+ private evaluateActionVisibility;
367
+ private resolveShowIfOperand;
368
+ private looseEquals;
369
+ private warnInvalidShowIfOnce;
370
+ private buildActionLoadingKey;
371
+ private ensureActionItemObjectId;
372
+ private warnGlobalCommandUnavailableOnce;
373
+ private buildLogOptions;
374
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisList, never>;
375
+ static ɵcmp: _angular_core.ɵɵ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>;
226
376
  }
227
377
 
228
378
  type NormalizedListConfig = Omit<PraxisListConfig, 'dataSource' | 'layout' | 'selection' | 'skin' | 'i18n'> & {
@@ -233,7 +383,7 @@ type NormalizedListConfig = Omit<PraxisListConfig, 'dataSource' | 'layout' | 'se
233
383
  sort?: string[];
234
384
  };
235
385
  layout: {
236
- variant: 'list' | 'cards';
386
+ variant: 'list' | 'cards' | 'tiles';
237
387
  density?: 'default' | 'comfortable' | 'compact';
238
388
  lines: 1 | 2 | 3;
239
389
  dividers?: 'none' | 'between' | 'all';
@@ -244,7 +394,7 @@ type NormalizedListConfig = Omit<PraxisListConfig, 'dataSource' | 'layout' | 'se
244
394
  pageSize?: number;
245
395
  };
246
396
  skin: {
247
- type: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'custom';
397
+ type: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'outline' | 'flat' | 'neumorphism' | 'custom';
248
398
  gradient: {
249
399
  from: string;
250
400
  to: string;
@@ -269,7 +419,12 @@ type NormalizedListConfig = Omit<PraxisListConfig, 'dataSource' | 'layout' | 'se
269
419
  currency?: string;
270
420
  };
271
421
  actions?: PraxisListConfig['actions'];
422
+ ui: NonNullable<PraxisListConfig['ui']>;
423
+ a11y?: PraxisListConfig['a11y'];
424
+ events?: PraxisListConfig['events'];
272
425
  };
426
+ type SkinType = NormalizedListConfig['skin']['type'];
427
+ type SkinPreset = Exclude<SkinType, 'custom'>;
273
428
  declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
274
429
  config: PraxisListConfig;
275
430
  listId?: string;
@@ -285,25 +440,27 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
285
440
  sortDir: 'asc' | 'desc';
286
441
  mappingPrimary: {
287
442
  field?: string;
288
- type: 'text' | 'currency' | 'date';
443
+ type: 'text' | 'currency' | 'date' | 'html';
289
444
  currencyCode?: string;
290
445
  locale?: string;
291
446
  dateStyle?: 'short' | 'medium' | 'long' | 'full';
292
447
  class?: string;
293
448
  style?: string;
449
+ extraPipe?: string;
294
450
  };
295
451
  mappingSecondary: {
296
452
  field?: string;
297
- type: 'text' | 'currency' | 'date';
453
+ type: 'text' | 'currency' | 'date' | 'html';
298
454
  currencyCode?: string;
299
455
  locale?: string;
300
456
  dateStyle?: 'short' | 'medium' | 'long' | 'full';
301
457
  class?: string;
302
458
  style?: string;
459
+ extraPipe?: string;
303
460
  };
304
461
  mappingMeta: {
305
462
  field?: string;
306
- type: 'text' | 'currency' | 'date' | 'chip' | 'rating';
463
+ type: 'text' | 'currency' | 'date' | 'chip' | 'rating' | 'icon' | 'image' | 'html';
307
464
  currencyCode?: string;
308
465
  locale?: string;
309
466
  dateStyle?: 'short' | 'medium' | 'long' | 'full';
@@ -312,31 +469,106 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
312
469
  placement?: 'side' | 'line';
313
470
  chipColor?: string;
314
471
  chipVariant?: 'filled' | 'outlined';
472
+ ratingColor?: string;
473
+ ratingSize?: number;
474
+ ratingMax?: number;
475
+ iconColor?: string;
476
+ imageAlt?: string;
477
+ extraPipe?: string;
315
478
  };
316
479
  mappingMetaPrefixIcon?: string;
317
480
  mappingTrailing: {
318
481
  field?: string;
319
- type?: 'text' | 'currency' | 'date' | 'chip';
482
+ type?: 'text' | 'currency' | 'date' | 'chip' | 'icon' | 'rating' | 'html' | 'image';
320
483
  class?: string;
321
484
  style?: string;
322
485
  chipColor?: string;
323
486
  chipVariant?: 'filled' | 'outlined';
487
+ ratingColor?: string;
488
+ ratingSize?: number;
489
+ ratingMax?: number;
490
+ iconColor?: string;
491
+ imageUrl?: string;
492
+ imageAlt?: string;
324
493
  currencyCode?: string;
325
494
  locale?: string;
326
495
  dateStyle?: 'short' | 'medium' | 'long' | 'full';
496
+ extraPipe?: string;
327
497
  };
328
498
  mappingLeading: {
329
- type: 'icon' | 'image';
499
+ field?: string;
500
+ type: 'icon' | 'image' | 'text' | 'chip' | 'rating' | 'html';
330
501
  icon?: string;
331
502
  imageUrl?: string;
503
+ imageAlt?: string;
332
504
  badgeText?: string;
333
505
  badgeColor?: string;
334
506
  badgeVariant?: 'filled' | 'outlined';
507
+ class?: string;
508
+ style?: string;
509
+ chipColor?: string;
510
+ chipVariant?: 'filled' | 'outlined';
511
+ ratingColor?: string;
512
+ ratingSize?: number;
513
+ ratingMax?: number;
514
+ iconColor?: string;
515
+ extraPipe?: string;
516
+ };
517
+ mappingSectionHeader: {
518
+ type: 'text' | 'chip' | 'icon' | 'image' | 'rating' | 'html';
519
+ expr?: string;
520
+ class?: string;
521
+ style?: string;
522
+ chipColor?: string;
523
+ chipVariant?: 'filled' | 'outlined';
524
+ ratingColor?: string;
525
+ ratingSize?: number;
526
+ ratingMax?: number;
527
+ iconColor?: string;
528
+ imageUrl?: string;
529
+ imageAlt?: string;
530
+ extraPipe?: string;
531
+ };
532
+ mappingEmptyState: {
533
+ type: 'text' | 'chip' | 'icon' | 'image' | 'rating' | 'html';
534
+ expr?: string;
535
+ class?: string;
536
+ style?: string;
537
+ chipColor?: string;
538
+ chipVariant?: 'filled' | 'outlined';
539
+ ratingColor?: string;
540
+ ratingSize?: number;
541
+ ratingMax?: number;
542
+ iconColor?: string;
543
+ imageUrl?: string;
544
+ imageAlt?: string;
545
+ extraPipe?: string;
335
546
  };
336
547
  mapping: {
337
548
  leadingIcon?: string;
338
549
  };
339
550
  private mappingDirty;
551
+ private appliedMappingSnapshot;
552
+ statusPosition: 'inline' | 'top-right' | undefined;
553
+ iconColorMapEntries: Array<{
554
+ key: string;
555
+ color?: string;
556
+ }>;
557
+ chipColorMapEntries: Array<{
558
+ key: string;
559
+ color?: string;
560
+ }>;
561
+ chipLabelMapEntries: Array<{
562
+ key: string;
563
+ label?: string;
564
+ }>;
565
+ globalActionCatalog: GlobalActionCatalogEntry[];
566
+ selectedGlobalActionId?: string;
567
+ uiSortRows: Array<{
568
+ label?: string;
569
+ field?: string;
570
+ dir?: 'asc' | 'desc';
571
+ }>;
340
572
  mappingMetaFields: string[];
341
573
  mappingMetaSeparator: string;
342
574
  mappingMetaWrapSecondInParens: boolean;
@@ -349,6 +581,9 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
349
581
  }>;
350
582
  featuresVisible: boolean;
351
583
  featuresMode: 'icons+labels' | 'icons-only' | 'labels-only';
584
+ skeletonCountInput: number;
585
+ queryJson: string;
586
+ queryError: string;
352
587
  private crud;
353
588
  private resourcePathChanges;
354
589
  constructor(injected?: any);
@@ -361,7 +596,8 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
361
596
  private normalize;
362
597
  private setupSchemaWatcher;
363
598
  onResourcePathChange(value: string): void;
364
- applySkinPreset(preset: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'outline' | 'flat' | 'neumorphism'): void;
599
+ applySkinPreset(preset: SkinPreset): void;
600
+ applyLayoutPreset(preset: 'tiles-modern'): void;
365
601
  previewData: {
366
602
  title: string;
367
603
  subtitle: string;
@@ -369,17 +605,103 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
369
605
  salary: number;
370
606
  hireDate: string;
371
607
  rating: number;
608
+ name: string;
609
+ status: string;
610
+ price: number;
611
+ imageUrl: string;
372
612
  }[];
373
613
  skinPreviewTheme: 'light' | 'dark' | 'grid';
614
+ readonly metaTypeConfigs: Array<{
615
+ type: 'text' | 'chip' | 'rating' | 'currency' | 'date' | 'icon' | 'image' | 'html';
616
+ label: string;
617
+ icon: string;
618
+ props?: string[];
619
+ }>;
620
+ readonly primaryTypeConfigs: {
621
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
622
+ label: string;
623
+ icon: string;
624
+ props?: string[];
625
+ }[];
626
+ readonly secondaryTypeConfigs: {
627
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
628
+ label: string;
629
+ icon: string;
630
+ props?: string[];
631
+ }[];
632
+ readonly leadingTypeConfigs: {
633
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
634
+ label: string;
635
+ icon: string;
636
+ props?: string[];
637
+ }[];
638
+ readonly trailingTypeConfigs: {
639
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
640
+ label: string;
641
+ icon: string;
642
+ props?: string[];
643
+ }[];
644
+ readonly sectionHeaderTypeConfigs: {
645
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
646
+ label: string;
647
+ icon: string;
648
+ props?: string[];
649
+ }[];
650
+ readonly emptyStateTypeConfigs: {
651
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
652
+ label: string;
653
+ icon: string;
654
+ props?: string[];
655
+ }[];
656
+ readonly paletteOptions: Array<{
657
+ value?: string;
658
+ label: string;
659
+ }>;
660
+ isThemeColor(value?: string): boolean;
661
+ isM3Color(value?: string): boolean;
662
+ isCustomColor(value?: string): boolean;
663
+ iconStyle(color?: string): string;
664
+ buttonStyle(color?: string, variant?: 'stroked' | 'raised' | 'flat'): string;
665
+ colorDotBackground(value?: string): string;
666
+ enableCustomColor(obj: any, prop: string, fallback?: string): void;
667
+ enableCustomActionColor(action: any, fallback?: string): void;
374
668
  addAction(): void;
375
669
  removeAction(idx: number): void;
376
670
  onActionsChanged(): void;
671
+ ensureConfirmation(action: any): void;
672
+ setConfirmationField(action: any, field: 'title' | 'message', value: string): void;
673
+ applyConfirmationPreset(action: any, type?: 'danger' | 'warning' | 'info' | ''): void;
674
+ isGlobalPayloadInvalid(payload: any): boolean;
675
+ applyGlobalPayloadExample(action: any): void;
676
+ globalPayloadExampleHint(action: any): string;
677
+ globalPayloadSchemaTooltip(action: any): string;
678
+ onGlobalActionSelected(id?: string): void;
679
+ private addGlobalActionFromCatalog;
680
+ metaTypeConfig(type?: string): {
681
+ type: "text" | "chip" | "rating" | "currency" | "date" | "icon" | "image" | "html";
682
+ label: string;
683
+ icon: string;
684
+ props?: string[];
685
+ } | undefined;
686
+ metaSupports(prop: string): boolean;
377
687
  ngDoCheck(): void;
378
688
  reset(): void;
379
689
  onLayoutChanged(): void;
380
690
  onSelectionChanged(): void;
691
+ onSkinGradientChanged(prop: 'from' | 'to' | 'angle', value: string | number): void;
692
+ onSkinTypeChanged(type: SkinType): void;
381
693
  onSkinChanged(): void;
694
+ private ensureSkinGradient;
695
+ onQueryChanged(value: string): void;
382
696
  onPageSizeChange(value: any): void;
697
+ onUiChanged(): void;
698
+ onSkeletonChanged(value: any): void;
699
+ addUiSortRow(): void;
700
+ removeUiSortRow(i: number): void;
701
+ onUiSortRowsChanged(): void;
702
+ isUiSortRowDuplicate(index: number): boolean;
703
+ isIconColorDuplicate(index: number): boolean;
704
+ private hydrateUiEditorFromConfig;
383
705
  private loadFieldsIfNeeded;
384
706
  updateSortConfig(): void;
385
707
  applyTemplate(): void;
@@ -388,6 +710,16 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
388
710
  addFeature(): void;
389
711
  removeFeature(idx: number): void;
390
712
  onFeaturesChanged(): void;
713
+ addIconColorEntry(): void;
714
+ removeIconColorEntry(i: number): void;
715
+ onIconColorMapChanged(): void;
716
+ addChipColorEntry(): void;
717
+ removeChipColorEntry(i: number): void;
718
+ onChipColorMapChanged(): void;
719
+ addChipLabelEntry(): void;
720
+ removeChipLabelEntry(i: number): void;
721
+ onChipLabelMapChanged(): void;
722
+ setPipe(target: any, spec: string): void;
391
723
  insertFeatureToken(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, field: string): void;
392
724
  insertLiteralAt(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, text: string): void;
393
725
  wrapSelectionAt(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, left: string, right: string): void;
@@ -395,13 +727,25 @@ declare class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {
395
727
  private updateFeatureExpr;
396
728
  private hydrateMappingFromTemplating;
397
729
  markDirty(): void;
730
+ private getMappingSnapshot;
731
+ private updateMappingDirty;
732
+ private isJsonLike;
733
+ private resolveGlobalActionCatalog;
734
+ private normalizeActionPayloads;
398
735
  verify(): void;
399
736
  inferFromFields(): void;
400
737
  generateFeaturesFromMetaComposition(): void;
401
738
  metaComposePreview(): string;
739
+ private splitTopLevelPipe;
740
+ private validateImageUrl;
741
+ isImageUrlInvalid(url?: string): boolean;
742
+ isImageUrlRequiredInvalid(url?: string): boolean;
743
+ isRatingSizeInvalid(value?: number): boolean;
744
+ isRatingMaxInvalid(value?: number): boolean;
402
745
  private suggestIcon;
403
- static ɵfac: i0.ɵɵFactoryDeclaration<PraxisListConfigEditor, never>;
404
- static ɵcmp: i0.ɵɵComponentDeclaration<PraxisListConfigEditor, "praxis-list-config-editor", never, { "config": { "alias": "config"; "required": false; }; "listId": { "alias": "listId"; "required": false; }; }, {}, never, never, true, never>;
746
+ getTypeIcon(type: string): string;
747
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisListConfigEditor, [{ optional: true; }]>;
748
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisListConfigEditor, "praxis-list-config-editor", never, { "config": { "alias": "config"; "required": false; }; "listId": { "alias": "listId"; "required": false; }; }, {}, never, never, true, never>;
405
749
  }
406
750
 
407
751
  /**
@@ -413,9 +757,10 @@ declare function inferTemplatingFromSchema(cfg: PraxisListConfig, fieldNames: st
413
757
 
414
758
  declare class ListSkinService {
415
759
  toHostClasses(config?: PraxisListConfig): string[];
416
- toInlineStyle(config?: PraxisListConfig): string;
417
- static ɵfac: i0.ɵɵFactoryDeclaration<ListSkinService, never>;
418
- static ɵprov: i0.ɵɵInjectableDeclaration<ListSkinService>;
760
+ toCssVars(config?: PraxisListConfig): Record<string, string>;
761
+ toInlineStyle(config?: PraxisListConfig, rootSelector?: string, includeVars?: boolean): string;
762
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ListSkinService, never>;
763
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ListSkinService>;
419
764
  }
420
765
 
421
766
  /**
@@ -447,5 +792,245 @@ declare function adaptSelection(config: PraxisListConfig | undefined, items: any
447
792
  declare const PRAXIS_LIST_COMPONENT_METADATA: ComponentDocMeta;
448
793
  declare function providePraxisListMetadata(): Provider;
449
794
 
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 };
795
+ /**
796
+ * Capabilities catalog for PraxisListConfig.
797
+ * Uses paths compatible with AiConfigAgentService (patch is merged into config).
798
+ */
799
+
800
+ declare module '@praxisui/core' {
801
+ interface AiCapabilityCategoryMap {
802
+ meta: true;
803
+ skin: true;
804
+ selection: true;
805
+ templating: true;
806
+ actions: true;
807
+ ui: true;
808
+ i18n: true;
809
+ a11y: true;
810
+ }
811
+ }
812
+ type CapabilityCategory = AiCapabilityCategory;
813
+ type ValueKind = AiValueKind;
814
+ interface Capability extends AiCapability {
815
+ category: CapabilityCategory;
816
+ }
817
+ interface CapabilityCatalog extends AiCapabilityCatalog {
818
+ capabilities: Capability[];
819
+ }
820
+ declare const LIST_AI_CAPABILITIES: CapabilityCatalog;
821
+
822
+ type DemoScenario = 'operations' | 'catalog' | 'empty';
823
+ type DemoVariant = 'list' | 'cards' | 'tiles';
824
+ type DemoDensity = 'default' | 'comfortable' | 'compact';
825
+ type DemoFeaturesMode = 'icons+labels' | 'icons-only' | 'labels-only';
826
+ type DemoSelectionMode = 'none' | 'single' | 'multiple';
827
+ type DemoSkin = 'elevated' | 'outline' | 'flat' | 'neumorphism' | 'pill-soft' | 'glass' | 'gradient-tile' | 'custom';
828
+ type CodeTab = 'template' | 'ts' | 'config' | 'remote';
829
+ interface ScenarioOption {
830
+ id: DemoScenario;
831
+ label: string;
832
+ helper: string;
833
+ }
834
+ interface VariantOption {
835
+ id: DemoVariant;
836
+ label: string;
837
+ }
838
+ interface DensityOption {
839
+ id: DemoDensity;
840
+ label: string;
841
+ }
842
+ interface FeaturesModeOption {
843
+ id: DemoFeaturesMode;
844
+ label: string;
845
+ }
846
+ interface SelectionModeOption {
847
+ id: DemoSelectionMode;
848
+ label: string;
849
+ }
850
+ interface SkinOption {
851
+ id: DemoSkin;
852
+ label: string;
853
+ }
854
+ interface CodeTabOption {
855
+ id: CodeTab;
856
+ label: string;
857
+ }
858
+ interface CoverageTopic {
859
+ title: string;
860
+ details: string;
861
+ }
862
+ interface EventLogEntry {
863
+ id: number;
864
+ message: string;
865
+ }
866
+ interface DemoItem {
867
+ id: number;
868
+ title: string;
869
+ subtitle: string;
870
+ department: string;
871
+ status: string;
872
+ statusIcon: string;
873
+ priority: string;
874
+ budget: number;
875
+ updatedAt: string;
876
+ rating: number;
877
+ owner: string;
878
+ city: string;
879
+ trend: string;
880
+ cover: string;
881
+ }
882
+ declare class PraxisListDocPageComponent {
883
+ readonly form: FormGroup<{
884
+ selectedItems: FormControl<unknown>;
885
+ }>;
886
+ readonly scenario: _angular_core.WritableSignal<DemoScenario>;
887
+ readonly variant: _angular_core.WritableSignal<DemoVariant>;
888
+ readonly density: _angular_core.WritableSignal<DemoDensity>;
889
+ readonly lines: _angular_core.WritableSignal<1 | 2 | 3>;
890
+ readonly skin: _angular_core.WritableSignal<DemoSkin>;
891
+ readonly featuresMode: _angular_core.WritableSignal<DemoFeaturesMode>;
892
+ readonly selectionMode: _angular_core.WritableSignal<DemoSelectionMode>;
893
+ readonly customizationEnabled: _angular_core.WritableSignal<boolean>;
894
+ readonly activeTab: _angular_core.WritableSignal<CodeTab>;
895
+ readonly eventLog: _angular_core.WritableSignal<EventLogEntry[]>;
896
+ private nextLogId;
897
+ readonly scenarioOptions: ReadonlyArray<ScenarioOption>;
898
+ readonly variantOptions: ReadonlyArray<VariantOption>;
899
+ readonly densityOptions: ReadonlyArray<DensityOption>;
900
+ readonly featuresModeOptions: ReadonlyArray<FeaturesModeOption>;
901
+ readonly selectionOptions: ReadonlyArray<SelectionModeOption>;
902
+ readonly skinOptions: ReadonlyArray<SkinOption>;
903
+ readonly codeTabs: ReadonlyArray<CodeTabOption>;
904
+ readonly featureCoverage: ReadonlyArray<CoverageTopic>;
905
+ readonly liveItems: _angular_core.Signal<DemoItem[]>;
906
+ readonly activeScenarioMeta: _angular_core.Signal<ScenarioOption | null>;
907
+ readonly liveConfig: _angular_core.Signal<PraxisListConfig>;
908
+ readonly skinPreviewItems: DemoItem[];
909
+ readonly skinPreviewConfigs: _angular_core.Signal<{
910
+ type: DemoSkin;
911
+ config: {
912
+ layout: {
913
+ variant: "cards";
914
+ lines: 2;
915
+ density: "compact";
916
+ model: "hotel";
917
+ groupBy: undefined;
918
+ dividers?: "none" | "between" | "all";
919
+ stickySectionHeader?: boolean;
920
+ virtualScroll?: boolean;
921
+ pageSize?: number;
922
+ };
923
+ selection: {
924
+ mode: "none";
925
+ };
926
+ dataSource: {
927
+ data: DemoItem[];
928
+ };
929
+ skin: {
930
+ type?: "pill-soft" | "gradient-tile" | "glass" | "elevated" | "outline" | "flat" | "neumorphism" | "custom";
931
+ gradient?: {
932
+ from: string;
933
+ to: string;
934
+ angle?: number;
935
+ };
936
+ radius?: string;
937
+ shadow?: string;
938
+ border?: string;
939
+ backdropBlur?: string;
940
+ class?: string;
941
+ inlineStyle?: string;
942
+ } | undefined;
943
+ id?: string;
944
+ templating?: {
945
+ leading?: TemplateDef;
946
+ primary?: TemplateDef;
947
+ secondary?: TemplateDef;
948
+ meta?: TemplateDef;
949
+ trailing?: TemplateDef;
950
+ metaPlacement?: "side" | "line";
951
+ metaPrefixIcon?: string;
952
+ statusPosition?: "inline" | "top-right";
953
+ chipColorMap?: Record<string, string>;
954
+ chipLabelMap?: Record<string, string>;
955
+ iconColorMap?: Record<string, string>;
956
+ features?: ListFeatureDef[];
957
+ featuresVisible?: boolean;
958
+ featuresMode?: "icons+labels" | "icons-only" | "labels-only";
959
+ sectionHeader?: TemplateDef;
960
+ emptyState?: TemplateDef;
961
+ skeleton?: {
962
+ count?: number;
963
+ };
964
+ };
965
+ actions?: Array<{
966
+ id: string;
967
+ icon?: string;
968
+ label?: string;
969
+ color?: string;
970
+ kind?: "icon" | "button";
971
+ buttonVariant?: "stroked" | "raised" | "flat";
972
+ showIf?: string;
973
+ emitPayload?: "item" | "id" | "value";
974
+ command?: string;
975
+ globalPayload?: any;
976
+ emitLocal?: boolean;
977
+ showLoading?: boolean;
978
+ confirmation?: {
979
+ title?: string;
980
+ message?: string;
981
+ type?: "danger" | "warning" | "info";
982
+ };
983
+ }>;
984
+ i18n?: Record<string, string>;
985
+ ui?: {
986
+ showSearch?: boolean;
987
+ searchField?: string;
988
+ searchPlaceholder?: string;
989
+ showSort?: boolean;
990
+ sortOptions?: Array<string | {
991
+ label: string;
992
+ value: string;
993
+ }>;
994
+ showRange?: boolean;
995
+ };
996
+ a11y?: {
997
+ ariaLabel?: string;
998
+ ariaLabelledBy?: string;
999
+ highContrast?: boolean;
1000
+ reduceMotion?: boolean;
1001
+ };
1002
+ events?: {
1003
+ itemClick?: string;
1004
+ actionClick?: string;
1005
+ selectionChange?: string;
1006
+ loaded?: string;
1007
+ };
1008
+ };
1009
+ }[]>;
1010
+ readonly configPreview: _angular_core.Signal<string>;
1011
+ readonly selectedSnippet: _angular_core.Signal<string>;
1012
+ readonly templateSnippet = "<praxis-list-doc-page></praxis-list-doc-page>";
1013
+ 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 {}";
1014
+ 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;";
1015
+ setScenario(next: DemoScenario): void;
1016
+ setVariant(next: DemoVariant): void;
1017
+ setDensity(next: DemoDensity): void;
1018
+ setLines(next: 1 | 2 | 3): void;
1019
+ setSkin(next: DemoSkin): void;
1020
+ setFeaturesMode(next: DemoFeaturesMode): void;
1021
+ setSelectionMode(next: DemoSelectionMode): void;
1022
+ setCodeTab(next: CodeTab): void;
1023
+ setCustomizationMode(enabled: boolean): void;
1024
+ clearLog(): void;
1025
+ handleItemClick(event: ListItemEvent): void;
1026
+ handleActionClick(event: ListActionEvent): void;
1027
+ handleSelectionChange(event: ListSelectionEvent): void;
1028
+ private buildSkinConfig;
1029
+ private buildTemplatingConfig;
1030
+ private pushLog;
1031
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisListDocPageComponent, never>;
1032
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisListDocPageComponent, "praxis-list-doc-page", never, {}, {}, never, never, true, never>;
1033
+ }
1034
+
1035
+ export { LIST_AI_CAPABILITIES, ListDataService, ListSkinService, PRAXIS_LIST_COMPONENT_METADATA, PraxisList, PraxisListConfigEditor, PraxisListDocPageComponent, adaptSelection, evalExpr, evaluateTemplate, inferTemplatingFromSchema, providePraxisListMetadata };
1036
+ export type { Capability, CapabilityCatalog, CapabilityCategory, ListActionEvent, ListFeatureDef, ListItemEvent, ListSection, ListSelectionEvent, PraxisListConfig, TemplateDef, TemplateType, ValueKind };