@praxisui/list 10.0.0-rc.34 → 10.0.0-rc.35

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/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@praxisui/list",
3
- "version": "10.0.0-rc.34",
3
+ "version": "10.0.0-rc.35",
4
4
  "description": "List components and helpers for Praxis UI.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
8
  "@angular/cdk": "^21.0.0",
9
9
  "@angular/material": "^21.0.0",
10
- "@praxisui/dynamic-fields": "^10.0.0-rc.34",
10
+ "@praxisui/dynamic-fields": "^10.0.0-rc.35",
11
11
  "rxjs": ">=7 <9",
12
12
  "@angular/forms": "^21.0.0",
13
13
  "@angular/router": "^21.0.0",
14
- "@praxisui/ai": "^10.0.0-rc.34",
15
- "@praxisui/core": "^10.0.0-rc.34",
16
- "@praxisui/rich-content": "^10.0.0-rc.34",
17
- "@praxisui/settings-panel": "^10.0.0-rc.34"
14
+ "@praxisui/ai": "^10.0.0-rc.35",
15
+ "@praxisui/core": "^10.0.0-rc.35",
16
+ "@praxisui/rich-content": "^10.0.0-rc.35",
17
+ "@praxisui/settings-panel": "^10.0.0-rc.35"
18
18
  },
