@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,490 @@
1
+ ---
2
+ tags: [seedgrid, front, component, feedback-e-exibicao]
3
+ fonte: front/seedgrid-fe-components/packages/seedgrid-fe-components/src/commons
4
+ branch: main
5
+ commit: ad30fc11de
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # API — feedback e exibição (`src/commons`)
10
+
11
+ Visão geral: [[SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral|Feedback e exibição — visão geral]] · Exemplos: [[SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos|Exemplos de feedback e exibição]]
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 componentes são `"use client"`. Textos padrão vêm do i18n interno (`useComponentsI18n` / `getComponentsI18n`) — ver [[SeedGrid/SeedGrid-components/fundamentos/API|API › i18n]].
16
+
17
+ ## SgAvatar
18
+
19
+ Avatar com imagem, ícone, iniciais ou fallback. Fonte: `front/seedgrid-fe-components/packages/seedgrid-fe-components/src/commons/SgAvatar.tsx` → `SgAvatar` (`React.forwardRef`).
20
+
21
+ ### Import
22
+
23
+ ```tsx
24
+ import {
25
+ SgAvatar, SgAvatarGroup,
26
+ type SgAvatarProps, type SgAvatarGroupProps, type SgAvatarSeverity, type SgAvatarShape,
27
+ type SgAvatarSize, type SgAvatarCustomColors, type SgAvatarGroupOverlap
28
+ } from "@seedgrid/fe-components";
29
+ ```
30
+
31
+ ### Props
32
+
33
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
34
+ |---|---|---|---|---|
35
+ | `src` | `string` | — | Não | URL da imagem principal do avatar. |
36
+ | `alt` | `string` | `?? t(i18n, "components.avatar.defaultAlt")` ᶠ | Não | Texto alternativo da imagem do avatar. |
37
+ | `label` | `React.ReactNode` | — | Não | Conteudo textual usado como iniciais ou identificacao visual. |
38
+ | `icon` | `React.ReactNode` | — | Não | Conteúdo visual do avatar. |
39
+ | `fallback` | `React.ReactNode` | — | Não | Conteudo de fallback quando nao ha imagem. |
40
+ | `size` | `SgAvatarSize` = `"sm" \| "md" \| "lg" \| "xs" \| "xl"` | `"md"` | Não | Escala visual do avatar. |
41
+ | `shape` | `SgAvatarShape` = `"square" \| "circle"` | `"circle"` | Não | Forma visual do avatar. |
42
+ | `severity` | `SgAvatarSeverity` = `"primary" \| "secondary" \| "success" \| "info" \| "warning" \| "danger" \| "neutral" \| "custom"` | `"primary"` | Não | Tom visual do avatar quando nao ha imagem. |
43
+ | `bordered` | `boolean` | `true` | Não | Borda e estado desabilitado. |
44
+ | `disabled` | `boolean` | `false` | Não | Borda e estado desabilitado. |
45
+ | `customColors` | `SgAvatarCustomColors` | — | Não | Substituições de cores quando necessário. |
46
+ | `imageClassName` | `string` | — | Não | Classes CSS para imagem e container. |
47
+ | `children` | `React.ReactNode` | — | Não | Conteúdo visual do avatar. |
48
+ | `onImageError` | `(event: React.SyntheticEvent<HTMLImageElement, Event>) => void` | — | Não | Callback para falha ao carregar imagem. |
49
+
50
+ - **Atributos DOM herdados**: o tipo é `Omit<React.HTMLAttributes<HTMLSpanElement>, "children" \| "color"> & { ... }`; acrescenta 276 props de `@types/react` (`HTMLAttributes` 54, `AriaAttributes` 53, `DOMAttributes` 169). Não listadas individualmente — ver contrato base `React.HTMLAttributes` em `@types/react`.
51
+ - Aceita `ref` (via `React.forwardRef`) e `key`.
52
+ - Atributos herdados tratados explicitamente: `onClick` (ignorado quando `disabled`), `role`, `tabIndex`, `title`, `style`, `aria-label`; o restante vai para o `<span>` raiz via `{...rest}` (Confirmado).
53
+
54
+ ### Eventos e callbacks
55
+
56
+ - `onImageError(event)` — erro de carga da `<img>`; o avatar passa a mostrar ícone/label/fallback. O estado de erro é reiniciado quando `src` muda.
57
+ - `onClick` (herdado) — se presente (ou `role="button"`/`tabIndex` numérico), o avatar ganha estilo interativo com anel de foco.
58
+
59
+ ### Ref
60
+
61
+ `React.forwardRef<HTMLSpanElement, SgAvatarProps>` → `<span>` raiz.
62
+
63
+ ### Children, slots e composição
64
+
65
+ Ordem de prioridade do conteúdo (Confirmado): `children` > imagem (`src`, se não falhou) > `icon` > `label` (normalizado em até 2 iniciais maiúsculas) > `fallback` > `"?"`.
66
+
67
+ ### Contexto, providers e hooks
68
+
69
+ `useComponentsI18n()` para o `alt` padrão (`components.avatar.defaultAlt`).
70
+
71
+ ### Acessibilidade
72
+
73
+ - `aria-label` = prop `aria-label` ?? `label` (se string) ?? `alt` resolvido (Confirmado; testado em `tests/commons.test.mjs`).
74
+ - `<img>` com `alt` (padrão traduzido) e `loading="lazy"`.
75
+ - Não há `role` padrão; para avatar clicável informe `role="button"` e `tabIndex={0}` — o componente não trata teclado (Confirmado: sem `onKeyDown`).
76
+
77
+ ### Tipos auxiliares exportados
78
+
79
+ `SgAvatarCustomColors`: `bg?`, `fg?`, `border?`, `ring?` (todas `string`, viram variáveis `--sg-avatar-*`). `SgAvatarSeverity`, `SgAvatarShape`, `SgAvatarSize`: valores na tabela.
80
+
81
+ ## SgAvatarGroup
82
+
83
+ Agrupa avatares sobrepostos com contador de excedentes. Fonte: `src/commons/SgAvatar.tsx` → `SgAvatarGroup` (`React.forwardRef`).
84
+
85
+ ### Props
86
+
87
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
88
+ |---|---|---|---|---|
89
+ | `children` | `React.ReactNode` | — | Sim | Lista de avatares exibidos no agrupamento. |
90
+ | `max` | `number` | — | Não | Quantidade maxima de avatares visiveis antes do contador de overflow. |
91
+ | `total` | `number` | `?? avatars.length` ᶠ | Não | Quantidade total de participantes para calculo do overflow (usa o maior entre `total` e o nº de filhos). |
92
+ | `overlap` | `SgAvatarGroupOverlap` = `"sm" \| "md" \| "lg" \| "none"` | `"md"` | Não | Nivel de sobreposicao entre os avatares. |
93
+ | `moreSeverity` | `SgAvatarSeverity` = `"primary" \| "secondary" \| "success" \| "info" \| "warning" \| "danger" \| "neutral" \| "custom"` | `"neutral"` | Não | Severidade do avatar contador `+N` de excedentes. *(Inferência)* |
94
+ | `moreLabel` | `(remaining: number) => React.ReactNode` | `+N` ᶠ | Não | Função que gera o conteúdo do avatar de excedentes a partir da quantidade oculta. |
95
+ | `size` | `SgAvatarSize` = `"sm" \| "md" \| "lg" \| "xs" \| "xl"` | `"md"` | Não | Tamanho do avatar contador `+N`. Não é propagado aos filhos — defina `size` em cada `SgAvatar`. *(Inferência)* |
96
+ | `shape` | `SgAvatarShape` = `"square" \| "circle"` | `"circle"` | Não | Forma do avatar contador `+N` (não propagada aos filhos). *(Inferência)* |
97
+ | `bordered` | `boolean` | `true` | Não | Borda do avatar contador `+N` (não propagada aos filhos). *(Inferência)* |
98
+
99
+ - **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`.
100
+ - Aceita `ref` (via `React.forwardRef`) e `key`.
101
+
102
+ ### Eventos e callbacks
103
+
104
+ Nenhum próprio; eventos DOM herdados vão para o `<div>` raiz via `{...rest}`.
105
+
106
+ ### Ref
107
+
108
+ `React.forwardRef<HTMLDivElement, SgAvatarGroupProps>` → `<div>` raiz.
109
+
110
+ ### Children, slots e composição
111
+
112
+ - `children` (obrigatório): normalmente `SgAvatar`. Exibe os primeiros `max` (inteiro > 0); os ocultos = `max(total ?? nº filhos, nº filhos) − visíveis`.
113
+ - O contador é um `SgAvatar` com `label` `+N` (ou `moreLabel(N)`), `moreSeverity`, `size`, `shape`, `bordered`. Essas três últimas **não** são propagadas aos filhos (Confirmado).
114
+ - `overlap` aplica margem negativa (`none`, `sm`, `md`, `lg`) a partir do 2º item.
115
+
116
+ ### Acessibilidade
117
+
118
+ Sem role de grupo; cada `SgAvatar` mantém seu `aria-label`.
119
+
120
+ `SgAvatarGroupOverlap`: valores na tabela.
121
+
122
+ ## SgBadge
123
+
124
+ Indicador/etiqueta com severidade, variantes, contador, ponto, ícones e remoção. Fonte: `src/commons/SgBadge.tsx` → `SgBadge` (função, sem forwardRef).
125
+
126
+ ### Import
127
+
128
+ ```tsx
129
+ import {
130
+ SgBadge,
131
+ type SgBadgeProps, type SgBadgeSeverity, type SgBadgeVariant, type SgBadgeSize,
132
+ type SgBadgeCustomColors, type SgBadgePartsClassName
133
+ } from "@seedgrid/fe-components";
134
+ ```
135
+
136
+ ### Props
137
+
138
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
139
+ |---|---|---|---|---|
140
+ | `value` | `React.ReactNode` | — | Não | Conteudo principal exibido dentro do badge. |
141
+ | `severity` | `SgBadgeSeverity` = `"primary" \| "secondary" \| "success" \| "info" \| "warning" \| "danger" \| "neutral" \| "custom"` | `"primary"` | Não | Tom semantico do indicador. |
142
+ | `badgeStyle` | `SgBadgeVariant` = `"solid" \| "outline" \| "ghost" \| "soft"` | `"solid"` | Não | Variante visual do badge. |
143
+ | `size` | `SgBadgeSize` = `"sm" \| "md" \| "lg" \| "xs"` | `"md"` | Não | Escala visual do badge. |
144
+ | `rounded` | `boolean` | `true` | Não | Formato pílula (`rounded-full`) ou cantos `rounded-md`. |
145
+ | `dot` | `boolean` | `false` | Não | Exibe um pequeno marcador visual adicional. |
146
+ | `pulse` | `boolean` | `false` | Não | Animação de pulso (somente com `dot`). |
147
+ | `max` | `number` | — | Não | Para `value` numérico: acima de `max` exibe `max+` (ex.: `99+`). *(Inferência)* |
148
+ | `showZero` | `boolean` | `true` | Não | Para `value` numérico `0`: se `false`, o badge não é renderizado (salvo ícones/removable). |
149
+ | `leftIcon` | `React.ReactNode` | — | Não | Ícones opcionais. |
150
+ | `rightIcon` | `React.ReactNode` | — | Não | Ícones opcionais. |
151
+ | `removable` | `boolean` | `false` | Não | Permite remover o badge com um botao interno. |
152
+ | `onRemove` | `() => void` | — | Não | Callback disparado ao remover o badge. |
153
+ | `removeAriaLabel` | `string` | texto i18n `components.badge.remove` ᶠ | Não | `aria-label` do botão interno de remover. *(Inferência)* |
154
+ | `autoRemove` | `boolean` | `false` | Não | Comportamento de remoção. |
155
+ | `onClick` | `(e: React.MouseEvent) => void` | — | Não | Callback de clique; quando informado o badge é renderizado como `<button>`. |
156
+ | `disabled` | `boolean` | — | Não | Desabilita o badge clicável (só tem efeito quando `onClick` é informado). |
157
+ | `title` | `string` | — | Não | Atributo `title` do badge (usado se `hint` não for informado). |
158
+ | `hint` | `string` | `?? title` ᶠ | Não | Texto de dica (atributo `title`); tem prioridade sobre `title`. |
159
+ | `customColors` | `SgBadgeCustomColors` | — | Não | Customização visual avançada. |
160
+ | `className` | `string` | — | Não | Customização visual avançada. |
161
+ | `style` | `React.CSSProperties` | — | Não | Customização visual avançada. |
162
+ | `partsClassName` | `SgBadgePartsClassName` | — | Não | Customização visual avançada. |
163
+ | `aria-label` | `string` | — | Não | Repassado ao elemento raiz (via `...aria`). *(Inferência)* |
164
+ - Tipo fechado (sem herança de atributos DOM); props não listadas acima são repassadas só se chegarem pelo resto `...aria` (na prática, `aria-label`).
165
+
166
+ ### Eventos e callbacks
167
+
168
+ - `onClick(e: React.MouseEvent)` — torna o badge um `<button type="button">`; ignorado com `disabled`.
169
+ - `onRemove()` — clique no botão interno `x` (com `stopPropagation`). Com `autoRemove`, o badge se oculta sozinho após o callback; sem ele, o pai deve removê-lo.
170
+
171
+ ### Ref
172
+
173
+ Não aceita `ref`.
174
+
175
+ ### Children, slots e composição
176
+
177
+ Sem `children`; conteúdo via `value`, `leftIcon`, `rightIcon`. Regras (Confirmado):
178
+ - `dot` renderiza só um ponto (com `pulse` opcional) e ignora `value`/ícones.
179
+ - `value` numérico: `> max` → `` `${max}+` ``; `0` com `showZero={false}` → oculto.
180
+ - Sem valor, ícones nem `removable`, não renderiza nada.
181
+ - `partsClassName` aplica classes em `container`, `label`, `removeButton`, `dot`.
182
+
183
+ ### Contexto, providers e hooks
184
+
185
+ `useComponentsI18n()` para `removeAriaLabel` padrão (`components.badge.remove`).
186
+
187
+ ### Acessibilidade
188
+
189
+ - Não clicável: `role="status"` no `<span>`. Clicável: `<button>` nativo.
190
+ - Botão remover: `aria-label` traduzido ou `removeAriaLabel` (Confirmado; testado em `tests/commons.test.mjs`).
191
+ - `hint ?? title` vira o atributo `title`.
192
+
193
+ ### Tipos auxiliares exportados
194
+
195
+ `SgBadgeCustomColors` (todas `string?`, viram `--sg-badge-*`): `bg`, `fg`, `border`, `softBg`, `softFg`, `hoverBg`, `hoverFg`, `hoverBorder`, `ring`.
196
+
197
+ `SgBadgePartsClassName`: `container?`, `label?`, `removeButton?`, `dot?` (`string`).
198
+
199
+ ## SgBadgeOverlay
200
+
201
+ Sobrepõe um badge a um elemento base. Fonte: `src/commons/SgBadgeOverlay.tsx` → `SgBadgeOverlay`.
202
+
203
+ ### Import
204
+
205
+ ```tsx
206
+ import { SgBadgeOverlay, type SgBadgeOverlayProps, type SgBadgeOverlayPlacement } from "@seedgrid/fe-components";
207
+ ```
208
+
209
+ ### Props
210
+
211
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
212
+ |---|---|---|---|---|
213
+ | `children` | `React.ReactNode` | — | Sim | Elemento base que recebera o badge sobreposto. |
214
+ | `badge` | `React.ReactNode` | — | Sim | Conteudo do indicador exibido sobre o elemento base. |
215
+ | `placement` | `SgBadgeOverlayPlacement` = `"top" \| "right" \| "bottom" \| "left" \| "top-left" \| "top-right" \| "bottom-left" \| "bottom-right"` | `"top-right"` | Não | Posicao do badge sobreposto. |
216
+ | `className` | `string` | — | Não | Classes CSS extras aplicadas ao wrapper `relative inline-flex`. *(Inferência)* |
217
+ | `style` | `React.CSSProperties` | — | Não | Inline style aplicado ao wrapper. |
218
+
219
+ ### Eventos, ref e composição
220
+
221
+ Sem callbacks e sem `ref`. Renderiza `<span class="relative inline-flex">{children}<span class="absolute …">{badge}</span></span>`; `badge` costuma ser um `SgBadge` (qualquer `ReactNode` serve). `placement` controla a posição por classes de translate.
222
+
223
+ ### Acessibilidade
224
+
225
+ Nenhum atributo próprio; depende do conteúdo de `children` e `badge`.
226
+
227
+ ## SgSkeleton
228
+
229
+ Placeholder de carregamento. Fonte: `src/commons/SgSkeleton.tsx` → `SgSkeleton`.
230
+
231
+ ### Import
232
+
233
+ ```tsx
234
+ import { SgSkeleton, type SgSkeletonProps, type SgSkeletonShape, type SgSkeletonAnimation } from "@seedgrid/fe-components";
235
+ ```
236
+
237
+ ### Props
238
+
239
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
240
+ |---|---|---|---|---|
241
+ | `width` | `number \| string` | `100%`, ou `2.5rem` para `square`/`circle` ᶠ | Não | Largura do placeholder. |
242
+ | `height` | `number \| string` | `1rem` (`text`), `2rem` (`rectangle`/`rounded`), `2.5rem` (`square`/`circle`) ᶠ | Não | Altura do placeholder. |
243
+ | `size` | `number \| string` | — | Não | Tamanho unico para placeholders quadrados ou circulares; quando informado substitui `width` e `height`. |
244
+ | `borderRadius` | `number \| string` | por `shape` ᶠ: `circle`/`text` `9999px`, `square` `0`, `rounded` `0.75rem`, `rectangle` `0.375rem` | Não | Raio de borda customizado (número = px). |
245
+ | `shape` | `SgSkeletonShape` = `"rounded" \| "square" \| "circle" \| "text" \| "rectangle"` | `"text"` | Não | Forma visual base do placeholder. |
246
+ | `animation` | `SgSkeletonAnimation` = `"none" \| "pulse" \| "wave"` | `"wave"` | Não | Animacao aplicada ao placeholder. |
247
+
248
+ - **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`.
249
+ - Números em `width`/`height`/`size`/`borderRadius` viram `px`. `style` é aplicado por último; demais atributos vão ao `<div>` via `{...rest}` (Confirmado).
250
+
251
+ ### Eventos, ref e composição
252
+
253
+ Sem callbacks próprios, sem `ref`, sem `children` (omitido do tipo). `animation="wave"` usa Web Animations API (`element.animate`, 1300 ms, infinito); `pulse` usa a classe `animate-pulse`.
254
+
255
+ ### Acessibilidade
256
+
257
+ A camada de onda tem `aria-hidden="true"`; o placeholder em si não declara `aria-busy`/`role` — sinalize o carregamento no container (Confirmado: sem atributos ARIA no `<div>`).
258
+
259
+ ## SgToaster
260
+
261
+ Pilha de toasts fixa na tela, alimentada pela API imperativa `toast`. Fonte: `src/commons/SgToaster.tsx` → `SgToaster`.
262
+
263
+ ### Import
264
+
265
+ ```tsx
266
+ import {
267
+ SgToaster, toast, dismissSgToast, subscribeSgToasts,
268
+ type SgToasterProps, type SgToasterPosition, type SgToasterTypeColors, type SgToasterCustomColors
269
+ } from "@seedgrid/fe-components";
270
+ ```
271
+
272
+ ### Props
273
+
274
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
275
+ |---|---|---|---|---|
276
+ | `position` | `SgToasterPosition` = `"top-left" \| "top-right" \| "bottom-left" \| "bottom-right" \| "top-center" \| "bottom-center"` | `"top-right"` | Não | Posicao global do stack de toasts. |
277
+ | `duration` | `number` | `4000` | Não | Duracao padrao dos toasts em milissegundos. |
278
+ | `visibleToasts` | `number` | `6` | Não | Quantidade maxima de toasts visiveis simultaneamente. |
279
+ | `closeButton` | `boolean` | `true` | Não | Exibe botao de fechar em cada toast. |
280
+ | `richColors` | `boolean` | `true` | Não | Ativa paleta visual rica por tipo de toast. |
281
+ | `transparency` | `number` | `0` | Não | Nivel de transparencia aplicado aos toasts. |
282
+ | `rounded` | `boolean` | `true` | Não | Arredonda os cantos de cada toast (rounded-md). Desligue para cantos retos. |
283
+ | `customColors` | `SgToasterCustomColors` | — | Não | Sobrescreve bg/fg/border por tipo. |
284
+
285
+ - **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`.
286
+ - `className`/`style` e demais atributos vão para o `<div>` container (`fixed z-[1100]`) via `{...rest}` (Confirmado).
287
+
288
+ ### Comportamento (Confirmado)
289
+
290
+ - Assina o store global (`subscribeSgToasts`) e mostra os **últimos** `visibleToasts` (≤ 0 → nenhum).
291
+ - Fechamento automático por toast: `toast.duration ?? duration`; `≤ 0` não expira; toasts `loading` nunca expiram.
292
+ - `closeButton` por toast sobrepõe a prop. Botão de `action` executa `onClick` e fecha o toast.
293
+ - `richColors` escolhe a paleta forte por tipo; `customColors[tipo]` sobrepõe `bg`/`fg`/`border`. `transparency` (0–100) vira `opacity = 1 − t/100`.
294
+ - Se existir qualquer `SgToastHost` montado, o `SgToaster` não renderiza nada (cede ao host).
295
+
296
+ ### Ref e composição
297
+
298
+ Sem `ref` e sem `children`. Monte um `SgToaster` (ou `SgToastHost`) uma vez na árvore e dispare com `toast(...)`.
299
+
300
+ ### Acessibilidade
301
+
302
+ Cada toast: `role="status"` + `aria-live="polite"`; botão fechar com `aria-label` traduzido (`components.toaster.close`). Sem foco automático nem atalho de teclado.
303
+
304
+ ### Tipos auxiliares exportados
305
+
306
+ - `SgToasterTypeColors`: `bg?`, `fg?`, `border?` (`string`).
307
+ - `SgToasterCustomColors`: `Partial<Record<SgToastType, SgToasterTypeColors>>`.
308
+
309
+ ## SgToastHost
310
+
311
+ Marca o ponto da árvore onde os toasts aparecem; resolve múltiplos hosts por pilha. Fonte: `src/commons/SgToastHost.tsx` → `SgToastHost`.
312
+
313
+ ### Import
314
+
315
+ ```tsx
316
+ import { SgToastHost, type SgToastHostProps } from "@seedgrid/fe-components";
317
+ ```
318
+
319
+ ### Props
320
+
321
+ `SgToastHostProps = SgToasterProps` — mesmas props do `SgToaster`, repassadas integralmente (`<SgToaster {...props} />`).
322
+
323
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
324
+ |---|---|---|---|---|
325
+ | `position` | `SgToasterPosition` = `"top-left" \| "top-right" \| "bottom-left" \| "bottom-right" \| "top-center" \| "bottom-center"` | `"top-right"` ᵇ | Não | Posicao dos toasts renderizados por este host. |
326
+ | `duration` | `number` | `4000` ᵇ | Não | Duracao padrao aplicada aos toasts deste host. |
327
+ | `visibleToasts` | `number` | `6` ᵇ | Não | Quantidade maxima de toasts visiveis. |
328
+ | `closeButton` | `boolean` | `true` ᵇ | Não | Exibe o botao de fechar em cada toast. |
329
+ | `richColors` | `boolean` | `true` ᵇ | Não | Usa uma paleta forte por severidade. |
330
+ | `transparency` | `number` | `0` ᵇ | Não | Nivel de transparencia aplicado aos toasts. |
331
+ | `rounded` | `boolean` | `true` ᵇ | Não | Arredonda os cantos de cada toast (rounded-md). Desligue para cantos retos. |
332
+ | `customColors` | `SgToasterCustomColors` | — | Não | Sobrescreve bg/fg/border por tipo. |
333
+
334
+ - Props declaradas em `SgToasterProps` (contrato reutilizado): `position`, `duration`, `visibleToasts`, `closeButton`, `richColors`, `transparency`, `rounded`, `customColors`.
335
+ - **Atributos DOM herdados**: o tipo é `SgToasterProps` (alias), que por sua vez é `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`.
336
+
337
+ ### Comportamento (Confirmado — JSDoc e código)
338
+
339
+ - Cada instância gera um id (`nextHostId()`) e se registra no `sgToastHostRegistry` ao montar; o host ativo é o **último montado**; ao desmontar, o anterior volta a ser ativo.
340
+ - Só o host ativo renderiza (um `SgToaster` dentro do contexto interno `SgToasterHostContext`, que pula a checagem de host). Começa inativo para evitar divergência de hidratação SSR.
341
+ - Com qualquer host presente, `SgToaster` "solto" deixa de renderizar.
342
+
343
+ Sem `ref`, sem `children`. Acessibilidade idêntica à do `SgToaster`.
344
+
345
+ ## SgWhistler
346
+
347
+ Lista de avisos ("whistles") **no fluxo do layout** (não é fixa), alimentada pela API `sgWhistle`. Fonte: `src/commons/SgWhistler.tsx` → `SgWhistler`.
348
+
349
+ ### Import
350
+
351
+ ```tsx
352
+ import { SgWhistler, sgWhistle, dismissSgWhistle, subscribeSgWhistles, type SgWhistlerProps } from "@seedgrid/fe-components";
353
+ ```
354
+
355
+ ### Props
356
+
357
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
358
+ |---|---|---|---|---|
359
+ | `max` | `number` | `4` | Não | Quantidade maxima de whistle items visiveis. |
360
+ | `newestOnTop` | `boolean` | `false` | Não | Inverte a ordem visual para mostrar os mais novos primeiro. |
361
+ | `gap` | `number` | `12` | Não | Espacamento entre os avisos renderizados. |
362
+ | `duration` | `number` | `4000` | Não | Duracao padrao, em milissegundos, dos whistles deste host. Cada whistle pode sobrescrever com `options.duration`, que tem PRIORIDADE. Use 0 (ou negativo) para que nada suma sozinho por padrao. Whistle `loading` nunca expira, qualquer que seja o valor. Espelha o `duration` do SgToaster/SgToastHost — mesmo default e mesma precedencia. Antes o valor era fixo no codigo e nao havia como mudar o padrao sem repetir `duration` em toda chamada de sgWhistle. |
363
+ | `rounded` | `boolean` | `true` | Não | Arredonda os cantos de cada whistle (rounded-lg). Desligue para cantos retos. |
364
+ | `customColors` | `Partial<Record<SgWhistleSeverity, SgWhistleColors>>` | — | Não | Sobrescreve as cores contextuais por severidade. |
365
+
366
+ - **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`.
367
+ - O tipo das cores `SgWhistleColors` (`{ bg: string; fg: string; border: string }`, todos obrigatórios) é **interno** (não exportado).
368
+ - `className`/`style` e demais atributos vão para o `<div class="flex flex-col">` via `{...rest}`; `gap` vira `style.gap`.
369
+
370
+ ### Comportamento (Confirmado)
371
+
372
+ - Mostra os últimos `max` whistles (≤ 0 → nenhum); `newestOnTop` inverte a ordem.
373
+ - Expiração: `whistle.duration ?? duration`; `≤ 0` não expira; `loading` nunca expira.
374
+ - `dismissible` (padrão `true` por whistle) mostra o botão fechar; `action` executa `onClick` e fecha.
375
+ - Conteúdo: `renderer` (de `sgWhistle.custom`) ou `title` + `message`; `icon` à esquerda. `borderStyle` (`solid` padrão, `soft`, `left-accent`, `full-accent`, `none`) e `opacity` (0–1) por whistle.
376
+ - Cede a vez a um `SgWhistleHost` montado (mesma lógica do toaster).
377
+
378
+ ### Acessibilidade
379
+
380
+ Cada whistle: `role="status"` + `aria-live="polite"`; botão fechar com `aria-label` traduzido (`components.whistler.close`).
381
+
382
+ ## SgWhistleHost
383
+
384
+ Equivalente ao `SgToastHost` para whistles. Fonte: `src/commons/SgWhistleHost.tsx` → `SgWhistleHost`. `SgWhistleHostProps = SgWhistlerProps` (repassadas a `<SgWhistler {...props} />`).
385
+
386
+ ```tsx
387
+ import { SgWhistleHost, type SgWhistleHostProps } from "@seedgrid/fe-components";
388
+ ```
389
+
390
+ | Prop | Tipo | Padrão | Obrigatória | Descrição |
391
+ |---|---|---|---|---|
392
+ | `max` | `number` | `4` ᵇ | Não | Quantidade maxima de whistle items visiveis neste host. |
393
+ | `newestOnTop` | `boolean` | `false` ᵇ | Não | Inverte a ordem visual para mostrar os mais novos primeiro. |
394
+ | `gap` | `number` | `12` ᵇ | Não | Espacamento entre os avisos renderizados. |
395
+ | `duration` | `number` | `4000` ᵇ | Não | Duracao padrao, em milissegundos, dos whistles deste host. Cada whistle pode sobrescrever com `options.duration`, que tem PRIORIDADE. Use 0 (ou negativo) para que nada suma sozinho por padrao. Whistle `loading` nunca expira, qualquer que seja o valor. Espelha o `duration` do SgToaster/SgToastHost — mesmo default e mesma precedencia. Antes o valor era fixo no codigo e nao havia como mudar o padrao sem repetir `duration` em toda chamada de sgWhistle. |
396
+ | `rounded` | `boolean` | `true` ᵇ | Não | Arredonda os cantos de cada whistle (rounded-lg). Desligue para cantos retos. |
397
+ | `customColors` | `Partial<Record<SgWhistleSeverity, SgWhistleColors>>` | — | Não | Sobrescreve as cores contextuais por severidade. |
398
+
399
+ - Props declaradas em `SgWhistlerProps` (contrato reutilizado): `max`, `newestOnTop`, `gap`, `duration`, `rounded`, `customColors`.
400
+ - **Atributos DOM herdados**: o tipo é `SgWhistlerProps` (alias), que por sua vez é `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`.
401
+
402
+ Registro em `src/commons/sgWhistleHostRegistry.ts` (funções `registerWhistleHost`, `unregisterWhistleHost`, `getActiveWhistleHostId`, `hasAnyWhistleHost`, `subscribeWhistleHostRegistry`, `nextWhistleHostId` — **internas**, não exportadas no barrel). Último host montado vence; renderiza dentro de `SgWhistlerHostContext` (interno). Testado em `tests/commons-dom.test.mjs`.
403
+
404
+ ## API imperativa de toasts (`src/commons/SgToast.ts`)
405
+
406
+ Store global em módulo (lista + listeners); funciona fora de componentes. Ids gerados: `sg-toast-<timestamp>-<n>`.
407
+
408
+ ### `toast` (`SgToastFn`)
409
+
410
+ | Chamada | Assinatura | Retorno | Comportamento |
411
+ |---|---|---|---|
412
+ | `toast(title?, options?)` | `(title?: React.ReactNode, options?: SgToastOptions) => SgToastId` | id | tipo `default` |
413
+ | `toast.message` | idem | id | tipo `default` |
414
+ | `toast.success` / `.info` / `.warning` / `.error` / `.loading` | idem | id | tipo correspondente (`loading` não expira) |
415
+ | `toast.custom` | `(renderer: React.ReactNode \| ((id: SgToastId) => React.ReactNode), options?) => SgToastId` | id | renderiza o nó como `title` de um toast `default` |
416
+ | `toast.dismiss` | `(id?: SgToastId) => void` | — | igual a `dismissSgToast` |
417
+ | `toast.promise` | `<T>(promiseOrFactory: Promise<T> \| (() => Promise<T>), messages: SgToastPromiseMessages<T>, options?) => Promise<T>` | a própria promessa | mostra `loading` (texto i18n `components.toast.loading` se omitido); no sucesso/erro **atualiza o mesmo id** para `success`/`error`, ou fecha se a mensagem correspondente for omitida; relança o erro |
418
+
419
+ Passar `options.id` existente atualiza (merge) o toast em vez de criar outro (Confirmado: `upsertToast`).
420
+
421
+ ### Funções
422
+
423
+ | Função | Assinatura | Comportamento |
424
+ |---|---|---|
425
+ | `dismissSgToast` | `(id?: SgToastId) => void` | sem id fecha todos; com id remove aquele |
426
+ | `subscribeSgToasts` | `(listener: (toasts: SgToastRecord[]) => void) => () => void` | chama o listener imediatamente com o snapshot atual e a cada mudança; retorna a função de cancelamento |
427
+
428
+ ### Tipos exportados
429
+
430
+ | Tipo | Definição |
431
+ |---|---|
432
+ | `SgToastId` | `string` |
433
+ | `SgToastType` | `"default" \| "success" \| "info" \| "warning" \| "error" \| "loading"` |
434
+ | `SgToastAction` | `{ label: React.ReactNode; onClick?: () => void }` |
435
+ | `SgToastOptions` | `{ id?: SgToastId; description?: React.ReactNode; duration?: number; action?: SgToastAction; closeButton?: boolean; className?: string; style?: React.CSSProperties }` |
436
+ | `SgToastRecord` | `Omit<SgToastOptions, "id"> & { id: SgToastId; type: SgToastType; title?: React.ReactNode; createdAt: number }` |
437
+ | `SgToastPromiseMessages<T>` | `{ loading?: React.ReactNode; success?: React.ReactNode \| ((value: T) => React.ReactNode); error?: React.ReactNode \| ((error: unknown) => React.ReactNode) }` |
438
+ | `SgToastFn` | tipo da função `toast` (tabela acima) |
439
+
440
+ ### Registro de hosts de toast (exportado)
441
+
442
+ `src/commons/sgToastHostRegistry.ts` — pilha global de ids usada por `SgToastHost`/`SgToaster`. Exportadas no barrel (uso avançado/testes):
443
+
444
+ | Função | Assinatura | Comportamento |
445
+ |---|---|---|
446
+ | `registerHost` | `(id: string) => void` | empilha (ignora duplicado) e notifica |
447
+ | `unregisterHost` | `(id: string) => void` | remove e notifica |
448
+ | `getActiveHostId` | `() => string \| null` | topo da pilha |
449
+ | `hasAnyHost` | `() => boolean` | pilha não vazia |
450
+ | `subscribeHostRegistry` | `(fn: () => void) => () => void` | listener de mudanças; retorna cancelamento |
451
+ | `nextHostId` | `() => string` | `sg-toast-host-<n>` |
452
+
453
+ Testado em `tests/commons.test.mjs` ("toast host registry …").
454
+
455
+ ## API imperativa de whistles (`src/commons/SgWhistle.ts`)
456
+
457
+ Store global análogo; ids `sg-whistle-<timestamp>-<n>`. `onClose` do whistle é chamado quando ele é removido (por `dismiss`, expiração, ação ou botão fechar).
458
+
459
+ ### `sgWhistle` (tipo interno `SgWhistleApi`)
460
+
461
+ | Método | Assinatura | Comportamento |
462
+ |---|---|---|
463
+ | `show` | `(options: SgWhistleOptions) => SgWhistleId` | severidade `options.severity ?? "default"` |
464
+ | `success` / `info` / `warning` / `error` / `loading` | `(options: SgWhistleOptions) => SgWhistleId` | força a severidade |
465
+ | `dismiss` | `(id?: SgWhistleId) => void` | igual a `dismissSgWhistle` |
466
+ | `update` | `(id: SgWhistleId, options: Partial<SgWhistleOptions>) => SgWhistleId` | merge no whistle existente (mantém `createdAt`); id inexistente → no-op |
467
+ | `custom` | `(renderer: React.ReactNode \| ((id) => React.ReactNode), options?: SgWhistleCustomOptions) => SgWhistleId` | conteúdo livre (`renderer`) |
468
+ | `promise` | `<T>(promiseOrFactory, states: SgWhistlePromiseStates<T>, options?: Omit<Partial<SgWhistleOptions>, "id" \| "severity" \| "message">) => Promise<T>` | `loading` → `update` para `success`/`error` no mesmo id, ou fecha se o estado for omitido; relança o erro |
469
+
470
+ ### Funções
471
+
472
+ | Função | Assinatura | Comportamento |
473
+ |---|---|---|
474
+ | `dismissSgWhistle` | `(id?: SgWhistleId) => void` | sem id remove todos (chamando `onClose` de cada) |
475
+ | `subscribeSgWhistles` | `(listener: (whistles: SgWhistleRecord[]) => void) => () => void` | snapshot imediato + mudanças; retorna cancelamento |
476
+
477
+ ### Tipos exportados
478
+
479
+ | Tipo | Definição |
480
+ |---|---|
481
+ | `SgWhistleId` | `string` |
482
+ | `SgWhistleSeverity` | `"default" \| "success" \| "info" \| "warning" \| "error" \| "loading"` |
483
+ | `SgWhistleBorderStyle` | `"solid" \| "soft" \| "left-accent" \| "full-accent" \| "none"` |
484
+ | `SgWhistleAction` | `{ label: string; onClick: () => void }` |
485
+ | `SgWhistleOptions` | `{ id?: string; severity?: SgWhistleSeverity; title?: string; message: string; icon?: React.ReactNode; duration?: number; dismissible?: boolean; borderStyle?: SgWhistleBorderStyle; opacity?: number; action?: SgWhistleAction; className?: string; style?: React.CSSProperties; onClose?: () => void }` (`message` obrigatório) |
486
+ | `SgWhistleCustomOptions` | `Omit<Partial<SgWhistleOptions>, "message"> & { message?: string }` |
487
+ | `SgWhistleRecord` | `Omit<SgWhistleCustomOptions, "id"> & { id: SgWhistleId; severity: SgWhistleSeverity; createdAt: number; renderer?: React.ReactNode }` |
488
+ | `SgWhistlePromiseStates<T>` | `{ loading?: …&{message: string}; success?: estado \| ((value: T) => estado); error?: estado \| ((error: unknown) => estado) }`, onde estado = `Omit<Partial<SgWhistleOptions>, "id" \| "severity"> & { message: string }` |
489
+
490
+ Testado em `tests/commons.test.mjs` (`sgWhistle.promise`, `sgWhistle.update`, `onClose`) e `tests/commons-dom.test.mjs`.