@snksergio/design-system 0.60.0 → 0.62.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.
Files changed (65) hide show
  1. package/dist-lib/ai/componentes/AlertModal.md +47 -0
  2. package/dist-lib/ai/componentes/AppShell.md +117 -0
  3. package/dist-lib/ai/componentes/Breadcrumb.md +187 -0
  4. package/dist-lib/ai/componentes/Button.md +116 -0
  5. package/dist-lib/ai/componentes/ButtonGroup.md +162 -0
  6. package/dist-lib/ai/componentes/CardCheckbox.md +99 -0
  7. package/dist-lib/ai/componentes/CardOption.md +133 -0
  8. package/dist-lib/ai/componentes/Chart.md +93 -0
  9. package/dist-lib/ai/componentes/Chip.md +68 -0
  10. package/dist-lib/ai/componentes/ChoroplethMap.md +118 -0
  11. package/dist-lib/ai/componentes/ColorPicker.md +70 -0
  12. package/dist-lib/ai/componentes/Combobox.md +51 -0
  13. package/dist-lib/ai/componentes/ConversationListItem.md +90 -0
  14. package/dist-lib/ai/componentes/DataList.md +111 -0
  15. package/dist-lib/ai/componentes/DataTable.md +867 -0
  16. package/dist-lib/ai/componentes/DatePicker.md +84 -0
  17. package/dist-lib/ai/componentes/DateSeparatorChip.md +59 -0
  18. package/dist-lib/ai/componentes/EmptyState.md +72 -0
  19. package/dist-lib/ai/componentes/FileUploadField.md +95 -0
  20. package/dist-lib/ai/componentes/FloatingPanel.md +118 -0
  21. package/dist-lib/ai/componentes/FooterTable.md +62 -0
  22. package/dist-lib/ai/componentes/FormField.md +110 -0
  23. package/dist-lib/ai/componentes/Gantt.md +552 -0
  24. package/dist-lib/ai/componentes/Header.md +98 -0
  25. package/dist-lib/ai/componentes/Icon.md +65 -0
  26. package/dist-lib/ai/componentes/Kanban.md +343 -0
  27. package/dist-lib/ai/componentes/Kpi.md +103 -0
  28. package/dist-lib/ai/componentes/List.md +61 -0
  29. package/dist-lib/ai/componentes/MarkdownText.md +59 -0
  30. package/dist-lib/ai/componentes/MenuSidebar.md +128 -0
  31. package/dist-lib/ai/componentes/MessageAck.md +53 -0
  32. package/dist-lib/ai/componentes/MessageBubble.md +115 -0
  33. package/dist-lib/ai/componentes/MessageComposer.md +80 -0
  34. package/dist-lib/ai/componentes/MessageVariablesPicker.md +104 -0
  35. package/dist-lib/ai/componentes/Modal.md +88 -0
  36. package/dist-lib/ai/componentes/MonthYearPicker.md +49 -0
  37. package/dist-lib/ai/componentes/PageHeader.md +129 -0
  38. package/dist-lib/ai/componentes/Panel.md +84 -0
  39. package/dist-lib/ai/componentes/Scheduler.md +421 -0
  40. package/dist-lib/ai/componentes/ScreenLoader.md +60 -0
  41. package/dist-lib/ai/componentes/SingleMenuSidebar.md +171 -0
  42. package/dist-lib/ai/componentes/Spinner.md +52 -0
  43. package/dist-lib/ai/componentes/Table.md +192 -0
  44. package/dist-lib/ai/componentes/TableToolbar.md +87 -0
  45. package/dist-lib/ai/componentes/TabsNavigation.md +152 -0
  46. package/dist-lib/ai/componentes/Toast.md +49 -0
  47. package/dist-lib/ai/componentes/_primitivos.md +74 -0
  48. package/dist-lib/ai/componentes/avatar-ig.md +181 -0
  49. package/dist-lib/ai/componentes/indice.json +49 -0
  50. package/dist-lib/ai/exemplos/dashboard/dashboard-brazil-map.ts +33 -0
  51. package/dist-lib/ai/exemplos/dashboard/dashboard-screen.tsx +1110 -0
  52. package/dist-lib/ai/exemplos/dashboard/index.ts +1 -0
  53. package/dist-lib/ai/global/componentes.md +217 -0
  54. package/dist-lib/ai/global/composicao.md +182 -0
  55. package/dist-lib/ai/indice.json +177 -0
  56. package/dist-lib/ai/lint/ds-lint-patterns.mjs +115 -0
  57. package/dist-lib/ai/manifest.json +16 -0
  58. package/dist-lib/ai/regras/design.md +88 -0
  59. package/dist-lib/ai/regras/temas.md +192 -0
  60. package/dist-lib/ai/regras-por-componente.json +103 -0
  61. package/dist-lib/ai/roteiros/dashboard/blueprint.md +47 -0
  62. package/dist-lib/ai/roteiros/dashboard/entrevista.md +62 -0
  63. package/dist-lib/ai/roteiros/dashboard/geracao.md +88 -0
  64. package/dist-lib/ai/roteiros/dashboard/roteiro.md +88 -0
  65. 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).