@seedgrid/ai-toolkit 0.0.0-stage → 0.3.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 (225) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +151 -2
  3. package/dist/adapters/claude.js +114 -0
  4. package/dist/adapters/codex.js +108 -0
  5. package/dist/adapters/index.js +17 -0
  6. package/dist/adapters/shared.js +142 -0
  7. package/dist/adapters/types.js +1 -0
  8. package/dist/cli.js +203 -0
  9. package/dist/commands/common.js +98 -0
  10. package/dist/commands/doctor.js +290 -0
  11. package/dist/commands/init.js +9 -0
  12. package/dist/commands/install.js +107 -0
  13. package/dist/commands/remove.js +54 -0
  14. package/dist/commands/review.js +127 -0
  15. package/dist/commands/status.js +73 -0
  16. package/dist/commands/update.js +8 -0
  17. package/dist/commands/validate.js +27 -0
  18. package/dist/core/apply.js +181 -0
  19. package/dist/core/blocks.js +64 -0
  20. package/dist/core/content.js +528 -0
  21. package/dist/core/env.js +40 -0
  22. package/dist/core/frontmatter.js +29 -0
  23. package/dist/core/hash.js +14 -0
  24. package/dist/core/inspect.js +51 -0
  25. package/dist/core/lock.js +124 -0
  26. package/dist/core/paths.js +65 -0
  27. package/dist/core/plan.js +242 -0
  28. package/dist/core/tools.js +62 -0
  29. package/dist/core/types.js +11 -0
  30. package/dist/core/updates.js +121 -0
  31. package/docs/arquitetura.md +80 -0
  32. package/docs/compatibilidade.md +50 -0
  33. package/docs/formato.md +155 -0
  34. package/docs/instalacao.md +105 -0
  35. package/docs/manutencao.md +115 -0
  36. package/package.json +43 -4
  37. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
  38. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
  39. package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
  40. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
  41. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
  42. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
  43. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
  44. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
  45. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
  46. package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
  47. package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
  48. package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
  49. package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
  50. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
  51. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
  52. package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
  53. package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
  54. package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
  55. package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
  56. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
  57. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
  58. package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
  59. package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
  60. package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
  61. package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
  62. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
  63. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
  64. package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
  65. package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
  66. package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
  67. package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
  68. package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
  69. package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
  70. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
  71. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
  72. package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
  73. package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
  74. package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
  75. package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
  76. package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
  77. package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
  78. package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
  79. package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
  80. package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
  81. package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
  82. package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
  83. package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
  84. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
  85. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
  86. package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
  87. package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
  88. package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
  89. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
  90. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
  91. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
  92. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
  93. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
  94. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
  95. package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
  96. package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
  97. package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
  98. package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
  99. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
  100. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
  101. package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
  102. package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
  103. package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
  104. package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
  105. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
  106. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
  107. package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
  108. package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
  109. package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
  110. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
  111. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
  112. package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
  113. package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
  114. package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
  115. package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
  116. package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
  117. package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
  118. package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
  119. package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
  120. package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
  121. package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
  122. package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
  123. package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
  124. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
  125. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
  126. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
  127. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
  128. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
  129. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
  130. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
  131. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
  132. package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
  133. package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
  134. package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
  135. package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
  136. package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
  137. package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
  138. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
  139. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
  140. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
  141. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
  142. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
  143. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
  144. package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
  145. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
  146. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
  147. package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
  148. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
  149. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
  150. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
  151. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
  152. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
  153. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
  154. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
  155. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
  156. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
  157. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
  158. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
  159. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
  160. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
  161. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
  162. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
  163. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
  164. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
  165. package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
  166. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
  167. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
  168. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
  169. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
  170. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
  171. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
  172. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
  173. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
  174. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
  175. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
  176. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
  177. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
  178. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
  179. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
  180. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
  181. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
  182. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
  183. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
  184. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
  185. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
  186. package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
  187. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
  188. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
  189. package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
  190. package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
  191. package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
  192. package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
  193. package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
  194. package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
  195. package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
  196. package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
  197. package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
  198. package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
  199. package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
  200. package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
  201. package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
  202. package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
  203. package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
  204. package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
  205. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
  206. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
  207. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
  208. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
  209. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
  210. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
  211. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
  212. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
  213. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
  214. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
  215. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
  216. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
  217. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
  218. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
  219. package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
  220. package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
  221. package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
  222. package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
  223. package/seedgridKB/SeedGrid/Versoes.md +64 -0
  224. package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
  225. package/seedgridKB/manifest.json +142 -0
