@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,1090 @@
1
+ ---
2
+ tags: [seedgrid, front, component, layout]
3
+ fonte: front/seedgrid-fe-components/packages/seedgrid-fe-components/src/layout
4
+ branch: main
5
+ commit: ad30fc11de
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # API — layout (`@seedgrid/fe-components`)
10
+
11
+ Visão geral do grupo: [[SeedGrid/SeedGrid-components/layout/Visao-geral|Layout — visão geral]] · Exemplos: [[SeedGrid/SeedGrid-components/layout/Exemplos|Layout — exemplos]] · i18n/estilos: [[SeedGrid/SeedGrid-components/fundamentos/Visao-geral|Fundamentos]]
12
+
13
+ > **Como ler as tabelas.** Geradas a partir do tipo TypeScript real do 1º parâmetro de cada componente (TS checker, commit `ad30fc11de`) — lista completa das props próprias. **Padrão**: valor sem marca = inicializador na desestruturação do componente (Confirmado); `ᶠ` = fallback interno `??` no corpo do componente (Confirmado, expressão pode estar abreviada); `ᵇ` = padrão aplicado pelo componente base para o qual a prop é repassada; `ᵐ` = declarado só no `*.meta.ts`; `ˢ` = declarado só na tabela de props do showcase (`ᵐ`/`ˢ` = Não confirmado no código); `—` = sem padrão. **Descrição**: JSDoc > `*.meta.ts` > tabela do showcase (textos originais, sem acento quando assim na fonte); *(Inferência)* = escrita a partir da leitura do código. **Obrigatória** = prop não opcional no tipo.
14
+
15
+ Todos os caminhos de fonte abaixo são relativos a `front/seedgrid-fe-components/packages/seedgrid-fe-components/`. Todos os arquivos do grupo começam com `"use client"`.
16
+
17
+ ## Sumário
18
+
19
+ - Primitivas de composição: [[#SgStack]] · [[#SgGrid]] · [[#SgPanel]] · [[#SgScreen]] · [[#SgGroupBox]]
20
+ - Containers: [[#SgCard]] · [[#SgAccordion]] · [[#SgPageControl]] (+ `SgPageControlPage`) · [[#SgExpandablePanel]] · [[#SgCarousel]]
21
+ - Navegação: [[#SgBreadcrumb]] · [[#SgMenu]] · [[#SgTreeView]]
22
+ - Docking: [[#SgDockLayout]] · [[#SgDockZone]] · [[#SgDockScreen]] · [[#SgToolBar]] (+ `SgToolbarIconButton`)
23
+ - [[#Funções utilitárias exportadas]]
24
+ - [[#Itens internos (não exportados)]]
25
+
26
+ ---
27
+
28
+ ## SgStack
29
+
30
+ Contêiner flex para empilhar filhos em coluna ou linha. Fonte: `src/layout/SgStack.tsx` → `SgStack`.
31
+
32
+ ### Import
33
+ ```tsx
34
+ import { SgStack, type SgStackProps } from "@seedgrid/fe-components";
35
+ ```
36
+
37
+ ### Props
38
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
39
+ |---|---|---|---|---|
40
+ | `direction` | `"row" \| "column"` | `"column"` | Não | Direcao principal do empilhamento. |
41
+ | `gap` | `number \| string` | `0` | Não | Espacamento entre os itens. |
42
+ | `justify` | `"start" \| "center" \| "end" \| "between" \| "around" \| "evenly"` | `"start"` | Não | Distribuicao dos itens no eixo principal. |
43
+ | `align` | `"start" \| "center" \| "end" \| "stretch"` | `"stretch"` | Não | Alinhamento dos itens no eixo cruzado. |
44
+ | `wrap` | `boolean` | `false` | Não | Permite quebra de linha quando necessario. |
45
+ | `grow` | `boolean` | `false` | Não | Permite que o stack cresca ocupando espaco disponivel. |
46
+ | `children` | `React.ReactNode` | — | Não | Itens renderizados dentro do stack. |
47
+
48
+ - **Atributos DOM herdados**: o tipo é `Omit<React.HTMLAttributes<HTMLDivElement>, "align" \| "children"> & { ... }`; acrescenta 277 props de `@types/react` (`HTMLAttributes` 55, `AriaAttributes` 53, `DOMAttributes` 169). Não listadas individualmente — ver contrato base `React.HTMLAttributes` em `@types/react`.
49
+
50
+ ### Eventos e callbacks
51
+ Nenhum próprio. Eventos DOM herdados (`onClick` etc.) são repassados ao `<div>` raiz via `{...rest}` (Confirmado).
52
+
53
+ ### Ref
54
+ Não usa `forwardRef`: `ref` não é repassado ao DOM (Confirmado — função simples).
55
+
56
+ ### Children, slots e composição
57
+ `children` é renderizado direto dentro de um `<div class="flex ...">`. `gap` numérico vira `px`; `direction` mapeia para `flex-row`/`flex-col`; `grow` aplica `flex-1`.
58
+
59
+ ### Contexto, providers e hooks
60
+ Nenhum.
61
+
62
+ ### Acessibilidade
63
+ Não adiciona roles nem atributos ARIA; aceita `aria-*`/`role` herdados via `{...rest}` (Confirmado).
64
+
65
+ ---
66
+
67
+ ## SgGrid
68
+
69
+ Grade CSS responsiva por colunas fixas por breakpoint ou por largura mínima de item (`auto-fit`). Fonte: `src/layout/SgGrid.tsx` → `SgGrid`.
70
+
71
+ ### Import
72
+ ```tsx
73
+ import { SgGrid, type SgGridProps, type SgGridColumns } from "@seedgrid/fe-components";
74
+ ```
75
+
76
+ ### Props
77
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
78
+ |---|---|---|---|---|
79
+ | `columns` | `SgGridColumns` | `1` coluna (`normalizeColumns(undefined)` → `{ base: 1 }`) ᶠ | Não | Define a quantidade de colunas base e por breakpoint. |
80
+ | `minItemWidth` | `number \| string` | — | Não | Largura minima dos itens em modo auto-fit. |
81
+ | `gap` | `number \| string` | `0` | Não | Espacamento entre os itens da grade. |
82
+ | `padding` | `number \| string` | — | Não | Espacamento interno do container grid. |
83
+ | `dense` | `boolean` | `false` | Não | Ativa preenchimento denso do fluxo de grade. |
84
+ | `rowHeight` | `number \| string` | — (não define `grid-auto-rows`) | Não | Altura automatica das linhas da grade. |
85
+ | `justify` | `"start" \| "center" \| "end" \| "stretch" \| "between" \| "around" \| "evenly"` | — | Não | Alinhamento do grid. |
86
+ | `align` | `"start" \| "center" \| "end" \| "stretch"` | — | Não | Alinhamento do grid. |
87
+ | `children` | `React.ReactNode` | — | Não | Itens renderizados dentro da grade. |
88
+
89
+ - **Atributos DOM herdados**: o tipo é `Omit<React.HTMLAttributes<HTMLDivElement>, "align" \| "children"> & { ... }`; acrescenta 277 props de `@types/react` (`HTMLAttributes` 55, `AriaAttributes` 53, `DOMAttributes` 169). Não listadas individualmente — ver contrato base `React.HTMLAttributes` em `@types/react`.
90
+
91
+ ### Eventos e callbacks
92
+ Nenhum próprio; atributos/eventos DOM vão para o `<div>` raiz via `{...rest}`.
93
+
94
+ ### Ref
95
+ Não aceita `ref` (função simples).
96
+
97
+ ### Children, slots e composição
98
+ - Breakpoints usados por `columns` (objeto): `sm` 640px, `md` 768px, `lg` 1024px, `xl` 1280px, `2xl` 1536px; injeta um `<style>` com `@media` por instância (`data-sg-grid`) e a variável `--sg-grid-cols` (Confirmado).
99
+ - Com `minItemWidth`, usa `repeat(auto-fit, minmax(<minItemWidth>, 1fr))` e ignora `columns` (Confirmado).
100
+ - **Contrato com os filhos**: se um filho tem prop `span` ou `rowSpan` numérica `> 1` (ex.: `SgPanel`), o filho é embrulhado num `<div>` com `grid-column: span N` / `grid-row: span N` (Confirmado). Funciona com qualquer elemento cujo `props` tenha `span`/`rowSpan`.
101
+
102
+ ### Tipos auxiliares exportados
103
+ - `SgGridColumns = number | Partial<Record<"base" | "sm" | "md" | "lg" | "xl" | "2xl", number>>`.
104
+
105
+ ### Contexto, providers e hooks
106
+ Nenhum.
107
+
108
+ ### Acessibilidade
109
+ Sem roles/ARIA próprios.
110
+
111
+ ---
112
+
113
+ ## SgPanel
114
+
115
+ Painel estrutural com borda, margem/padding, scroll e **docking por alinhamento** (`align` top/left/right/bottom/client) quando colocado dentro de outro `SgPanel` ou de `SgScreen`. Fonte: `src/layout/SgPanel.tsx` → `SgPanel` (usa `src/layout/sgDocking.tsx`, interno).
116
+
117
+ ### Import
118
+ ```tsx
119
+ import {
120
+ SgPanel,
121
+ type SgPanelProps, type SgPanelAlign, type SgPanelBorderStyle, type SgPanelScrollable, type SgPanelPercent
122
+ } from "@seedgrid/fe-components";
123
+ ```
124
+
125
+ ### Props
126
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
127
+ |---|---|---|---|---|
128
+ | `align` | `SgPanelAlign` = `"top" \| "right" \| "bottom" \| "left" \| "client"` | `"client"` | Não | Posicionamento relativo ao container pai em cenarios de dock. |
129
+ | `width` | `SgPanelPercent` | — | Não | Largura do painel quando dockado ou usado em composicoes controladas. |
130
+ | `height` | `SgPanelPercent` | — | Não | Altura do painel quando dockado ou usado em composicoes controladas. |
131
+ | `minWidthPx` | `number` | — | Não | Limites minimos em pixels para evitar corte de conteudo. |
132
+ | `minHeightPx` | `number` | — | Não | Limites minimos em pixels para evitar corte de conteudo. |
133
+ | `span` | `number` | — | Não | Span de colunas e linhas quando usado dentro de `SgGrid`. |
134
+ | `rowSpan` | `number` | — | Não | Span de colunas e linhas quando usado dentro de `SgGrid`. |
135
+ | `borderStyle` | `SgPanelBorderStyle` = `"solid" \| "none" \| "dashed"` | `"dashed"` | Não | Estilo visual da borda do container. |
136
+ | `padding` | `number \| string` | — (aplicado como `margin`) | Não | Espacamento externo do painel em relacao ao slot recebido do pai. |
137
+ | `contentPadding` | `number \| string` | — (aplicado como `padding`) | Não | Espacamento interno entre a borda e o conteudo. |
138
+ | `scrollable` | `SgPanelScrollable` | `false` | Não | Habilita scroll apenas quando desejado. |
139
+ | `scrollbarGutter` | `boolean` | `false` | Não | Reserva espaco visual para scrollbar. |
140
+ | `contentDirection` | `SgPanelContentDirection` = `"row" \| "column"` | — | Não | Controlam a disposicao dos filhos dentro da area de conteudo. |
141
+ | `contentGap` | `number \| string` | — | Não | Controlam a disposicao dos filhos dentro da area de conteudo. |
142
+ | `contentJustify` | `SgPanelContentJustify` = `"start" \| "center" \| "end" \| "between" \| "around" \| "evenly"` | — | Não | Controlam a disposicao dos filhos dentro da area de conteudo. |
143
+ | `contentAlign` | `SgPanelContentAlign` = `"start" \| "center" \| "end" \| "stretch"` | — | Não | Controlam a disposicao dos filhos dentro da area de conteudo. |
144
+ | `contentWrap` | `boolean` | — | Não | Controlam a disposicao dos filhos dentro da area de conteudo. |
145
+ | `contentClassName` | `string` | — | Não | Classes do contêiner flex interno que envolve os filhos não ancorados (gerado por `renderDockContent`). *(Inferência)* |
146
+ | `contentStyle` | `React.CSSProperties` | — | Não | Estilo inline do contêiner flex interno dos filhos não ancorados (mesclado depois do `gap`). *(Inferência)* |
147
+ | `children` | `React.ReactNode` | — | Não | Conteudo livre ou outros elementos de layout aninhados. |
148
+
149
+ - **Atributos DOM herdados**: o tipo é `Omit< React.HTMLAttributes<HTMLDivElement>, "align" \| "children" > & { ... }`; acrescenta 277 props de `@types/react` (`HTMLAttributes` 55, `AriaAttributes` 53, `DOMAttributes` 169). Não listadas individualmente — ver contrato base `React.HTMLAttributes` em `@types/react`.
150
+
151
+ ### Eventos e callbacks
152
+ Nenhum próprio; eventos DOM vão para o `<div>` raiz via `{...rest}`.
153
+
154
+ ### Ref
155
+ Não aceita `ref`.
156
+
157
+ ### Children, slots e composição
158
+ - **Docking (Confirmado, `renderDockContent`)**: os filhos que são `SgPanel` **com `align` definido** (detectados por `displayName === "SgPanel"`) são distribuídos em faixas: `top` e `bottom` (largura 100%, altura `height` em %), `left` e `right` (altura 100%, largura `width` em %), `client` (ocupa o restante, `flex: 1`). Filhos sem `align` ficam num contêiner flex na área central.
159
+ - Sem filhos ancorados, todos os filhos ficam num contêiner flex com `contentDirection` (padrão: `row` se o próprio painel for `top`/`bottom`, senão `column`), `contentGap` (padrão `10`px), `contentJustify` (`start`), `contentAlign` (padrão `start` para top/bottom, senão `stretch`) e `contentWrap` (`false`).
160
+ - `width`/`height` numéricos são **porcentagem** (`20` → `20%`); strings passam como CSS. `minWidthPx`/`minHeightPx` em px.
161
+ - `padding` vira `margin` do painel; `contentPadding` vira `padding` (Confirmado).
162
+ - `span`/`rowSpan` não são usados pelo próprio `SgPanel`; são lidos pelo `SgGrid` pai.
163
+ - `scrollable`: `false` → `overflow-hidden`; `true`/`"auto"` → `overflow-auto`; `"y"`/`"x"` → overflow só no eixo.
164
+
165
+ ### Tipos auxiliares exportados
166
+ `SgPanelAlign = "top" | "left" | "bottom" | "right" | "client"` · `SgPanelBorderStyle = "none" | "solid" | "dashed"` · `SgPanelScrollable = boolean | "auto" | "y" | "x"` · `SgPanelPercent = number | \`${number}%\``. Os tipos `SgPanelContentDirection`, `SgPanelContentJustify`, `SgPanelContentAlign` existem no arquivo mas **não** são exportados pelo barrel.
167
+
168
+ ### Contexto, providers e hooks
169
+ Nenhum.
170
+
171
+ ### Acessibilidade
172
+ Sem roles/ARIA próprios; aceita os herdados via `{...rest}`.
173
+
174
+ ---
175
+
176
+ ## SgScreen
177
+
178
+ Raiz de tela: ocupa a viewport (`100%` × `100dvh`) por padrão e aplica o mesmo docking por `align` dos `SgPanel` filhos (área tratada como `client`). Fonte: `src/layout/SgScreen.tsx` → `SgScreen`.
179
+
180
+ ### Import
181
+ ```tsx
182
+ import { SgScreen, type SgScreenProps } from "@seedgrid/fe-components";
183
+ ```
184
+
185
+ ### Props
186
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
187
+ |---|---|---|---|---|
188
+ | `fullscreen` | `boolean` | `true` | Não | Define se a tela ocupa toda a viewport. |
189
+ | `width` | `number \| string` | — | Não | Largura explicita quando a tela nao for fullscreen. |
190
+ | `height` | `number \| string` | — | Não | Altura explicita quando a tela nao for fullscreen. |
191
+ | `padding` | `number \| string` | — | Não | Espacamento interno aplicado ao root da tela. |
192
+ | `children` | `React.ReactNode` | — | Não | Conteudo estrutural da tela, normalmente com panels dockados. |
193
+
194
+ - **Atributos DOM herdados**: o tipo é `Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & { ... }`; acrescenta 277 props de `@types/react` (`HTMLAttributes` 55, `AriaAttributes` 53, `DOMAttributes` 169). Não listadas individualmente — ver contrato base `React.HTMLAttributes` em `@types/react`.
195
+
196
+ ### Eventos e callbacks
197
+ Nenhum próprio; DOM via `{...rest}`.
198
+
199
+ ### Ref
200
+ Não aceita `ref`.
201
+
202
+ ### Children, slots e composição
203
+ Os filhos passam por `renderDockContent({ align: "client" })`: `SgPanel` com `align` são ancorados; os demais ficam num contêiner flex em coluna. `width`/`height` explícitos têm precedência sobre `fullscreen` (Confirmado).
204
+
205
+ ### Contexto, providers e hooks
206
+ Nenhum.
207
+
208
+ ### Acessibilidade
209
+ Sem roles/ARIA próprios.
210
+
211
+ ---
212
+
213
+ ## SgGroupBox
214
+
215
+ Agrupador com `<fieldset>` + `<legend>` (título). Fonte: `src/layout/SgGroupBox.tsx` → `SgGroupBox`.
216
+
217
+ ### Import
218
+ ```tsx
219
+ import { SgGroupBox, type SgGroupBoxProps } from "@seedgrid/fe-components";
220
+ ```
221
+
222
+ ### Props
223
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
224
+ |---|---|---|---|---|
225
+ | `title` | `string` | — | Sim | Titulo exibido no topo da secao agrupada. |
226
+ | `height` | `number \| string` | — | Não | Altura do bloco de agrupamento. |
227
+ | `width` | `number \| string` | — | Não | Largura do bloco de agrupamento. |
228
+ | `children` | `React.ReactNode` | — | Sim | Conteudo agrupado dentro do fieldset. |
229
+ | `className` | `string` | — | Não | Classes CSS adicionais para o estilo externo. |
230
+ | `style` | `React.CSSProperties` | — | Não | Inline style adicional do container. |
231
+
232
+ ### Eventos e callbacks
233
+ Nenhum.
234
+
235
+ ### Ref
236
+ Não aceita `ref`.
237
+
238
+ ### Children, slots e composição
239
+ Estrutura: `<div style={width,height,...style}>` → `<fieldset>` → `<legend>{title}</legend>` + `<div>{children}</div>`. `width` padrão `100%` (fallback `toCssSize(width) ?? "100%"`); números viram `px`.
240
+
241
+ ### Contexto, providers e hooks
242
+ Nenhum.
243
+
244
+ ### Acessibilidade
245
+ Usa semântica nativa `fieldset`/`legend` (Confirmado). Não aceita outros atributos DOM (tipo fechado).
246
+
247
+ ---
248
+
249
+ ## SgCard
250
+
251
+ Card com cabeçalho (título/descrição/leading/trailing/actions), corpo, rodapé, modo clicável, colapso e arraste com posição persistida. Fonte: `src/layout/SgCard.tsx` → `SgCard`.
252
+
253
+ ### Import
254
+ ```tsx
255
+ import { SgCard, type SgCardProps, type SgCardVariant, type SgCardSize, type SgCardPosition } from "@seedgrid/fe-components";
256
+ ```
257
+
258
+ ### Props
259
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
260
+ |---|---|---|---|---|
261
+ | `className` | `string` | — | Não | Customizacao de estilos por bloco. |
262
+ | `draggable` | `boolean` | `false` | Não | Arrasta o card ao segurar o cabecalho. |
263
+ | `children` | `React.ReactNode` | — | Não | Conteudo principal exibido dentro do card. |
264
+ | `headerClassName` | `string` | — | Não | Customizacao de estilos por bloco. |
265
+ | `bodyClassName` | `string` | — | Não | Customizacao de estilos por bloco. |
266
+ | `footerClassName` | `string` | — | Não | Customizacao de estilos por bloco. |
267
+ | `bgColor` | `string` | `?? style?.backgroundColor` ᶠ | Não | Cor de fundo do card, titulo e footer. |
268
+ | `bgColorTitle` | `string` | — | Não | Cor de fundo do card, titulo e footer. |
269
+ | `bgColorFooter` | `string` | — | Não | Cor de fundo do card, titulo e footer. |
270
+ | `cardStyle` | `SgCardVariant` = `"default" \| "outlined" \| "flat" \| "elevated"` | `"default"` | Não | Estilo visual da superficie do card. |
271
+ | `size` | `SgCardSize` = `"sm" \| "md" \| "lg"` | `"md"` | Não | Escala geral de espacos e dimensoes do card. |
272
+ | `leading` | `React.ReactNode` | — | Não | Elementos auxiliares no cabecalho. |
273
+ | `trailing` | `React.ReactNode` | `?? trailer` ᶠ | Não | Elementos auxiliares no cabecalho. |
274
+ | `trailer` | `React.ReactNode` | — | Não | Elementos auxiliares no cabecalho. |
275
+ | `title` | `React.ReactNode` | — | Não | Titulo principal do card. |
276
+ | `description` | `React.ReactNode` | — | Não | Descricao ou subtitulo complementar do cabecalho. |
277
+ | `actions` | `React.ReactNode` | — | Não | Areas customizaveis do layout. |
278
+ | `header` | `React.ReactNode` | — | Não | Areas customizaveis do layout. |
279
+ | `footer` | `React.ReactNode` | — | Não | Areas customizaveis do layout. |
280
+ | `clickable` | `boolean` | `false` | Não | Transforma o card em superficie clicavel. |
281
+ | `disabled` | `boolean` | `false` | Não | Modo clicavel e estado desabilitado. |
282
+ | `collapsible` | `boolean` | `false` | Não | Permite recolher e expandir o conteudo do card. |
283
+ | `defaultOpen` | `boolean` | `true` | Não | Controle de colapso do conteudo. |
284
+ | `open` | `boolean` | — (não controlado quando omitido) | Não | Controle de colapso do conteudo. |
285
+ | `onOpenChange` | `(open: boolean) => void` | — | Não | Callback de abertura/fechamento. |
286
+ | `collapseIcon` | `React.ReactNode` | `?? <DefaultCaret open={isOpen} size={collapseIconSize} />` ᶠ | Não | Customizacao do botao de colapso e posicao do icone. |
287
+ | `collapseIconSize` | `number` | `18` | Não | Customizacao do botao de colapso e posicao do icone. |
288
+ | `collapseToggleAlign` | `"left" \| "right"` | `"left"` | Não | Customizacao do botao de colapso e posicao do icone. |
289
+ | `toggleOnHeaderClick` | `boolean` | `true` | Não | Com `collapsible`, clicar no cabeçalho (ou Enter/Espaço com foco nele) alterna abrir/fechar; com `false`, só o botão de colapso alterna. *(Inferência)* |
290
+ | `defaultPosition` | `SgCardPosition` | — (usa `{ x: 0, y: 0 }` quando omitido) | Não | Arrasta o card ao segurar o cabecalho. |
291
+ | `dragPersistKey` | `string` | — | Não | Persistencia de posicao via EnvironmentProvider ou localStorage fallback. |
292
+ | `onPositionChange` | `(position: SgCardPosition) => void` | — | Não | Persistencia de posicao via EnvironmentProvider ou localStorage fallback. |
293
+ | `onClick` | `React.MouseEventHandler<HTMLElement>` | — | Não | Callback disparado quando o card e acionado. |
294
+
295
+ - **Atributos DOM herdados**: o tipo é `Omit<React.HTMLAttributes<HTMLElement>, "title" \| "onClick"> & { ... }`; acrescenta 273 props de `@types/react` (`HTMLAttributes` 52, `AriaAttributes` 53, `DOMAttributes` 168). Não listadas individualmente — ver contrato base `React.HTMLAttributes` em `@types/react`.
296
+
297
+ ### Eventos e callbacks
298
+ | Callback | Assinatura | Quando dispara (Confirmado) |
299
+ |---|---|---|
300
+ | `onClick` | `React.MouseEventHandler<HTMLElement>` | Clique no card (desativado com `disabled`). Se o card é interativo (`clickable` ou `onClick`, e **não** `collapsible`/`draggable`), a raiz é um `<button type="button">`. |
301
+ | `onOpenChange` | `(open: boolean) => void` | Ao alternar o colapso (botão ou cabeçalho), só com `collapsible`. |
302
+ | `onPositionChange` | `(position: SgCardPosition) => void` | Em todo commit de `dragPosition` (efeito), inclusive na montagem e ao hidratar a posição salva. |
303
+
304
+ ### Ref
305
+ Não aceita `ref`.
306
+
307
+ ### Children, slots e composição
308
+ - Slots: `header` (substitui o cabeçalho padrão inteiro), `title`, `description`, `leading`, `trailing` (alias legado `trailer`; `trailing ?? trailer`), `actions`, `footer`, `collapseIcon`, `children` (corpo).
309
+ - Raiz: `<section>` (ou `<button>` quando interativo); demais atributos via `{...rest}`.
310
+ - **Arraste** (`draggable`): arrasta segurando o cabeçalho (ignora cliques em botões, links, inputs e elementos com `data-sg-card-no-drag="true"`); aplica `transform: translate3d`. A posição é salva na chave `dragPersistKey` ou, na falta, `sg-card-pos:<id>`; sem chave, não persiste. Com `SgEnvironmentProvider` presente usa `useSgPersistence` (load/save/clear); sem provider usa `localStorage`. Valores inválidos são removidos (Confirmado).
311
+
312
+ ### Contexto, providers e hooks
313
+ Consome `useHasSgEnvironmentProvider`/`useSgPersistence` (environment) e `useComponentsI18n` (rótulos "expandir/recolher").
314
+
315
+ ### Acessibilidade
316
+ - Botão de colapso com `aria-label` traduzido (`components.actions.collapse`/`expand`) e `aria-expanded` (Confirmado; coberto por `tests/buttons-menus.test.mjs`).
317
+ - Com `collapsible` + `toggleOnHeaderClick`, o cabeçalho recebe `role="button"`, `tabIndex=0`, `aria-expanded` e alterna com **Enter** ou **Espaço** (Confirmado).
318
+ - Card interativo vira `<button>` nativo (foco/teclado nativos).
319
+
320
+ ---
321
+
322
+ ## SgAccordion
323
+
324
+ Lista de seções colapsáveis, vertical ou horizontal (cabeçalho com texto vertical), controlada ou não. Fonte: `src/layout/SgAccordion.tsx` → `SgAccordion`.
325
+
326
+ ### Import
327
+ ```tsx
328
+ import { SgAccordion, type SgAccordionProps, type SgAccordionItem, type SgAccordionOrientation } from "@seedgrid/fe-components";
329
+ ```
330
+
331
+ ### Props
332
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
333
+ |---|---|---|---|---|
334
+ | `id` | `string` | `?? 'sg-accordion-${generatedId}'` ᶠ | Não | Identificador do accordion. |
335
+ | `items` | `SgAccordionItem[]` | — | Sim | Colecao de secoes renderizadas pelo accordion. |
336
+ | `orientation` | `SgAccordionOrientation` = `"horizontal" \| "vertical"` | `"vertical"` | Não | Direcao de expansao dos paineis. |
337
+ | `multiple` | `boolean` | `false` | Não | Permite manter varios paineis abertos simultaneamente. |
338
+ | `collapsible` | `boolean` | `true` | Não | Permite fechar um painel ja ativo. |
339
+ | `activeIndex` | `number \| number[]` | — (não controlado quando omitido) | Não | Estado controlado dos paineis abertos. |
340
+ | `defaultActiveIndex` | `number \| number[]` | — (sem ele, abre o índice `0` se `defaultOpenFirst`) | Não | Estado inicial dos paineis abertos. |
341
+ | `defaultOpenFirst` | `boolean` | `true` | Não | Initial open behavior and DOM persistence. |
342
+ | `onActiveIndexChange` | `(indexes: number[]) => void` | — | Não | Callback disparado quando o conjunto de paineis abertos muda. |
343
+ | `onItemToggle` | `(index: number, isOpen: boolean) => void` | — | Não | State change events. |
344
+ | `panelClassName` | `string` | — | Não | Style customization per area. |
345
+ | `headerClassName` | `string` | — | Não | Style customization per area. |
346
+ | `headerBackgroundColor` | `string` | `?? DEFAULT_HEADER_BACKGROUND` ᶠ | Não | Cor base dos headers do accordion. |
347
+ | `contentClassName` | `string` | — | Não | Style customization per area. |
348
+ | `animationDuration` | `number` | `220` | Não | Open/close animation duration. |
349
+ | `horizontalHeaderWidth` | `number \| string` | `52` | Não | Dimensions in horizontal mode. |
350
+ | `horizontalMinHeight` | `number \| string` | `220` | Não | Dimensions in horizontal mode. |
351
+ | `keepMounted` | `boolean` | `true` | Não | Initial open behavior and DOM persistence. |
352
+
353
+ - **Atributos DOM herdados**: o tipo é `Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> & { ... }`; acrescenta 276 props de `@types/react` (`HTMLAttributes` 54, `AriaAttributes` 53, `DOMAttributes` 169), incluindo `children`. Não listadas individualmente — ver contrato base `React.HTMLAttributes` em `@types/react`.
354
+
355
+ ### Eventos e callbacks
356
+ | Callback | Assinatura | Quando dispara (Confirmado) |
357
+ |---|---|---|
358
+ | `onActiveIndexChange` | `(indexes: number[]) => void` | A cada alternância, com os índices abertos normalizados (ordenados, únicos, dentro do intervalo; no máximo 1 se `multiple=false`). |
359
+ | `onItemToggle` | `(index: number, isOpen: boolean) => void` | Após `onActiveIndexChange`, com o novo estado do item. Não dispara para item `disabled` nem ao tentar fechar com `collapsible=false`. |
360
+
361
+ ### Ref
362
+ Não aceita `ref`.
363
+
364
+ ### Tipos auxiliares exportados
365
+ `SgAccordionItem`:
366
+
367
+ | Campo | Tipo | Obrigatório | Uso |
368
+ |---|---|---|---|
369
+ | `id` | `string \| number` | Não | Compõe os ids DOM (`<baseId>-header-<id>` etc.); padrão = índice. |
370
+ | `title` | `React.ReactNode` | Sim | Texto do cabeçalho. |
371
+ | `content` | `React.ReactNode` | Sim | Conteúdo do painel. |
372
+ | `disabled` | `boolean` | Não | Bloqueia a alternância (botão `disabled`). |
373
+ | `icon` | `React.ReactNode` | Não | Ícone no cabeçalho. |
374
+ | `end` | `React.ReactNode` | Não | Conteúdo à direita do cabeçalho (só vertical). |
375
+ | `className` | `string` | Não | Classe do painel do item. |
376
+ | `headerClassName` | `string` | Não | Classe do cabeçalho do item. |
377
+ | `headerBackgroundColor` | `string` | Não | Cor do cabeçalho (precede a prop do componente). |
378
+ | `contentClassName` | `string` | Não | Classe da região de conteúdo. |
379
+
380
+ `SgAccordionOrientation = "vertical" | "horizontal"`.
381
+
382
+ ### Children, slots e composição
383
+ Conteúdo vem só de `items` (não usa `children`). Com `keepMounted=false`, conteúdo fechado é desmontado. Na orientação vertical a animação usa `max-height` até `960px` — conteúdos mais altos podem ser cortados durante a transição/aberto (Inferência a partir do estilo `maxHeight: "960px"`).
384
+
385
+ ### Contexto, providers e hooks
386
+ Nenhum.
387
+
388
+ ### Acessibilidade
389
+ Cabeçalho é `<button type="button">` com `aria-controls` e `aria-expanded`; conteúdo tem `role="region"` e `aria-labelledby` apontando para o cabeçalho (Confirmado). Não há navegação por setas entre cabeçalhos.
390
+
391
+ ---
392
+
393
+ ## SgPageControl
394
+
395
+ Abas (`tablist`) com páginas declaradas como filhos `SgPageControlPage`; controlado por id ou índice; no celular vira rolagem ou `<select>`. Fonte: `src/layout/SgPageControl.tsx` → `SgPageControl`, `SgPageControlPage`.
396
+
397
+ ### Import
398
+ ```tsx
399
+ import { SgPageControl, SgPageControlPage, type SgPageControlProps, type SgPageControlPageProps } from "@seedgrid/fe-components";
400
+ ```
401
+
402
+ ### Props — `SgPageControl`
403
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
404
+ |---|---|---|---|---|
405
+ | `children` | `React.ReactNode` | — | Sim | Paginas filhas definidas por SgPageControlPage. |
406
+ | `activePageId` | `string` | — | Não | Id da pagina ativa em modo controlado. |
407
+ | `activeIndex` | `number` | — | Não | Indice ativo em modo controlado. |
408
+ | `defaultActivePageId` | `string` | — | Não | Initial state when uncontrolled. |
409
+ | `defaultActiveIndex` | `number` | `0` | Não | Initial state when uncontrolled. |
410
+ | `onActivePageIdChange` | `( pageId: string, context: { index: number; page: SgPageControlPageProps } ) => void` | — | Não | Callback disparado quando a pagina ativa muda. |
411
+ | `onActiveIndexChange` | `( index: number, context: { pageId: string; page: SgPageControlPageProps } ) => void` | — | Não | Events triggered on page change. |
412
+ | `hiddenPageIds` | `string[]` | — (tratado como `[]`) | Não | Hide pages without removing declarations. |
413
+ | `keepMounted` | `boolean` | `false` | Não | Mantem paineis inativos montados no DOM. |
414
+ | `pageControlStyle` | `"underline" \| "pills"` | `"underline"` | Não | Estilo visual da lista de abas. |
415
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | Não | Escala visual das abas. |
416
+ | `fullWidthTabs` | `boolean` | `false` | Não | Distribui as abas em larguras iguais a partir do tablet (`md`, 768px). No celular as abas mantem a largura natural e a lista rola — abas iguais numa tela estreita espremem os rotulos ate ninguem conseguir ler. |
417
+ | `mobilePageControl` | `"scroll" \| "select"` | `"scroll"` | Não | Comportamento das abas no celular (abaixo de `md`, 768px). - `"scroll"` (default): continuam abas, com rolagem horizontal, e a aba ativa e trazida para a area visivel sozinha. - `"select"`: viram um `<select>` nativo, util quando sao muitas abas ou os rotulos sao longos. Tablet e desktop nao mudam. |
418
+ | `keyboardNavigation` | `boolean` | `true` | Não | Arrow/Home/End navigation between tabs. |
419
+ | `ariaLabel` | `string` | `?? t(i18n, "components.pageControl.ariaLabel")` ᶠ | Não | Accessibility and empty state. |
420
+ | `emptyMessage` | `React.ReactNode` | `?? t(i18n, "components.pageControl.empty")` ᶠ | Não | Accessibility and empty state. |
421
+ | `className` | `string` | — | Não | Classes and styles for wrappers. |
422
+ | `tabListClassName` | `string` | — | Não | Classes and styles for wrappers. |
423
+ | `tabClassName` | `string` | — | Não | Classes and styles for wrappers. |
424
+ | `panelClassName` | `string` | — | Não | Classes and styles for wrappers. |
425
+ | `style` | `React.CSSProperties` | — | Não | Classes and styles for wrappers. |
426
+
427
+ ### Props — `SgPageControlPage`
428
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
429
+ |---|---|---|---|---|
430
+ | `id` | `string` | — | Não | Identificador estavel da pagina. |
431
+ | `title` | `React.ReactNode` | — | Sim | Titulo exibido na aba da pagina. |
432
+ | `hint` | `string` | — | Não | Descricao curta associada a aba. |
433
+ | `icon` | `React.ReactNode` | — | Não | Icone opcional da aba. |
434
+ | `hidden` | `boolean` | — (tratado como `false`) | Não | Oculta a pagina sem remove-la da estrutura. |
435
+ | `disabled` | `boolean` | — (tratado como `false`) | Não | Desabilita a selecao da pagina. |
436
+ | `className` | `string` | — | Não | Classes and styles for wrappers. |
437
+ | `style` | `React.CSSProperties` | — | Não | Classes and styles for wrappers. |
438
+ | `tabClassName` | `string` | — | Não | Classes and styles for wrappers. |
439
+ | `children` | `React.ReactNode` | — | Sim | Conteudo exibido no painel desta pagina. |
440
+
441
+ ### Eventos e callbacks
442
+ | Callback | Assinatura | Quando dispara (Confirmado) |
443
+ |---|---|---|
444
+ | `onActivePageIdChange` | `(pageId: string, context: { index: number; page: SgPageControlPageProps }) => void` | Ao selecionar outra página visível (clique, teclado, select mobile). |
445
+ | `onActiveIndexChange` | `(index: number, context: { pageId: string; page: SgPageControlPageProps }) => void` | Junto com o anterior; `index` é relativo às páginas **visíveis**. |
446
+
447
+ ### Ref
448
+ Nenhum dos dois aceita `ref`.
449
+
450
+ ### Children, slots e composição
451
+ - Só filhos `SgPageControlPage` (ou com `displayName === "SgPageControlPage"`) viram páginas; o resto é ignorado. Id padrão: `sg-page-control-page-<n>` (1-based).
452
+ - `SgPageControlPage` apenas renderiza `children`; suas props são lidas pelo pai (título, ícone, `hint` como `title` da aba, `className`/`style` do painel, `tabClassName` da aba).
453
+ - Página ativa inválida (oculta/inexistente) cai para a primeira visível.
454
+ - `keepMounted` (no `SgPageControl`) mantém todos os painéis montados (ocultos com `hidden`).
455
+ - No select mobile, o rótulo da opção é `title` (se string/number), senão `hint`, senão o id.
456
+
457
+ ### Contexto, providers e hooks
458
+ `useComponentsI18n` para `ariaLabel`/`emptyMessage` padrão.
459
+
460
+ ### Acessibilidade (Confirmado)
461
+ - `role="tablist"` com `aria-label`; abas `role="tab"` com `aria-selected`, `aria-controls`, roving `tabIndex` (0 na ativa, -1 nas demais); painéis `role="tabpanel"` com `aria-labelledby`.
462
+ - Teclado (quando `keyboardNavigation`): **→/↓** próxima, **←/↑** anterior, **Home**/**End** primeira/última, **Enter**/**Espaço** ativam.
463
+ - `<select>` mobile com `aria-label`.
464
+
465
+ ---
466
+
467
+ ## SgExpandablePanel
468
+
469
+ Painel que expande para uma direção, inline (empurra o layout) ou em overlay (portal no `document.body`, com backdrop, foco preso e bloqueio de scroll). Fonte: `src/layout/SgExpandablePanel.tsx` → `SgExpandablePanel`.
470
+
471
+ ### Import
472
+ ```tsx
473
+ import {
474
+ SgExpandablePanel,
475
+ type SgExpandablePanelProps, type SgExpandablePanelDirection, type SgExpandablePanelPlacement,
476
+ type SgExpandablePanelMode, type SgExpandablePanelSize, type SgExpandablePanelAnimation,
477
+ type SgExpandablePanelElevation, type SgExpandablePanelRounded, type SgExpandablePanelRole
478
+ } from "@seedgrid/fe-components";
479
+ ```
480
+
481
+ ### Props
482
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
483
+ |---|---|---|---|---|
484
+ | `header` | `React.ReactNode` | — | Não | Conteudo opcional do cabecalho. |
485
+ | `children` | `React.ReactNode` | — | Sim | Conteudo principal do painel. |
486
+ | `footer` | `React.ReactNode` | — | Não | Conteudo opcional do rodape. |
487
+ | `handle` | `React.ReactNode` | — | Não | Elemento visual acima do header. |
488
+ | `open` | `boolean` | — | Não | Controla a abertura do painel. |
489
+ | `defaultOpen` | `boolean` | `false` | Não | Estado inicial no modo nao controlado. |
490
+ | `onOpenChange` | `(open: boolean) => void` | — | Não | Callback disparado ao abrir ou fechar o painel. |
491
+ | `expandTo` | `SgExpandablePanelDirection` = `"top" \| "right" \| "bottom" \| "left"` | — | Sim | Direcao para a qual o painel se expande. |
492
+ | `placement` | `SgExpandablePanelPlacement` = `"start" \| "center" \| "end"` | `"start"` | Não | Posicao no eixo perpendicular. |
493
+ | `mode` | `SgExpandablePanelMode` = `"inline" \| "overlay"` | `"inline"` | Não | Modo de renderizacao do painel. |
494
+ | `size` | `SgExpandablePanelSize` | `default`: `320` (eixo x) / `280` (eixo y); `min`: `180`/`140` ᶠ | Não | Configuracao de tamanho minimo, maximo e padrao. |
495
+ | `resizable` | `boolean` | `false` | Não | Permite redimensionar o painel. |
496
+ | `onSizeChange` | `(size: number \| string) => void` | — | Não | Retorno de chamada durante o redimensionamento. |
497
+ | `closeOnOutsideClick` | `boolean` | `?? mode === "overlay"` ᶠ | Não | Fecha ao clicar fora do painel. |
498
+ | `closeOnEsc` | `boolean` | `true` | Não | Fecha ao pressionar ESC. |
499
+ | `trapFocus` | `boolean` | `?? mode === "overlay"` ᶠ | Não | Prende foco dentro do painel. |
500
+ | `showBackdrop` | `boolean` | `true` | Não | Mostra camada de fundo no overlay. |
501
+ | `animation` | `SgExpandablePanelAnimation` | `{ type: "slide", durationMs: 180 }` ᶠ | Não | Animacao de entrada/saida. |
502
+ | `elevation` | `SgExpandablePanelElevation` = `"sm" \| "md" \| "lg" \| "none"` | `"md"` | Não | Sombra do painel. |
503
+ | `border` | `boolean` | `true` | Não | Exibe borda do container. |
504
+ | `rounded` | `SgExpandablePanelRounded` = `"md" \| "lg" \| "none" \| "xl"` | `"lg"` | Não | Raio dos cantos. |
505
+ | `ariaLabel` | `string` | `?? t(i18n, "components.expandablePanel.ariaLabel")` ᶠ | Não | Rotulo acessivel do painel. |
506
+ | `role` | `SgExpandablePanelRole` = `"dialog" \| "region"` | `?? (mode === "overlay" ? "dialog" : "region")` ᶠ | Não | Papel semantico aplicado ao painel. |
507
+ | `className` | `string` | — | Não | Classe extra no container do painel. |
508
+ | `contentClassName` | `string` | — | Não | Classe extra no wrapper de conteudo. |
509
+ | `headerClassName` | `string` | — | Não | Classe extra da area de header. |
510
+ | `bodyClassName` | `string` | — | Não | Classe extra da area de body. |
511
+ | `footerClassName` | `string` | — | Não | Classe extra da area de footer. |
512
+ | `overlayClassName` | `string` | — | Não | Classe extra da camada de overlay/backdrop. |
513
+ | `style` | `React.CSSProperties` | — | Não | Estilo inline do container do painel. |
514
+
515
+ - Aceita `ref` (via `React.forwardRef`) e `key`.
516
+
517
+ ### Eventos e callbacks
518
+ | Callback | Assinatura | Quando dispara (Confirmado) |
519
+ |---|---|---|
520
+ | `onOpenChange` | `(open: boolean) => void` | Fechamento por **Esc** (`closeOnEsc`), clique no backdrop (`closeOnOutsideClick`) — só em overlay. O componente não tem botão próprio de abrir/fechar: abrir é responsabilidade do chamador. |
521
+ | `onSizeChange` | `(size: number \| string) => void` | Durante o redimensionamento pela alça (`resizable`), com o tamanho em px já limitado a `min`/`max`. |
522
+
523
+ ### Ref
524
+ `React.forwardRef<HTMLDivElement>` — o `ref` aponta para o elemento do painel (Confirmado).
525
+
526
+ ### Tipos auxiliares exportados
527
+ `SgExpandablePanelDirection = "left" | "right" | "top" | "bottom"` · `SgExpandablePanelPlacement = "start" | "center" | "end"` · `SgExpandablePanelMode = "inline" | "overlay"` · `SgExpandablePanelSize = { min?: number | string; max?: number | string; default?: number | string }` · `SgExpandablePanelAnimation = { type?: "slide" | "fade" | "none"; durationMs?: number }` · `SgExpandablePanelElevation = "none" | "sm" | "md" | "lg"` · `SgExpandablePanelRounded = "none" | "md" | "lg" | "xl"` · `SgExpandablePanelRole = "dialog" | "region"`.
528
+
529
+ ### Children, slots e composição
530
+ Slots `handle` (topo), `header`, `children` (corpo), `footer`. `size.min` padrão efetivo `180`px (x) / `140`px (y); `max` sem limite. Em overlay, o backdrop é renderizado se `showBackdrop` **ou** `closeOnOutsideClick` (fica transparente sem `showBackdrop`).
531
+
532
+ ### Contexto, providers e hooks
533
+ `useComponentsI18n` (rótulo padrão `components.expandablePanel.ariaLabel`).
534
+
535
+ ### Acessibilidade (Confirmado)
536
+ - `role` = `dialog` em overlay / `region` inline (ou a prop `role`); `aria-modal` em overlay; `aria-label` sempre presente.
537
+ - Overlay: foco vai para o 1º focável ao abrir e volta ao elemento anterior ao fechar; **Tab/Shift+Tab** circulam dentro do painel com `trapFocus`; **Esc** fecha com `closeOnEsc`; `document.body.style.overflow = "hidden"` enquanto aberto.
538
+ - A alça de resize é `aria-hidden` e só funciona com ponteiro (sem teclado).
539
+
540
+ ---
541
+
542
+ ## SgCarousel
543
+
544
+ Carrossel horizontal/vertical de `items`, com vários visíveis, rolagem em passos, modo circular, autoplay (pausa no hover), navegadores e indicadores. Fonte: `src/layout/SgCarousel.tsx` → `SgCarousel`.
545
+
546
+ ### Import
547
+ ```tsx
548
+ import { SgCarousel, type SgCarouselProps, type SgCarouselOrientation } from "@seedgrid/fe-components";
549
+ ```
550
+
551
+ ### Props
552
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
553
+ |---|---|---|---|---|
554
+ | `id` | `string` | — | Não | Unique identifier for the carousel |
555
+ | `items` | `React.ReactNode[]` | — | Sim | Items to display in the carousel |
556
+ | `numVisible` | `number` | `1` | Não | Number of items to display at once |
557
+ | `numScroll` | `number` | `1` | Não | Number of items to scroll at a time |
558
+ | `orientation` | `SgCarouselOrientation` = `"horizontal" \| "vertical"` | `"horizontal"` | Não | Orientation of the carousel |
559
+ | `circular` | `boolean` | `true` | Não | Enable circular mode (infinite loop) |
560
+ | `autoPlay` | `boolean` | `false` | Não | Enable auto play |
561
+ | `autoPlayInterval` | `number` | `3000` | Não | Auto play interval in milliseconds |
562
+ | `showNavigators` | `boolean` | `true` | Não | Show navigation buttons |
563
+ | `showIndicators` | `boolean` | `true` | Não | Show indicators (dots) |
564
+ | `className` | `string` | `""` | Não | Custom class name for container |
565
+ | `itemClassName` | `string` | `""` | Não | Custom class name for items |
566
+ | `width` | `number \| string` | `"100%"` | Não | Width of the carousel container |
567
+ | `height` | `number \| string` | — | Não | Height of the carousel container |
568
+ | `gap` | `number` | `16` | Não | Gap between items in pixels |
569
+ | `onIndexChange` | `(index: number) => void` | — | Não | Callback when active index changes |
570
+ | `style` | `React.CSSProperties` | — | Não | Custom inline style for container |
571
+ | `customNavigators` | `{ prev?: React.ReactNode; next?: React.ReactNode; }` | — | Não | Custom render for navigation buttons |
572
+
573
+ ### Eventos e callbacks
574
+ `onIndexChange(index: number)` — disparado em efeito depois que o índice ativo (índice do 1º item visível) muda por navegação, indicador ou autoplay (Confirmado). Não há prop para controlar o índice externamente.
575
+
576
+ ### Ref
577
+ Não aceita `ref`.
578
+
579
+ ### Children, slots e composição
580
+ Conteúdo via `items: React.ReactNode[]` (não usa `children`). `customNavigators.prev/next` substituem o conteúdo dos botões de navegação. `numVisible`/`numScroll` < 1 são tratados como 1.
581
+
582
+ ### Contexto, providers e hooks
583
+ `useComponentsI18n` (rótulo dos indicadores).
584
+
585
+ ### Acessibilidade
586
+ - Indicadores têm `aria-label` traduzido (`components.carousel.goToSlide`, ex.: "slide 2") — Confirmado (teste em `tests/buttons-menus.test.mjs`).
587
+ - Botões anterior/próximo **não** têm `aria-label` (só ícone) e não há suporte a teclado próprio nem pausa do autoplay por foco — lacuna (Confirmado pela ausência no código).
588
+
589
+ ---
590
+
591
+ ## SgBreadcrumb
592
+
593
+ Trilha de navegação com separadores, ícone de início, colapso de itens excedentes (menu `<details>`) ou rolagem horizontal. Fonte: `src/layout/SgBreadcrumb.tsx` → `SgBreadcrumb`.
594
+
595
+ ### Import
596
+ ```tsx
597
+ import { SgBreadcrumb, type SgBreadcrumbProps, type SgBreadcrumbItem, type SgBreadcrumbSeparator } from "@seedgrid/fe-components";
598
+ ```
599
+
600
+ ### Props
601
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
602
+ |---|---|---|---|---|
603
+ | `items` | `SgBreadcrumbItem[]` | — | Sim | Lista ordenada de niveis do caminho de navegacao. |
604
+ | `separator` | `SgBreadcrumbSeparator \| React.ReactNode` | `"chevron"` | Não | Separador visual entre os niveis. |
605
+ | `maxItems` | `number` | — | Não | Quantidade maxima de itens visiveis antes do colapso. |
606
+ | `overflowBehavior` | `"collapse" \| "scroll"` | `"collapse"` | Não | Comportamento quando o caminho excede o espaco disponivel. |
607
+ | `showHomeIcon` | `boolean` | `false` | Não | Adiciona um item inicial com icone de home. |
608
+ | `homeHref` | `string` | `"/"` | Não | Automatic Home item configuration. |
609
+ | `homeLabel` | `React.ReactNode` | `"Home"` | Não | Automatic Home item configuration. |
610
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | Não | Visual size of items. |
611
+ | `variant` | `"default" \| "subtle" \| "primary"` | `"default"` | Não | Variante visual do breadcrumb. |
612
+ | `ariaLabel` | `string` | `?? t(i18n, "components.breadcrumb.ariaLabel")` ᶠ | Não | Accessible label for navigation. |
613
+ | `overflowLabel` | `string` | `?? t(i18n, "components.breadcrumb.overflow")` ᶠ | Não | Label for the overflow button. |
614
+ | `onNavigate` | `(item: SgBreadcrumbItem, index: number) => void` | — | Não | Callback disparado ao navegar por um item. |
615
+ | `className` | `string` | — | Não | Layout and style customization. |
616
+ | `itemClassName` | `string` | — | Não | Layout and style customization. |
617
+ | `style` | `React.CSSProperties` | — | Não | Layout and style customization. |
618
+
619
+ ### Eventos e callbacks
620
+ `onNavigate(item, index)` — disparado ao clicar num item com `href` (como `<a>`, após `item.onClick`) ou com `onClick` (como `<button>`); não impede a navegação do link. O item de início gerado por `showHomeIcon` é reportado com `index = -1` (Confirmado). O último item nunca é clicável (é a página atual).
621
+
622
+ ### Ref
623
+ Não aceita `ref`.
624
+
625
+ ### Tipos auxiliares exportados
626
+ `SgBreadcrumbItem`: `id: string` (obrigatório), `label: React.ReactNode` (obrigatório), `href?: string`, `icon?: React.ReactNode`, `disabled?: boolean`, `hidden?: boolean` (filtrado antes de renderizar), `onClick?: () => void`.
627
+ `SgBreadcrumbSeparator = "slash" | "chevron" | "dot" | "arrow"`; `separator` também aceita um elemento React.
628
+
629
+ ### Children, slots e composição
630
+ Colapso (`overflowBehavior="collapse"` + `maxItems >= 2`): mantém o 1º item e os `maxItems - 2` últimos; os do meio vão para um menu "…" (`<details>`). Com `maxItems = 2`, mostra só o primeiro e o último (sem menu).
631
+
632
+ ### Contexto, providers e hooks
633
+ `useComponentsI18n` (`components.breadcrumb.ariaLabel`, `components.breadcrumb.overflow`).
634
+
635
+ ### Acessibilidade (Confirmado)
636
+ `<nav aria-label>` com `<ol>`; separadores `aria-hidden`; último item com `aria-current="page"`; o botão de overflow (`<summary>`) tem `aria-label`.
637
+
638
+ ---
639
+
640
+ ## SgMenu
641
+
642
+ Menu de navegação hierárquico: sidebar (recolhível, com persistência), drawer (overlay), inline ou híbrido; variantes painel (árvore), em camadas e mega menu; busca integrada, marca, bloco de usuário, pin e encaixe em `SgDockLayout`. Fonte: `src/layout/SgMenu.tsx` → `SgMenu` (lógica pura em `src/layout/menu-logic.ts`).
643
+
644
+ ### Import
645
+ ```tsx
646
+ import {
647
+ SgMenu,
648
+ type SgMenuProps, type SgMenuStyle, type SgMenuNode, type SgMenuSelection, type SgMenuBrand, type SgMenuUser
649
+ } from "@seedgrid/fe-components";
650
+ ```
651
+
652
+ ### Props
653
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
654
+ |---|---|---|---|---|
655
+ | `id` | `string` | `?? 'sg-menu-${autoId.replace(/[:]/g, "")}'` ᶠ | Não | Stable menu identifier (recommended for dockable persistence). |
656
+ | `menu` | `SgMenuNode[]` | — | Sim | Arvore de itens e subitens do menu. |
657
+ | `selection` | `SgMenuSelection` | — | Não | Selecao ativa por id ou url. |
658
+ | `brand` | `SgMenuBrand` | — | Não | Bloco de marca no topo do menu. |
659
+ | `user` | `SgMenuUser` | — | Não | Bloco de usuario exibido no menu. |
660
+ | `userMenu` | `SgMenuNode[]` | — | Não | Actions shown in the user menu. |
661
+ | `menuStyle` | `"sidebar" \| "drawer" \| "inline" \| "hybrid"` | `"sidebar"` | Não | Modo estrutural do menu. |
662
+ | `menuVariantStyle` | `SgMenuStyle` = `"panel" \| "tiered" \| "mega-horizontal" \| "mega-vertical" \| "PanelMenu" \| "Tiered" \| "MegaMenuHorizontal" \| "MegaMenuVertical"` | `"panel"` | Não | Variante visual e comportamental do menu. |
663
+ | `position` | `"left" \| "right"` | `"left"` | Não | Horizontal menu position. |
664
+ | `density` | `"compact" \| "comfortable"` | `"comfortable"` | Não | Visual density of rows and icons. |
665
+ | `indent` | `number` | `16` | Não | Indent per depth level. |
666
+ | `collapsedWidth` | `number \| string` | `72` | Não | Width when collapsed. |
667
+ | `expandedWidth` | `number \| string` | `280` | Não | Width when expanded. |
668
+ | `overlaySize` | `SgExpandablePanelSize` | `?? { default: menuStyle === "drawer" ? 320 : expandedWidth, min: 240, max: 520 }` ᶠ | Não | Overlay size in drawer/hybrid modes. |
669
+ | `overlayBackdrop` | `boolean` | `?? (menuStyle === "drawer")` ᶠ | Não | Controls overlay backdrop. |
670
+ | `dockable` | `boolean` | `false` | Não | When true and inside SgDockLayout, the menu can be docked in zones. |
671
+ | `dockZone` | `SgDockZoneId` = `"top" \| "right" \| "bottom" \| "left" \| "free"` | `?? resolveDockZoneFromOrientationDirection(orientationDirection)` ᶠ | Não | Initial zone in dockable mode (if omitted, can be inferred from orientationDirection). |
672
+ | `draggable` | `boolean` | `false` | Não | In dockable mode, shows drag handle between dock zones. |
673
+ | `orientationDirection` | `SgMenuOrientationDirection` = `"horizontal-left" \| "horizontal-right" \| "vertical-up" \| "vertical-top" \| "vertical-down"` | — | Não | Optional direction used as fallback to infer initial dockZone. |
674
+ | `mode` | `"accordion" \| "multiple"` | `"multiple"` | Não | Group expansion strategy. |
675
+ | `expandedIds` | `string[]` | — | Não | External control of expanded groups. |
676
+ | `defaultExpandedIds` | `string[]` | `[]` | Não | Initial state of expanded groups. |
677
+ | `onExpandedIdsChange` | `(ids: string[]) => void` | — | Não | Callback when expanded groups change. |
678
+ | `collapsed` | `boolean` | — | Não | Controla o estado colapsado do menu. |
679
+ | `defaultCollapsed` | `boolean` | `false` | Não | Initial collapsed state. |
680
+ | `onCollapsedChange` | `(value: boolean) => void` | — | Não | Callback when collapsing/expanding. |
681
+ | `showCollapseButton` | `boolean` | `false` | Não | Shows collapse button in the header. |
682
+ | `open` | `boolean` | — | Não | External control of drawer/overlay open state. |
683
+ | `defaultOpen` | `boolean` | `false` | Não | Initial open state in drawer/overlay. |
684
+ | `onOpenChange` | `(value: boolean) => void` | — | Não | Callback when opening/closing overlay. |
685
+ | `closeOnNavigate` | `boolean` | `?? true` ᶠ | Não | Closes drawer after navigation. |
686
+ | `pinned` | `boolean` | — | Não | External control of pinned state. |
687
+ | `defaultPinned` | `boolean` | `false` | Não | Initial pinned state. |
688
+ | `onPinnedChange` | `(value: boolean) => void` | — | Não | Callback when pinning/unpinning. |
689
+ | `showPinButton` | `boolean` | `false` | Não | Shows pin button in the header. |
690
+ | `onNavigate` | `(node: SgMenuNode) => void` | — | Não | Callback disparado na navegacao por um item. |
691
+ | `onAction` | `(node: SgMenuNode) => void` | — | Não | Fired for action items. |
692
+ | `onItemClick` | `(node: SgMenuNode) => void` | — | Não | Fired on any item click. |
693
+ | `ariaLabel` | `string` | `?? t(i18n, "components.menu.ariaLabel")` ᶠ | Não | Accessibility label for nav. |
694
+ | `keyboardNavigation` | `boolean` | `true` | Não | Enables keyboard navigation. |
695
+ | `openSubmenuOnHover` | `boolean` | `false` | Não | In tiered style, opens submenu on hover when true; default opens on click. |
696
+ | `search` | `{ enabled: boolean; placeholder?: string }` | — (busca desligada: `search?.enabled ?? false`) | Não | Configuracao opcional de busca integrada. |
697
+ | `elevation` | `"none" \| "sm" \| "md"` | `"none"` | Não | Container elevation/shadow. |
698
+ | `border` | `boolean` | `true` | Não | Shows external menu border. |
699
+ | `className` | `string` | — | Não | Additional CSS classes on root. |
700
+ | `style` | `React.CSSProperties` | — | Não | Inline styles on root. |
701
+ | `userSectionClassName` | `string` | — | Não | Additional CSS classes in the user section (menu footer area). |
702
+ | `userSectionStyle` | `React.CSSProperties` | — | Não | Inline styles in the user section, useful to customize background color. |
703
+ | `footer` | `React.ReactNode` | — | Não | Menu footer content. |
704
+
705
+ ### Eventos e callbacks
706
+ Ao ativar um item (clique, Enter/Espaço ou seleção na busca) — `activateNode`, Confirmado:
707
+ 1. `onItemClick(node)` sempre (itens não `disabled`);
708
+ 2. se o item tem `url`: `onNavigate(node)` se informado; **senão o menu executa `window.location.assign(url)`**;
709
+ 3. se o item tem `onClick`: chama `node.onClick()` e depois `onAction(node)`;
710
+ 4. em `drawer`/`hybrid`, com `url`, `closeOnNavigate` e não fixado (`pinned`), fecha o overlay.
711
+
712
+ Demais: `onExpandedIdsChange(ids)` (expansão de grupos; `mode="accordion"` mantém só um ramo por nível), `onCollapsedChange(value)`, `onOpenChange(value)` (drawer/hybrid), `onPinnedChange(value)`.
713
+
714
+ ### Ref
715
+ Não aceita `ref`.
716
+
717
+ ### Tipos auxiliares exportados
718
+ - `SgMenuNode`: `id: string`, `label: string`, `hint?: string` (tooltip), `url?: string`, `children?: SgMenuNode[]`, `disabled?: boolean`, `icon?: React.ReactNode`, `badge?: string | number`, `onClick?: () => void`.
719
+ - `SgMenuSelection`: `activeId?: string`, `activeUrl?: string` (item ativo por id ou pela primeira ocorrência da URL).
720
+ - `SgMenuBrand`: `title?: string`, `imageSrc?: string`, `image?: React.ReactNode`, `onClick?: () => void`.
721
+ - `SgMenuUser`: `name: string`, `subtitle?: string`, `avatarSrc?: string`, `avatar?: React.ReactNode`, `onClick?: () => void`.
722
+ - `SgMenuStyle` (valores de `menuVariantStyle`): `"panel" | "tiered" | "mega-horizontal" | "mega-vertical"` e os aliases equivalentes `"PanelMenu" | "Tiered" | "MegaMenuHorizontal" | "MegaMenuVertical"` (normalizados por `normalizeMenuStyle`).
723
+ - `SgMenuOrientationDirection` (tipo de `orientationDirection`) **não** é exportado pelo barrel; mapeia para zona inicial: `horizontal-left`→`top`, `horizontal-right`→`bottom`, `vertical-up`/`vertical-top`→`left`, `vertical-down`→`right`, padrão `left`.
724
+
725
+ ### Children, slots e composição
726
+ - Sem `children`: estrutura vem de `menu`, `brand`, `user`, `userMenu` (renderizados como itens) e `footer`.
727
+ - `menuStyle`: `sidebar` (recolhível; largura `collapsedWidth`/`expandedWidth`), `drawer` (usa `SgExpandablePanel` em overlay, `role="dialog"`), `inline`, `hybrid` (rail recolhido + overlay; aberto quando `pinned`).
728
+ - Busca (`search.enabled`) usa `SgAutocomplete` internamente.
729
+ - Bloco de usuário usa `SgAvatar` e `SgCard`.
730
+ - **Persistência do colapso**: com `id` e `collapsed` não controlado, o estado é salvo em `sg-menu:<id>:collapsed` (via `useSgPersistence` se houver `SgEnvironmentProvider`, senão `localStorage`) — Confirmado.
731
+ - **Docking**: com `dockable`, dentro de `SgDockLayout`, e `menuStyle` diferente de `drawer`/`hybrid`, o menu é renderizado por portal na zona atribuída (`dockZone` ou derivada de `orientationDirection`); `draggable` mostra a alça para mover entre zonas.
732
+
733
+ ### Contexto, providers e hooks
734
+ Consome `useSgDockLayout` (interno), `useHasSgEnvironmentProvider`/`useSgPersistence` e `useComponentsI18n`.
735
+
736
+ ### Acessibilidade (Confirmado)
737
+ - Raiz `role="navigation"` com `aria-label` (padrão traduzido `components.menu.ariaLabel`; teste em `tests/buttons-menus.test.mjs`).
738
+ - Itens: `aria-current="page"` no item ativo, `aria-disabled`; botões de expandir com `aria-label` traduzido; botões de pin/arraste com `aria-label`.
739
+ - Teclado (`keyboardNavigation`, via `resolveMenuKeyboardAction`): **↓/↑** movem o foco; **→** abre o ramo ou entra no 1º filho; **←** fecha o ramo ou sobe ao pai; **Enter/Espaço** alternam ramos sem destino ou ativam o item (testes em `tests/menu-logic.test.mjs`).
740
+ - Drawer/hybrid usam `role="dialog"`.
741
+
742
+ ---
743
+
744
+ ## SgTreeView
745
+
746
+ Árvore com expansão, busca, checkboxes em cascata (com estado indeterminado), modo de confirmação, trilhas de colunas extras e API imperativa via ref. Fonte: `src/layout/SgTreeView.tsx` → `SgTreeView`, `sgTreeFromJson`, `sgTreeFromJsonWithChecked`.
747
+
748
+ ### Import
749
+ ```tsx
750
+ import {
751
+ SgTreeView, sgTreeFromJson, sgTreeFromJsonWithChecked,
752
+ type SgTreeViewProps, type SgTreeViewRef, type SgTreeNode, type SgTreeNodeJson,
753
+ type SgTreeIconRegistry, type SgTreeConfirmBar, type SgSize, type SgDensity, type SgTone
754
+ } from "@seedgrid/fe-components";
755
+ ```
756
+
757
+ ### Props
758
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
759
+ |---|---|---|---|---|
760
+ | `nodes` | `SgTreeNode[]` | — | Sim | Lista hierarquica de nos exibidos pela arvore. |
761
+ | `className` | `string` | — | Não | Aulas extras sem container. |
762
+ | `style` | `React.CSSProperties` | — | Não | Inline style adicional no container. |
763
+ | `size` | `SgSize` = `"sm" \| "md" \| "lg"` | `"md"` | Não | Escala visual da arvore e dos itens. |
764
+ | `density` | `SgDensity` = `"compact" \| "comfortable" \| "normal"` | `"normal"` | Não | Ajustes visuais do componente. |
765
+ | `tone` | `SgTone` = `"default" \| "muted"` | `"default"` | Não | Ajustes visuais do componente. |
766
+ | `iconTone` | `"default" \| "primary"` | `"default"` | Não | Ajustes visuais do componente. |
767
+ | `checkable` | `boolean` | `false` | Não | Comportamento de seleção com checkboxes. |
768
+ | `checkMode` | `"live" \| "confirm"` | `"live"` | Não | Comportamento de seleção com checkboxes. |
769
+ | `confirmSelection` | `"all" \| "leafOnly"` | `"leafOnly"` | Não | Comportamento de seleção com checkboxes. |
770
+ | `checkedIds` | `string[]` | — (não controlado quando omitido) | Não | Nos marcados em cenarios de checkbox tree. |
771
+ | `defaultCheckedIds` | `string[]` | `?? []` ᶠ | Não | Estado de seleção. |
772
+ | `onCheckedChange` | `(ids: string[]) => void` | — | Não | Estado de seleção. |
773
+ | `checkableLabel` | `string` | — | Não | Cabecalho da coluna do checkbox principal -- so' e' desenhado quando `tracks` tambem esta' presente (e' o cabecalho de colunas como um todo que fica ambiguo com 2+ controles por linha, nao o checkbox sozinho). |
774
+ | `tracks` | `SgTreeTrack[]` | — | Não | Trilhas de selecao extras, uma por coluna de controle na linha -- ver SgTreeTrack. |
775
+ | `expandedIds` | `string[]` | — (não controlado quando omitido) | Não | Estado de expansão. |
776
+ | `defaultExpandedIds` | `string[]` | `?? []` ᶠ | Não | Estado de expansão. |
777
+ | `onExpandedChange` | `(ids: string[]) => void` | — | Não | Estado de expansão. |
778
+ | `onExpand` | `(node: SgTreeNode) => void` | — | Não | Eventos de interação. |
779
+ | `onCollapse` | `(node: SgTreeNode) => void` | — | Não | Eventos de interação. |
780
+ | `onLeafClick` | `(id: string) => void` | — | Não | Eventos de interação. |
781
+ | `branchLabelBehavior` | `"toggle" \| "none"` | `"toggle"` | Não | Clique no rótulo de um nó com filhos: `"toggle"` expande/recolhe; `"none"` não faz nada (só o caret alterna). *(Inferência)* |
782
+ | `searchable` | `boolean` | `false` | Não | Habilita campo interno de busca para filtrar nos. |
783
+ | `searchPlaceholder` | `string` | `?? '${t(i18n, "components.actions.search")}...'` ᶠ | Não | Busca e filtro da árvore. |
784
+ | `searchValue` | `string` | — (não controlado quando omitido) | Não | Busca e filtro da árvore. |
785
+ | `defaultSearchValue` | `string` | `?? ""` ᶠ | Não | Texto de busca inicial (não controlado). *(Inferência)* |
786
+ | `onSearchChange` | `(v: string) => void` | — | Não | Chamado a cada alteração do texto de busca. *(Inferência)* |
787
+ | `expandMatchesOnSearch` | `boolean` | `true` | Não | Durante a busca, expande automaticamente os ancestrais dos nós encontrados. *(Inferência)* |
788
+ | `confirmBar` | `SgTreeConfirmBar` | `?? false` ᶠ | Não | Configurações complementares da interface. |
789
+ | `emptyText` | `string` | `?? t(i18n, "components.tree.empty")` ᶠ | Não | Configurações complementares da interface. |
790
+ | `maxHeightClassName` | `string` | `"max-h-[60vh]"` | Não | Configurações complementares da interface. |
791
+
792
+ - Aceita `ref` (via `React.forwardRef`) e `key`.
793
+
794
+ ### Eventos e callbacks
795
+ | Callback | Assinatura | Quando dispara (Confirmado) |
796
+ |---|---|---|
797
+ | `onCheckedChange` | `(ids: string[]) => void` | Mudança de marcação no modo `live` (cascata pai→filhos aplicada). |
798
+ | `onExpandedChange` | `(ids: string[]) => void` | Expandir/recolher, `expandAll`/`collapseAll`, expansão automática da busca. |
799
+ | `onExpand` / `onCollapse` | `(node: SgTreeNode) => void` | Ao expandir/recolher um nó pelo usuário. |
800
+ | `onLeafClick` | `(id: string) => void` | Clique no rótulo de um nó **sem filhos** (não `disabled`). |
801
+ | `onSearchChange` | `(v: string) => void` | Digitação na busca (`searchable`). |
802
+ | `confirmBar.onConfirm` | `(selectedIds: string[]) => void` | Botão confirmar (só com `checkable` + `checkMode="confirm"` + `confirmBar`); envia folhas (`confirmSelection="leafOnly"`) ou todos (`"all"`). |
803
+ | `confirmBar.onCancel` | `() => void` | Botão cancelar (`showCancel`). |
804
+
805
+ ### Ref — `SgTreeViewRef` (forwardRef, `useImperativeHandle`, Confirmado)
806
+ | Método | Retorno | Efeito |
807
+ |---|---|---|
808
+ | `getCheckedIds()` | `string[]` | Ids marcados (pendentes, no modo `confirm`). |
809
+ | `getCheckedLeafIds()` | `string[]` | Só as folhas marcadas. |
810
+ | `setCheckedIds(ids)` | `void` | Define a marcação. |
811
+ | `getExpandedIds()` | `string[]` | Ids expandidos. |
812
+ | `setExpandedIds(ids)` | `void` | Define a expansão. |
813
+ | `expandAll()` / `collapseAll()` | `void` | Expande/recolhe tudo. |
814
+ | `clearChecked()` | `void` | Limpa a marcação. |
815
+
816
+ ### Tipos auxiliares
817
+ - `SgTreeNode`: `id: string`, `label: string`, `icon?: React.ReactNode`, `children?: SgTreeNode[]`, `disabled?: boolean`, `meta?: unknown`.
818
+ - `SgTreeNodeJson`: igual, mas `icon?: string` (chave do registro) e `checked?: boolean`.
819
+ - `SgTreeIconRegistry = Record<string, React.ReactNode>`.
820
+ - `SgTreeConfirmBar = false | { label?: string; hint?: string; showCancel?: boolean; cancelLabel?: string; sticky?: boolean; disabledWhenEmpty?: boolean; resetAfterConfirm?: boolean; onConfirm: (selectedIds: string[]) => void; onCancel?: () => void }` — `disabledWhenEmpty` vale `true` salvo `false` explícito; `resetAfterConfirm` limpa a marcação após confirmar.
821
+ - `SgSize = "sm" | "md" | "lg"` · `SgDensity = "compact" | "normal" | "comfortable"` · `SgTone = "default" | "muted"`.
822
+ - **Trilhas (`tracks`)** — o tipo `SgTreeTrack` e variantes **não são exportados pelo barrel** (só existem em `SgTreeView.tsx`): base `{ id: string; label?: string; width?: string /* padrão 110px */ }` +
823
+ - `SgTreeTrackBoolean`: `kind: "boolean"`, `checkedIds: string[]`, `onCheckedChange(ids)`, `disabled?(node)`, `ariaLabel?`, `adornment?(node)`;
824
+ - `SgTreeTrackEnum`: `kind: "enum"`, `options: { value; label }[]`, `valueByNodeId: Record<string, string | undefined>`, `onChange(next)`, `disabled?(node)`, `ariaLabel?`, `placeholder?`, `mixedLabel?`, `adornment?(node)`;
825
+ - `SgTreeTrackCustom`: `kind: "custom"`, `render(node)`.
826
+ As trilhas `boolean`/`enum` são controladas de fora e têm cascata própria pai→filhos.
827
+
828
+ ### Funções exportadas
829
+ - `sgTreeFromJson(json: SgTreeNodeJson[], iconRegistry?: SgTreeIconRegistry): SgTreeNode[]` — converte JSON (ícone por chave do registro).
830
+ - `sgTreeFromJsonWithChecked(json, iconRegistry?): { nodes: SgTreeNode[]; checkedIds: string[] }` — idem e coleta `checked: true`, incluindo todos os descendentes de ramos marcados.
831
+
832
+ ### Children, slots e composição
833
+ Sem `children`. A área de rolagem usa `maxHeightClassName` (padrão `max-h-[60vh]`). `checkableLabel` só aparece quando há `tracks` (cabeçalho de colunas).
834
+
835
+ ### Contexto, providers e hooks
836
+ `useComponentsI18n` (placeholder de busca, texto vazio, rótulos de expandir/recolher/limpar — teste em `tests/buttons-menus.test.mjs`).
837
+
838
+ ### Acessibilidade
839
+ Botões de expandir com `aria-label` traduzido; checkboxes nativos com estado `indeterminate`; trilhas usam `ariaLabel`. **Não** há `role="tree"`/`treeitem` nem navegação por setas (Confirmado pela ausência no código).
840
+
841
+ ---
842
+
843
+ ## SgDockLayout
844
+
845
+ Provedor de layout com zonas de encaixe (`top`, `bottom`, `left`, `right`, `free`) para `SgToolBar`/`SgMenu`, com estado (zona, ordem, colapso) persistido. Fonte: `src/layout/SgDockLayout.tsx` → `SgDockLayout`.
846
+
847
+ ### Import
848
+ ```tsx
849
+ import { SgDockLayout, type SgDockLayoutProps, type SgDockLayoutState, type SgDockToolbarState, type SgDockZoneId } from "@seedgrid/fe-components";
850
+ ```
851
+
852
+ ### Props
853
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
854
+ |---|---|---|---|---|
855
+ | `id` | `string` | — | Sim | Identificador do layout usado para persistencia e coordenacao interna. |
856
+ | `className` | `string` | — | Não | Classes adicionais do container raiz. |
857
+ | `style` | `React.CSSProperties` | — | Não | Inline style adicional do container. |
858
+ | `children` | `React.ReactNode` | — | Sim | Zonas, toolbars e conteudo estrutural do layout. |
859
+ | `defaultState` | `SgDockLayoutState` | `?? EMPTY_STATE` ᶠ | Não | Estado inicial das toolbars e zonas do layout. |
860
+
861
+ ### Eventos e callbacks
862
+ Nenhum callback público; mudanças de zona/ordem/colapso vão direto para o estado persistido.
863
+
864
+ ### Ref
865
+ Não aceita `ref`.
866
+
867
+ ### Tipos auxiliares exportados
868
+ - `SgDockZoneId = "top" | "bottom" | "left" | "right" | "free"`.
869
+ - `SgDockToolbarState = { id: string; zone: SgDockZoneId; collapsed?: boolean; orientation?: "horizontal" | "vertical"; order?: number }`.
870
+ - `SgDockLayoutState = { version: 1; toolbars: Record<string, SgDockToolbarState> }`.
871
+
872
+ ### Children, slots e composição
873
+ Renderiza `<div className style>{children}</div>` dentro do contexto. Os filhos esperados são `SgDockZone` (registram seu elemento) e, dentro delas, `SgToolBar`/`SgMenu` (registram-se via `ensureToolbar`). O layout visual (grade) é responsabilidade do `className` do chamador — ver `SgDockScreen` para a grade pronta.
874
+
875
+ ### Contexto, providers e hooks
876
+ - Fornece um contexto interno (`DockContext`), lido por `useSgDockLayout()` — **hook não exportado pelo barrel** (uso interno de `SgDockZone`, `SgToolBar`, `SgMenu`).
877
+ - Persistência: `useSgPersistentState({ baseKey: "dock-layout:<id>", defaultValue: defaultState ?? { version: 1, toolbars: {} } })` — ver [[SeedGrid/SeedGrid-components/providers/API|providers › useSgPersistentState]] (Confirmado). Toolbars novas só são registradas após hidratação.
878
+
879
+ ### Acessibilidade
880
+ Sem ARIA próprio.
881
+
882
+ ---
883
+
884
+ ## SgDockZone
885
+
886
+ Região nomeada de um `SgDockLayout`. Fonte: `src/layout/SgDockZone.tsx` → `SgDockZone`.
887
+
888
+ ### Import
889
+ ```tsx
890
+ import { SgDockZone, type SgDockZoneProps } from "@seedgrid/fe-components";
891
+ ```
892
+
893
+ ### Props
894
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
895
+ |---|---|---|---|---|
896
+ | `zone` | `SgDockZoneId` = `"top" \| "right" \| "bottom" \| "left" \| "free"` | — | Sim | Identificador da zona dentro do dock layout. |
897
+ | `className` | `string` | — (sem classe, aplica layout padrão por zona) | Não | Classes adicionais da zona. |
898
+ | `style` | `React.CSSProperties` | — | Não | Inline style adicional do container. |
899
+ | `children` | `React.ReactNode` | — | Não | Conteudo renderizado dentro da zona. |
900
+
901
+ ### Eventos e callbacks
902
+ Nenhum.
903
+
904
+ ### Ref
905
+ Não aceita `ref`.
906
+
907
+ ### Children, slots e composição
908
+ - Registra o próprio `<div data-sg-dock-zone=<zone>>` no layout (`registerZone`). Fora de `SgDockLayout` apenas renderiza o `div`.
909
+ - Sem `className`, aplica posicionamento de grade padrão por zona: `top` `col-span-3 row-start-1`, `bottom` `col-span-3 row-start-3`, `left` `col-start-1 row-start-2`, `right` `col-start-3 row-start-2`, `free` `col-start-2 row-start-2` (pressupõe grade 3×3, como a do `SgDockScreen`). Com `className`, nada disso é aplicado.
910
+ - Durante o arraste de uma toolbar, mostra pré-visualização tracejada e slots de inserção (`><`); fora das zonas laterais/topo mostra o texto traduzido `components.dock.dropHere`.
911
+
912
+ ### Acessibilidade
913
+ Indicadores de soltura são `aria-hidden`; arrastar é só por ponteiro.
914
+
915
+ ---
916
+
917
+ ## SgDockScreen
918
+
919
+ Atalho: `SgScreen` + `SgDockLayout` com grade 3×3 pronta (`grid-cols-[12rem_1fr_12rem] grid-rows-[auto_1fr_auto]`). Fonte: `src/layout/SgDockScreen.tsx` → `SgDockScreen`.
920
+
921
+ ### Import
922
+ ```tsx
923
+ import { SgDockScreen, type SgDockScreenProps } from "@seedgrid/fe-components";
924
+ ```
925
+
926
+ ### Props
927
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
928
+ |---|---|---|---|---|
929
+ | `width` | `number \| string` | — | Não | Dimensoes da tela base. |
930
+ | `height` | `number \| string` | — | Não | Dimensoes da tela base. |
931
+ | `padding` | `number \| string` | — ᵇ | Não | Preenchimento interno do SgScreen. |
932
+ | `fullscreen` | `boolean` | `true` ᵇ | Não | Quando ativo, a screen ocupa a viewport inteira. |
933
+ | `id` | `string` | — | Sim | Identificador do dock layout interno. |
934
+ | `screenId` | `string` | — | Não | ID opcional do elemento raiz de screen. |
935
+ | `defaultState` | `SgDockLayoutState` | — | Não | Estado inicial das toolbars e zonas internas. |
936
+ | `layoutClassName` | `string` | — | Não | Classes adicionais aplicadas ao SgDockLayout interno, somadas à grade padrão `grid-cols-[12rem_1fr_12rem] grid-rows-[auto_1fr_auto]`. |
937
+ | `children` | `React.ReactNode` | — | Não | Zonas e conteudo estrutural do dock screen. |
938
+
939
+ - Props declaradas em `SgScreenProps` (contrato reutilizado): `width`, `height`, `padding`, `fullscreen`.
940
+ - **Atributos DOM herdados**: o tipo é `Omit<SgScreenProps, "children" \| "id"> & { ... }`; acrescenta 276 props de `@types/react` (`HTMLAttributes` 54, `AriaAttributes` 53, `DOMAttributes` 169). Não listadas individualmente — ver contrato base `React.HTMLAttributes` em `@types/react`.
941
+
942
+ ### Eventos e callbacks / Ref
943
+ Nenhum callback próprio; não aceita `ref`. As demais props (inclusive atributos DOM) vão para o `SgScreen` (`{...screenProps}`); `screenId` vira o `id` do `SgScreen`, e `id` vai para o `SgDockLayout` (chave de persistência `dock-layout:<id>`).
944
+
945
+ ### Children, slots e composição
946
+ Filhos esperados: `SgDockZone` (sem `className`, para aproveitar o posicionamento padrão na grade).
947
+
948
+ ### Acessibilidade
949
+ Sem ARIA próprio.
950
+
951
+ ---
952
+
953
+ ## SgToolBar
954
+
955
+ Barra de ferramentas colapsável, com orientação/direção, arraste entre zonas de um `SgDockLayout` (ou arraste livre com posição persistida). Fonte: `src/layout/SgToolBar.tsx` → `SgToolBar`, `SgToolbarIconButton` (lógica pura em `toolbar-logic.ts` e `drag-position.ts`).
956
+
957
+ ### Import
958
+ ```tsx
959
+ import {
960
+ SgToolBar, SgToolbarIconButton,
961
+ type SgToolBarProps, type SgToolBarOrientation, type SgToolBarOrientationDirection,
962
+ type SgToolBarSeverity, type SgToolBarSize, type SgToolbarIconButtonProps
963
+ } from "@seedgrid/fe-components";
964
+ ```
965
+
966
+ ### Props — `SgToolBar`
967
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
968
+ |---|---|---|---|---|
969
+ | `id` | `string` | — | Sim | Identificador estavel da toolbar. |
970
+ | `title` | `React.ReactNode` | — | Não | Titulo opcional exibido na barra. |
971
+ | `orientationDirection` | `SgToolBarOrientationDirection` = `"horizontal-left" \| "horizontal-right" \| "vertical-up" \| "vertical-down"` | `?? "vertical-down"` ᶠ | Não | Direcao e orientacao da toolbar. |
972
+ | `buttonsPerDirection` | `number` | — | Não | Quantidade de botoes distribuidos por direcao. |
973
+ | `bgColorTitle` | `string` | — | Não | Cor de fundo (CSS) da barra de título/colapso. *(Inferência)* |
974
+ | `bgColor` | `string` | — | Não | Cor de fundo (CSS) do contêiner da toolbar. *(Inferência)* |
975
+ | `size` | `SgToolBarSize` | — | Não | Largura (`w`) e altura (`h`) aplicadas ao estilo do contêiner. *(Inferência)* |
976
+ | `className` | `string` | — | Não | Classes adicionais do contêiner raiz da toolbar. *(Inferência)* |
977
+ | `style` | `React.CSSProperties` | — | Não | Estilo inline do contêiner raiz (aplicado por último, sobrescreve posição/cores calculadas). *(Inferência)* |
978
+ | `dockZone` | `"top" \| "bottom" \| "left" \| "right" \| "free"` | `?? "free"` ᶠ | Não | Zona de encaixe da toolbar. |
979
+ | `draggable` | `boolean` | `false` | Não | Permite arrastar a toolbar. |
980
+ | `freeDrag` | `boolean` | `false` | Não | Com `draggable`, arrasta livremente (posição absoluta/fixa) em vez de reposicionar entre zonas do dock; a posição é persistida na chave `sg-toolbar-pos:<id>`. *(Inferência)* |
981
+ | `defaultPosition` | `{ x: number; y: number }` | — | Não | Posição inicial `{x, y}` usada no modo `freeDrag` (ignorada sem `freeDrag`). *(Inferência)* |
982
+ | `collapsible` | `boolean` | `true` | Não | Permite recolher a toolbar. |
983
+ | `collapsed` | `boolean` | — (dentro de `SgDockLayout`, usa o estado persistido do layout) | Não | Estado recolhido controlado. *(Inferência)* |
984
+ | `defaultCollapsed` | `boolean` | `false` | Não | Estado recolhido inicial (não controlado); também semeia o estado do toolbar no `SgDockLayout`. *(Inferência)* |
985
+ | `onCollapsedChange` | `(collapsed: boolean) => void` | — | Não | Chamado ao alternar o colapso com o novo valor. *(Inferência)* |
986
+ | `children` | `React.ReactNode` | — | Não | Botoes e elementos de acao da toolbar. |
987
+
988
+ ### Props — `SgToolbarIconButton`
989
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
990
+ |---|---|---|---|---|
991
+ | `icon` | `React.ReactNode \| string` | — | Não | Icone principal exibido no botao. |
992
+ | `label` | `string` | — | Não | Rotulo textual da acao. |
993
+ | `showLabel` | `boolean` | `true` | Não | Exibe o rotulo junto do icone quando suportado pela toolbar. |
994
+ | `hint` | `string` | — | Não | Texto auxiliar usado como dica contextual. |
995
+ | `loading` | `boolean` | `false` | Não | Indica processamento em andamento. |
996
+ | `severity` | `SgToolBarSeverity` = `"primary" \| "secondary" \| "success" \| "info" \| "warning" \| "help" \| "danger" \| "plain"` | `"plain"` | Não | Tom visual do botao de toolbar. |
997
+ | `disabled` | `boolean` | — | Não | Desabilita interacao. |
998
+ | `onClick` | `() => void \| Promise<void>` | — | Não | Callback executado ao clicar no item. |
999
+ | `className` | `string` | — | Não | Classes adicionais do botão. *(Inferência)* |
1000
+ | `style` | `React.CSSProperties` | — | Não | Estilo inline do botão. *(Inferência)* |
1001
+ | `hideLabel` | `boolean` | — | Não | Oculta o rótulo visível e o tooltip de `hint`. Não faz parte de `SgToolbarIconButtonProps`: vem da interseção `& { hideLabel?: boolean }` na assinatura do componente. *(Inferência)* |
1002
+
1003
+ - Tipo de props declarado inline na assinatura de `SgToolbarIconButton` (não há tipo `SgToolbarIconButtonProps` exportado).
1004
+
1005
+ ### Eventos e callbacks
1006
+ - `SgToolBar.onCollapsedChange(collapsed)` — ao clicar no botão de colapso; dentro de dock também grava `collapsed` no estado do layout (Confirmado).
1007
+ - `SgToolbarIconButton.onClick(): void | Promise<void>` — se retornar Promise, o botão fica em loading (`aria-busy`) até ela terminar; cliques são ignorados com `disabled` ou em loading (Confirmado).
1008
+
1009
+ ### Ref
1010
+ Nenhum dos dois aceita `ref`.
1011
+
1012
+ ### Tipos auxiliares exportados
1013
+ `SgToolBarOrientation = "horizontal" | "vertical"` · `SgToolBarOrientationDirection = "vertical-up" | "vertical-down" | "horizontal-left" | "horizontal-right"` · `SgToolBarSeverity = "primary" | "secondary" | "success" | "info" | "warning" | "help" | "danger" | "plain"` · `SgToolBarSize = { w?: number; h?: number }`.
1014
+
1015
+ ### Children, slots e composição
1016
+ - `children` (normalmente `SgToolbarIconButton`) ficam no contêiner de conteúdo; `buttonsPerDirection > 0` troca o flex por grade com N botões por linha (horizontal) ou por coluna (vertical).
1017
+ - `SgToolbarIconButton` lê a orientação da toolbar por um contexto interno (posição do tooltip de `hint`, renderizado por portal). `icon` string é exibido como texto.
1018
+ - **Dentro de `SgDockLayout`**: a toolbar se registra (`ensureToolbar`) e é renderizada por portal no elemento da zona atribuída (persistida) ou `dockZone`; em zonas `top`/`bottom` a orientação é forçada para horizontal e em `left`/`right` para vertical (`resolveToolbarDockOrientationDirection`). Com `draggable` (sem `freeDrag`) pode ser solta em outra zona/posição.
1019
+ - **`freeDrag`**: arraste livre; posição salva em `sg-toolbar-pos:<id>` (via `useSgPersistence` com `SgEnvironmentProvider`, senão `localStorage`). Teste DOM em `tests/buttons-menus-dom.test.mjs`.
1020
+ - Atenção (Confirmado em `toolbar-logic.ts`): `"horizontal-right"` resolve para `direction: "left"` (conteúdo abre à esquerda do título) e `"horizontal-left"` para `direction: "right"`.
1021
+
1022
+ ### Contexto, providers e hooks
1023
+ Consome `useSgDockLayout` (interno), `useHasSgEnvironmentProvider`/`useSgPersistence`, `useComponentsI18n`.
1024
+
1025
+ ### Acessibilidade (Confirmado)
1026
+ Botão de colapso com `aria-label` traduzido (`components.toolbar.toggle`; teste em `tests/buttons-menus.test.mjs`); `SgToolbarIconButton` com `aria-label = hint ?? label ?? (ícone texto)` e `aria-busy` em loading. Não há `role="toolbar"` nem navegação por setas entre botões.
1027
+
1028
+ ---
1029
+
1030
+ ## Funções utilitárias exportadas
1031
+
1032
+ Funções puras exportadas pelo barrel (usadas internamente pelos componentes e cobertas por testes). Assinaturas obtidas pelo TS checker.
1033
+
1034
+ ### `src/layout/drag-position.ts`
1035
+ | Função | Assinatura | O que faz |
1036
+ |---|---|---|
1037
+ | `parseStoredPanelDragPosition` | `(raw: unknown) => { x: number; y: number } \| null` | Aceita objeto ou string JSON; retorna `{x,y}` se ambos forem números finitos. |
1038
+ | `buildToolbarStorageKey` | `(id: string) => string` | `sg-toolbar-pos:<id>`. |
1039
+ | `buildDockMenuStorageKey` | `(dragId?: string \| null, isAbsolutePosition?: boolean) => string \| null` | `sg-dockmenu-pos:<dragId>:parent\|viewport`; `null` sem `dragId` (usado pelo SgDockMenu — ver [[SeedGrid/SeedGrid-components/navegacao-e-overlay/API\|navegação e overlay]]). |
1040
+
1041
+ ### `src/layout/toolbar-logic.ts`
1042
+ | Função | Assinatura completa |
1043
+ |---|---|
1044
+ | `resolveToolbarOrientationDirection` | `(orientationDirection: SgToolBarOrientationDirection) => { orientation: SgToolBarOrientation; direction: "left" \| "right" \| "up" \| "down"; }` |
1045
+ | `resolveToolbarDockOrientationDirection` | `(orientationDirection: SgToolBarOrientationDirection, inDock: boolean, zone: "left" \| "right" \| "top" \| "bottom" \| "free") => SgToolBarOrientationDirection` |
1046
+ | `buildToolbarLayoutState` | `(args: { orientationDirection: SgToolBarOrientationDirection; inDock: boolean; zone: "left" \| "right" \| "top" \| "bottom" \| "free"; freeDrag: boolean; dragHoverZone: SgDockZoneId \| null; effectiveZone: "left" \| "right" \| "top" \| "bottom" \| "free"; showContent: boolean; }) => { zoneForOrientation: "left" \| "right" \| "top" \| "bottom" \| "free"; resolvedOrientationDirection: SgToolBarOrientationDirection; orientation: SgToolBarOrientation; direction: "left" \| "right" \| "up" \| "down"; openUp: boolean; openLeft: boolean; showLeadingCollapseButton: boolean; collapseIconDirection: "left" \| "right" \| "up" \| "down"; }` |
1047
+
1048
+ ### `src/layout/menu-logic.ts`
1049
+ Tipos exportados pelo barrel: `MenuLogicNode = { id: string; label?: string; children?: MenuLogicNode[]; url?: string; onClick?: () => void }`, `MenuVisibleNode<T> = { node: T; depth: number; parentId?: string }`, `MenuKeyboardAction = { type: "focus" \| "toggle" \| "activate"; id: string } \| { type: "noop" }`. Outros tipos usados nas assinaturas (`MenuMaps`, `MenuActiveSets`, `MenuSearchEntry`, `MenuAutocompleteItem`, `MenuHintPlacement`) existem só no arquivo (não exportados pelo barrel). Formas: `MenuMaps<T> = { parentById: Map<string, string>; nodeById: Map<string, T>; childrenByParent: Map<string, string[]>; firstByUrl: Map<string, string> }`; `MenuActiveSets = { exact: Set<string>; branch: Set<string> }`; `MenuSearchEntry = { id: string; label: string; path: string; group: string }`; `MenuAutocompleteItem = { id: string; label: string; value: string; group: string; data: { nodeId: string; path: string } }`; `MenuHintPlacement = "top" | "right"`.
1050
+
1051
+ | Função | Assinatura completa |
1052
+ |---|---|
1053
+ | `buildMenuMaps` | `<T extends MenuLogicNode>(menu: T[], rootParentId?: string) => MenuMaps<T>` |
1054
+ | `collectParentChain` | `(parentById: Map<string, string>, id: string, rootParentId?: string) => string[]` |
1055
+ | `computeActiveSets` | `<T extends MenuLogicNode>(nodes: T[], activeId: string \| undefined, activeUrl: string \| undefined) => MenuActiveSets` |
1056
+ | `resolveEffectiveActiveId` | `(args: { activeId?: string \| undefined; activeUrl?: string \| undefined; localActiveId?: string \| undefined; firstByUrl: Map<string, string>; }) => string \| undefined` |
1057
+ | `mergeExpandedIdsForActivePath` | `(currentIds: string[], parentChain: string[]) => string[]` |
1058
+ | `resolveTieredActiveState` | `<T extends MenuLogicNode>(args: { effectiveActiveId?: string \| undefined; maps: MenuMaps<T>; menu: T[]; rootParentId?: string \| undefined; }) => { tieredPath: string[]; megaActiveId?: string \| undefined; }` |
1059
+ | `resolveMenuLayoutState` | `(args: { dockMode: boolean; effectiveDockZone: string \| null; orientationDirection?: "horizontal-left" \| "horizontal-right" \| "vertical-up" \| "vertical-top" \| "vertical-down" \| undefined; position: "left" \| "right"; horizontalDockAlign: "left" \| "right" \| null; isCollapsed: boolean; menuStyle: "sidebar" \| "drawer" \| "inline" \| "hybrid"; effectiveMenuStyle: "panel" \| "tiered" \| "mega-horizontal" \| "mega-vertical"; pinnedState: boolean; expandedWidthCss: string; collapsedWidthCss: string; }) => { resolvedPosition: "left" \| "right"; isHorizontalDockZone: boolean; isVerticalDockZone: boolean; tieredOpenToLeft: boolean; isMegaMenuStyle: boolean; dockAlign: "start" \| "end" \| null; sidebarWidthCss: string; }` |
1060
+ | `resolveMenuNodeActionIntent` | `(args: { variant: "panel" \| "flat"; hasChildren: boolean; hasActionTarget: boolean; isCollapsed?: boolean \| undefined; }) => "toggle" \| "activate" \| "noop"` |
1061
+ | `resolveExpandedIdsToggle` | `(args: { currentIds: string[]; nodeId: string; mode: "accordion" \| "multiple"; parentById: Map<string, string>; childrenByParent: Map<string, string[]>; rootParentId?: string \| undefined; }) => string[]` |
1062
+ | `resolveMenuHintPosition` | `(args: { isConnected: boolean; rect: { left: number; right: number; top: number; width: number; height: number; }; placement: MenuHintPlacement; }) => { x: number; y: number; } \| null` |
1063
+ | `resolveHorizontalDockAlign` | `(clientX: number, zoneRect: { left: number; width: number; }) => "left" \| "right"` |
1064
+ | `resolveTieredHoverPath` | `(currentPath: string[], depth: number, nodeId: string, hasChildren: boolean) => string[]` |
1065
+ | `resolveTieredHoverIntent` | `(args: { currentPath: string[]; depth: number; nodeId: string; hasChildren: boolean; openSubmenuOnHover: boolean; }) => string[] \| undefined` |
1066
+ | `resolveTieredClickState` | `(currentPath: string[], depth: number, nodeId: string) => { nextPath: string[]; isOpenAtDepth: boolean; }` |
1067
+ | `resolveMenuSearchSelectionState` | `(args: { currentExpandedIds: string[]; parentChain: string[]; rootToParent: string[]; nodeId: string; hasChildren: boolean; hasActionTarget: boolean; }) => { expandedIds: string[]; tieredPath: string[]; megaActiveId?: string \| undefined; localActiveId?: string \| undefined; shouldActivateNode: boolean; }` |
1068
+ | `resolveTieredNodeClickIntent` | `(args: { currentPath: string[]; depth: number; nodeId: string; hasChildren: boolean; hasActionTarget: boolean; }) => { nextPath: string[]; shouldActivateNode: boolean; isOpenAtDepth: boolean; }` |
1069
+ | `resolveMegaMenuActiveNode` | `<T extends MenuLogicNode>(items: T[], megaActiveId?: string \| undefined) => T \| undefined` |
1070
+ | `resolveMegaMenuInteraction` | `(args: { nodeId: string; hasChildren: boolean; }) => { nextMegaActiveId?: string \| undefined; shouldActivateNode: boolean; }` |
1071
+ | `resolveMegaMenuHoverActiveId` | `(args: { nodeId: string; hasChildren: boolean; }) => string \| undefined` |
1072
+ | `resolveMenuAutocompleteItems` | `(searchEntries: MenuSearchEntry[], query: string, limit?: number) => MenuAutocompleteItem[]` |
1073
+ | `filterMenuNodes` | `<T extends MenuLogicNode>(nodes: T[], query: string) => T[]` |
1074
+ | `collectMenuSearchEntries` | `<T extends MenuLogicNode>(nodes: T[], trail?: string[], out?: MenuSearchEntry[]) => MenuSearchEntry[]` |
1075
+ | `flattenVisibleNodes` | `<T extends MenuLogicNode>(nodes: T[], expandedSet: Set<string>, collapsed: boolean, forceExpand: boolean, depth?: number, parentId?: string, out?: MenuVisibleNode<T>[]) => MenuVisibleNode<T>[]` |
1076
+ | `resolveMenuKeyboardAction` | `(args: { key: string; visibleNodes: MenuVisibleNode<MenuLogicNode>[]; focusedId?: string \| undefined; expandedIds: Set<string>; hasSearch: boolean; isCollapsed: boolean; parentById: Map<string, string>; rootParentId: string; }) => MenuKeyboardAction` |
1077
+
1078
+ Comportamentos verificados em `tests/menu-logic.test.mjs` (ex.: `filterMenuNodes` mantém ramos/ancestrais que casam e devolve a mesma referência para consulta vazia; `resolveMenuKeyboardAction` vira no-op em ramos recolhidos/busca).
1079
+
1080
+ ---
1081
+
1082
+ ## Itens internos (não exportados)
1083
+
1084
+ | Item | Onde | Observação |
1085
+ |---|---|---|
1086
+ | `sgDocking.tsx` (`renderDockContent`, `cn`, `toCssSpace`, `toCssPercent`, `getDefaultContent*`, tipos `SgDock*`) | `src/layout/sgDocking.tsx` | Motor de docking de `SgPanel`/`SgScreen`. |
1087
+ | `useSgDockLayout`, `SgDockDropIndicator` | `src/layout/SgDockLayout.tsx` | Contexto do dock (exportados só do arquivo). |
1088
+ | `SgTreeTrack*` | `src/layout/SgTreeView.tsx` | Tipos da prop `tracks`, não exportados pelo barrel. |
1089
+ | `SgMenuOrientationDirection` | `src/layout/SgMenu.tsx` | Tipo de `SgMenu.orientationDirection`, não exportado pelo barrel. |
1090
+ | `SgPanelContentDirection/Justify/Align` | `src/layout/SgPanel.tsx` | Não exportados pelo barrel. |