@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.
- package/LICENSE +21 -0
- package/README.md +151 -2
- package/dist/adapters/claude.js +114 -0
- package/dist/adapters/codex.js +108 -0
- package/dist/adapters/index.js +17 -0
- package/dist/adapters/shared.js +142 -0
- package/dist/adapters/types.js +1 -0
- package/dist/cli.js +203 -0
- package/dist/commands/common.js +98 -0
- package/dist/commands/doctor.js +290 -0
- package/dist/commands/init.js +9 -0
- package/dist/commands/install.js +107 -0
- package/dist/commands/remove.js +54 -0
- package/dist/commands/review.js +127 -0
- package/dist/commands/status.js +73 -0
- package/dist/commands/update.js +8 -0
- package/dist/commands/validate.js +27 -0
- package/dist/core/apply.js +181 -0
- package/dist/core/blocks.js +64 -0
- package/dist/core/content.js +528 -0
- package/dist/core/env.js +40 -0
- package/dist/core/frontmatter.js +29 -0
- package/dist/core/hash.js +14 -0
- package/dist/core/inspect.js +51 -0
- package/dist/core/lock.js +124 -0
- package/dist/core/paths.js +65 -0
- package/dist/core/plan.js +242 -0
- package/dist/core/tools.js +62 -0
- package/dist/core/types.js +11 -0
- package/dist/core/updates.js +121 -0
- package/docs/arquitetura.md +80 -0
- package/docs/compatibilidade.md +50 -0
- package/docs/formato.md +155 -0
- package/docs/instalacao.md +105 -0
- package/docs/manutencao.md +115 -0
- package/package.json +43 -4
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
- package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
- package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
- package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
- package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
- package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
- package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
- package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
- package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
- package/seedgridKB/SeedGrid/Versoes.md +64 -0
- package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
- 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. |
|