@snksergio/design-system 0.61.0 → 0.63.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/dist-lib/ai/blocos/chart/budget-breakdown.tsx +174 -0
- package/dist-lib/ai/blocos/indice.md +43 -0
- package/dist-lib/ai/blocos/paneldetail/detalhe-com-tabela.tsx +450 -0
- package/dist-lib/ai/blocos/paneldetail/detalhe-de-tarefa-com-abas.tsx +570 -0
- package/dist-lib/ai/blocos/paneldetail/detalhe-do-registro.tsx +555 -0
- package/dist-lib/ai/componentes/AlertModal.md +47 -0
- package/dist-lib/ai/componentes/AppShell.md +117 -0
- package/dist-lib/ai/componentes/Breadcrumb.md +187 -0
- package/dist-lib/ai/componentes/Button.md +116 -0
- package/dist-lib/ai/componentes/ButtonGroup.md +162 -0
- package/dist-lib/ai/componentes/CardCheckbox.md +99 -0
- package/dist-lib/ai/componentes/CardOption.md +133 -0
- package/dist-lib/ai/componentes/Chart.md +93 -0
- package/dist-lib/ai/componentes/Chip.md +68 -0
- package/dist-lib/ai/componentes/ChoroplethMap.md +118 -0
- package/dist-lib/ai/componentes/ColorPicker.md +70 -0
- package/dist-lib/ai/componentes/Combobox.md +51 -0
- package/dist-lib/ai/componentes/ConversationListItem.md +90 -0
- package/dist-lib/ai/componentes/DataList.md +111 -0
- package/dist-lib/ai/componentes/DataTable.md +867 -0
- package/dist-lib/ai/componentes/DatePicker.md +84 -0
- package/dist-lib/ai/componentes/DateSeparatorChip.md +59 -0
- package/dist-lib/ai/componentes/EmptyState.md +72 -0
- package/dist-lib/ai/componentes/FileUploadField.md +95 -0
- package/dist-lib/ai/componentes/FloatingPanel.md +118 -0
- package/dist-lib/ai/componentes/FooterTable.md +62 -0
- package/dist-lib/ai/componentes/FormField.md +110 -0
- package/dist-lib/ai/componentes/Gantt.md +552 -0
- package/dist-lib/ai/componentes/Header.md +98 -0
- package/dist-lib/ai/componentes/Icon.md +65 -0
- package/dist-lib/ai/componentes/Kanban.md +343 -0
- package/dist-lib/ai/componentes/Kpi.md +103 -0
- package/dist-lib/ai/componentes/List.md +61 -0
- package/dist-lib/ai/componentes/MarkdownText.md +59 -0
- package/dist-lib/ai/componentes/MenuSidebar.md +128 -0
- package/dist-lib/ai/componentes/MessageAck.md +53 -0
- package/dist-lib/ai/componentes/MessageBubble.md +115 -0
- package/dist-lib/ai/componentes/MessageComposer.md +80 -0
- package/dist-lib/ai/componentes/MessageVariablesPicker.md +104 -0
- package/dist-lib/ai/componentes/Modal.md +88 -0
- package/dist-lib/ai/componentes/MonthYearPicker.md +49 -0
- package/dist-lib/ai/componentes/PageHeader.md +129 -0
- package/dist-lib/ai/componentes/Panel.md +84 -0
- package/dist-lib/ai/componentes/Scheduler.md +421 -0
- package/dist-lib/ai/componentes/ScreenLoader.md +60 -0
- package/dist-lib/ai/componentes/SingleMenuSidebar.md +171 -0
- package/dist-lib/ai/componentes/Spinner.md +52 -0
- package/dist-lib/ai/componentes/Table.md +192 -0
- package/dist-lib/ai/componentes/TableToolbar.md +87 -0
- package/dist-lib/ai/componentes/TabsNavigation.md +152 -0
- package/dist-lib/ai/componentes/Toast.md +49 -0
- package/dist-lib/ai/componentes/_primitivos.md +74 -0
- package/dist-lib/ai/componentes/avatar-ig.md +181 -0
- package/dist-lib/ai/componentes/indice.json +49 -0
- package/dist-lib/ai/exemplos/app-shell/app-shell-example.tsx +140 -0
- package/dist-lib/ai/exemplos/app-shell/index.ts +3 -0
- package/dist-lib/ai/exemplos/app-shell/nav-data.ts +97 -0
- package/dist-lib/ai/exemplos/app-shell/routes.tsx +75 -0
- package/dist-lib/ai/exemplos/chat/chat-screen.tsx +152 -0
- package/dist-lib/ai/exemplos/chat/chat-v2-mocks.ts +171 -0
- package/dist-lib/ai/exemplos/chat/chat-v2.styles.ts +23 -0
- package/dist-lib/ai/exemplos/chat/chat-v2.types.ts +81 -0
- package/dist-lib/ai/exemplos/chat/components/ChannelDot/channel-dot.tsx +28 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationActionsMenu/conversation-actions-menu.tsx +83 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationActionsMenu/index.ts +4 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationColumn/conversation-column.styles.ts +22 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationColumn/conversation-column.tsx +203 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationColumn/conversation-column.types.ts +10 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationColumn/index.ts +2 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationListItem/conversation-list-item.styles.ts +55 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationListItem/conversation-list-item.tsx +52 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationListItem/conversation-list-item.types.ts +7 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationListItem/index.ts +2 -0
- package/dist-lib/ai/exemplos/chat/components/DateSeparator/date-separator.tsx +18 -0
- package/dist-lib/ai/exemplos/chat/components/DetailField/detail-field.tsx +23 -0
- package/dist-lib/ai/exemplos/chat/components/DetailSection/detail-section.tsx +41 -0
- package/dist-lib/ai/exemplos/chat/components/DetailSection/index.ts +1 -0
- package/dist-lib/ai/exemplos/chat/components/DetailsColumn/details-column.styles.ts +30 -0
- package/dist-lib/ai/exemplos/chat/components/DetailsColumn/details-column.tsx +142 -0
- package/dist-lib/ai/exemplos/chat/components/DetailsColumn/details-column.types.ts +16 -0
- package/dist-lib/ai/exemplos/chat/components/DetailsColumn/index.ts +5 -0
- package/dist-lib/ai/exemplos/chat/components/FilterRow/filter-row.styles.ts +37 -0
- package/dist-lib/ai/exemplos/chat/components/FilterRow/filter-row.tsx +45 -0
- package/dist-lib/ai/exemplos/chat/components/FilterRow/index.ts +1 -0
- package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-column.styles.ts +27 -0
- package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-column.tsx +66 -0
- package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-column.types.ts +13 -0
- package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-rail.tsx +38 -0
- package/dist-lib/ai/exemplos/chat/components/FiltersColumn/index.ts +6 -0
- package/dist-lib/ai/exemplos/chat/components/MessageBubble/index.ts +2 -0
- package/dist-lib/ai/exemplos/chat/components/MessageBubble/message-bubble.styles.ts +37 -0
- package/dist-lib/ai/exemplos/chat/components/MessageBubble/message-bubble.tsx +29 -0
- package/dist-lib/ai/exemplos/chat/components/MessageBubble/message-bubble.types.ts +5 -0
- package/dist-lib/ai/exemplos/chat/components/PersonAvatar/index.ts +5 -0
- package/dist-lib/ai/exemplos/chat/components/PersonAvatar/person-avatar.tsx +31 -0
- package/dist-lib/ai/exemplos/chat/components/QueueColumn/index.ts +2 -0
- package/dist-lib/ai/exemplos/chat/components/QueueColumn/queue-column.styles.ts +19 -0
- package/dist-lib/ai/exemplos/chat/components/QueueColumn/queue-column.tsx +140 -0
- package/dist-lib/ai/exemplos/chat/components/QueueColumn/queue-column.types.ts +13 -0
- package/dist-lib/ai/exemplos/chat/components/RailItem/index.ts +1 -0
- package/dist-lib/ai/exemplos/chat/components/RailItem/rail-item.styles.ts +30 -0
- package/dist-lib/ai/exemplos/chat/components/RailItem/rail-item.tsx +42 -0
- package/dist-lib/ai/exemplos/chat/hooks/use-resizable.ts +98 -0
- package/dist-lib/ai/exemplos/chat/index.ts +1 -0
- package/dist-lib/ai/exemplos/clientes/_table-data.ts +59 -0
- package/dist-lib/ai/exemplos/clientes/clientes-screen.tsx +505 -0
- package/dist-lib/ai/exemplos/clientes/clientes-showcase-mocks.ts +117 -0
- package/dist-lib/ai/exemplos/clientes/clientes-showcase.styles.ts +13 -0
- package/dist-lib/ai/exemplos/clientes/clientes-showcase.types.ts +16 -0
- package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/detail-drawer.styles.ts +28 -0
- package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/detail-drawer.tsx +303 -0
- package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/detail-drawer.types.ts +14 -0
- package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/index.ts +2 -0
- package/dist-lib/ai/exemplos/clientes/components/NovoClienteDrawer/index.ts +2 -0
- package/dist-lib/ai/exemplos/clientes/components/NovoClienteDrawer/novo-cliente-drawer.tsx +207 -0
- package/dist-lib/ai/exemplos/clientes/index.ts +1 -0
- package/dist-lib/ai/exemplos/dashboard/dashboard-brazil-map.ts +33 -0
- package/dist-lib/ai/exemplos/dashboard/dashboard-screen.tsx +1110 -0
- package/dist-lib/ai/exemplos/dashboard/index.ts +1 -0
- package/dist-lib/ai/exemplos/edit-page/components/StepNav.tsx +81 -0
- package/dist-lib/ai/exemplos/edit-page/components/section-card.tsx +85 -0
- package/dist-lib/ai/exemplos/edit-page/edit-page-screen.tsx +234 -0
- package/dist-lib/ai/exemplos/edit-page/index.ts +1 -0
- package/dist-lib/ai/exemplos/finance/_table-data.ts +57 -0
- package/dist-lib/ai/exemplos/finance/clientes-financeiro-mocks.ts +227 -0
- package/dist-lib/ai/exemplos/finance/clientes-financeiro.types.ts +75 -0
- package/dist-lib/ai/exemplos/finance/clientes-showcase-mocks.ts +117 -0
- package/dist-lib/ai/exemplos/finance/clientes-showcase.styles.ts +13 -0
- package/dist-lib/ai/exemplos/finance/clientes-showcase.types.ts +16 -0
- package/dist-lib/ai/exemplos/finance/components/EditarFinanceDrawer/editar-finance-drawer.tsx +241 -0
- package/dist-lib/ai/exemplos/finance/components/EditarFinanceDrawer/index.ts +5 -0
- package/dist-lib/ai/exemplos/finance/components/ExtratoExpansion/extrato-expansion.tsx +172 -0
- package/dist-lib/ai/exemplos/finance/components/ExtratoExpansion/index.ts +1 -0
- package/dist-lib/ai/exemplos/finance/components/FinanceDetailPanel/finance-detail-panel.tsx +241 -0
- package/dist-lib/ai/exemplos/finance/components/FinanceDetailPanel/index.ts +2 -0
- package/dist-lib/ai/exemplos/finance/components/NovoClienteDrawer/index.ts +2 -0
- package/dist-lib/ai/exemplos/finance/components/NovoClienteDrawer/novo-cliente-drawer.tsx +207 -0
- package/dist-lib/ai/exemplos/finance/components/SacarDialog/index.ts +2 -0
- package/dist-lib/ai/exemplos/finance/components/SacarDialog/sacar-dialog.tsx +346 -0
- package/dist-lib/ai/exemplos/finance/finance-screen.tsx +821 -0
- package/dist-lib/ai/exemplos/finance/index.ts +1 -0
- package/dist-lib/ai/exemplos/gantt/_gantt-data.tsx +402 -0
- package/dist-lib/ai/exemplos/gantt/gantt-screen.tsx +512 -0
- package/dist-lib/ai/exemplos/gantt/index.ts +1 -0
- package/dist-lib/ai/exemplos/login/index.ts +1 -0
- package/dist-lib/ai/exemplos/login/login-screen.tsx +246 -0
- package/dist-lib/ai/exemplos/mapa-rede/components/ConsultorDetailPanel/consultor-detail-panel.tsx +158 -0
- package/dist-lib/ai/exemplos/mapa-rede/components/ConsultorDetailPanel/index.ts +2 -0
- package/dist-lib/ai/exemplos/mapa-rede/index.ts +1 -0
- package/dist-lib/ai/exemplos/mapa-rede/mapa-de-rede-mocks.ts +655 -0
- package/dist-lib/ai/exemplos/mapa-rede/mapa-de-rede.types.ts +53 -0
- package/dist-lib/ai/exemplos/mapa-rede/mapa-rede-screen.tsx +227 -0
- package/dist-lib/ai/exemplos/order-detail/components/ActivityTab.tsx +77 -0
- package/dist-lib/ai/exemplos/order-detail/components/AttachmentsTab.tsx +45 -0
- package/dist-lib/ai/exemplos/order-detail/components/CommentsTab.tsx +111 -0
- package/dist-lib/ai/exemplos/order-detail/components/DetailsTab.tsx +189 -0
- package/dist-lib/ai/exemplos/order-detail/components/OverviewTab.tsx +200 -0
- package/dist-lib/ai/exemplos/order-detail/components/section-card.tsx +85 -0
- package/dist-lib/ai/exemplos/order-detail/index.ts +1 -0
- package/dist-lib/ai/exemplos/order-detail/order-detail-screen.tsx +119 -0
- package/dist-lib/ai/exemplos/order-detail/order-mocks.ts +186 -0
- package/dist-lib/ai/exemplos/order-detail/order.types.ts +118 -0
- package/dist-lib/ai/global/componentes.md +217 -0
- package/dist-lib/ai/global/composicao.md +182 -0
- package/dist-lib/ai/indice.json +192 -0
- package/dist-lib/ai/lint/ds-lint-patterns.mjs +115 -0
- package/dist-lib/ai/manifest.json +42 -0
- package/dist-lib/ai/regras/design.md +88 -0
- package/dist-lib/ai/regras/temas.md +192 -0
- package/dist-lib/ai/regras-por-componente.json +103 -0
- package/dist-lib/ai/roteiros/app-builder/roteiro.md +155 -0
- package/dist-lib/ai/roteiros/auth-builder/roteiro.md +42 -0
- package/dist-lib/ai/roteiros/cards/roteiro.md +34 -0
- package/dist-lib/ai/roteiros/charts/roteiro.md +32 -0
- package/dist-lib/ai/roteiros/chat/roteiro.md +31 -0
- package/dist-lib/ai/roteiros/crud-builder/blueprint.md +63 -0
- package/dist-lib/ai/roteiros/crud-builder/entrevista.md +139 -0
- package/dist-lib/ai/roteiros/crud-builder/geracao.md +113 -0
- package/dist-lib/ai/roteiros/crud-builder/roteiro.md +89 -0
- package/dist-lib/ai/roteiros/dashboard-builder/blueprint.md +47 -0
- package/dist-lib/ai/roteiros/dashboard-builder/entrevista.md +62 -0
- package/dist-lib/ai/roteiros/dashboard-builder/geracao.md +88 -0
- package/dist-lib/ai/roteiros/dashboard-builder/roteiro.md +88 -0
- package/dist-lib/ai/roteiros/drawers/roteiro.md +41 -0
- package/dist-lib/ai/roteiros/list-builder/blueprint.md +94 -0
- package/dist-lib/ai/roteiros/list-builder/entrevista.md +188 -0
- package/dist-lib/ai/roteiros/list-builder/geracao.md +63 -0
- package/dist-lib/ai/roteiros/list-builder/roteiro.md +91 -0
- package/dist-lib/ai/roteiros/module-replicator/roteiro.md +56 -0
- package/dist-lib/ai/roteiros/page-detail/roteiro.md +32 -0
- package/dist-lib/ai/roteiros/page-edit/roteiro.md +31 -0
- package/dist-lib/ai/roteiros/screen-composer/roteiro.md +95 -0
- package/package.json +4 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# ConversationListItem
|
|
2
|
+
|
|
3
|
+
Item de **lista de conversa** (Atendimento / Chat) — uma linha clicável que
|
|
4
|
+
representa um ticket/conversa. **Composto** (categoria: composite): combina
|
|
5
|
+
`Avatar` + `Chip` (slot `badges`) + `Button`/`Icon` (slot `actions`) +
|
|
6
|
+
`MarkdownText` (prévia inline). NÃO é uma célula de DataTable.
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
- Coluna lateral de tickets/conversas do Atendimento (variant `ticket`).
|
|
11
|
+
- Lista de conversas estilo DM/chat (variant `chat`).
|
|
12
|
+
- Qualquer lista vertical de conversas com avatar + prévia + hora + metadados.
|
|
13
|
+
|
|
14
|
+
Para tabelas de dados com colunas/sort/filtros → use `DataTable`, não este.
|
|
15
|
+
|
|
16
|
+
## Props essenciais
|
|
17
|
+
|
|
18
|
+
| Prop | Tipo | Default | Descrição |
|
|
19
|
+
|-------------|----------------------------------------------------------|----------------|-----------|
|
|
20
|
+
| `title` | `string` (req) | — | Nome do contato/conversa. Truncado. |
|
|
21
|
+
| `avatar` | `{ src?, name?, colorHex? }` \| `ReactNode` | — | Objeto-atalho monta o `Avatar` do DS (iniciais do nome; `src` vira `<img>`); ou nó custom. |
|
|
22
|
+
| `preview` | `string` | — | Última mensagem (markdown WA) → `MarkdownText` inline, `line-clamp-1`. |
|
|
23
|
+
| `time` | `string` | — | Hora já formatada (`14:32` / `21/06`). Tabular, caption. |
|
|
24
|
+
| `badges` | `ReactNode` | — | Slot de `<Chip>`s coloridos (protocolo/conexão/agente/fila/tags). |
|
|
25
|
+
| `unread` | `number` | — | `> 0` → badge `bg-bg-danger`/`text-fg-on-danger` (mostra `99+`). |
|
|
26
|
+
| `actions` | `ReactNode` | — | Slot de ações revelado no hover/focus (ex `<Button>` Pencil/Trash ou menu). |
|
|
27
|
+
| `onClick` | `() => void` | — | Clique na linha (Enter/Space também disparam). |
|
|
28
|
+
| `selected` | `boolean` | `false` | Stripe brand 3px à esquerda + `bg-bg-muted`. |
|
|
29
|
+
| `disabled` | `boolean` | `false` | Desabilita interação. |
|
|
30
|
+
| `className` | `string` | — | Classe extra no root. |
|
|
31
|
+
|
|
32
|
+
## Variants
|
|
33
|
+
|
|
34
|
+
| Variant | Valores | Default | Efeito |
|
|
35
|
+
|---------------|----------------------------------|-----------------|--------|
|
|
36
|
+
| `variant` | `ticket` \| `chat` | `ticket` | `chat` aperta o espaçamento vertical do corpo. |
|
|
37
|
+
| `density` | `comfortable` \| `compact` | `comfortable` | Padding vertical da linha. |
|
|
38
|
+
| `selected` | `boolean` | `false` | Stripe brand + bg muted. |
|
|
39
|
+
| `unread`(>0) | derivado de `unread` | — | Título em bold + prévia mais forte. |
|
|
40
|
+
| `disabled` | `boolean` | `false` | Último compoundVariant (L-006). |
|
|
41
|
+
|
|
42
|
+
## Exemplo mínimo
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
import { ConversationListItem } from "@/components/ui/ConversationListItem";
|
|
46
|
+
import { Chip } from "@/components/ui/Chip";
|
|
47
|
+
import { Button } from "@/components/ui/Button";
|
|
48
|
+
import { Icon } from "@/components/ui/Icon";
|
|
49
|
+
|
|
50
|
+
<ConversationListItem
|
|
51
|
+
title="Maria Silva"
|
|
52
|
+
avatar={{ name: "Maria Silva", colorHex: "#8754ec" }}
|
|
53
|
+
preview="*Olá!* Gostaria de saber sobre a fatura ```#A12```"
|
|
54
|
+
time="14:32"
|
|
55
|
+
unread={3}
|
|
56
|
+
selected={selectedId === ticket.id}
|
|
57
|
+
onClick={() => selectTicket(ticket.id)}
|
|
58
|
+
badges={
|
|
59
|
+
<>
|
|
60
|
+
<Chip size="sm" color="info" variant="soft">#PROTO-1024</Chip>
|
|
61
|
+
<Chip size="sm" color="success" variant="soft">WHATSAPP</Chip>
|
|
62
|
+
<Chip size="sm" color="primary" variant="soft">SUPORTE</Chip>
|
|
63
|
+
</>
|
|
64
|
+
}
|
|
65
|
+
actions={
|
|
66
|
+
<>
|
|
67
|
+
<Button size="xs" variant="ghost" iconLeft={<Icon name="line-pencil" />} aria-label="Editar" />
|
|
68
|
+
<Button size="xs" variant="ghost" color="critical" iconLeft={<Icon name="line-bin" />} aria-label="Excluir" />
|
|
69
|
+
</>
|
|
70
|
+
}
|
|
71
|
+
/>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Gotchas / cuidados
|
|
75
|
+
|
|
76
|
+
- **Renderiza `div[role="button"]`**, não `<button>` — porque o slot `actions`
|
|
77
|
+
costuma conter `<button>` (botão aninhado é HTML inválido). A11y por teclado:
|
|
78
|
+
`tabIndex=0` + Enter/Space disparam `onClick`. `role`/`tabIndex` só existem
|
|
79
|
+
quando há `onClick` e não está `disabled`.
|
|
80
|
+
- O `Avatar` do DS exibe **iniciais**; quando você passa `avatar.src`, a imagem
|
|
81
|
+
é renderizada como `<img>` DENTRO do Avatar (que já é `rounded-full overflow-hidden`).
|
|
82
|
+
Sem `src`, as iniciais derivam de `name` (fallback: `title`).
|
|
83
|
+
- `preview` passa por `MarkdownText inline` — markdown WA (`*bold*` `_italic_`
|
|
84
|
+
`~strike~` ` ```mono``` `) é sanitizado e truncado em 1 linha. Não passe HTML cru.
|
|
85
|
+
- `unread` só desenha o badge quando `> 0`; valores `> 99` viram `99+`.
|
|
86
|
+
- Cliques dentro de `actions` têm `stopPropagation` — não disparam o `onClick`
|
|
87
|
+
da linha.
|
|
88
|
+
- Visual 100% via tokens DS. Única exceção de hardcode: `before:w-[3px]` da stripe
|
|
89
|
+
e as dimensões finas do count-badge (`min-w-[18px] h-[18px] px-[5px]`) — mesmo
|
|
90
|
+
padrão dos contadores de Chip/Table.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# DataList — USAGE
|
|
2
|
+
|
|
3
|
+
**O que é:** componente **inteligente** sobre o `List` (como `DataTable` é sobre o
|
|
4
|
+
`Table`). Toolbar enxuta + busca + filtros + saved-views + persistência + seleção/
|
|
5
|
+
bulk + server/async + virtualização + lazy-load. _Categoria: List Components._
|
|
6
|
+
|
|
7
|
+
**Quando usar:** lista de cards que precisa de busca/filtro/views/seleção. Para
|
|
8
|
+
cards "crus" sem toolbar, use `List`. Para tabela densa, `DataTable`.
|
|
9
|
+
|
|
10
|
+
## Toolbar (enxuta — sem colunas)
|
|
11
|
+
|
|
12
|
+
Visões (ou `title`) · refresh · search · filtro · `⋯`. **Não tem** toggle de visão
|
|
13
|
+
nem menu de configurações de colunas (é cards, não tabela). Reusa o `<TableToolbar>`
|
|
14
|
+
(dumb): as **visões viram abas** (1ª aba = `title`/"Todos", igual à DataTable) e os
|
|
15
|
+
filtros aplicados aparecem como **chips** (`<ToolbarApplied>`) abaixo da toolbar —
|
|
16
|
+
o drawer de filtro é o MESMO `<ToolbarSimpleFilterDrawer>` da tabela. Os **chips são
|
|
17
|
+
clicáveis**: abrem o fast-filter do column-type (via `columnTypeRegistry`) pra editar o
|
|
18
|
+
valor inline — mesma UX do DataTable (sem precisar reabrir o drawer).
|
|
19
|
+
|
|
20
|
+
## Exemplo
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
<DataList
|
|
24
|
+
title="Membros"
|
|
25
|
+
items={people}
|
|
26
|
+
searchable
|
|
27
|
+
filterFields={[
|
|
28
|
+
{
|
|
29
|
+
id: "role",
|
|
30
|
+
label: "Papel",
|
|
31
|
+
type: "select",
|
|
32
|
+
accessor: (i) => i.data.role,
|
|
33
|
+
options: [
|
|
34
|
+
{ label: "Admin", value: "admin" },
|
|
35
|
+
{ label: "Editor", value: "editor" },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "status",
|
|
40
|
+
label: "Status",
|
|
41
|
+
type: "select",
|
|
42
|
+
accessor: (i) => i.data.status,
|
|
43
|
+
options: [
|
|
44
|
+
{ label: "Ativo", value: "active" },
|
|
45
|
+
{ label: "Pendente", value: "pending" },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
]}
|
|
49
|
+
views={[
|
|
50
|
+
{
|
|
51
|
+
id: "admins",
|
|
52
|
+
label: "Admins",
|
|
53
|
+
query: {
|
|
54
|
+
search: "",
|
|
55
|
+
filterModel: {
|
|
56
|
+
logicOperator: "AND",
|
|
57
|
+
items: [
|
|
58
|
+
{ id: "v1", field: "role", operator: "equals", value: "admin" },
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
]}
|
|
64
|
+
selectable
|
|
65
|
+
bulkActions={[{ label: "Arquivar", onClick: (ids) => archive(ids) }]}
|
|
66
|
+
onRefresh={refetch}
|
|
67
|
+
persistKey="members"
|
|
68
|
+
/>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Props essenciais
|
|
72
|
+
|
|
73
|
+
| Prop | Nota |
|
|
74
|
+
| ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
75
|
+
| `items` / `layout` / `groups` | repassados ao `List` (layout é fixo, não troca na toolbar) |
|
|
76
|
+
| `title` · `searchable` · `filterFields` · `views` · `onRefresh` · `moreActions` | toolbar |
|
|
77
|
+
| `toolbarActions` | `ToolbarAction[]` — ações custom no toolbar (`button`/`dropdown`/`input`, ex.: seletor de período). Inline no desktop (entre Filtros e ⋯); no **mobile colapsam num ⋯** junto com `moreActions`. Ver `<ToolbarActions>` |
|
|
78
|
+
| `filterFields` | `{ id, label, accessor, type: text/select/boolean/number/date, options? }` |
|
|
79
|
+
| `mode` `"client"`/`"server"` + `onQueryChange` · `loading` · `total` | dados server/async |
|
|
80
|
+
| `onLoadMore` + `hasMore` + `loadingMore` | infinite scroll (sentinel IntersectionObserver + cards skeleton) — **não virtualizado** |
|
|
81
|
+
| `virtualized` (+ `estimateItemSize`) | listas grandes — **só layout standard** |
|
|
82
|
+
| `onLoadChildren(id)` | lazy-load de filhos (hierarchical) |
|
|
83
|
+
| `defaultExpandedIds` | `Set<string>` — nós abertos no mount (hierarchical/grouped) |
|
|
84
|
+
| `branchHighlight` | destaque de família (hierárquico, passa pro List): `none` · `block` (painéis) · `active` (ramo do último aberto) |
|
|
85
|
+
| `selectable` + `onSelectionChange` + `bulkActions` | seleção + bulk bar |
|
|
86
|
+
| `enableDnD` + `onReorder`/`onMove` | DnD (passa pro List) |
|
|
87
|
+
| `persistKey` | persiste a query (search+filtros) em localStorage |
|
|
88
|
+
| `fillHeight` | ocupa 100% da altura do pai e faz **só a lista rolar** (toolbar/chips/bulk fixos). Dê altura ao pai + `className="flex-1 min-h-0"`. Não combinar com `virtualized` |
|
|
89
|
+
|
|
90
|
+
## Gotchas
|
|
91
|
+
|
|
92
|
+
- **`virtualized` desliga o DnD** (mutuamente exclusivos: o `@hello-pangea/dnd` precisa
|
|
93
|
+
de todos os cards montados; a virtualização desmonta os fora da viewport). Virtualização
|
|
94
|
+
só no layout `standard`.
|
|
95
|
+
- **Modo server:** o DataList NÃO filtra localmente — emite `onQueryChange({search, filters})`
|
|
96
|
+
(debounce no search) e renderiza o que vier em `items` (use `loading`/`total`).
|
|
97
|
+
- **Filtros por campos** (não colunas): o consumer declara `filterFields`. Busca textual
|
|
98
|
+
cobre title/subtitle/description + accessors dos campos.
|
|
99
|
+
- **Infinite scroll** (`onLoadMore`/`hasMore`/`loadingMore`): o consumer controla os `items`
|
|
100
|
+
(append da próxima página) — o DataList só dispara `onLoadMore` quando o sentinel entra na
|
|
101
|
+
viewport (rootMargin 200px) e mostra skeletons enquanto `loadingMore`. Incompatível com
|
|
102
|
+
`virtualized` (use um, não os dois).
|
|
103
|
+
- **`toolbarActions`** (ações custom no toolbar): formato `ToolbarAction[]`. Inline no
|
|
104
|
+
desktop; no mobile colapsam num único ⋯ (junto com `moreActions`). Shapes:
|
|
105
|
+
```ts
|
|
106
|
+
{ kind: "button", id, label, icon?, onClick, isActive?, disabled? }
|
|
107
|
+
{ kind: "dropdown", id, label, icon?, items: { label, icon?, onClick, active?, separator?, destructive? }[] }
|
|
108
|
+
{ kind: "input", id, label, icon?, value, onChange, placeholder? }
|
|
109
|
+
```
|
|
110
|
+
Ex.: seletor de período → `{ kind:"dropdown", id:"periodo", label:mes, items:[...] }`.
|
|
111
|
+
- A doc viva é o showcase `#/data-list` e `#/list-standard` (exemplo do seletor de período).
|