@@ -0,0 +1,174 @@
1
+ ---
2
+ tags: [seedgrid, component, frontend, react, datatable, api]
3
+ fonte: front/seedgrid-fe-components/packages/seedgrid-fe-components/src/inputs/SgDatatable.tsx
4
+ branch: main
5
+ commit: ad30fc11de
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # SgDatatable: API
10
+
11
+ Import: `import { SgDatatable, type SgDatatableColumn } from "@seedgrid/fe-components";` (pacote v`2026.7.1`). Contexto: [[SeedGrid/SeedGrid-components/datatable/Visao-geral|Visão geral do SgDatatable]]. Exemplos: [[SeedGrid/SeedGrid-components/datatable/Exemplos|Exemplos do SgDatatable]]. A metodologia das tabelas está em [[SeedGrid/SeedGrid-components/inputs-texto/API#Como as tabelas foram montadas|Como as tabelas foram montadas]].
12
+
13
+ O componente é genérico: `SgDatatable<T extends SgDatatableRow = SgDatatableRow>`, com `SgDatatableRow = Record<string, unknown>`. É declarado com `React.forwardRef` e recebe `ref?: React.Ref<SgDatatableRef<T>>`. **Não** usa `RhfFieldProps`, então não há integração com react-hook-form. **Confirmado**.
14
+
15
+ ## Tipos exportados
16
+
17
+ `SgDatatableProps`, `SgDatatableRow`, `SgDatatableColumn`, `SgDatatableColumnAlign`, `SgDatatableCellMeta`, `SgDatatableFilterEvent`, `SgDatatableFilterMatchMode`, `SgDatatablePageEvent`, `SgDatatableRef`, `SgDatatableSelection`, `SgDatatableSelectionMode`, `SgDatatableSortEvent`, `SgDatatableSortOrder`. **Confirmado** em `src/index.ts`.
18
+
19
+ ## Props de `SgDatatable` (40)
20
+
21
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
22
+ |---|---|---|---|---|
23
+ | `id` | `string` | — | Não | Também chave de persistência das colunas (`datatable:<id>:columns`) quando há `SgEnvironmentProvider`. |
24
+ | `title` | `string` | — | Não | Título do `SgGroupBox`. |
25
+ | `value` | `T[]` | — | Sim | Linhas (`Record<string, unknown>[]`). |
26
+ | `columns` | `SgDatatableColumn<T>[]` | — | Sim | `SgDatatableColumn<T>[]`. |
27
+ | `dataKey` | `string` | — | Não | Campo identidade da linha (seleção e `key`). |
28
+ | `lazy` | `boolean` | `false` | Não | Server-side: não filtra, ordena nem pagina localmente. |
29
+ | `totalRecords` | `number` | `value.length` | Não | Total em modo `lazy`. |
30
+ | `paginator` | `boolean` | `false` | Não | Exibe paginação. |
31
+ | `rows` | `number` | `10` | Não | Linhas por página (valor inicial). |
32
+ | `first` | `number` | `0` | Não | Índice da 1ª linha (controlado quando definido). |
33
+ | `rowsPerPageOptions` | `number[]` | — | Não | Opções de linhas por página. |
34
+ | `onPage` | `((event: SgDatatablePageEvent) => void)` | — | Não | `{first, rows, page (base 1), pageCount, totalRecords}`. |
35
+ | `sortField` | `string \| null` | — | Não | Campo ordenado (controlado). |
36
+ | `sortOrder` | `SgDatatableSortOrder` | `0` | Não | `1` asc, `-1` desc, `0` sem ordem (controlado). |
37
+ | `onSort` | `((event: SgDatatableSortEvent) => void)` | — | Não | `{sortField, sortOrder}`. |
38
+ | `removableSort` | `boolean` | `true` | Não | Ciclo asc → desc → sem ordem (senão volta a asc). |
39
+ | `selectionMode` | `SgDatatableSelectionMode` | — | Não | `single` ou `multiple` (clique na linha). |
40
+ | `selection` | `SgDatatableSelection<T>` | — | Não | Seleção controlada (`T`, `T[]` ou `null`). |
41
+ | `onSelectionChange` | `((selection: SgDatatableSelection<T>) => void)` | — | Não | Recebe a nova seleção. |
42
+ | `showGlobalFilter` | `boolean` | `false` | Não | Campo de filtro global (match `contains`). |
43
+ | `globalFilter` | `string` | — | Não | Filtro global controlado. |
44
+ | `globalFilterPlaceholder` | `string` | i18n `components.datatable.globalFilterPlaceholder` | Não | Placeholder. |
45
+ | `onGlobalFilterChange` | `((value: string) => void)` | — | Não | Recebe o texto do filtro global. |
46
+ | `showColumnFilters` | `boolean` | `false` | Não | Filtros por coluna (colunas com `filter`). |
47
+ | `filters` | `Record<string, string>` | — | Não | Filtros por coluna controlados (`{campo: texto}`). |
48
+ | `onFilter` | `((event: SgDatatableFilterEvent) => void)` | — | Não | `{filters, globalFilter}`. |
49
+ | `showClearFiltersButton` | `boolean` | `false` | Não | Botão limpar filtros. |
50
+ | `stripedRows` | `boolean` | `false` | Não | Zebrado. |
51
+ | `showGridlines` | `boolean` | `false` | Não | Linhas de grade. |
52
+ | `hoverableRows` | `boolean` | `true` | Não | Destaque no hover. |
53
+ | `loading` | `boolean` | `false` | Não | Linha de carregamento (i18n `components.datatable.loading`). |
54
+ | `emptyMessage` | `string` | i18n `components.datatable.empty` | Não | Texto sem linhas. |
55
+ | `className` | `string` | `""` | Não | Classes do wrapper. |
56
+ | `style` | `CSSProperties` | — | Não | Estilo do wrapper. |
57
+ | `tableClassName` | `string` | `""` | Não | Classes do `<table>`. |
58
+ | `rowClassName` | `string \| ((rowData: T, rowIndex: number) => string)` | — | Não | Classe fixa ou função `(row, index)`. |
59
+ | `groupBoxProps` | `(Omit<Partial<SgGroupBoxProps>, "title" \| "children"> & { title?: string; })` | `{}` | Não | Props do `SgGroupBox`. |
60
+ | `showColumnManager` | `boolean` | `true` | Não | Gerenciador de colunas (ocultar/reordenar). |
61
+ | `columnManagerLabel` | `string` | i18n `components.datatable.columns` (fallback "Colunas") | Não | Rótulo do gerenciador. |
62
+ | `columnManagerMaxHeight` | `string \| number` | `320` | Não | Altura máxima do painel. |
63
+
64
+ ## `SgDatatableColumn<T>` (22 campos)
65
+
66
+ | Campo | Tipo | Padrão | Obrigatório | Descrição |
67
+ |---|---|---|---|---|
68
+ | `columnId` | `string` | — | Não | Chave estável da coluna, usada na persistência e na reordenação. A chave final segue a ordem `columnId` → `field` → índice. |
69
+ | `field` | `string` | — | Não | Campo da linha. Aceita caminho com ponto, como `"cliente.nome"` (`getFieldValue`). |
70
+ | `header` | `ReactNode` | — | **Sim** | Cabeçalho. |
71
+ | `body` | `(rowData: T, meta: SgDatatableCellMeta<T>) => ReactNode` | valor do campo | Não | Render da célula. `meta = {rowIndex, field, value, rowData}`. |
72
+ | `footer` | `ReactNode \| ((rows: T[]) => ReactNode)` | — | Não | Rodapé. A função recebe as linhas filtradas e ordenadas, **todas**, não só a página. |
73
+ | `sortable` | `boolean` | — | Não | Habilita ordenação pelo cabeçalho. |
74
+ | `sortField` | `string` | `field` | Não | Campo usado para ordenar. |
75
+ | `sortFunction` | `(rowA: T, rowB: T) => number` | `compareValues` | Não | Comparador próprio. A direção é aplicada por cima. |
76
+ | `filter` | `boolean` | — | Não | Mostra filtro na coluna (requer `showColumnFilters`). |
77
+ | `filterField` | `string` | `field` | Não | Campo filtrado. |
78
+ | `filterPlaceholder` | `string` | i18n `components.datatable.columnFilterPlaceholder` | Não | Placeholder do filtro. |
79
+ | `filterMatchMode` | `SgDatatableFilterMatchMode` | `"contains"` | Não | `contains`, `startsWith`, `endsWith` ou `equals`. |
80
+ | `excludeGlobalFilter` | `boolean` | — | Não | Tira a coluna do filtro global. |
81
+ | `align` | `SgDatatableColumnAlign` | — | Não | `left`, `center` ou `right`. |
82
+ | `width` | `number \| string` | — | Não | Largura (número = px). |
83
+ | `minWidth` | `number \| string` | — | Não | Largura mínima. |
84
+ | `hidden` | `boolean` | `false` | Não | Começa oculta. O gerenciador de colunas pode mudar isso. |
85
+ | `hideable` | `boolean` | `true` (efetivo) | Não | `false` impede ocultar pelo gerenciador. |
86
+ | `reorderable` | `boolean` | `true` (efetivo) | Não | `false` impede reordenar pelo gerenciador. |
87
+ | `className` | `string` | — | Não | Classe aplicada ao `<th>`, às células e ao rodapé da coluna. |
88
+ | `headerClassName` | `string` | — | Não | Classe do `<th>`. |
89
+ | `bodyClassName` | `string \| ((rowData: T, rowIndex: number) => string \| undefined)` | — | Não | Classe da célula, fixa ou calculada. |
90
+
91
+ Fonte: `SgDatatable.tsx` → tipo `SgDatatableColumn` e usos em `SgDatatableBase`. **Confirmado**, exceto onde a célula indica outra coisa.
92
+
93
+ ## Eventos e formatos
94
+
95
+ | Evento | Payload | Quando |
96
+ |---|---|---|
97
+ | `onPage` | `SgDatatablePageEvent` = `{ first, rows, page, pageCount, totalRecords }` (`page` começa em **1**) | Troca de página, de linhas por página e `resetPage`/`goToPage` |
98
+ | `onSort` | `SgDatatableSortEvent` = `{ sortField: string \| null, sortOrder: 1 \| -1 \| 0 }` | Clique em cabeçalho ordenável |
99
+ | `onFilter` | `SgDatatableFilterEvent` = `{ filters: Record<string,string>, globalFilter: string }` | Mudança de filtro global ou de coluna |
100
+ | `onGlobalFilterChange` | `string` | Mudança do filtro global |
101
+ | `onSelectionChange` | `SgDatatableSelection<T>` = `T \| T[] \| null` | Clique na linha. Em `single`, clicar de novo na linha selecionada desmarca (`null`). Em `multiple`, alterna a linha no array. |
102
+
103
+ **Seleção por clique:** o clique é ignorado quando o alvo está dentro de `button`, `a`, `input`, `select`, `textarea`, `label` ou de um elemento com `data-sg-stop-row-select="true"`. Por isso os botões de ação na célula não selecionam a linha. **Confirmado**.
104
+
105
+ **Ordenação:** o clique em uma coluna nova ordena asc. Na mesma coluna, a sequência é asc → desc → sem ordem com `removableSort` (padrão); sem ele, desc → asc. **Confirmado**.
106
+
107
+ ## Ref (`SgDatatableRef<T>`)
108
+
109
+ | Método | Retorno/efeito |
110
+ |---|---|
111
+ | `getProcessedRows()` | Linhas filtradas e ordenadas (`T[]`). Em `lazy`, devolve o próprio `value`. |
112
+ | `getPagedRows()` | Linhas da página atual. |
113
+ | `clearFilters()` | Limpa os filtros global e de coluna. |
114
+ | `clearSelection()` | Limpa a seleção. |
115
+ | `resetSort()` | Remove a ordenação. |
116
+ | `resetPage()` | Volta para a primeira página. |
117
+ | `goToPage(page)` | Vai para a página indicada. |
118
+
119
+ **Confirmado** (`useImperativeHandle` em `SgDatatableBase`).
120
+
121
+ ## Modos controlado e não controlado
122
+
123
+ Cada estado é controlado só quando a prop correspondente é passada (`!== undefined`):
124
+ - `first`;
125
+ - `sortField`;
126
+ - `sortOrder`;
127
+ - `selection`;
128
+ - `globalFilter`;
129
+ - `filters`.
130
+
131
+ Quando não é passada, o componente guarda o estado internamente. `rows` é **só valor inicial**: o estado interno `internalRows` muda pelo seletor de linhas por página. **Confirmado**.
132
+
133
+ ## Modo `lazy` (server-side)
134
+
135
+ - Com `lazy`, as linhas de `value` são exibidas como chegam: sem filtro, sem ordenação e sem fatiar por página.
136
+ - O total vem de `totalRecords`.
137
+ - A aplicação busca os dados em `onPage`, `onSort` e `onFilter`.
138
+ - Testes em `tests/datatable-dom.test.mjs`: "lazy: nao ordena localmente", "lazy: nao pagina localmente". **Confirmado** (testes lidos, não executados).
139
+
140
+ ## Persistência de colunas
141
+
142
+ - **Quando:** só com `SgEnvironmentProvider` presente (`useHasSgEnvironmentProvider()`) e `id` não vazio.
143
+ - **O que é salvo:** `{version: 1, columnOrder, hiddenColumnsMap}`, via `useSgPersistence()`, na chave `datatable:<id>:columns`.
144
+ - **Ao carregar:** colunas novas entram no fim; colunas que deixaram de existir são descartadas.
145
+ - **Falhas:** erros de persistência são ignorados.
146
+ - **Testes:** `tests/datatable-dom.test.mjs` garante que re-renders do pai com `columns` instável não regravam a persistência.
147
+
148
+ **Confirmado**.
149
+
150
+ ## Internacionalização
151
+
152
+ Todos os textos visíveis vêm de `components.datatable.*`:
153
+ - `empty`, `loading`;
154
+ - `globalFilterPlaceholder`, `columnFilterPlaceholder`, `clearFilters`;
155
+ - `columns`, `restoreColumns`, `showAllColumns`, `dragToReorder`;
156
+ - `first`, `prev`, `next`, `last`, `jumpBackward`, `jumpForward`;
157
+ - `rowsPerPage`, `pageReport`, `page`, `pagination`.
158
+
159
+ `columns` e `restoreColumns` têm fallback fixo em pt-BR ("Colunas", "Restaurar padrão") caso a chave não exista. **Confirmado**.
160
+
161
+ ## Acessibilidade comprovável
162
+
163
+ - Linhas com `aria-selected` quando selecionadas.
164
+ - Paginação com `aria-label` (`components.datatable.pagination`). Os botões têm `aria-label` próprio, e a página atual tem `aria-current="page"`.
165
+ - O botão do gerenciador de colunas tem `aria-label`.
166
+ - Não há `aria-sort` nos cabeçalhos ordenáveis. A seleção de linha é feita só por clique (o `<tr>` não tem `tabIndex`).
167
+
168
+ **Confirmado** pela presença ou ausência no código.
169
+
170
+ ## Fontes
171
+
172
+ - `front/seedgrid-fe-components/packages/seedgrid-fe-components/src/inputs/SgDatatable.tsx` (`SgDatatableBase`, tipos, `buildDatatableColumnsPersistenceKey`)
173
+ - `front/seedgrid-fe-components/packages/seedgrid-fe-components/src/environment/SgEnvironmentProvider.tsx` (`useHasSgEnvironmentProvider`, `useSgPersistence`)
174
+ - `front/seedgrid-fe-components/packages/seedgrid-fe-components/tests/datatable-dom.test.mjs`
@@ -0,0 +1,236 @@
1
+ ---
2
+ tags: [seedgrid, component, frontend, react, datatable, exemplos]
3
+ fonte: front/seedgrid-fe-components/apps/showcase/src/app/components/sg-datatable
4
+ branch: main
5
+ commit: ad30fc11de
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # SgDatatable: exemplos
10
+
11
+ Os exemplos foram conferidos contra [[SeedGrid/SeedGrid-components/datatable/API|API do SgDatatable]]. As fontes são relativas a `front/seedgrid-fe-components/apps/showcase/src/app/components/sg-datatable/samples/`. Não foram compilados nem executados.
12
+
13
+ Os samples `basico` e `templates` do showcase declaram as colunas **sem tipo** (`const BASE_COLUMNS = [{ …, align: "right" }]`). Sem anotação, o TypeScript alarga `"right"` para `string`, que não é atribuível a `SgDatatableColumnAlign`. Por isso, abaixo, as colunas são anotadas com `SgDatatableColumn<Row>[]`. Isso é **Inferência** pelas regras do TS: os `.sample` não passam pelo `typecheck` do pacote.
14
+
15
+ ## Básico: paginação, zebra e grade
16
+
17
+ Adaptado de `basico.tsx.sample`, com menos linhas e colunas tipadas.
18
+
19
+ ```tsx
20
+ import React from "react";
21
+ import { SgDatatable, type SgDatatableColumn } from "@seedgrid/fe-components";
22
+
23
+ type ProductRow = { id: number; code: string; name: string; category: string; price: number; stock: number };
24
+
25
+ const PRODUCT_ROWS: ProductRow[] = [
26
+ { id: 1, code: "P-1000", name: "Notebook Pro 14", category: "Computers", price: 1899, stock: 22 },
27
+ { id: 2, code: "P-1001", name: "Mechanical Keyboard", category: "Accessories", price: 149, stock: 64 },
28
+ { id: 3, code: "P-1002", name: "Ergonomic Mouse", category: "Accessories", price: 89, stock: 48 }
29
+ ];
30
+
31
+ const BASE_COLUMNS: SgDatatableColumn<ProductRow>[] = [
32
+ { field: "code", header: "Code", sortable: true },
33
+ { field: "name", header: "Name", sortable: true, filter: true },
34
+ { field: "category", header: "Category", sortable: true },
35
+ { field: "price", header: "Price", sortable: true, align: "right" },
36
+ { field: "stock", header: "Stock", sortable: true, align: "right" }
37
+ ];
38
+
39
+ export default function BasicDatatableExample() {
40
+ return (
41
+ <SgDatatable<ProductRow>
42
+ id="datatable-basic"
43
+ title="Product catalog"
44
+ value={PRODUCT_ROWS}
45
+ columns={BASE_COLUMNS}
46
+ dataKey="id"
47
+ paginator
48
+ rows={5}
49
+ rowsPerPageOptions={[5, 10]}
50
+ showGlobalFilter
51
+ showColumnFilters
52
+ stripedRows
53
+ showGridlines
54
+ />
55
+ );
56
+ }
57
+ ```
58
+
59
+ ## Templates de célula e rodapé
60
+
61
+ Adaptado de `templates.tsx.sample`. O `footer` recebe **todas** as linhas processadas (filtradas e ordenadas), não só a página atual.
62
+
63
+ ```tsx
64
+ import React from "react";
65
+ import { SgDatatable, type SgDatatableColumn } from "@seedgrid/fe-components";
66
+
67
+ type ProductRow = { id: number; code: string; name: string; price: number };
68
+
69
+ const currency = new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL" });
70
+
71
+ const TEMPLATE_COLUMNS: SgDatatableColumn<ProductRow>[] = [
72
+ {
73
+ field: "name",
74
+ header: "Produto",
75
+ sortable: true,
76
+ body: (row) => (
77
+ <div className="space-y-0.5">
78
+ <p className="font-medium">{row.name}</p>
79
+ <p className="text-xs text-muted-foreground">{row.code}</p>
80
+ </div>
81
+ ),
82
+ footer: (rows) => <span>Total: {rows.length}</span>
83
+ },
84
+ {
85
+ field: "price",
86
+ header: "Preço",
87
+ align: "right",
88
+ body: (row) => <span>{currency.format(row.price)}</span>,
89
+ footer: (rows) => <span>{currency.format(rows.reduce((sum, r) => sum + r.price, 0))}</span>
90
+ }
91
+ ];
92
+
93
+ export default function TemplateDatatableExample({ rows }: { rows: ProductRow[] }) {
94
+ return <SgDatatable<ProductRow> id="datatable-template" title="Custom body and footer" value={rows} columns={TEMPLATE_COLUMNS} dataKey="id" paginator rows={5} showGridlines />;
95
+ }
96
+ ```
97
+
98
+ ## Ações por linha sem disparar a seleção
99
+
100
+ Baseado em `acoes.tsx.sample`. Botões dentro da célula não selecionam a linha (`button`, `a` e outros são ignorados pelo `onClick` do `<tr>`).
101
+
102
+ ```tsx
103
+ import React from "react";
104
+ import { Pencil } from "lucide-react";
105
+ import { SgButton, SgDatatable, type SgDatatableColumn, type SgDatatableSelection } from "@seedgrid/fe-components";
106
+
107
+ type PermissionRow = { id: number; name: string; description: string };
108
+
109
+ export default function ActionsDatatableExample({ rows }: { rows: PermissionRow[] }) {
110
+ const [selection, setSelection] = React.useState<SgDatatableSelection<PermissionRow>>(null);
111
+
112
+ const columns = React.useMemo<SgDatatableColumn<PermissionRow>[]>(() => [
113
+ { field: "id", header: "ID", sortable: true, width: 80 },
114
+ { field: "name", header: "Name", sortable: true },
115
+ {
116
+ header: "Actions",
117
+ align: "center",
118
+ width: 120,
119
+ body: (row) => (
120
+ <SgButton
121
+ size="sm"
122
+ appearance="ghost"
123
+ severity="secondary"
124
+ iconOnly
125
+ leftIcon={<Pencil className="size-4" />}
126
+ aria-label={`Edit ${row.name}`}
127
+ onClick={() => console.log("edit", row.id)}
128
+ />
129
+ )
130
+ }
131
+ ], []);
132
+
133
+ return (
134
+ <SgDatatable<PermissionRow>
135
+ id="datatable-actions"
136
+ title="Permissions"
137
+ value={rows}
138
+ columns={columns}
139
+ dataKey="id"
140
+ selectionMode="single"
141
+ selection={selection}
142
+ onSelectionChange={setSelection}
143
+ paginator
144
+ rows={4}
145
+ />
146
+ );
147
+ }
148
+ ```
149
+
150
+ ## Server-side (`lazy`)
151
+
152
+ Resumo de `server-side.tsx.sample`, que traz também uma API simulada completa. O componente só emite eventos: a aplicação busca os dados e devolve `value` + `totalRecords`.
153
+
154
+ ```tsx
155
+ import React from "react";
156
+ import {
157
+ SgDatatable,
158
+ type SgDatatableColumn,
159
+ type SgDatatableFilterEvent,
160
+ type SgDatatablePageEvent,
161
+ type SgDatatableSortEvent,
162
+ type SgDatatableSortOrder
163
+ } from "@seedgrid/fe-components";
164
+
165
+ type ProductRow = { id: number; code: string; name: string };
166
+ type ServerQuery = { first: number; rows: number; sortField: string | null; sortOrder: SgDatatableSortOrder; globalFilter: string; filters: Record<string, string> };
167
+
168
+ const COLUMNS: SgDatatableColumn<ProductRow>[] = [
169
+ { field: "code", header: "Code", sortable: true, filter: true },
170
+ { field: "name", header: "Name", sortable: true, filter: true }
171
+ ];
172
+
173
+ export default function ServerSideDatatableExample({ fetchPage }: { fetchPage: (q: ServerQuery) => Promise<{ data: ProductRow[]; totalRecords: number }> }) {
174
+ const [query, setQuery] = React.useState<ServerQuery>({ first: 0, rows: 10, sortField: "name", sortOrder: 1, globalFilter: "", filters: {} });
175
+ const [rows, setRows] = React.useState<ProductRow[]>([]);
176
+ const [total, setTotal] = React.useState(0);
177
+ const [loading, setLoading] = React.useState(false);
178
+
179
+ React.useEffect(() => {
180
+ let cancelled = false;
181
+ setLoading(true);
182
+ fetchPage(query)
183
+ .then((r) => { if (!cancelled) { setRows(r.data); setTotal(r.totalRecords); } })
184
+ .finally(() => { if (!cancelled) setLoading(false); });
185
+ return () => { cancelled = true; };
186
+ }, [query, fetchPage]);
187
+
188
+ return (
189
+ <SgDatatable<ProductRow>
190
+ id="datatable-server"
191
+ value={rows}
192
+ columns={COLUMNS}
193
+ dataKey="id"
194
+ lazy
195
+ totalRecords={total}
196
+ paginator
197
+ rows={query.rows}
198
+ first={query.first}
199
+ rowsPerPageOptions={[10, 20, 50]}
200
+ sortField={query.sortField}
201
+ sortOrder={query.sortOrder}
202
+ onSort={(e: SgDatatableSortEvent) => setQuery((p) => ({ ...p, first: 0, sortField: e.sortField, sortOrder: e.sortOrder }))}
203
+ showGlobalFilter
204
+ globalFilter={query.globalFilter}
205
+ showColumnFilters
206
+ filters={query.filters}
207
+ onFilter={(e: SgDatatableFilterEvent) => setQuery((p) => ({ ...p, first: 0, globalFilter: e.globalFilter, filters: e.filters }))}
208
+ onPage={(e: SgDatatablePageEvent) => setQuery((p) => ({ ...p, first: e.first, rows: e.rows }))}
209
+ loading={loading}
210
+ />
211
+ );
212
+ }
213
+ ```
214
+
215
+ ## Ref imperativo
216
+
217
+ ```tsx
218
+ import React from "react";
219
+ import { SgButton, SgDatatable, type SgDatatableColumn, type SgDatatableRef } from "@seedgrid/fe-components";
220
+
221
+ type Row = { id: number; name: string };
222
+ const COLUMNS: SgDatatableColumn<Row>[] = [{ field: "name", header: "Nome", sortable: true, filter: true }];
223
+
224
+ export default function RefExample({ rows }: { rows: Row[] }) {
225
+ const tableRef = React.useRef<SgDatatableRef<Row>>(null);
226
+ return (
227
+ <>
228
+ <SgDatatable<Row> ref={tableRef} id="tbl-ref" value={rows} columns={COLUMNS} dataKey="id" paginator showColumnFilters />
229
+ <SgButton onClick={() => tableRef.current?.clearFilters()}>Limpar filtros</SgButton>
230
+ <SgButton onClick={() => console.log(tableRef.current?.getProcessedRows())}>Exportar visíveis</SgButton>
231
+ </>
232
+ );
233
+ }
234
+ ```
235
+
236
+ Os métodos estão confirmados em `SgDatatableRef`. A tipagem com `ref` vem do cast de `React.forwardRef(SgDatatableBase)` para uma função genérica com `ref?: React.Ref<SgDatatableRef<T>>`.
@@ -0,0 +1,76 @@
1
+ ---
2
+ tags: [seedgrid, component, frontend, react, datatable]
3
+ fonte: front/seedgrid-fe-components/packages/seedgrid-fe-components/src/inputs/SgDatatable.tsx
4
+ branch: main
5
+ commit: ad30fc11de
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # SgDatatable
10
+
11
+ O `SgDatatable` é a tabela de dados do pacote `@seedgrid/fe-components` (v`2026.7.1`). O arquivo fica em `src/inputs/` e é exportado pela raiz do pacote. Referência completa: [[SeedGrid/SeedGrid-components/datatable/API|API do SgDatatable]]. Código: [[SeedGrid/SeedGrid-components/datatable/Exemplos|Exemplos do SgDatatable]].
12
+
13
+ ## Objetivo e funcionalidades
14
+
15
+ Mostra coleções tabulares com as funções abaixo, todas **Confirmado** em `SgDatatable.tsx`:
16
+ - **Paginação** com seletor de linhas por página e relatório "x–y de n". O número de botões de página se adapta à largura, via `ResizeObserver`.
17
+ - **Ordenação** por coluna, com ciclo asc → desc → sem ordem e comparador customizável.
18
+ - **Filtros:** um global (`contains`) e um por coluna (`contains`, `startsWith`, `endsWith`, `equals`), com botão "limpar filtros".
19
+ - **Seleção** de linha `single` ou `multiple` por clique. Botões e links dentro da célula não selecionam.
20
+ - **Templates** de célula (`body`) e de rodapé (`footer`), além de classes por linha e por célula.
21
+ - **Gerenciador de colunas** (padrão ligado): ocultar e reordenar por arrastar.
22
+ - Com `SgEnvironmentProvider` e `id`, persiste a ordem e a visibilidade.
23
+ - **Modo `lazy`** para paginação, ordenação e filtro no servidor.
24
+ - **Estados** `loading` e vazio.
25
+ - **Ref imperativo:** `getProcessedRows`, `getPagedRows`, `clearFilters`, `clearSelection`, `resetSort`, `resetPage` e `goToPage`.
26
+
27
+ ## Quando usar
28
+
29
+ - **Use para:** listagens de cadastros (CRUD), consultas e relatórios em tela, com até algumas centenas de linhas em memória. Para volume maior, use `lazy` e faça o trabalho no backend.
30
+ - **Não use para:**
31
+ - edição inline: não há edição de célula no componente;
32
+ - árvores: veja `SgTreeView` (outro grupo);
33
+ - escolher itens para um formulário: prefira [[SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral|inputs de seleção]] como `SgPickList`/`SgMultiSelect`.
34
+
35
+ Essas recomendações são **Inferência**, a partir das props existentes.
36
+ - **Formulário:** não há integração com react-hook-form. A seleção é controlada por `selection`/`onSelectionChange`. **Confirmado**.
37
+
38
+ ## Composição e dependências
39
+
40
+ - **Componentes internos:**
41
+ - `SgGroupBox`: moldura e título (`groupBoxProps`);
42
+ - `SgButton`: paginação e ações;
43
+ - `createPortal` do `react-dom`: painel do gerenciador de colunas.
44
+ - **Ícones** do `lucide-react`: setas, chevrons, `GripVertical`, `SlidersHorizontal` e outros.
45
+ - **Persistência:** `useHasSgEnvironmentProvider` e `useSgPersistence` (`src/environment/SgEnvironmentProvider.tsx`). Sem provider, nada é persistido.
46
+ - **Peers:** `react`, `lucide-react`. Diferente dos inputs, o arquivo do SgDatatable não importa `react-hook-form`; mesmo assim, ele continua peer obrigatório do pacote.
47
+
48
+ **Confirmado**.
49
+
50
+ ## Tema e estilos
51
+
52
+ - **Variáveis CSS do tema:**
53
+ - linha selecionada/hover: `--sg-primary-100`;
54
+ - zebra: `--sg-primary-50`;
55
+ - texto secundário: `--sg-muted`.
56
+ - **Customização:** `className`, `style`, `tableClassName`, `rowClassName` (string ou função), além de `className`/`headerClassName`/`bodyClassName` por coluna. Flags visuais: `stripedRows`, `showGridlines`, `hoverableRows`.
57
+ - O CSS é injetado na importação do pacote (ver [[SeedGrid/SeedGrid-components/inputs-texto/Visao-geral#Tema e estilos|Tema e estilos]]).
58
+
59
+ **Confirmado**.
60
+
61
+ ## Internacionalização
62
+
63
+ Os textos usam as chaves `components.datatable.*` (ver [[SeedGrid/SeedGrid-components/datatable/API#Internacionalização|API]]), resolvidas pelo `SgComponentsI18nProvider`. Sem provider, o locale padrão é `en-US`. **Confirmado**.
64
+
65
+ ## Testes (lidos, **não executados**)
66
+
67
+ `tests/datatable-dom.test.mjs` cobre:
68
+ - no modo `lazy`, não ordena nem pagina localmente;
69
+ - com `columns` instável (nova identidade a cada render), um render do pai causa um render do corpo e não toca na persistência de colunas.
70
+
71
+ ## Limitações e pontos de atenção
72
+
73
+ - Não há `aria-sort`, nem navegação de linhas por teclado. **Confirmado**.
74
+ - `rows` só define o valor inicial de linhas por página; não existe prop controlada para isso. **Confirmado**.
75
+ - O `id` serve também de chave de persistência: duas tabelas com o mesmo `id` dentro do mesmo `SgEnvironmentProvider` compartilham o layout de colunas. **Inferência**, pela chave `datatable:<id>:columns`.
76
+ - Para o gerenciador de colunas e a persistência, dê `columnId` ou `field` estáveis. Colunas sem nenhum dos dois usam o índice como chave. **Confirmado**.