@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,661 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, component, frontend, react, inputs-texto, api]
|
|
3
|
+
fonte: front/seedgrid-fe-components/packages/seedgrid-fe-components/src/inputs
|
|
4
|
+
branch: main
|
|
5
|
+
commit: ad30fc11de
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Inputs de texto: API
|
|
10
|
+
|
|
11
|
+
Pacote `@seedgrid/fe-components` versão `2026.7.1` (`packages/seedgrid-fe-components/package.json`). Visão geral: [[SeedGrid/SeedGrid-components/inputs-texto/Visao-geral|Visão geral dos inputs de texto]]. Exemplos: [[SeedGrid/SeedGrid-components/inputs-texto/Exemplos|Exemplos dos inputs de texto]].
|
|
12
|
+
|
|
13
|
+
## Como as tabelas foram montadas
|
|
14
|
+
|
|
15
|
+
- **Tipo** e **Obrigatória** vêm do tipo TypeScript `<Componente>Props`, lido com o type checker do próprio pacote (mesma técnica de `scripts/extract-props.mjs`, só que **sem** a lista `IGNORED_PROPS` daquele script). Por isso as tabelas incluem `control`, `register`, `rules`, `inputProps`, `className`, `labelClassName`, `elevation` e `borderRadius`, que o `src/ai-meta/generated-props.json` deixa de fora de propósito. **Confirmado**.
|
|
16
|
+
- **Padrão** e **Descrição** foram lidos no corpo de cada componente (desestruturação com default, `??` e uso). **Confirmado**, a menos que a célula diga outra coisa.
|
|
17
|
+
- Nenhum `*Props` estende `HTMLAttributes`: atributos DOM só entram por `inputProps`/`textareaProps`. **Confirmado** (contagem de props por tipo: 25 a 72, nunca as centenas de um `HTMLAttributes`).
|
|
18
|
+
- Componentes que embrulham o `SgInputText` só listam na tabela as props que **declaram ou redeclaram**. As demais aparecem na linha "Herdadas", que é completa, e seguem o [[#Contrato base SgInputText]].
|
|
19
|
+
- `\|` dentro das células é um `|` escapado.
|
|
20
|
+
|
|
21
|
+
## Importação e exportação pública
|
|
22
|
+
|
|
23
|
+
Entrada única: `import { … } from "@seedgrid/fe-components"`. O `exports` do `package.json` só expõe `"."` (`dist/index.js` + `dist/index.d.ts`) e `"./style.css"`. Não há subpath por componente. **Confirmado**.
|
|
24
|
+
|
|
25
|
+
| Componente | Exportado em `src/index.ts` | Tipos públicos exportados |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| `SgInputText` | sim | `SgInputTextProps` |
|
|
28
|
+
| `SgInputTextArea` | sim | `SgInputTextAreaProps` |
|
|
29
|
+
| `SgInputTextSearch` | sim | `SgInputTextSearchProps` |
|
|
30
|
+
| `SgInputEmail` | sim | nenhum (`SgInputEmailProps` existe no arquivo mas não é reexportado) |
|
|
31
|
+
| `SgInputPassword` | sim | nenhum (`SgInputPasswordProps` não reexportado) |
|
|
32
|
+
| `SgInputPhone` | sim | `SgInputPhoneProps` |
|
|
33
|
+
| `SgInputCPF` | sim | `SgInputCPFProps` |
|
|
34
|
+
| `SgInputCNPJ` | sim | `SgInputCNPJProps` |
|
|
35
|
+
| `SgInputCPFCNPJ` | sim | `SgInputCPFCNPJProps` |
|
|
36
|
+
| `SgInputPostalCode` | sim | `SgInputPostalCodeProps`, `PostalCodeCountry`, `ViaCepResponse` |
|
|
37
|
+
| `SgInputBirthDate` | sim | nenhum (`SgInputBirthDateProps` não reexportado; `BirthDatePolicy` sim, via `validators`) |
|
|
38
|
+
| `SgInputDate` | sim | nenhum (`SgInputDateProps` não reexportado) |
|
|
39
|
+
| `SgInputNumber` | sim | `SgInputNumberProps` |
|
|
40
|
+
| `SgInputCurrency` | sim | `SgInputCurrencyProps` |
|
|
41
|
+
| `SgInputOTP` | sim | `SgInputOTPProps`, `SgInputOTPRef` |
|
|
42
|
+
|
|
43
|
+
Para obter o tipo de props que não é reexportado, use `React.ComponentProps<typeof SgInputEmail>`. Isso é **Inferência** (TypeScript padrão), não um padrão documentado pelo pacote.
|
|
44
|
+
|
|
45
|
+
Utilitários puros relacionados, também exportados: `onlyDigits`, `maskCpf`, `maskCnpj`, `maskCpfCnpj`, `maskCep`, `maskPostalCodeBR/PT/US/ES/UY/AR/PY`, `maskPhone` (`src/masks.ts`), além de `isValidCpf`, `isValidCnpj`, `isValidEmail`, `isBlockedEmailDomain`, `getBlockedEmailDomains`, `DEFAULT_BLOCKED_EMAIL_DOMAINS`, `validatePassword`, `validateBirthDate`, `isDateAfter`, `isDateBefore` e os tipos `PasswordPolicy`/`BirthDatePolicy` (`src/validators.ts`). **Confirmado** em `src/index.ts`.
|
|
46
|
+
|
|
47
|
+
## Contrato RhfFieldProps (react-hook-form)
|
|
48
|
+
|
|
49
|
+
Origem: `front/seedgrid-fe-components/packages/seedgrid-fe-components/src/rhf.ts`, tipo `RhfFieldProps`. Ele é misturado (`&` ou `extends`) nos props de quase todos os inputs, inclusive nos dos grupos [[SeedGrid/SeedGrid-components/inputs-selecao/API|inputs de seleção]] e [[SeedGrid/SeedGrid-components/editor/API|editor]].
|
|
50
|
+
|
|
51
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
52
|
+
|---|---|---|---|---|
|
|
53
|
+
| `name` | `string` | — | Não | Nome do campo no formulário. Sozinho não faz nada. |
|
|
54
|
+
| `control` | `any` | — | Não | `control` do `useForm()`. Com `name`, o componente se envolve em `<Controller>`. Tipado como `any` de propósito, para aceitar o `Control` de qualquer formulário tipado (comentário no próprio arquivo). |
|
|
55
|
+
| `register` | `UseFormRegister<any>` | — | Não | `register` do `useForm()`. Com `name`, chama `register(name, rules)` e liga `onChange`/`onBlur`/`ref` ao elemento nativo. |
|
|
56
|
+
| `rules` | `RegisterOptions<any>` | — | Não | Regras do RHF. |
|
|
57
|
+
| `error` | `string` | — | Não | Erro externo exibido pelo componente. |
|
|
58
|
+
|
|
59
|
+
Regras comuns, todas **Confirmado** no código de cada componente:
|
|
60
|
+
- **Precedência:** quando `name` + `register` **e** `control` são passados juntos, o `register` vence em `SgInputText`, `SgInputTextArea`, `SgInputNumber`, `SgInputCurrency` e `SgInputOTP` (o `if (name && register)` vem antes).
|
|
61
|
+
- **`mergeRequiredRule(rules, required, message)`:** com `required={true}`, injeta `required: <mensagem i18n>` nas `rules`, a menos que já exista uma regra `required` explícita. É usado por `SgInputText`, `SgInputTextArea`, `SgInputNumber`, `SgInputCurrency` e `SgInputOTP` (e, no outro grupo, por `SgAutocomplete`, `SgCheckboxGroup`, `SgRadioGroup`, `SgToggleSwitch` e `SgRating`).
|
|
62
|
+
- **`resolveFieldError(...erros)`:** devolve o primeiro erro não vazio. No caminho `control`, a ordem é `error` (prop) e depois `fieldState.error.message`.
|
|
63
|
+
- **Valor gravado no formulário:**
|
|
64
|
+
- `SgInputText` e derivados gravam a string do input, já com `prefixText`/`suffixText`.
|
|
65
|
+
- `SgInputNumber`/`SgInputCurrency` gravam a string canônica (`"1234.50"`).
|
|
66
|
+
- `SgInputOTP` grava o valor **bruto** (sem separadores da máscara).
|
|
67
|
+
- Os wrappers que não fazem a integração sozinhos (Email, Password, Phone, CPF, CNPJ, CPFCNPJ, PostalCode, Date, BirthDate, TextSearch) repassam `name`/`control`/`register`/`rules` ao `SgInputText`, que faz a ligação. Exceção: o `SgInputPassword` também repassa, mas não está coberto por teste de RHF.
|
|
68
|
+
|
|
69
|
+
## Contrato base SgInputText
|
|
70
|
+
|
|
71
|
+
Fonte: `front/seedgrid-fe-components/packages/seedgrid-fe-components/src/inputs/SgInputText.tsx` → `SgInputText`, `SgInputTextBase`. Import: `import { SgInputText, type SgInputTextProps } from "@seedgrid/fe-components";`. São 46 props, incluindo as 5 do contrato RHF.
|
|
72
|
+
|
|
73
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
74
|
+
|---|---|---|---|---|
|
|
75
|
+
| `name` | `string` | — | Não | Nome do campo no react-hook-form. Só tem efeito junto com `control` ou `register` (ver contrato RHF). |
|
|
76
|
+
| `control` | `any` | — | Não | `Control` do `useForm()`; com `name`, envolve o componente em `<Controller>`. |
|
|
77
|
+
| `register` | `UseFormRegister<any>` | — | Não | `register` do `useForm()`; com `name`, registra o elemento nativo. |
|
|
78
|
+
| `rules` | `RegisterOptions<any>` | — | Não | Regras de validação do RHF (`RegisterOptions`). |
|
|
79
|
+
| `error` | `string` | — | Não | Erro externo; tem precedência sobre o erro interno (com `control`, combinado com `fieldState.error` via `resolveFieldError`). |
|
|
80
|
+
| `id` | `string` | — | Sim | `id` do `<input>`; também usado no `htmlFor` do rótulo. |
|
|
81
|
+
| `label` | `string` | — | Não | Rótulo (usado quando `labelText` não é informado). |
|
|
82
|
+
| `labelText` | `string` | — | Não | Rótulo; precedência sobre `label`. |
|
|
83
|
+
| `labelPosition` | `"float" \| "top" \| "left"` | `"float"` | Não | Rótulo flutuante dentro do campo, acima (`top`) ou à esquerda (`left`, grid a partir de `sm`). |
|
|
84
|
+
| `labelWidth` | `string \| number` | `"11rem"` | Não | Largura da coluna do rótulo com `labelPosition="left"` (número = px). |
|
|
85
|
+
| `labelAlign` | `"start" \| "center" \| "end"` | `"start"` | Não | Alinhamento do texto do rótulo com `labelPosition="left"`. |
|
|
86
|
+
| `elevation` | `"none" \| "sm" \| "md" \| "lg"` | sombra `sm` | Não | Sombra: `none`, `md`, `lg`; qualquer outro valor (inclusive ausente) aplica `shadow-sm`. |
|
|
87
|
+
| `hintText` | `string` | — | Não | Placeholder alternativo (usado quando `placeholder` está ausente). |
|
|
88
|
+
| `prefixText` | `string` | — | Não | Afixo fixo à esquerda. O valor emitido (`onChange`/RHF) é `prefixText + digitado + suffixText`; ao exibir, o afixo é removido. |
|
|
89
|
+
| `suffixText` | `string` | — | Não | Afixo fixo à direita (mesma regra de `prefixText`). |
|
|
90
|
+
| `type` | `HTMLInputTypeAttribute` | `"text"` | Não | Atributo `type` do `<input>`. |
|
|
91
|
+
| `placeholder` | `string` | rótulo (float) / `""` | Não | Placeholder. Com rótulo flutuante: `placeholder ?? hintText ?? rótulo` (fica transparente); senão `placeholder ?? hintText ?? ""`. |
|
|
92
|
+
| `className` | `string` | classes internas | Não | SUBSTITUI toda a classe padrão do `<input>` (não concatena). |
|
|
93
|
+
| `labelClassName` | `string` | — | Não | Classes extras no `<label>`. |
|
|
94
|
+
| `inputProps` | `(InputHTMLAttributes<HTMLInputElement> & { ref?: Ref<HTMLInputElement>; })` | — | Não | Atributos do `<input>` nativo, espalhados depois dos atributos calculados (podem sobrescrevê-los). `ref`, `onChange` e `onBlur` são encadeados; `onFocus` de `inputProps` não é chamado (use `onEnter`). `value` torna o campo controlado. |
|
|
95
|
+
| `maxLength` | `number` | — | Não | Atributo `maxLength` e validação (`components.inputs.maxLength`). |
|
|
96
|
+
| `maxLengthMessage` | `string` | i18n | Não | Mensagem de `maxLength`. |
|
|
97
|
+
| `minLength` | `number` | — | Não | Validação de tamanho mínimo (`components.inputs.minLength`). |
|
|
98
|
+
| `minLengthMessage` | `string` | i18n | Não | Mensagem de `minLength`. |
|
|
99
|
+
| `minNumberOfWords` | `number` | — | Não | Mínimo de palavras (separadas por espaço) (`components.inputs.minWords`). |
|
|
100
|
+
| `minNumberOfWordsMessage` | `string` | i18n | Não | Mensagem de `minNumberOfWords`. |
|
|
101
|
+
| `prefixIcon` | `ReactNode` | — | Não | Ícone à esquerda dentro do campo. |
|
|
102
|
+
| `width` | `string \| number` | `"100%"` | Não | Largura do wrapper (`style.width`). |
|
|
103
|
+
| `clearButton` | `boolean` | `true` | Não | Exibe botão limpar (X); oculto com `enabled={false}` ou `readOnly`. |
|
|
104
|
+
| `filled` | `boolean` | `false` | Não | Fundo preenchido (`bg-muted/40`). |
|
|
105
|
+
| `enabled` | `boolean` | `true` (efetivo) | Não | `false` desabilita o `<input>` (`disabled`). |
|
|
106
|
+
| `textInputType` | `"none" \| "email" \| "search" \| "tel" \| "text" \| "url" \| "numeric" \| "decimal"` | — | Não | `inputMode` do `<input>` (precedência sobre `inputProps.inputMode`). |
|
|
107
|
+
| `onEnter` | `(() => void)` | — | Não | Chamado ao receber foco. |
|
|
108
|
+
| `onExit` | `(() => void)` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
109
|
+
| `onChange` | `((value: string) => void)` | — | Não | `(value: string) => void` a cada alteração; valor inclui afixos; `""` ao limpar. |
|
|
110
|
+
| `onClear` | `(() => void)` | — | Não | Chamado ao clicar no botão limpar. |
|
|
111
|
+
| `withBorder` | `boolean` | `true` | Não | Exibe borda; com erro a borda vermelha aparece mesmo com `false`. |
|
|
112
|
+
| `borderRadius` | `string \| number` | — | Não | Raio da borda (número = px). |
|
|
113
|
+
| `required` | `boolean` | `false` | Não | Valida vazio, exibe `*` e injeta `required` nas `rules` do RHF (`mergeRequiredRule`). |
|
|
114
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
115
|
+
| `showCharCounter` | `boolean` | `false` | Não | Contador `n` ou `n/maxLength` abaixo do campo. |
|
|
116
|
+
| `iconButtons` | `ReactNode[]` | — | Não | Nós extras à direita (após o X). |
|
|
117
|
+
| `readOnly` | `boolean` | `false` | Não | Somente leitura (também oculta o X). |
|
|
118
|
+
| `validation` | `((value: string) => string \| null)` | — | Não | Validador executado por último (após required/maxLength/minLength/minNumberOfWords); retorna mensagem ou `null`. |
|
|
119
|
+
| `validateOnBlur` | `boolean` | `true` | Não | `true`: valida no blur (e na digitação após interação); `false`: valida a cada alteração. |
|
|
120
|
+
| `onValidation` | `((message: string \| null) => void)` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
121
|
+
|
|
122
|
+
**Ordem de validação interna** (`runValidation`): `required` → `maxLength` → `minLength` → `minNumberOfWords` → `validation`. A primeira falha vira o erro interno e é enviada a `onValidation`. A validação roda no blur (padrão) ou a cada alteração com `validateOnBlur={false}`. **Confirmado**.
|
|
123
|
+
|
|
124
|
+
**Eventos**: `onChange(value: string)` (valor completo com afixos), `onEnter()` no foco, `onExit()` no blur, `onClear()` no botão X e `onValidation(msg | null)`. Não há `ref`/`forwardRef` no componente: para acessar o `<input>`, use `inputProps.ref`, que é mesclado com o ref do RHF. **Confirmado**.
|
|
125
|
+
|
|
126
|
+
**Controlado vs. não controlado**: o modo é controlado quando há `inputProps.value` ou `control`. Sem eles, o campo é não controlado (DOM). O teste `tests/inputs-dom.test.mjs` cobre o modo controlado ("keeps the typed value when controlled through inputProps.value / react-hook-form"). **Confirmado**.
|
|
127
|
+
|
|
128
|
+
**Acessibilidade comprovável**:
|
|
129
|
+
- `<label htmlFor={id}>` em todas as posições de rótulo.
|
|
130
|
+
- O botão limpar tem `aria-label` = i18n `components.actions.clear` e `tabIndex={-1}`.
|
|
131
|
+
- O asterisco de obrigatório usa `aria-hidden`.
|
|
132
|
+
|
|
133
|
+
Não há `aria-invalid` nem `aria-describedby` ligando o erro ao input: o erro é um `<p data-sg-error>`. **Confirmado** pela ausência no código.
|
|
134
|
+
|
|
135
|
+
**Ponto de atenção**: `inputProps.onFocus` é sobrescrito pelo handler interno `onFocus={handleFocus}`, que vem depois do spread no JSX. Para reagir ao foco, use `onEnter`. **Confirmado** pela ordem dos atributos.
|
|
136
|
+
|
|
137
|
+
## SgInputTextArea
|
|
138
|
+
|
|
139
|
+
Fonte: `src/inputs/SgInputTextArea.tsx` → `SgInputTextArea`. Não deriva do `SgInputText`: é uma implementação paralela sobre `<textarea>`, com o mesmo estilo de props. Import: `import { SgInputTextArea } from "@seedgrid/fe-components";`.
|
|
140
|
+
|
|
141
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
142
|
+
|---|---|---|---|---|
|
|
143
|
+
| `id` | `string` | — | Sim | `id` do `<textarea>`. |
|
|
144
|
+
| `label` | `string` | — | Não | Rótulo (fallback de `labelText`). |
|
|
145
|
+
| `labelText` | `string` | — | Não | Rótulo; precedência sobre `label`. |
|
|
146
|
+
| `labelPosition` | `"float" \| "top" \| "left"` | `"float"` | Não | `float`, `top` ou `left`. |
|
|
147
|
+
| `labelWidth` | `string \| number` | `"11rem"` | Não | Largura do rótulo em `left` (número = px). |
|
|
148
|
+
| `labelAlign` | `"start" \| "center" \| "end"` | `"start"` | Não | Alinhamento do rótulo em `left`. |
|
|
149
|
+
| `elevation` | `"none" \| "sm" \| "md" \| "lg"` | sombra `sm` | Não | `none`, `md`, `lg`; demais valores → `shadow-sm`. |
|
|
150
|
+
| `hintText` | `string` | — | Não | Placeholder (em float, fallback para o rótulo). |
|
|
151
|
+
| `error` | `string` | — | Não | Mensagem de erro externa exibida abaixo do campo. |
|
|
152
|
+
| `className` | `string` | classes internas | Não | Substitui a classe padrão do `<textarea>`. |
|
|
153
|
+
| `labelClassName` | `string` | — | Não | Classes extras no rótulo. |
|
|
154
|
+
| `textareaProps` | `(TextareaHTMLAttributes<HTMLTextAreaElement> & { ref?: Ref<HTMLTextAreaElement>; })` | — | Não | Atributos do `<textarea>` nativo (inclui `ref`, `value`, `onChange`, `onBlur`). |
|
|
155
|
+
| `maxLength` | `number` | — | Não | Atributo e validação (`components.inputs.textarea.maxLength`). |
|
|
156
|
+
| `maxLengthMessage` | `string` | i18n | Não | Mensagem de `maxLength`. |
|
|
157
|
+
| `maxLines` | `number` | `2` (rows) | Não | Usado como atributo `rows` do `<textarea>` (não limita linhas digitadas). |
|
|
158
|
+
| `minLines` | `number` | — | Não | Mínimo de linhas (`components.inputs.textarea.minLines`). |
|
|
159
|
+
| `minLinesMessage` | `string` | i18n | Não | Mensagem de `minLines`. |
|
|
160
|
+
| `minLength` | `number` | — | Não | Tamanho mínimo (`components.inputs.textarea.minLength`). |
|
|
161
|
+
| `minLengthMessage` | `string` | i18n | Não | Mensagem de `minLength`. |
|
|
162
|
+
| `minNumberOfWords` | `number` | — | Não | Mínimo de palavras (`components.inputs.textarea.minWords`). |
|
|
163
|
+
| `minNumberOfWordsMessage` | `string` | i18n | Não | Mensagem de `minNumberOfWords`. |
|
|
164
|
+
| `required` | `boolean` | `false` | Não | Valida vazio (`components.inputs.textarea.required`) e injeta `required` nas rules RHF. |
|
|
165
|
+
| `requiredMessage` | `string` | i18n `components.inputs.textarea.required` | Não | Mensagem de obrigatório. |
|
|
166
|
+
| `prefixIcon` | `ReactNode` | — | Não | Ícone à esquerda. |
|
|
167
|
+
| `width` | `string \| number` | `"100%"` | Não | Largura do wrapper. |
|
|
168
|
+
| `height` | `string \| number` | — | Não | Altura do `<textarea>` (número = px). |
|
|
169
|
+
| `clearButton` | `boolean` | `true` | Não | Botão limpar (oculto quando desabilitado/readOnly). |
|
|
170
|
+
| `filled` | `boolean` | `false` | Não | Fundo preenchido. |
|
|
171
|
+
| `enabled` | `boolean` | `true` (efetivo) | Não | `false` → `disabled` + `readOnly`. |
|
|
172
|
+
| `showCharCounter` | `boolean` | `false` | Não | Contador de caracteres. |
|
|
173
|
+
| `onEnter` | `(() => void)` | — | Não | Chamado ao receber foco. |
|
|
174
|
+
| `onExit` | `(() => void)` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
175
|
+
| `onChange` | `((value: string) => void)` | — | Não | `(value: string) => void` a cada alteração; `""` ao limpar. |
|
|
176
|
+
| `onClear` | `(() => void)` | — | Não | Chamado ao limpar. |
|
|
177
|
+
| `withBorder` | `boolean` | `true` | Não | Exibe borda (forçada em erro). |
|
|
178
|
+
| `borderRadius` | `string \| number` | — | Não | Raio da borda. |
|
|
179
|
+
| `validation` | `((value: string) => string \| null)` | — | Não | Validador final; mensagem ou `null`. |
|
|
180
|
+
| `validateOnBlur` | `boolean` | `true` | Não | `true`: valida no blur (e na digitação após interação); `false`: valida a cada alteração. |
|
|
181
|
+
| `onValidation` | `((message: string \| null) => void)` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
182
|
+
| `name` | `string` | — | Não | Nome do campo no react-hook-form. Só tem efeito junto com `control` ou `register` (ver contrato RHF). |
|
|
183
|
+
| `control` | `any` | — | Não | `Control` do `useForm()`; com `name`, envolve o componente em `<Controller>`. |
|
|
184
|
+
| `register` | `UseFormRegister<any>` | — | Não | `register` do `useForm()`; com `name`, registra o elemento nativo. |
|
|
185
|
+
| `rules` | `RegisterOptions<any>` | — | Não | Regras de validação do RHF (`RegisterOptions`). |
|
|
186
|
+
|
|
187
|
+
- **Validação:** `required` → `maxLength` → `minLength` → `minNumberOfWords` → `minLines` → `validation`. Usa chaves i18n próprias (`components.inputs.textarea.*`).
|
|
188
|
+
- **RHF:** `register` ou `control`, com `mergeRequiredRule` (o teste `tests/rhf-components-contract.test.mjs` verifica que ambos os caminhos existem).
|
|
189
|
+
- **Ref:** sem `forwardRef`; use `textareaProps.ref`.
|
|
190
|
+
- `maxLines` só define `rows`.
|
|
191
|
+
|
|
192
|
+
Tudo **Confirmado**.
|
|
193
|
+
|
|
194
|
+
## SgInputTextSearch
|
|
195
|
+
|
|
196
|
+
Fonte: `src/inputs/SgInputTextSearch.tsx`. Envolve o `SgInputText` e acrescenta um debounce feito com `setTimeout` (o comentário do arquivo diz que substitui a versão antiga, que usava rxjs).
|
|
197
|
+
|
|
198
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
199
|
+
|---|---|---|---|---|
|
|
200
|
+
| `minChars` | `number` | `3` | Não | Tamanho mínimo (após `trim`) para emitir `onSearchChange`; string vazia sempre é emitida. |
|
|
201
|
+
| `debounceMs` | `number` | `350` | Não | Atraso do debounce em ms. |
|
|
202
|
+
| `onChange` | `((value: string) => void)` | — | Não | Disparado imediatamente a cada digitação, com o valor cru. |
|
|
203
|
+
| `onSearchChange` | `(value: string) => void` | — | Sim | Disparado após o debounce com o valor normalizado (`trim`), respeitando `minChars` e sem repetir o último valor emitido (distinct). Não dispara na montagem. |
|
|
204
|
+
|
|
205
|
+
**Herdadas de `SgInputText` (tipo inalterado; ver contrato base) (45):** `required`, `maxLength`, `minLength`, `name`, `control`, `register`, `rules`, `error`, `id`, `label`, `labelText`, `labelPosition`, `labelWidth`, `labelAlign`, `elevation`, `hintText`, `prefixText`, `suffixText`, `type`, `placeholder`, `className`, `labelClassName`, `inputProps`, `maxLengthMessage`, `minLengthMessage`, `minNumberOfWords`, `minNumberOfWordsMessage`, `prefixIcon`, `width`, `clearButton`, `filled`, `enabled`, `textInputType`, `onEnter`, `onExit`, `onClear`, `withBorder`, `borderRadius`, `requiredMessage`, `showCharCounter`, `iconButtons`, `readOnly`, `validation`, `validateOnBlur`, `onValidation`.
|
|
206
|
+
|
|
207
|
+
**Removidas do contrato base:** nenhuma.
|
|
208
|
+
|
|
209
|
+
- O valor exibido é estado interno: o componente injeta `inputProps.value`, então um `inputProps.value` externo é sobrescrito. **Confirmado**.
|
|
210
|
+
- O teste `tests/inputs-dom.test.mjs` cobre: `onChange` imediato, `onSearchChange` só depois do debounce, `minChars` padrão 3 com `trim`, a regra "distinct" (não repete o último valor) e o debounce de digitação rápida. **Confirmado**.
|
|
211
|
+
|
|
212
|
+
## SgInputEmail
|
|
213
|
+
|
|
214
|
+
Fonte: `src/inputs/SgInputEmail.tsx`. Fixa `type="email"` e usa `textInputType` padrão `"email"`.
|
|
215
|
+
|
|
216
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
217
|
+
|---|---|---|---|---|
|
|
218
|
+
| `required` | `boolean` | `false` | Não | Valida campo vazio e exibe `*` no rótulo. |
|
|
219
|
+
| `onExit` | `() => void` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
220
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
221
|
+
| `iconButtons` | `ReactNode[]` | — | Não | Nós extras à direita. |
|
|
222
|
+
| `validation` | `(value: string) => string \| null` | — | Não | Validador customizado; roda ANTES da checagem de formato. |
|
|
223
|
+
| `validateOnBlur` | `boolean` | `true` | Não | `true`: valida no blur (e na digitação após interação); `false`: valida a cada alteração. |
|
|
224
|
+
| `onValidation` | `(message: string \| null) => void` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
225
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
226
|
+
| `invalidMessage` | `string` | i18n `components.inputs.email.invalid` | Não | Mensagem de formato inválido (regex `/.+@.+\..+/`). |
|
|
227
|
+
| `blockFakeMail` | `boolean` | `true` | Não | Rejeita domínios de e-mail temporário (mensagem fixa i18n `components.inputs.email.tempInvalid`). |
|
|
228
|
+
| `blockedEmailDomains` | `string[]` | — | Não | Domínios extras a bloquear; somados à lista padrão `DEFAULT_BLOCKED_EMAIL_DOMAINS` e a `globalThis.__seedgridBlockedEmailDomains`. |
|
|
229
|
+
|
|
230
|
+
**Herdadas de `SgInputText` (tipo inalterado; ver contrato base) (37):** `maxLength`, `minLength`, `onChange`, `name`, `control`, `register`, `rules`, `id`, `label`, `labelText`, `labelPosition`, `labelWidth`, `labelAlign`, `elevation`, `hintText`, `prefixText`, `suffixText`, `placeholder`, `className`, `labelClassName`, `inputProps`, `maxLengthMessage`, `minLengthMessage`, `minNumberOfWords`, `minNumberOfWordsMessage`, `prefixIcon`, `width`, `clearButton`, `filled`, `enabled`, `textInputType`, `onEnter`, `onClear`, `withBorder`, `borderRadius`, `showCharCounter`, `readOnly`.
|
|
231
|
+
|
|
232
|
+
**Removidas do contrato base (`Omit`) (1):** `type`.
|
|
233
|
+
|
|
234
|
+
- **Ordem de validação:** `required` → `validation` → formato (`isValidEmail`) → domínio bloqueado (`isBlockedEmailDomain`, quando `blockFakeMail` está ligado).
|
|
235
|
+
- Chaves i18n: `components.inputs.required`, `components.inputs.email.invalid`, `components.inputs.email.tempInvalid`.
|
|
236
|
+
|
|
237
|
+
**Confirmado**.
|
|
238
|
+
|
|
239
|
+
## SgInputPassword
|
|
240
|
+
|
|
241
|
+
Fonte: `src/inputs/SgInputPassword.tsx`. Usa `type="password"` ou `"text"` conforme o botão de olho, e inclui barra de força, lista de requisitos e gerador de senha.
|
|
242
|
+
|
|
243
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
244
|
+
|---|---|---|---|---|
|
|
245
|
+
| `maxLength` | `number` | `15` | Não | Repassado ao `SgInputText` como `maxLength` (padrão 15 — atenção para frases-senha); também teto da senha gerada. |
|
|
246
|
+
| `onEnter` | `() => void` | — | Não | Chamado ao receber foco. |
|
|
247
|
+
| `onExit` | `() => void` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
248
|
+
| `onValidation` | `(message: string \| null) => void` | — | Não | Recebe a 1ª regra não atendida (ou `null`). |
|
|
249
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
250
|
+
| `required` | `boolean` | `false` | Não | Valida campo vazio e exibe `*` no rótulo. |
|
|
251
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
252
|
+
| `validateOnBlur` | `boolean` | `true` | Não | `true`: valida no blur (e na digitação após interação); `false`: valida a cada alteração. |
|
|
253
|
+
| `hidePassword` | `boolean` | `true` | Não | Estado inicial do olho (senha oculta). Há botão para alternar. |
|
|
254
|
+
| `validation` | `((value: string) => string \| null)` | — | Não | Regra extra; a mensagem entra na lista de requisitos não atendidos. |
|
|
255
|
+
| `createNewPasswordButton` | `boolean` | `false` | Não | Mostra botão que gera senha aleatória (via `crypto.getRandomValues`) respeitando a política. |
|
|
256
|
+
| `newPasswordLength` | `number` | `minSize` | Não | Tamanho da senha gerada (limitado por `maxLength`). |
|
|
257
|
+
| `showStrengthBar` | `boolean` | `true` | Não | Barra de força (5 segmentos). |
|
|
258
|
+
| `commonPasswordCheck` | `boolean` | `true` | Não | Rejeita senhas comuns (lista interna, limitada a 1000 entradas). |
|
|
259
|
+
| `commonPasswordMessage` | `string` | i18n `components.password.common` | Não | Mensagem de senha comum. |
|
|
260
|
+
| `commonPasswordList` | `string[]` | — | Não | Senhas comuns extras, acrescentadas ao fim da lista interna (o conjunto é truncado em 1000 itens). |
|
|
261
|
+
| `upperRequired` | `boolean` | `true` | Não | Exige maiúscula. |
|
|
262
|
+
| `lowerRequired` | `boolean` | `true` | Não | Exige minúscula. |
|
|
263
|
+
| `numberRequired` | `boolean` | `true` | Não | Exige dígito. |
|
|
264
|
+
| `specialCharacterRequired` | `boolean` | `true` | Não | Exige caractere especial do conjunto ``!@#$%^&*()_+-=[]{};':"\|,.<>/?``. |
|
|
265
|
+
| `prohibitsRepeatedCharactersInSequence` | `boolean` | `true` | Não | Proíbe dois caracteres iguais seguidos (`/(.)\1/`). |
|
|
266
|
+
| `prohibitsSequentialAscCharacters` | `boolean` | `true` | Não | Proíbe sequência crescente de 3 (`abc`, `123`). |
|
|
267
|
+
| `prohibitsSequentialDescCharacters` | `boolean` | `true` | Não | Proíbe sequência decrescente de 3 (`cba`, `321`). |
|
|
268
|
+
| `minSize` | `number` | `8` | Não | Tamanho mínimo. |
|
|
269
|
+
|
|
270
|
+
**Herdadas de `SgInputText` (tipo inalterado; ver contrato base) (36):** `minLength`, `onChange`, `name`, `control`, `register`, `rules`, `id`, `label`, `labelText`, `labelPosition`, `labelWidth`, `labelAlign`, `elevation`, `hintText`, `prefixText`, `suffixText`, `placeholder`, `className`, `labelClassName`, `inputProps`, `maxLengthMessage`, `minLengthMessage`, `minNumberOfWords`, `minNumberOfWordsMessage`, `prefixIcon`, `width`, `clearButton`, `filled`, `enabled`, `textInputType`, `onClear`, `withBorder`, `borderRadius`, `showCharCounter`, `iconButtons`, `readOnly`.
|
|
271
|
+
|
|
272
|
+
**Removidas do contrato base (`Omit`) (1):** `type`.
|
|
273
|
+
|
|
274
|
+
- **`onChange(value)`:** declarado no `SgInputText` e consumido aqui. É chamado a cada digitação e também quando a senha é gerada. O teste "SgInputPassword calls the top-level onChange(value) while typing" cobre isso. **Confirmado**.
|
|
275
|
+
- **Senha gerada:**
|
|
276
|
+
- Tamanho: `max(minSize, newPasswordLength ?? minSize, nº de grupos exigidos)`, limitado por `maxLength`.
|
|
277
|
+
- Tenta até 50 vezes até cumprir a política.
|
|
278
|
+
- Os testes "generates a password with minSize length, not maxLength" e "honours newPasswordLength" cobrem isso.
|
|
279
|
+
|
|
280
|
+
**Confirmado**.
|
|
281
|
+
- **Força:** número de regras ativas menos o número de regras não cumpridas, mostrado em 5 segmentos.
|
|
282
|
+
- **i18n:** `components.password.{minSize,upper,lower,number,special,noRepeat,noSeqAsc,noSeqDesc,common,show,hide,generate}`.
|
|
283
|
+
- **Acessibilidade:** os botões de olho e de gerar têm `aria-label` traduzido. O ícone de revelar nativo do Edge é escondido via `[data-sg-password]::-ms-reveal`.
|
|
284
|
+
|
|
285
|
+
**Confirmado**.
|
|
286
|
+
|
|
287
|
+
## SgInputPhone
|
|
288
|
+
|
|
289
|
+
Fonte: `src/inputs/SgInputPhone.tsx`. Aplica a máscara `maskPhone` a cada digitação e aceita 10 ou 11 dígitos (BR). Usa `textInputType="numeric"` como padrão.
|
|
290
|
+
|
|
291
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
292
|
+
|---|---|---|---|---|
|
|
293
|
+
| `required` | `boolean` | `false` | Não | Valida campo vazio e exibe `*` no rótulo. |
|
|
294
|
+
| `onEnter` | `() => void` | — | Não | Chamado ao receber foco. |
|
|
295
|
+
| `onExit` | `() => void` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
296
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
297
|
+
| `validation` | `(value: string) => string \| null` | — | Não | Validador customizado, roda antes da checagem de dígitos. |
|
|
298
|
+
| `validateOnBlur` | `boolean` | `true` | Não | `true`: valida no blur (e na digitação após interação); `false`: valida a cada alteração. |
|
|
299
|
+
| `onValidation` | `(message: string \| null) => void` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
300
|
+
| `inputProps` | `(InputHTMLAttributes<HTMLInputElement> & { ref?: Ref<HTMLInputElement>; })` | — | Não | Atributos do `<input>`; `inputMode` padrão `numeric`. `onChange`/`onBlur` são encadeados após a máscara/validação. |
|
|
301
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
302
|
+
| `lengthMessage` | `string` | i18n `components.inputs.phone.invalid` | Não | Mensagem quando não há 10 ou 11 dígitos. |
|
|
303
|
+
| `invalidMessage` | `string` | i18n `components.inputs.phone.invalid` | Não | Fallback de `lengthMessage`. |
|
|
304
|
+
|
|
305
|
+
**Herdadas de `SgInputText` (tipo inalterado; ver contrato base) (37):** `maxLength`, `minLength`, `onChange`, `name`, `control`, `register`, `rules`, `id`, `label`, `labelText`, `labelPosition`, `labelWidth`, `labelAlign`, `elevation`, `hintText`, `prefixText`, `suffixText`, `type`, `placeholder`, `className`, `labelClassName`, `maxLengthMessage`, `minLengthMessage`, `minNumberOfWords`, `minNumberOfWordsMessage`, `prefixIcon`, `width`, `clearButton`, `filled`, `enabled`, `textInputType`, `onClear`, `withBorder`, `borderRadius`, `showCharCounter`, `iconButtons`, `readOnly`.
|
|
306
|
+
|
|
307
|
+
**Removidas do contrato base:** nenhuma.
|
|
308
|
+
|
|
309
|
+
Teste: "SgInputPhone shows the required asterisk when required is true". **Confirmado**.
|
|
310
|
+
|
|
311
|
+
## SgInputCPF
|
|
312
|
+
|
|
313
|
+
Fonte: `src/inputs/SgInputCPF.tsx`. Aplica `maskCpf`, exige 11 dígitos e valida com `isValidCpf`. Particularidade: o `maxLength` passado ao `SgInputText` tem padrão **`18`**, embora o CPF mascarado tenha 14 caracteres. **Confirmado** (`maxLength={rest.maxLength ?? 18}`).
|
|
314
|
+
|
|
315
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
316
|
+
|---|---|---|---|---|
|
|
317
|
+
| `required` | `boolean` | `false` | Não | Valida vazio (validação interna do wrapper). **Não** é repassado ao `SgInputText`: o rótulo não mostra `*` e nenhuma regra `required` é injetada no RHF. |
|
|
318
|
+
| `onEnter` | `() => void` | — | Não | Chamado ao receber foco. |
|
|
319
|
+
| `onExit` | `() => void` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
320
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
321
|
+
| `validation` | `(value: string) => string \| null` | — | Não | Validador customizado, roda antes das checagens de tamanho/dígito. |
|
|
322
|
+
| `validateOnBlur` | `boolean` | `true` | Não | Valida no blur. A validação também roda a cada digitação (no `onChange` mascarado). |
|
|
323
|
+
| `onValidation` | `(message: string \| null) => void` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
324
|
+
| `inputProps` | `(InputHTMLAttributes<HTMLInputElement> & { ref?: Ref<HTMLInputElement>; })` | — | Não | Atributos do `<input>`; `inputMode` padrão `numeric`. |
|
|
325
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
326
|
+
| `lengthMessage` | `string` | i18n `components.inputs.cpf.length` | Não | Mensagem quando não há 11 dígitos. |
|
|
327
|
+
| `invalidMessage` | `string` | i18n `components.inputs.cpf.invalid` | Não | Mensagem de dígito verificador inválido (`isValidCpf`). |
|
|
328
|
+
|
|
329
|
+
**Herdadas de `SgInputText` (tipo inalterado; ver contrato base) (37):** `maxLength`, `minLength`, `onChange`, `name`, `control`, `register`, `rules`, `id`, `label`, `labelText`, `labelPosition`, `labelWidth`, `labelAlign`, `elevation`, `hintText`, `prefixText`, `suffixText`, `type`, `placeholder`, `className`, `labelClassName`, `maxLengthMessage`, `minLengthMessage`, `minNumberOfWords`, `minNumberOfWordsMessage`, `prefixIcon`, `width`, `clearButton`, `filled`, `enabled`, `textInputType`, `onClear`, `withBorder`, `borderRadius`, `showCharCounter`, `iconButtons`, `readOnly`.
|
|
330
|
+
|
|
331
|
+
**Removidas do contrato base:** nenhuma.
|
|
332
|
+
|
|
333
|
+
O valor emitido em `onChange` e no RHF é a string **mascarada** (`000.000.000-00`). **Confirmado**: a máscara é aplicada ao `event.target.value` antes de propagar.
|
|
334
|
+
|
|
335
|
+
## SgInputCNPJ
|
|
336
|
+
|
|
337
|
+
Fonte: `src/inputs/SgInputCNPJ.tsx`. Aplica `maskCnpj` e aceita CNPJ **alfanumérico**: 14 caracteres `[0-9A-Z]`, em maiúsculas. Valida com `isValidCnpj`. O `maxLength` padrão é `18`.
|
|
338
|
+
|
|
339
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
340
|
+
|---|---|---|---|---|
|
|
341
|
+
| `required` | `boolean` | `false` | Não | Valida vazio (validação interna do wrapper). **Não** é repassado ao `SgInputText`: o rótulo não mostra `*` e nenhuma regra `required` é injetada no RHF. |
|
|
342
|
+
| `onEnter` | `() => void` | — | Não | Chamado ao receber foco. |
|
|
343
|
+
| `onExit` | `() => void` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
344
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
345
|
+
| `validation` | `(value: string) => string \| null` | — | Não | Validador customizado, roda antes das checagens. |
|
|
346
|
+
| `validateOnBlur` | `boolean` | `true` | Não | Valida no blur; também valida a cada digitação. |
|
|
347
|
+
| `onValidation` | `(message: string \| null) => void` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
348
|
+
| `inputProps` | `(InputHTMLAttributes<HTMLInputElement> & { ref?: Ref<HTMLInputElement>; })` | — | Não | Atributos do `<input>`; `inputMode` padrão `text` (CNPJ alfanumérico). |
|
|
349
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
350
|
+
| `lengthMessage` | `string` | i18n `components.inputs.cnpj.length` | Não | Mensagem quando não há 14 caracteres alfanuméricos. |
|
|
351
|
+
| `invalidMessage` | `string` | i18n `components.inputs.cnpj.invalid` | Não | Mensagem de CNPJ inválido (`isValidCnpj`). |
|
|
352
|
+
| `validateWithPublicaCnpj` | `boolean` | `false` (falsy) | Não | Consulta o CNPJ (somente numérico) em serviço externo; sem dados → erro. Resultado cacheado para o último CNPJ. |
|
|
353
|
+
| `publicaCnpjErrorMessage` | `string` | `invalidMessage` / i18n | Não | Mensagem quando a consulta não retorna dados. |
|
|
354
|
+
| `publicaCnpjFetch` | `((cnpj: string) => Promise<unknown>)` | `fetch("https://publica.cnpj.ws/cnpj/<cnpj>")` | Não | Função de consulta substituível; retorna dados ou `null`. |
|
|
355
|
+
| `onPublicaCnpjResult` | `((data: unknown) => void)` | — | Não | Recebe o retorno da consulta (ou `null`). |
|
|
356
|
+
| `onPublicaCnpjError` | `((error: unknown) => void)` | — | Não | Recebe exceções da consulta (a validação então passa). |
|
|
357
|
+
|
|
358
|
+
**Herdadas de `SgInputText` (tipo inalterado; ver contrato base) (37):** `maxLength`, `minLength`, `onChange`, `name`, `control`, `register`, `rules`, `id`, `label`, `labelText`, `labelPosition`, `labelWidth`, `labelAlign`, `elevation`, `hintText`, `prefixText`, `suffixText`, `type`, `placeholder`, `className`, `labelClassName`, `maxLengthMessage`, `minLengthMessage`, `minNumberOfWords`, `minNumberOfWordsMessage`, `prefixIcon`, `width`, `clearButton`, `filled`, `enabled`, `textInputType`, `onClear`, `withBorder`, `borderRadius`, `showCharCounter`, `iconButtons`, `readOnly`.
|
|
359
|
+
|
|
360
|
+
**Removidas do contrato base:** nenhuma.
|
|
361
|
+
|
|
362
|
+
- A consulta externa só acontece para CNPJ totalmente numérico (`!/[A-Z]/.test(raw)`). É uma chamada de rede ao vivo para `https://publica.cnpj.ws/cnpj/<cnpj>`, salvo quando `publicaCnpjFetch` é passado.
|
|
363
|
+
- A validação é `async`. O erro é atualizado quando a promise resolve.
|
|
364
|
+
|
|
365
|
+
**Confirmado**.
|
|
366
|
+
|
|
367
|
+
## SgInputCPFCNPJ
|
|
368
|
+
|
|
369
|
+
Fonte: `src/inputs/SgInputCPFCNPJ.tsx`. Aplica `maskCpfCnpj`. Trata o valor como CNPJ quando há letra ou mais de 11 caracteres; caso contrário, como CPF. O `maxLength` padrão é `18`.
|
|
370
|
+
|
|
371
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
372
|
+
|---|---|---|---|---|
|
|
373
|
+
| `required` | `boolean` | `false` | Não | Valida vazio (validação interna do wrapper). **Não** é repassado ao `SgInputText`: o rótulo não mostra `*` e nenhuma regra `required` é injetada no RHF. |
|
|
374
|
+
| `onEnter` | `() => void` | — | Não | Chamado ao receber foco. |
|
|
375
|
+
| `onExit` | `() => void` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
376
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
377
|
+
| `validation` | `(value: string) => string \| null` | — | Não | Validador customizado, roda antes das checagens. |
|
|
378
|
+
| `validateOnBlur` | `boolean` | `true` | Não | Valida no blur; também valida a cada digitação. |
|
|
379
|
+
| `onValidation` | `(message: string \| null) => void` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
380
|
+
| `inputProps` | `(InputHTMLAttributes<HTMLInputElement> & { ref?: Ref<HTMLInputElement>; })` | — | Não | Atributos do `<input>`; `inputMode` padrão `text`. |
|
|
381
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
382
|
+
| `lengthMessage` | `string` | i18n (`cpf.length` / `cnpj.length`) | Não | Mensagem de tamanho (vale para os dois tipos). |
|
|
383
|
+
| `invalidMessage` | `string` | i18n (`cpf.invalid` / `cnpj.invalid`) | Não | Mensagem de inválido (vale para os dois tipos). |
|
|
384
|
+
|
|
385
|
+
**Herdadas de `SgInputText` (tipo inalterado; ver contrato base) (37):** `maxLength`, `minLength`, `onChange`, `name`, `control`, `register`, `rules`, `id`, `label`, `labelText`, `labelPosition`, `labelWidth`, `labelAlign`, `elevation`, `hintText`, `prefixText`, `suffixText`, `type`, `placeholder`, `className`, `labelClassName`, `maxLengthMessage`, `minLengthMessage`, `minNumberOfWords`, `minNumberOfWordsMessage`, `prefixIcon`, `width`, `clearButton`, `filled`, `enabled`, `textInputType`, `onClear`, `withBorder`, `borderRadius`, `showCharCounter`, `iconButtons`, `readOnly`.
|
|
386
|
+
|
|
387
|
+
**Removidas do contrato base:** nenhuma.
|
|
388
|
+
|
|
389
|
+
## SgInputPostalCode
|
|
390
|
+
|
|
391
|
+
Fonte: `src/inputs/SgInputPostalCode.tsx` → `COUNTRY_CONFIGS`. A máscara, o tamanho e o `inputMode` dependem de `country`.
|
|
392
|
+
|
|
393
|
+
| País | Máscara | Tamanho bruto aceito | `maxLength` padrão | `inputMode` |
|
|
394
|
+
|---|---|---|---|---|
|
|
395
|
+
| BR | `maskPostalCodeBR` | 8 | 10 | numeric |
|
|
396
|
+
| PT | `maskPostalCodePT` | 7 | 8 | numeric |
|
|
397
|
+
| US | `maskPostalCodeUS` | 5 ou 9 | 10 | numeric |
|
|
398
|
+
| ES | `maskPostalCodeES` | 5 | 5 | numeric |
|
|
399
|
+
| UY | `maskPostalCodeUY` | 5 | 5 | numeric |
|
|
400
|
+
| AR | `maskPostalCodeAR` | 4 ou 8 (alfanumérico) | 8 | text |
|
|
401
|
+
| PY | `maskPostalCodePY` | 6 | 6 | numeric |
|
|
402
|
+
|
|
403
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
404
|
+
|---|---|---|---|---|
|
|
405
|
+
| `required` | `boolean` | `false` | Não | Valida vazio (validação interna do wrapper). **Não** é repassado ao `SgInputText`: o rótulo não mostra `*` e nenhuma regra `required` é injetada no RHF. |
|
|
406
|
+
| `onEnter` | `() => void` | — | Não | Chamado ao receber foco. |
|
|
407
|
+
| `onExit` | `() => void` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
408
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
409
|
+
| `validation` | `(value: string) => string \| null` | — | Não | Validador customizado, roda antes da checagem de tamanho. |
|
|
410
|
+
| `validateOnBlur` | `boolean` | `true` | Não | `true`: valida no blur (e na digitação após interação); `false`: valida a cada alteração. |
|
|
411
|
+
| `onValidation` | `(message: string \| null) => void` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
412
|
+
| `inputProps` | `(InputHTMLAttributes<HTMLInputElement> & { ref?: Ref<HTMLInputElement>; })` | — | Não | Atributos do `<input>`; `inputMode` padrão por país. |
|
|
413
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
414
|
+
| `country` | `PostalCodeCountry` | `"BR"` | Não | País da máscara/validação: `BR`, `PT`, `US`, `ES`, `UY`, `AR`, `PY`. |
|
|
415
|
+
| `lengthMessage` | `string` | i18n `components.inputs.postalCode.<país>.length` | Não | Mensagem de tamanho. Tamanhos: BR 8, PT 7, US 5 ou 9, ES 5, UY 5, AR 4 ou 8 (alfanumérico), PY 6. |
|
|
416
|
+
| `invalidMessage` | `string` | i18n `components.inputs.postalCode.<país>.invalid` | Não | Mensagem de CEP inexistente (só usada com ViaCEP). |
|
|
417
|
+
| `validateWithViaCep` | `boolean` | `false` (falsy) | Não | Só para `country="BR"`: consulta o CEP; `erro: true` → inválido. Último CEP consultado é cacheado. |
|
|
418
|
+
| `viaCepErrorMessage` | `string` | `invalidMessage` / i18n | Não | Mensagem para CEP não encontrado. |
|
|
419
|
+
| `viaCepFetch` | `((cep: string) => Promise<ViaCepResponse>)` | `fetch("https://viacep.com.br/ws/<cep>/json/")` | Não | Função de consulta substituível. |
|
|
420
|
+
| `onViaCepResult` | `((data: ViaCepResponse) => void)` | — | Não | Recebe o `ViaCepResponse`. |
|
|
421
|
+
| `onViaCepError` | `((error: unknown) => void)` | — | Não | Recebe exceções da consulta (a validação passa). |
|
|
422
|
+
|
|
423
|
+
**Herdadas de `SgInputText` (tipo inalterado; ver contrato base) (37):** `maxLength`, `minLength`, `onChange`, `name`, `control`, `register`, `rules`, `id`, `label`, `labelText`, `labelPosition`, `labelWidth`, `labelAlign`, `elevation`, `hintText`, `prefixText`, `suffixText`, `type`, `placeholder`, `className`, `labelClassName`, `maxLengthMessage`, `minLengthMessage`, `minNumberOfWords`, `minNumberOfWordsMessage`, `prefixIcon`, `width`, `clearButton`, `filled`, `enabled`, `textInputType`, `onClear`, `withBorder`, `borderRadius`, `showCharCounter`, `iconButtons`, `readOnly`.
|
|
424
|
+
|
|
425
|
+
**Removidas do contrato base:** nenhuma.
|
|
426
|
+
|
|
427
|
+
- `ViaCepResponse` (exportado) tem os campos `{cep?, logradouro?, complemento?, bairro?, localidade?, uf?, ibge?, gia?, ddd?, siafi?, erro?}`.
|
|
428
|
+
- A configuração de cada país tem um campo `placeholder` (por exemplo `"00000-000"`), mas ele **não é usado** na renderização: uso não encontrado.
|
|
429
|
+
|
|
430
|
+
**Confirmado**.
|
|
431
|
+
|
|
432
|
+
## SgInputDate
|
|
433
|
+
|
|
434
|
+
Fonte: `src/inputs/SgInputDate.tsx`. Envolve um `SgInputText` com `type="date"` (widget nativo do navegador).
|
|
435
|
+
|
|
436
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
437
|
+
|---|---|---|---|---|
|
|
438
|
+
| `onEnter` | `() => void` | — | Não | Chamado ao receber foco. |
|
|
439
|
+
| `onExit` | `() => void` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
440
|
+
| `minDate` | `string \| Date` | — | Não | Data mínima (`"yyyy-MM-dd"` ou `Date`): atributo `min` e validação (`components.inputs.date.min`/`range`). |
|
|
441
|
+
| `maxDate` | `string \| Date` | — (atributo HTML `9999-12-31`) | Não | Data máxima: atributo `max` e validação. Sem valor, só o atributo recebe `9999-12-31` para conter o ano em 4 dígitos. |
|
|
442
|
+
|
|
443
|
+
**Herdadas de `SgInputText` (tipo inalterado; ver contrato base) (37):** `required`, `maxLength`, `minLength`, `onChange`, `name`, `control`, `register`, `rules`, `error`, `id`, `label`, `labelText`, `labelPosition`, `labelWidth`, `labelAlign`, `elevation`, `prefixText`, `suffixText`, `inputProps`, `maxLengthMessage`, `minLengthMessage`, `minNumberOfWords`, `minNumberOfWordsMessage`, `prefixIcon`, `width`, `clearButton`, `enabled`, `textInputType`, `onClear`, `borderRadius`, `requiredMessage`, `showCharCounter`, `iconButtons`, `readOnly`, `validation`, `validateOnBlur`, `onValidation`.
|
|
444
|
+
|
|
445
|
+
**Removidas do contrato base (`Omit`) (1):** `type`.
|
|
446
|
+
|
|
447
|
+
- O rótulo é sempre estático, no topo da borda. O rótulo interno do `SgInputText` vira `sr-only`.
|
|
448
|
+
- O estilo do input é calculado pelo próprio `SgInputDate`. Para trocar a classe do `<input>`, use `inputProps.className`.
|
|
449
|
+
- `required` e `onValidation` **não** são repassados ao `SgInputText`: não aparece `*` e não há `required` automático nas regras do RHF.
|
|
450
|
+
- O valor é a string ISO do input nativo (`yyyy-MM-dd`).
|
|
451
|
+
- O tema claro/escuro do picker vem de `color-scheme`, via `useDarkFlag()`.
|
|
452
|
+
- **Mensagens de erro:**
|
|
453
|
+
- Chaves: `components.inputs.date.{invalid,min,max,range}`.
|
|
454
|
+
- As datas aparecem como `dd/MM/yyyy`, exceto no locale `en-US`, que mantém o ISO.
|
|
455
|
+
|
|
456
|
+
**Confirmado**.
|
|
457
|
+
|
|
458
|
+
## SgInputBirthDate
|
|
459
|
+
|
|
460
|
+
Fonte: `src/inputs/SgInputBirthDate.tsx`. Envolve o `SgInputDate` e acrescenta a política de idade (`BirthDatePolicy` de `src/validators.ts`).
|
|
461
|
+
|
|
462
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
463
|
+
|---|---|---|---|---|
|
|
464
|
+
| `required` | `boolean` | `false` | Não | Valida vazio (`components.inputs.birthdate.required`). Não é repassado ao `SgInputText` (sem `*` e sem regra RHF automática). |
|
|
465
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
466
|
+
| `onEnter` | `() => void` | — | Não | Chamado ao receber foco. |
|
|
467
|
+
| `onExit` | `() => void` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
468
|
+
| `requiredMessage` | `string` | i18n `components.inputs.birthdate.required` | Não | Mensagem de obrigatório. |
|
|
469
|
+
| `validateOnBlur` | `boolean` | `true` | Não | Valida idade no blur. |
|
|
470
|
+
| `onValidation` | `(message: string \| null) => void` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
471
|
+
| `minAge` | `number` | — | Não | Idade mínima: deriva `maxDate` (hoje − minAge anos) e valida via `validateBirthDate`. |
|
|
472
|
+
| `maxAge` | `number` | — | Não | Idade máxima: deriva `minDate` (hoje − maxAge anos). **Sem `minAge` nem `maxAge`, qualquer data preenchida gera o erro `components.validators.birthdate.configMissing`.** |
|
|
473
|
+
| `maxDate` | `string \| Date` | minAge derivado ou hoje | Não | Sobrescreve a data máxima derivada. |
|
|
474
|
+
| `minDate` | `string \| Date` | maxAge derivado | Não | Sobrescreve a data mínima derivada. |
|
|
475
|
+
|
|
476
|
+
**Herdadas de `SgInputText` (tipo inalterado; ver contrato base) (32):** `maxLength`, `minLength`, `onChange`, `name`, `control`, `register`, `rules`, `id`, `label`, `labelText`, `labelPosition`, `labelWidth`, `labelAlign`, `elevation`, `prefixText`, `suffixText`, `inputProps`, `maxLengthMessage`, `minLengthMessage`, `minNumberOfWords`, `minNumberOfWordsMessage`, `prefixIcon`, `width`, `clearButton`, `enabled`, `textInputType`, `onClear`, `borderRadius`, `showCharCounter`, `iconButtons`, `readOnly`, `validation`.
|
|
477
|
+
|
|
478
|
+
**Removidas do contrato base (`Omit`) (1):** `type`.
|
|
479
|
+
|
|
480
|
+
Pegadinha (**Confirmado** em `validateBirthDate`): sem `minAge` nem `maxAge`, ao preencher qualquer data o componente mostra "Configuração inválida: informe minAge e/ou maxAge." (`components.validators.birthdate.configMissing`). Os exemplos do showcase sempre passam `minAge`/`maxAge`.
|
|
481
|
+
|
|
482
|
+
## SgInputNumber
|
|
483
|
+
|
|
484
|
+
Fonte: `src/inputs/SgInputNumber.tsx`. Implementação própria, não deriva do `SgInputText`. A digitação é tratada tecla a tecla, em estado `{negative, intDigits, decDigits, hasDecimal}`. Os separadores vêm de `Intl.NumberFormat(i18n.locale)`.
|
|
485
|
+
|
|
486
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
487
|
+
|---|---|---|---|---|
|
|
488
|
+
| `name` | `string` | — | Não | Nome do campo no react-hook-form. Só tem efeito junto com `control` ou `register` (ver contrato RHF). |
|
|
489
|
+
| `control` | `any` | — | Não | `Control` do `useForm()`; com `name`, envolve o componente em `<Controller>`. |
|
|
490
|
+
| `register` | `UseFormRegister<any>` | — | Não | `register` do `useForm()`; com `name`, registra o elemento nativo. |
|
|
491
|
+
| `rules` | `RegisterOptions<any>` | — | Não | Regras de validação do RHF (`RegisterOptions`). |
|
|
492
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
493
|
+
| `id` | `string` | — | Sim | `id` do `<input>`. |
|
|
494
|
+
| `label` | `string` | — | Não | Rótulo. |
|
|
495
|
+
| `labelText` | `string` | — | Não | Rótulo; precedência sobre `label`. |
|
|
496
|
+
| `labelPosition` | `"float" \| "top" \| "left"` | `"float"` | Não | `float`, `top` ou `left`. |
|
|
497
|
+
| `labelWidth` | `string \| number` | `"11rem"` | Não | Largura do rótulo em `left`. |
|
|
498
|
+
| `labelAlign` | `"start" \| "center" \| "end"` | `"start"` | Não | Alinhamento do rótulo em `left`. |
|
|
499
|
+
| `elevation` | `"none" \| "sm" \| "md" \| "lg"` | sombra `sm` | Não | `none`, `md`, `lg`; demais → `shadow-sm`. |
|
|
500
|
+
| `hintText` | `string` | — | Não | Placeholder alternativo. |
|
|
501
|
+
| `prefixText` | `string` | — | Não | Afixo visual à esquerda (não entra no valor emitido). |
|
|
502
|
+
| `suffixText` | `string` | — | Não | Afixo visual à direita. |
|
|
503
|
+
| `decimals` | `number` | `2` | Não | Casas decimais (0 = inteiro). |
|
|
504
|
+
| `allowNegative` | `boolean` | `true` | Não | Permite negativo (tecla `-` alterna o sinal). |
|
|
505
|
+
| `emptyValue` | `"null" \| "zero"` | `"zero"` | Não | Valor ao apagar tudo/limpar: `"zero"` → `0`, `"null"` → string vazia. |
|
|
506
|
+
| `type` | `HTMLInputTypeAttribute` | `"text"` | Não | Atributo `type`. |
|
|
507
|
+
| `placeholder` | `string` | rótulo (float) | Não | Placeholder. |
|
|
508
|
+
| `className` | `string` | classes internas | Não | Substitui a classe padrão do `<input>`. |
|
|
509
|
+
| `labelClassName` | `string` | — | Não | Classes do rótulo. |
|
|
510
|
+
| `inputProps` | `(InputHTMLAttributes<HTMLInputElement> & { ref?: Ref<HTMLInputElement>; })` | — | Não | Atributos do `<input>`; `value`/`defaultValue` de `inputProps` servem como valor externo/inicial; `onChange` recebe evento sintético com o valor canônico. |
|
|
511
|
+
| `maxValue` | `number` | — | Não | Máximo (`components.inputs.number.max`). |
|
|
512
|
+
| `minValue` | `number` | — | Não | Mínimo (`components.inputs.number.min`). |
|
|
513
|
+
| `minValueMessage` | `string` | i18n | Não | Mensagem de mínimo. |
|
|
514
|
+
| `maxValueMessage` | `string` | i18n | Não | Mensagem de máximo. |
|
|
515
|
+
| `prefixIcon` | `ReactNode` | — | Não | Ícone à esquerda. |
|
|
516
|
+
| `width` | `string \| number` | `"100%"` | Não | Largura do wrapper. |
|
|
517
|
+
| `clearButton` | `boolean` | `true` | Não | Botão limpar (aplica `emptyValue`). |
|
|
518
|
+
| `filled` | `boolean` | `false` | Não | Fundo preenchido. |
|
|
519
|
+
| `enabled` | `boolean` | `true` (efetivo) | Não | `false` desabilita. |
|
|
520
|
+
| `textInputType` | `"none" \| "email" \| "search" \| "tel" \| "text" \| "url" \| "numeric" \| "decimal"` | `"decimal"` | Não | `inputMode` do `<input>`. |
|
|
521
|
+
| `onEnter` | `(() => void)` | — | Não | Chamado ao receber foco. |
|
|
522
|
+
| `onExit` | `(() => void)` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
523
|
+
| `onChange` | `((value: string) => void)` | — | Não | Valor canônico string: ponto decimal, sem separador de milhar, decimais completas (ex.: `"1234.50"`, `"-3.00"`); `""` quando vazio com `emptyValue="null"`. |
|
|
524
|
+
| `onClear` | `(() => void)` | — | Não | Chamado ao limpar. |
|
|
525
|
+
| `withBorder` | `boolean` | `true` | Não | Exibe borda. |
|
|
526
|
+
| `borderRadius` | `string \| number` | — | Não | Raio da borda. |
|
|
527
|
+
| `required` | `boolean` | `false` | Não | Valida vazio e injeta `required` nas rules RHF. |
|
|
528
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
529
|
+
| `iconButtons` | `ReactNode[]` | — | Não | Nós extras à direita. |
|
|
530
|
+
| `readOnly` | `boolean` | `false` | Não | Somente leitura (ignora teclas/cola). |
|
|
531
|
+
| `validation` | `((value: string) => string \| null)` | — | Não | Validador final; recebe o valor canônico. |
|
|
532
|
+
| `validateOnBlur` | `boolean` | `true` | Não | `true`: valida no blur (e na digitação após interação); `false`: valida a cada alteração. |
|
|
533
|
+
| `onValidation` | `((message: string \| null) => void)` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
534
|
+
|
|
535
|
+
- **Valor:** string canônica, ou `""` com `emptyValue="null"`. Para obter número, faça `Number(valor)`.
|
|
536
|
+
- **Teclas:**
|
|
537
|
+
- `-` ou `_` alternam o sinal.
|
|
538
|
+
- `.`, `,` e o separador do locale abrem a parte decimal.
|
|
539
|
+
- Backspace/Delete apagam da direita para a esquerda.
|
|
540
|
+
- Ctrl/Meta/Alt e as teclas de navegação passam direto.
|
|
541
|
+
- **Colar:** o texto colado é normalizado.
|
|
542
|
+
- **RHF:** com `register`, o valor é enviado como evento sintético `{target: {name, value}}`; com `control`, por `field.onChange(valor)`.
|
|
543
|
+
|
|
544
|
+
**Confirmado**.
|
|
545
|
+
|
|
546
|
+
## SgInputCurrency
|
|
547
|
+
|
|
548
|
+
Fonte: `src/inputs/SgInputCurrency.tsx`. Mesma mecânica do `SgInputNumber`. O símbolo, a posição dele e os separadores vêm de `Intl.NumberFormat(locale, {style: "currency", currency})`. **Diferença**: não tem `labelPosition`, `labelWidth`, `labelAlign` nem `elevation`, então o rótulo é sempre flutuante. **Confirmado** pelo tipo.
|
|
549
|
+
|
|
550
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
551
|
+
|---|---|---|---|---|
|
|
552
|
+
| `name` | `string` | — | Não | Nome do campo no react-hook-form. Só tem efeito junto com `control` ou `register` (ver contrato RHF). |
|
|
553
|
+
| `control` | `any` | — | Não | `Control` do `useForm()`; com `name`, envolve o componente em `<Controller>`. |
|
|
554
|
+
| `register` | `UseFormRegister<any>` | — | Não | `register` do `useForm()`; com `name`, registra o elemento nativo. |
|
|
555
|
+
| `rules` | `RegisterOptions<any>` | — | Não | Regras de validação do RHF (`RegisterOptions`). |
|
|
556
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
557
|
+
| `id` | `string` | — | Sim | `id` do `<input>`. |
|
|
558
|
+
| `label` | `string` | — | Não | Rótulo. |
|
|
559
|
+
| `labelText` | `string` | — | Não | Rótulo; precedência sobre `label`. |
|
|
560
|
+
| `hintText` | `string` | — | Não | Placeholder alternativo. |
|
|
561
|
+
| `prefixText` | `string` | — | Não | Afixo visual extra, combinado com o símbolo quando este fica à esquerda. |
|
|
562
|
+
| `suffixText` | `string` | — | Não | Afixo visual extra, combinado com o símbolo quando este fica à direita. |
|
|
563
|
+
| `decimals` | `number` | casas da moeda (`Intl`) | Não | Casas decimais; padrão = `maximumFractionDigits` da moeda (BRL 2, JPY 0). |
|
|
564
|
+
| `allowNegative` | `boolean` | `true` | Não | Permite negativo (tecla `-` alterna o sinal). |
|
|
565
|
+
| `emptyValue` | `"null" \| "zero"` | `"zero"` | Não | Valor ao apagar tudo/limpar: `"zero"` → `0`, `"null"` → string vazia. |
|
|
566
|
+
| `currency` | `string` | `"BRL"` | Não | Código ISO 4217 (convertido para maiúsculas). |
|
|
567
|
+
| `locale` | `string` | locale do i18n | Não | Locale para separadores/posição do símbolo. |
|
|
568
|
+
| `currencyDisplay` | `"symbol" \| "name" \| "narrowSymbol" \| "code"` | `"symbol"` | Não | `symbol`, `narrowSymbol`, `code`, `name` (`Intl.NumberFormat`). |
|
|
569
|
+
| `currencySymbolOverride` | `string` | — | Não | Símbolo customizado. |
|
|
570
|
+
| `currencySymbolPlacement` | `"auto" \| "prefix" \| "suffix"` | `"auto"` | Não | `auto` (pelo locale), `prefix`, `suffix`. |
|
|
571
|
+
| `showCurrencySymbol` | `boolean` | `true` | Não | Exibe o símbolo. |
|
|
572
|
+
| `useGrouping` | `boolean` | `true` | Não | Separador de milhar. |
|
|
573
|
+
| `type` | `HTMLInputTypeAttribute` | `"text"` | Não | Atributo `type`. |
|
|
574
|
+
| `placeholder` | `string` | rótulo (float) | Não | Placeholder. |
|
|
575
|
+
| `className` | `string` | classes internas | Não | Substitui a classe padrão do `<input>`. |
|
|
576
|
+
| `labelClassName` | `string` | — | Não | Classes do rótulo. |
|
|
577
|
+
| `inputProps` | `(InputHTMLAttributes<HTMLInputElement> & { ref?: Ref<HTMLInputElement>; })` | — | Não | Atributos do `<input>`; `value`/`defaultValue` de `inputProps` servem como valor externo/inicial; `onChange` recebe evento sintético com o valor canônico. |
|
|
578
|
+
| `maxValue` | `number` | — | Não | Máximo (`components.inputs.number.max`). |
|
|
579
|
+
| `minValue` | `number` | — | Não | Mínimo (`components.inputs.number.min`). |
|
|
580
|
+
| `minValueMessage` | `string` | i18n | Não | Mensagem de mínimo. |
|
|
581
|
+
| `maxValueMessage` | `string` | i18n | Não | Mensagem de máximo. |
|
|
582
|
+
| `prefixIcon` | `ReactNode` | — | Não | Ícone à esquerda. |
|
|
583
|
+
| `width` | `string \| number` | `"100%"` | Não | Largura do wrapper. |
|
|
584
|
+
| `clearButton` | `boolean` | `true` | Não | Botão limpar (aplica `emptyValue`). |
|
|
585
|
+
| `filled` | `boolean` | `false` | Não | Fundo preenchido. |
|
|
586
|
+
| `enabled` | `boolean` | `true` (efetivo) | Não | `false` desabilita. |
|
|
587
|
+
| `textInputType` | `"none" \| "email" \| "search" \| "tel" \| "text" \| "url" \| "numeric" \| "decimal"` | `"decimal"` | Não | `inputMode` do `<input>`. |
|
|
588
|
+
| `onEnter` | `(() => void)` | — | Não | Chamado ao receber foco. |
|
|
589
|
+
| `onExit` | `(() => void)` | — | Não | Chamado ao perder o foco (após a validação). |
|
|
590
|
+
| `onChange` | `((value: string) => void)` | — | Não | Valor canônico string (ex.: `"1234.56"`), sem símbolo nem separador de milhar. |
|
|
591
|
+
| `onClear` | `(() => void)` | — | Não | Chamado ao limpar. |
|
|
592
|
+
| `withBorder` | `boolean` | `true` | Não | Exibe borda. |
|
|
593
|
+
| `borderRadius` | `string \| number` | — | Não | Raio da borda. |
|
|
594
|
+
| `required` | `boolean` | `false` | Não | Valida vazio e injeta `required` nas rules RHF. |
|
|
595
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
596
|
+
| `iconButtons` | `ReactNode[]` | — | Não | Nós extras à direita. |
|
|
597
|
+
| `readOnly` | `boolean` | `false` | Não | Somente leitura (ignora teclas/cola). |
|
|
598
|
+
| `validation` | `((value: string) => string \| null)` | — | Não | Validador final; recebe o valor canônico. |
|
|
599
|
+
| `validateOnBlur` | `boolean` | `true` | Não | `true`: valida no blur (e na digitação após interação); `false`: valida a cada alteração. |
|
|
600
|
+
| `onValidation` | `((message: string \| null) => void)` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
601
|
+
|
|
602
|
+
## SgInputOTP
|
|
603
|
+
|
|
604
|
+
Fonte: `src/inputs/SgInputOTP.tsx`. Usa um `<input>` por slot e um `<input type="hidden" name>` com o valor bruto, que serve para formulários nativos e para o `register`. É o único do grupo com `forwardRef`.
|
|
605
|
+
|
|
606
|
+
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|
|
607
|
+
|---|---|---|---|---|
|
|
608
|
+
| `name` | `string` | — | Não | Nome do campo no react-hook-form. Só tem efeito junto com `control` ou `register` (ver contrato RHF). |
|
|
609
|
+
| `control` | `any` | — | Não | `Control` do `useForm()`; com `name`, envolve o componente em `<Controller>`. |
|
|
610
|
+
| `register` | `UseFormRegister<any>` | — | Não | `register` do `useForm()`; com `name`, registra o elemento nativo. |
|
|
611
|
+
| `rules` | `RegisterOptions<any>` | — | Não | Regras de validação do RHF (`RegisterOptions`). |
|
|
612
|
+
| `error` | `string` | — | Não | Erro externo; precedência sobre o interno. |
|
|
613
|
+
| `id` | `string` | — | Sim | Base dos ids dos slots. |
|
|
614
|
+
| `label` | `string` | — | Não | Rótulo; também prefixo do `aria-label` de cada slot. |
|
|
615
|
+
| `hintText` | `string` | — | Não | Texto de ajuda abaixo dos slots. |
|
|
616
|
+
| `mask` | `string` | `"999999"` | Não | Máscara: `9` = dígito, `#` = alfanumérico, qualquer outro caractere = separador fixo. Máscara sem slots cai no padrão. |
|
|
617
|
+
| `value` | `string` | — | Não | Valor controlado (bruto ou mascarado; caracteres são distribuídos nos slots). |
|
|
618
|
+
| `defaultValue` | `string` | — | Não | Valor inicial não controlado. |
|
|
619
|
+
| `className` | `string` | — | Não | Classes do wrapper externo. |
|
|
620
|
+
| `groupClassName` | `string` | — | Não | Classes do grupo de slots (`role="group"`). |
|
|
621
|
+
| `slotClassName` | `string` | — | Não | Classes de cada slot. |
|
|
622
|
+
| `separatorClassName` | `string` | — | Não | Classes dos separadores. |
|
|
623
|
+
| `inputProps` | `(Omit<InputHTMLAttributes<HTMLInputElement>, "value" \| "defaultValue"> & { ref?: Ref<HTMLInputElement>; })` | — | Não | Atributos aplicados aos `<input>` de slot (exceto `value`/`defaultValue`); `autoComplete` padrão `one-time-code` no 1º slot. |
|
|
624
|
+
| `width` | `string \| number` | `fit-content` | Não | Largura do wrapper (número = px). |
|
|
625
|
+
| `enabled` | `boolean` | `true` | Não | `false` desabilita os slots. |
|
|
626
|
+
| `readOnly` | `boolean` | `false` | Não | Somente leitura. |
|
|
627
|
+
| `required` | `boolean` | `false` | Não | Valida vazio e injeta `required` nas rules RHF. |
|
|
628
|
+
| `requiredMessage` | `string` | i18n `components.inputs.required` | Não | Mensagem para campo obrigatório vazio. |
|
|
629
|
+
| `validation` | `((rawValue: string, maskedValue: string) => string \| null)` | — | Não | `(rawValue, maskedValue) => string \| null`. |
|
|
630
|
+
| `validateOnBlur` | `boolean` | `true` | Não | `true`: valida ao sair do grupo; `false`: valida a cada alteração. |
|
|
631
|
+
| `onValidation` | `((message: string \| null) => void)` | — | Não | Recebe a mensagem de erro corrente ou `null` a cada validação. |
|
|
632
|
+
| `onChange` | `((maskedValue: string) => void)` | — | Não | Valor MASCARADO a cada alteração (ex.: `"AB1-2C3-45"`). |
|
|
633
|
+
| `onRawChange` | `((rawValue: string) => void)` | — | Não | Valor BRUTO (só os caracteres dos slots). |
|
|
634
|
+
| `onComplete` | `((value: string) => void)` | — | Não | Disparado quando todos os slots estão preenchidos; recebe o valor mascarado. |
|
|
635
|
+
| `onEnter` | `(() => void)` | — | Não | Foco entra no grupo de slots. |
|
|
636
|
+
| `onExit` | `(() => void)` | — | Não | Foco sai do grupo de slots. |
|
|
637
|
+
| `onClear` | `(() => void)` | — | Não | Chamado quando o valor passa de não vazio para vazio. |
|
|
638
|
+
|
|
639
|
+
**Ref (`SgInputOTPRef`, exportado)**:
|
|
640
|
+
|
|
641
|
+
| Método | Assinatura | Efeito |
|
|
642
|
+
|---|---|---|
|
|
643
|
+
| `focus` | `(slotIndex?: number) => void` | Foca e seleciona o slot. O padrão é `0`. |
|
|
644
|
+
| `clear` | `() => void` | Esvazia os slots e foca o primeiro. |
|
|
645
|
+
| `getRawValue` | `() => string` | Valor bruto. |
|
|
646
|
+
| `getMaskedValue` | `() => string` | Valor com separadores. |
|
|
647
|
+
|
|
648
|
+
- **Acessibilidade:**
|
|
649
|
+
- O container tem `role="group"`, com `aria-label` igual ao rótulo ou ao i18n `components.inputs.otp.group`, e `aria-invalid` quando há erro.
|
|
650
|
+
- Cada slot tem `aria-label` = `"<rótulo> N"` ou i18n `components.inputs.otp.slot`.
|
|
651
|
+
- O primeiro slot usa `autoComplete="one-time-code"`.
|
|
652
|
+
- O teste `tests/inputs-i18n.test.mjs` cobre os rótulos traduzidos.
|
|
653
|
+
- **Comportamento:** colar distribui os caracteres aceitos a partir do slot atual. Caracteres que não combinam com o tipo do slot são ignorados.
|
|
654
|
+
|
|
655
|
+
**Confirmado**.
|
|
656
|
+
|
|
657
|
+
## Fontes
|
|
658
|
+
|
|
659
|
+
- `front/seedgrid-fe-components/packages/seedgrid-fe-components/src/inputs/*.tsx` (componentes) e `*.meta.ts` (metadados de IA)
|
|
660
|
+
- `front/seedgrid-fe-components/packages/seedgrid-fe-components/src/rhf.ts`, `src/validators.ts`, `src/masks.ts`, `src/i18n/*.ts`
|
|
661
|
+
- `front/seedgrid-fe-components/packages/seedgrid-fe-components/tests/inputs-dom.test.mjs`, `inputs-i18n.test.mjs`, `rhf.test.mjs`, `rhf-components-contract.test.mjs` (lidos; **não executados**)
|