19
19
  "dependencies": {
20
20
  "tslib": "^2.3.0",
@@ -104,11 +104,13 @@ Este documento e a referencia canonica da API JSON de praxis-list.
104
104
  | ------------ | ------------- | ------------- | ------- | ------------- | ---------------------------------------------------------------------------- |
105
105
  | `id` | not-specified | not-specified | n/a | Declared-only | preservado no contrato, sem efeito direto |
106
106
  | `dataSource` | not-specified | not-specified | n/a | Active | origem de dados, query e sort |
107
- | `layout` | not-specified | not-specified | n/a | Partial | maioria ativa; `stickySectionHeader` e `virtualScroll` sem binding funcional |
107
+ | `layout` | not-specified | not-specified | n/a | Partial | maioria ativa (`rowLayout`, `virtualScroll`, `itemAppearance`); `stickySectionHeader` sem binding funcional |
108
108
  | `skin` | not-specified | not-specified | n/a | Active | classes + css vars + inline style sanitizado |
109
- | `selection` | not-specified | not-specified | n/a | Active | binding e shape do payload de selecao |
110
- | `templating` | not-specified | not-specified | n/a | Partial | quase completo; `type='slot'` sem renderer |
111
- | `actions` | not-specified | not-specified | n/a | Partial | quase completo; `emitPayload` sem consumo no runtime |
109
+ | `selection` | not-specified | not-specified | n/a | Active | binding, `showControl` e shape do payload de selecao |
110
+ | `templating` | not-specified | not-specified | n/a | Partial | quase completo (`compose`, `metric`, `datetime`, `relative` ativos); `type='slot'` sem renderer |
111
+ | `rules` | not-specified | not-specified | n/a | Active | `itemStyles` (com `tone` semântico) e `slotOverrides` condicionais por linha |
112
+ | `actions` | not-specified | not-specified | n/a | Partial | quase completo (`placement='actions'|'trailing'|'menu'`, `kind='icon'|'button'|'menu-item'`); `emitPayload` sem consumo no runtime |
113
+ | `itemActions`| not-specified | not-specified | n/a | Active | alias compatível para `actions` |
112
114
  | `i18n` | not-specified | not-specified | n/a | Active | locale/currency para `date/currency` |
113
115
  | `ui` | not-specified | not-specified | n/a | Active | busca/sort/range |
114
116
  | `export` | not-specified | not-specified | n/a | Active | contrato compartilhado de exportação de coleções |
@@ -141,11 +143,13 @@ Este arquivo foi adaptado para o padrao canonico atual sem remover conteudo tecn
141
143
  | Block | Purpose | Required | Merge strategy | Notes |
142
144
  | ------------ | --------------------------------------------------- | -------- | -------------- | -------------------------------------------------------------- |
143
145
  | `dataSource` | Origem de dados, query, sort e paginação | Yes | deep-merge | Base para `ListDataService`. |
144
- | `layout` | Modelo visual e paginação do componente | No | deep-merge | `virtualScroll` e `stickySectionHeader` com cobertura parcial. |
146
+ | `layout` | Modelo visual e paginação do componente | No | deep-merge | `rowLayout`, `virtualScroll` e `itemAppearance` ativos; `stickySectionHeader` declarativo. |
145
147
  | `skin` | Tema visual com classes, css vars e style inline | No | replace-block | Processado por `ListSkinService`. |
146
- | `selection` | Estratégia de seleção e integração com formulário | No | deep-merge | Normaliza modo single/multiple e payload de retorno. |
147
- | `templating` | Slots primário/secundário/meta/trailing | No | deep-merge | Avaliação por template engine + inferência opcional. |
148
- | `actions` | Ações locais e globais por item | No | replace-array | Inclui confirmação opcional e loading por ação. |
148
+ | `selection` | Estratégia de seleção e integração com formulário | No | deep-merge | Normaliza modo single/multiple, `showControl` e payload de retorno. |
149
+ | `templating` | Slots primário/secundário/meta/trailing | No | deep-merge | Avaliação por template engine (`compose`, `metric`, `datetime`, `relative` inclusos) + inferência opcional. |
150
+ | `rules` | Regras condicionais de estilo e override de slot | No | deep-merge | `itemStyles` (com `tone`) e `slotOverrides` avaliados por item. |
151
+ | `actions` | Ações locais, inline, overflow menu e globais | No | replace-array | Suporta `placement` (`actions`, `trailing`, `menu`) e `kind` (`icon`, `button`, `menu-item`). |
152
+ | `itemActions`| Alias compatível de `actions` | No | replace-array | Normalizado para `actions` quando `actions` não for informado. |
149
153
  | `i18n` | Locale/currency para renderizadores `date/currency` | No | deep-merge | Aplica fallback de locale/currency quando ausente. |
150
154
  | `ui` | Busca, ordenação e elementos auxiliares de UX | No | deep-merge | Conecta com stream de pesquisa e estado de página. |
151
155
 
@@ -155,11 +159,13 @@ Este arquivo foi adaptado para o padrao canonico atual sem remover conteudo tecn
155
159
  | ------------ | ------------- | ------------- | ------- | ----------------- | ---------------------------------------------------------------------------- |
156
160
  | `id` | not-specified | not-specified | n/a | component-defined | preservado no contrato, sem efeito direto |
157
161
  | `dataSource` | not-specified | not-specified | n/a | component-defined | origem de dados, query e sort |
158
- | `layout` | not-specified | not-specified | n/a | component-defined | maioria ativa; `stickySectionHeader` e `virtualScroll` sem binding funcional |
162
+ | `layout` | not-specified | not-specified | n/a | component-defined | maioria ativa (`rowLayout`, `virtualScroll`, `itemAppearance`); `stickySectionHeader` sem binding funcional |
159
163
  | `skin` | not-specified | not-specified | n/a | component-defined | classes + css vars + inline style sanitizado |
160
- | `selection` | not-specified | not-specified | n/a | component-defined | binding e shape do payload de selecao |
164
+ | `selection` | not-specified | not-specified | n/a | component-defined | binding, `showControl` e shape do payload de selecao |
161
165
  | `templating` | not-specified | not-specified | n/a | component-defined | quase completo; `type='slot'` sem renderer |
162
- | `actions` | not-specified | not-specified | n/a | component-defined | quase completo; `emitPayload` sem consumo no runtime |
166
+ | `rules` | not-specified | not-specified | n/a | component-defined | `itemStyles` e `slotOverrides` ativos no runtime |
167
+ | `actions` | not-specified | not-specified | n/a | component-defined | quase completo (`placement` e `menu-item` ativos); `emitPayload` sem consumo |
168
+ | `itemActions`| not-specified | not-specified | n/a | component-defined | alias compatível para `actions` |
163
169
  | `i18n` | not-specified | not-specified | n/a | component-defined | locale/currency para `date/currency` |
164
170
  | `ui` | not-specified | not-specified | n/a | component-defined | busca/sort/range |
165
171
  | `a11y` | not-specified | not-specified | n/a | component-defined | aria ativos; `highContrast/reduceMotion` sem efeito |
@@ -325,6 +331,8 @@ Legenda de suporte:
325
331
  - [Skin API](#skin-api)
326
332
  - [Selection API](#selection-api)
327
333
  - [Templating API (deep dive)](#templating-api-deep-dive)
334
+ - [Rules API](#rules-api)
335
+ - [Expansion API](#expansion-api)
328
336
  - [Actions API](#actions-api)
329
337
  - [UI, i18n, a11y e events](#ui-i18n-a11y-e-events)
330
338
  - [Expressoes suportadas (`expr` e `showIf`)](#expressoes-suportadas-expr-e-showif)
@@ -491,8 +499,10 @@ interface PraxisListConfig {
491
499
  selection?: {...};
492
500
  interaction?: {...};
493
501
  templating?: {...};
502
+ rules?: {...};
494
503
  expansion?: {...};
495
504
  actions?: Array<...>;
505
+ itemActions?: Array<...>;
496
506
  i18n?: {
497
507
  locale?: string;
498
508
  currency?: string;
@@ -510,13 +520,15 @@ interface PraxisListConfig {
510
520
  | ------------- | ------------- | ---------------------------------------------------------------------------- |
511
521
  | `id` | Declared-only | preservado no contrato, sem efeito direto |
512
522
  | `dataSource` | Active | origem de dados, query e sort |
513
- | `layout` | Partial | maioria ativa; `stickySectionHeader` e `virtualScroll` sem binding funcional |
523
+ | `layout` | Partial | maioria ativa (`rowLayout`, `virtualScroll`, `itemAppearance`); `stickySectionHeader` sem binding funcional |
514
524
  | `skin` | Active | classes + css vars + inline style sanitizado |
515
- | `selection` | Active | binding e shape do payload de selecao |
525
+ | `selection` | Active | binding, `showControl` e shape do payload de selecao |
516
526
  | `interaction` | Partial | expansao inline V1; apenas `variant=list` |
517
- | `templating` | Partial | quase completo; `type='slot'` sem renderer |
518
- | `expansion` | Partial | detail row tipada da V1 |
519
- | `actions` | Partial | quase completo; `emitPayload` sem consumo no runtime |
527
+ | `templating` | Partial | quase completo (`compose`, `metric`, `datetime`, `relative` ativos); `type='slot'` sem renderer |
528
+ | `rules` | Active | `itemStyles` (com `tone`) e `slotOverrides` condicionais por linha |
529
+ | `expansion` | Partial | detail row tipada da V1 (com pipes avaliados em `itemsExpr`) |
530
+ | `actions` | Partial | quase completo (`placement`, `menu-item` ativos); `emitPayload` sem consumo no runtime |
531
+ | `itemActions` | Active | alias compatível para `actions` |
520
532
  | `i18n` | Active | locale/currency para `date/currency` |
521
533
  | `ui` | Active | busca/sort/range |
522
534
  | `export` | Active | exportação via contrato compartilhado de coleções |
@@ -534,19 +546,27 @@ interface PraxisListConfig {
534
546
 
535
547
  #### Layout API
536
548
 
537
- | Caminho | Status | Observacao |
538
- | ---------------------------- | ------------- | ---------------------------------------------------------- |
539
- | `layout.variant` | Active | `list/cards/tiles` |
540
- | `layout.density` | Active | classe `density-*` |
541
- | `layout.itemSpacing` | Active | classe `item-spacing-*` |
542
- | `layout.itemAppearance` | Active | `flat/card` (isola itens em cartões sob `variant: 'list'`) |
543
- | `layout.lines` | Active | linhas de texto + classe `lines-*` |
544
- | `layout.dividers` | Active | divisores no modo `list` |
545
- | `layout.model` | Active | classe `model-*` |
546
- | `layout.groupBy` | Active | agrupamento em `sections$` |
547
- | `layout.pageSize` | Active | page size inicial |
548
- | `layout.stickySectionHeader` | Declared-only | sem sticky runtime |
549
- | `layout.virtualScroll` | Declared-only | sem virtual scroll runtime |
549
+ | Caminho | Status | Observacao |
550
+ | -------------------------------------- | ------------- | ----------------------------------------------------------------------------------------------------------- |
551
+ | `layout.variant` | Active | `list/cards/tiles` |
552
+ | `layout.density` | Active | classe `density-*` |
553
+ | `layout.itemSpacing` | Active | classe `item-spacing-*` |
554
+ | `layout.itemAppearance` | Active | `flat/card` (isola itens em cartões sob `variant: 'list'`) |
555
+ | `layout.lines` | Active | linhas de texto + classe `lines-*` |
556
+ | `layout.dividers` | Active | divisores no modo `list` |
557
+ | `layout.model` | Active | classe `model-*` |
558
+ | `layout.groupBy` | Active | agrupamento em `sections$` |
559
+ | `layout.pageSize` | Active | page size inicial |
560
+ | `layout.rowLayout.type` | Active | `'grid'` para distribuicao colunar explicita dos slots em `variant='list'` |
561
+ | `layout.rowLayout.gap` | Active | gap horizontal entre colunas do `rowLayout` |
562
+ | `layout.rowLayout.align` | Active | alinhamento vertical das celulas (`start/center/end/stretch`) |
563
+ | `layout.rowLayout.columns` | Active | array de colunas `{ id?, slot, width, align?, minWidth?, maxWidth? }` (`leading/primary/secondary/meta/trailing/actions`) |
564
+ | `layout.stickySectionHeader` | Declared-only | sem sticky runtime |
565
+ | `layout.virtualScroll.enabled` | Active | habilita CDK Virtual Scroll (`variant='list'` sem `groupBy`); quando combinado com `interaction.expandable=true`, aplica viewport delimitado com barra de rolagem fina |
566
+ | `layout.virtualScroll.itemSize` | Active | altura estimada por linha em px no CDK Virtual Scroll |
567
+ | `layout.virtualScroll.minBufferPx` | Active | buffer minimo em px |
568
+ | `layout.virtualScroll.maxBufferPx` | Active | buffer maximo em px |
569
+ | `layout.virtualScroll.viewportHeight` | Active | altura do viewport (ex: `360` ou `'360px'`) tanto em virtual scroll quanto no fallback com `expandable=true`|
550
570
 
551
571
  #### Skin API
552
572
 
@@ -570,13 +590,14 @@ Notas de seguranca:
570
590
 
571
591
  #### Selection API
572
592
 
573
- | Caminho | Status | Observacao |
574
- | --------------------------- | ------ | -------------------------------------------------- |
575
- | `selection.mode` | Active | `none/single/multiple` |
576
- | `selection.formControlName` | Active | binding em form externo |
577
- | `selection.formControlPath` | Active | binding em path do form externo |
578
- | `selection.compareBy` | Active | igualdade de seleção e geração de `ids` |
579
- | `selection.return` | Active | `value/item/id` no payload `selectionChange.value` |
593
+ | Caminho | Status | Observacao |
594
+ | --------------------------- | ------ | -------------------------------------------------------------------------------------------------- |
595
+ | `selection.mode` | Active | `none/single/multiple` |
596
+ | `selection.showControl` | Active | exibe/oculta explicitamente o controle visual (`radio`/`checkbox`) sem desabilitar `selection.mode` |
597
+ | `selection.formControlName` | Active | binding em form externo |
598
+ | `selection.formControlPath` | Active | binding em path do form externo |
599
+ | `selection.compareBy` | Active | igualdade de seleção e geração de `ids` |
600
+ | `selection.return` | Active | `value/item/id` no payload `selectionChange.value` |
580
601
 
581
602
  A identidade de renderização é independente da identidade escolhida para a
582
603
  seleção. Registros HATEOAS usam prioritariamente `_links.self.href`, evitando
@@ -673,6 +694,22 @@ Tipo declarado sem renderer dedicado:
673
694
  | `templating.featuresMode` | Active | `icons+labels/icons-only/labels-only` |
674
695
  | `templating.skeleton.count` | Active | skeleton durante loading |
675
696
 
697
+ #### Rules API
698
+
699
+ | Caminho | Status | Observacao |
700
+ | ---------------------------------- | ------ | ---------------------------------------------------------------------------------------------- |
701
+ | `rules.itemStyles` | Active | array de regras visuais avaliadas por linha |
702
+ | `rules.itemStyles[].id` | Active | identificador da regra |
703
+ | `rules.itemStyles[].condition` | Active | condição Json Logic (ex: `{"==":[{"var":"row.severidade"},"CRITICA"]}`) ou expressão booleana |
704
+ | `rules.itemStyles[].tone` | Active | tom semântico (`neutral/info/success/warning/danger`) materializado como `.item-tone-*` |
705
+ | `rules.itemStyles[].class` | Active | classes CSS extras adicionadas ao item quando a condição é verdadeira |
706
+ | `rules.itemStyles[].style` | Active | declarações CSS inline adicionadas ao item quando a condição é verdadeira |
707
+ | `rules.slotOverrides` | Active | array de overrides condicionais de template por slot (`leading/primary/secondary/meta/trailing`) |
708
+ | `rules.slotOverrides[].id` | Active | identificador do override |
709
+ | `rules.slotOverrides[].slot` | Active | slot alvo (`leading/primary/secondary/meta/trailing`) |
710
+ | `rules.slotOverrides[].condition` | Active | condição Json Logic ou expressão booleana avaliada por linha |
711
+ | `rules.slotOverrides[].template` | Active | `TemplateDef` substituto para o slot quando a condição for verdadeira |
712
+
676
713
  #### Expansion API
677
714
 
678
715
  | Caminho | Status | Observacao |
@@ -711,9 +748,11 @@ Notas de UX/WCAG:
711
748
  | `actions[].icon` | Active | icone |
712
749
  | `actions[].label` | Active | label/aria-label |
713
750
  | `actions[].color` | Active | tema/cor custom |
714
- | `actions[].kind` | Active | `icon` ou `button` |
751
+ | `actions[].kind` | Active | `icon`, `button` ou `menu-item` (item de menu de overflow `⋮`) |
752
+ | `actions[].placement` | Active | `actions` (default), `trailing` (inline no slot trailing) ou `menu` (agrupado em `mat-menu` de overflow) |
715
753
  | `actions[].buttonVariant` | Active | `stroked/raised/flat` |
716
754
  | `actions[].showIf` | Active | condição Json Logic avaliada no contexto `row` |
755
+ | `itemActions` | Active | alias compatível para `actions` (normalizado automaticamente quando `actions` estiver ausente) |
717
756
  | `actions[].emitPayload` | Declared-only | sem uso no payload de ações nativas; ações `rich-content` hospedadas podem emitir `payload?` próprio |
718
757
  | `actions[].action` | Active | `surface.open` identifica a execução contextual governada quando acompanhada de `recordOpen` |
719
758
  | `actions[].recordOpen` | Active | referência mínima `{ sourceIdentityField, target: { resourceKey, surfaceId } }`; o runtime reconsulta catálogo, item e `_links.surfaces` antes de materializar |
@@ -828,8 +867,18 @@ AI:
828
867
  | `layout.dividers` | Active | divisor no list |
829
868
  | `layout.model` | Active | classe host |
830
869
  | `layout.groupBy` | Active | agrupamento |
870
+ | `layout.rowLayout` | Active | grid colunar explicito por linha (`variant='list'`) |
871
+ | `layout.rowLayout.type` | Active | `'grid'` |
872
+ | `layout.rowLayout.gap` | Active | gap horizontal entre colunas |
873
+ | `layout.rowLayout.align` | Active | `start/center/end/stretch` |
874
+ | `layout.rowLayout.columns` | Active | array de colunas `{ id?, slot, width, align?, minWidth?, maxWidth? }` |
831
875
  | `layout.stickySectionHeader` | Declared-only | sem sticky runtime |
832
- | `layout.virtualScroll` | Declared-only | sem virtual runtime |
876
+ | `layout.virtualScroll` | Active | CDK Virtual Scroll + bounded scroll fallback com `expandable=true` |
877
+ | `layout.virtualScroll.enabled` | Active | habilita virtual scroll ou viewport delimitado |
878
+ | `layout.virtualScroll.itemSize` | Active | altura por item em px |
879
+ | `layout.virtualScroll.minBufferPx` | Active | buffer minimo em px |
880
+ | `layout.virtualScroll.maxBufferPx` | Active | buffer maximo em px |
881
+ | `layout.virtualScroll.viewportHeight` | Active | altura do viewport (px ou CSS length) |
833
882
  | `layout.pageSize` | Active | pagina remota |
834
883
  | `skin` | Active | bloco de skin |
835
884
  | `skin.type` | Active | classe skin |
@@ -845,6 +894,7 @@ AI:
845
894
  | `skin.inlineStyle` | Active | css inline sanitizado |
846
895
  | `selection` | Active | bloco de selecao |
847
896
  | `selection.mode` | Active | none/single/multiple |
897
+ | `selection.showControl` | Active | visibilidade explicita do radio/checkbox |
848
898
  | `selection.formControlName` | Active | binding form |
849
899
  | `selection.formControlPath` | Active | binding form |
850
900
  | `selection.compareBy` | Active | igualdade de seleção e ids |
@@ -890,12 +940,24 @@ AI:
890
940
  | `templating.featuresMode` | Active | icons+labels/icons-only/labels-only |
891
941
  | `templating.skeleton` | Active | skeleton bloco |
892
942
  | `templating.skeleton.count` | Active | skeleton count |
943
+ | `rules` | Active | bloco de regras condicionais por linha |
944
+ | `rules.itemStyles` | Active | estilos condicionais de linha |
945
+ | `rules.itemStyles[].id` | Active | id da regra |
946
+ | `rules.itemStyles[].condition` | Active | condicao Json Logic ou expressao booleana |
947
+ | `rules.itemStyles[].tone` | Active | `neutral/primary/success/warning/danger/muted` |
948
+ | `rules.itemStyles[].class` | Active | classes extras |
949
+ | `rules.itemStyles[].style` | Active | estilo inline extra |
950
+ | `rules.slotOverrides` | Active | overrides condicionais de slot |
951
+ | `rules.slotOverrides[].id` | Active | id do override |
952
+ | `rules.slotOverrides[].slot` | Active | slot alvo |
953
+ | `rules.slotOverrides[].condition` | Active | condicao Json Logic ou expressao booleana |
954
+ | `rules.slotOverrides[].template` | Active | `TemplateDef` substituto |
893
955
  | `expansion` | Partial | detail row governada |
894
956
  | `expansion.sections` | Active | secoes do detail row |
895
957
  | `expansion.sections[].id` | Active | id |
896
958
  | `expansion.sections[].title` | Active | title |
897
959
  | `expansion.sections[].type` | Active | info-list/chip-list/timeline/key-value/metadata/component/rich-content |
898
- | `expansion.sections[].itemsExpr` | Active | expr |
960
+ | `expansion.sections[].itemsExpr` | Active | expr (suporta placeholders com pipes) |
899
961
  | `expansion.sections[].document` | Active | `RichContentDocument` para `rich-content` |
900
962
  | `expansion.sections[].documentExpr` | Active | expr que resolve `RichContentDocument` |
901
963
  | `expansion.sections[].emptyLabel` | Active | empty state da secao |
@@ -906,11 +968,13 @@ AI:
906
968
  | `expansion.rendering.class` | Active | classe do shell |
907
969
  | `expansion.rendering.style` | Active | estilo adicional |
908
970
  | `actions` | Partial | bloco de acoes |
971
+ | `itemActions` | Active | alias compatível para `actions` |
909
972
  | `actions[].id` | Active | id |
910
973
  | `actions[].icon` | Active | icon |
911
974
  | `actions[].label` | Active | label |
912
975
  | `actions[].color` | Active | color |
913
- | `actions[].kind` | Active | icon/button |
976
+ | `actions[].kind` | Active | icon/button/menu-item |
977
+ | `actions[].placement` | Active | actions/trailing/menu |
914
978
  | `actions[].buttonVariant` | Active | raised/flat/stroked |
915
979
  | `actions[].showIf` | Active | visibilidade |
916
980
  | `actions[].emitPayload` | Declared-only | sem efeito runtime |
@@ -1015,11 +1079,25 @@ Recomendacao corporativa:
1015
1079
  "layout": {
1016
1080
  "variant": "list",
1017
1081
  "itemAppearance": "card",
1018
- "itemSpacing": "compact"
1082
+ "itemSpacing": "tight",
1083
+ "virtualScroll": {
1084
+ "enabled": true,
1085
+ "itemSize": 76,
1086
+ "viewportHeight": "360px"
1087
+ }
1019
1088
  },
1020
1089
  "skin": {
1021
1090
  "type": "glass"
1022
1091
  },
1092
+ "selection": {
1093
+ "mode": "none",
1094
+ "showControl": false
1095
+ },
1096
+ "interaction": {
1097
+ "expandable": true,
1098
+ "expandTrigger": "row+icon",
1099
+ "expandMode": "single"
1100
+ },
1023
1101
  "templating": {
1024
1102
  "leading": {
1025
1103
  "type": "icon",
@@ -1040,12 +1118,44 @@ Recomendacao corporativa:
1040
1118
  },
1041
1119
  "metaPlacement": "side"
1042
1120
  },
1121
+ "rules": {
1122
+ "itemStyles": [
1123
+ {
1124
+ "id": "critical-tone",
1125
+ "condition": { "==": [{ "var": "row.severidade" }, "CRITICA"] },
1126
+ "tone": "danger"
1127
+ }
1128
+ ]
1129
+ },
1130
+ "expansion": {
1131
+ "rendering": {
1132
+ "shell": "attached",
1133
+ "columns": 1
1134
+ },
1135
+ "sections": [
1136
+ {
1137
+ "id": "telemetry",
1138
+ "title": "Telemetria",
1139
+ "type": "key-value",
1140
+ "itemsExpr": "{\"Protocolo\":\"${item.protocolo}\",\"Local\":\"${item.localizacao}\"}"
1141
+ }
1142
+ ]
1143
+ },
1043
1144
  "actions": [
1044
1145
  {
1045
1146
  "id": "dispatch",
1046
1147
  "label": "Despachar",
1047
- "icon": "send",
1048
- "kind": "icon"
1148
+ "icon": "bolt",
1149
+ "kind": "icon",
1150
+ "placement": "trailing",
1151
+ "showIf": { "==": [{ "var": "row.status" }, "ABERTO"] }
1152
+ },
1153
+ {
1154
+ "id": "details",
1155
+ "label": "Ver detalhes",
1156
+ "icon": "visibility",
1157
+ "kind": "menu-item",
1158
+ "placement": "menu"
1049
1159
  }
1050
1160
  ]
1051
1161
  }
@@ -255,6 +255,12 @@ interface PraxisListConfig {
255
255
  };
256
256
  selection?: {
257
257
  mode?: 'none' | 'single' | 'multiple';
258
+ /**
259
+ * Controls whether the explicit checkbox/radio control is rendered on each row.
260
+ * Defaults to `true` when selection is enabled. Set to `false` to allow row-click
261
+ * selection without displaying a trailing radio/checkbox control.
262
+ */
263
+ showControl?: boolean;
258
264
  formControlName?: string;
259
265
  formControlPath?: string;
260
266
  compareBy?: string;
@@ -624,6 +630,7 @@ declare class PraxisList implements OnInit, OnChanges, AfterViewInit, OnDestroy
624
630
  isCardsVariant(): boolean;
625
631
  isTilesVariant(): boolean;
626
632
  isSelectionEnabled(): boolean;
633
+ shouldShowSelectionControl(): boolean;
627
634
  private setupSelectionBinding;
628
635
  private watchSelectionControl;
629
636
  leading: (item: any) => Record<string, any> | null;
@@ -708,7 +715,9 @@ declare class PraxisList implements OnInit, OnChanges, AfterViewInit, OnDestroy
708
715
  hasSkeleton(): boolean;
709
716
  skeletonCount(): number;
710
717
  skeletonItems(): any[];
718
+ private isVirtualScrollConfigured;
711
719
  isVirtualScrollEnabled(): boolean;
720
+ hasBoundedScrollViewport(): boolean;
712
721
  virtualScrollItemSize(): number;
713
722
  virtualScrollMinBufferPx(): number;
714
723
  virtualScrollMaxBufferPx(): number;
@@ -876,8 +885,13 @@ declare class PraxisList implements OnInit, OnChanges, AfterViewInit, OnDestroy
876
885
  private mapDateTimeStyle;
877
886
  starIcon(index: number, ratingValue: string | number): string;
878
887
  isThemeColor(color?: string): boolean;
888
+ private normalizeTemplatingMapKey;
889
+ private lookupTemplatingMapValue;
890
+ resolveSemanticTone(color?: string): 'info' | 'success' | 'warning' | 'danger' | 'neutral' | undefined;
891
+ private resolveSemanticBaseColor;
879
892
  chipStyle(color?: string, variant?: 'filled' | 'outlined'): string;
880
893
  iconStyle(color?: string): string;
894
+ leadingIconStyle(color?: string, extraStyle?: string): string;
881
895
  actionIconStyle(color?: string): string;
882
896
  buttonStyle(color?: string, variant?: 'stroked' | 'raised' | 'flat'): string;
883
897
  ratingMax(def?: any): number;
@@ -1243,6 +1257,7 @@ type NormalizedListConfig = Omit<PraxisListConfig, 'dataSource' | 'layout' | 'se
1243
1257
  formControlPath?: string;
1244
1258
  compareBy?: string;
1245
1259
  return?: 'value' | 'item' | 'id';
1260
+ showControl?: boolean;
1246
1261
  };
1247
1262
  i18n: {
1248
1263
  locale?: string;