@seedgrid/ai-toolkit 0.0.0-stage → 0.3.1
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 +162 -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 +209 -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/selfinstall.js +63 -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,312 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, component, frontend, react, inputs-texto, exemplos]
|
|
3
|
+
fonte: front/seedgrid-fe-components/apps/showcase/src/app/components
|
|
4
|
+
branch: main
|
|
5
|
+
commit: ad30fc11de
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Inputs de texto: exemplos
|
|
10
|
+
|
|
11
|
+
Todos os exemplos foram conferidos contra os tipos descritos em [[SeedGrid/SeedGrid-components/inputs-texto/API|API dos inputs de texto]]. Os que vêm do showcase indicam o arquivo de origem, relativo a `front/seedgrid-fe-components/apps/showcase/src/app/components/`. Cada componente também tem página no showcase em `/components/<slug>` (campo `showcase.route` dos `*.meta.ts`). Os exemplos não foram compilados nem executados nesta análise. A conferência foi feita contra os tipos.
|
|
12
|
+
|
|
13
|
+
## Configuração de idioma (recomendada)
|
|
14
|
+
|
|
15
|
+
Sem provider, as mensagens saem em `en-US`, que é o padrão do i18n global. **Confirmado**.
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import { SgComponentsI18nProvider } from "@seedgrid/fe-components";
|
|
19
|
+
|
|
20
|
+
export function Providers({ children }: { children: React.ReactNode }) {
|
|
21
|
+
return <SgComponentsI18nProvider locale="pt-BR">{children}</SgComponentsI18nProvider>;
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## SgInputText com `register`
|
|
26
|
+
|
|
27
|
+
Fonte: `sg-input-text/samples/basico-rhf.tsx.sample`.
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
import * as React from "react";
|
|
31
|
+
import { useForm } from "react-hook-form";
|
|
32
|
+
import { SgInputText } from "@seedgrid/fe-components";
|
|
33
|
+
|
|
34
|
+
export default function App() {
|
|
35
|
+
const { register, watch } = useForm({ defaultValues: { nome: "" } });
|
|
36
|
+
return (
|
|
37
|
+
<>
|
|
38
|
+
<SgInputText id="demo-basic" label="Nome completo" name="nome" register={register} />
|
|
39
|
+
<p>Valor atual: {watch("nome")}</p>
|
|
40
|
+
</>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## SgInputText com `control` e validação
|
|
46
|
+
|
|
47
|
+
Baseado em `sg-input-text/samples/controlado.tsx.sample`, com `required`/`minLength` acrescentados. As props usadas estão confirmadas no tipo.
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
import * as React from "react";
|
|
51
|
+
import { useForm } from "react-hook-form";
|
|
52
|
+
import { SgButton, SgInputText } from "@seedgrid/fe-components";
|
|
53
|
+
|
|
54
|
+
export default function App() {
|
|
55
|
+
const { control, handleSubmit } = useForm({ defaultValues: { cliente: "" } });
|
|
56
|
+
return (
|
|
57
|
+
<form onSubmit={handleSubmit((data) => console.log(data))}>
|
|
58
|
+
<SgInputText
|
|
59
|
+
id="cliente"
|
|
60
|
+
label="Cliente"
|
|
61
|
+
name="cliente"
|
|
62
|
+
control={control}
|
|
63
|
+
required
|
|
64
|
+
minLength={3}
|
|
65
|
+
showCharCounter
|
|
66
|
+
maxLength={60}
|
|
67
|
+
/>
|
|
68
|
+
<SgButton type="submit">Salvar</SgButton>
|
|
69
|
+
</form>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## SgInputTextArea
|
|
75
|
+
|
|
76
|
+
Fonte: `sg-input-text-area/samples/minimo-de-linhas.tsx.sample`.
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
import * as React from "react";
|
|
80
|
+
import { SgInputTextArea } from "@seedgrid/fe-components";
|
|
81
|
+
|
|
82
|
+
export default function App() {
|
|
83
|
+
return <SgInputTextArea id="demo-minlines" label="Min 3 linhas" minLines={3} minLinesMessage="Digite ao menos 3 linhas" />;
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## SgInputTextSearch (debounce)
|
|
88
|
+
|
|
89
|
+
Fonte: `sg-input-text-search/samples/minchars-e-debounce.tsx.sample`.
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
import * as React from "react";
|
|
93
|
+
import { SgInputTextSearch } from "@seedgrid/fe-components";
|
|
94
|
+
|
|
95
|
+
export default function App() {
|
|
96
|
+
const [immediate, setImmediate] = React.useState("");
|
|
97
|
+
const [searchTerm, setSearchTerm] = React.useState("");
|
|
98
|
+
return (
|
|
99
|
+
<>
|
|
100
|
+
<SgInputTextSearch
|
|
101
|
+
id="search-tuned"
|
|
102
|
+
label="Busca"
|
|
103
|
+
placeholder="Digite para buscar"
|
|
104
|
+
minChars={1}
|
|
105
|
+
debounceMs={800}
|
|
106
|
+
onChange={setImmediate}
|
|
107
|
+
onSearchChange={setSearchTerm}
|
|
108
|
+
/>
|
|
109
|
+
<p>Valor imediato (onChange): {immediate}</p>
|
|
110
|
+
<p>Termo de busca (onSearchChange): {searchTerm}</p>
|
|
111
|
+
</>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## SgInputEmail
|
|
117
|
+
|
|
118
|
+
Fonte: `sg-input-email/samples/basico.tsx.sample`. `blockedEmailDomains` foi acrescentado (prop confirmada).
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
import * as React from "react";
|
|
122
|
+
import { SgInputEmail } from "@seedgrid/fe-components";
|
|
123
|
+
|
|
124
|
+
export default function App() {
|
|
125
|
+
return (
|
|
126
|
+
<SgInputEmail
|
|
127
|
+
id="email"
|
|
128
|
+
label="E-mail"
|
|
129
|
+
hintText="name@domain.com"
|
|
130
|
+
blockedEmailDomains={["exemplo-temporario.com"]}
|
|
131
|
+
onChange={(value) => console.log(value)}
|
|
132
|
+
/>
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## SgInputPassword com política e gerador
|
|
138
|
+
|
|
139
|
+
Baseado em `sg-input-password/samples/basico.tsx.sample`, com props de política acrescentadas. Observe que o `maxLength` padrão é 15, e por isso aqui ele é aumentado.
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
import * as React from "react";
|
|
143
|
+
import { SgInputPassword } from "@seedgrid/fe-components";
|
|
144
|
+
|
|
145
|
+
export default function App() {
|
|
146
|
+
const [senha, setSenha] = React.useState("");
|
|
147
|
+
return (
|
|
148
|
+
<div className="w-80">
|
|
149
|
+
<SgInputPassword
|
|
150
|
+
id="senha"
|
|
151
|
+
label="Senha"
|
|
152
|
+
minSize={10}
|
|
153
|
+
maxLength={64}
|
|
154
|
+
specialCharacterRequired={false}
|
|
155
|
+
createNewPasswordButton
|
|
156
|
+
newPasswordLength={16}
|
|
157
|
+
onChange={setSenha}
|
|
158
|
+
onValidation={(msg) => console.log("primeira regra pendente:", msg)}
|
|
159
|
+
/>
|
|
160
|
+
<p className="mt-2 text-xs">Tamanho atual: {senha.length}</p>
|
|
161
|
+
</div>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Documentos brasileiros
|
|
167
|
+
|
|
168
|
+
Fontes: `sg-input-cpf/samples/basico.tsx.sample`, `sg-input-cnpj/samples/cnpj-publico.tsx.sample`, `sg-input-cpf-cnpj/samples/basico.tsx.sample` e `sg-input-phone/samples/basico.tsx.sample`, combinados em um formulário.
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
import * as React from "react";
|
|
172
|
+
import { SgInputCNPJ, SgInputCPF, SgInputCPFCNPJ, SgInputPhone } from "@seedgrid/fe-components";
|
|
173
|
+
|
|
174
|
+
export default function App() {
|
|
175
|
+
return (
|
|
176
|
+
<>
|
|
177
|
+
<SgInputCPF id="cpf" label="CPF" hintText="000.000.000-00" onChange={(value) => console.log(value)} />
|
|
178
|
+
<SgInputCNPJ
|
|
179
|
+
id="cnpj"
|
|
180
|
+
label="CNPJ"
|
|
181
|
+
hintText="00.000.000/0000-00"
|
|
182
|
+
validateWithPublicaCnpj
|
|
183
|
+
publicaCnpjErrorMessage="CNPJ nao encontrado"
|
|
184
|
+
onPublicaCnpjResult={(data) => console.log(data)}
|
|
185
|
+
onPublicaCnpjError={(error) => console.log(error)}
|
|
186
|
+
/>
|
|
187
|
+
<SgInputCPFCNPJ id="doc" label="CPF ou CNPJ" required />
|
|
188
|
+
<SgInputPhone id="telefone" label="Telefone" hintText="(11) 99999-0000" />
|
|
189
|
+
</>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
`validateWithPublicaCnpj` faz uma chamada HTTP real a `publica.cnpj.ws`. Em testes, passe `publicaCnpjFetch={async () => ({ ok: true })}`.
|
|
195
|
+
|
|
196
|
+
## SgInputPostalCode com ViaCEP
|
|
197
|
+
|
|
198
|
+
Fonte: `sg-input-postal-code/samples/viacep.tsx.sample`.
|
|
199
|
+
|
|
200
|
+
```tsx
|
|
201
|
+
import * as React from "react";
|
|
202
|
+
import { SgInputPostalCode } from "@seedgrid/fe-components";
|
|
203
|
+
|
|
204
|
+
export default function App() {
|
|
205
|
+
return (
|
|
206
|
+
<SgInputPostalCode
|
|
207
|
+
id="cep"
|
|
208
|
+
label="CEP (Brasil)"
|
|
209
|
+
hintText="00000-000"
|
|
210
|
+
country="BR"
|
|
211
|
+
validateWithViaCep
|
|
212
|
+
viaCepErrorMessage="CEP invalido."
|
|
213
|
+
onViaCepResult={(data) => console.log(data)}
|
|
214
|
+
/>
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## SgInputDate e SgInputBirthDate
|
|
220
|
+
|
|
221
|
+
Fontes: `sg-input-date/samples/intervalo.tsx.sample` e `sg-input-birth-date/samples/intervalo.tsx.sample`.
|
|
222
|
+
|
|
223
|
+
```tsx
|
|
224
|
+
import * as React from "react";
|
|
225
|
+
import { SgInputBirthDate, SgInputDate } from "@seedgrid/fe-components";
|
|
226
|
+
|
|
227
|
+
export default function App() {
|
|
228
|
+
return (
|
|
229
|
+
<div className="w-80">
|
|
230
|
+
<SgInputDate id="demo-range" label="Periodo" minDate="2020-01-01" maxDate="2030-12-31" />
|
|
231
|
+
<SgInputBirthDate id="demo-birth" label="Data de nascimento" minAge={12} maxAge={80} />
|
|
232
|
+
</div>
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
Sempre informe `minAge` e/ou `maxAge` no `SgInputBirthDate`. Sem eles, qualquer data gera erro de configuração.
|
|
238
|
+
|
|
239
|
+
## SgInputNumber e SgInputCurrency com `control`
|
|
240
|
+
|
|
241
|
+
`SgInputCurrency` vem de `sg-input-currency/samples/controlado.tsx.sample`. O `SgInputNumber` foi acrescentado no mesmo formulário: os samples `basico`/`controlado` dele no showcase não têm `useForm`.
|
|
242
|
+
|
|
243
|
+
```tsx
|
|
244
|
+
import React from "react";
|
|
245
|
+
import { useForm } from "react-hook-form";
|
|
246
|
+
import { SgButton, SgGrid, SgInputCurrency, SgInputNumber } from "@seedgrid/fe-components";
|
|
247
|
+
|
|
248
|
+
export default function Example() {
|
|
249
|
+
const { control, watch, setValue } = useForm({
|
|
250
|
+
defaultValues: { quantidade: "1.000", controlled: "1234.50" }
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
return (
|
|
254
|
+
<div className="w-96 space-y-3">
|
|
255
|
+
<SgInputNumber id="qtd" label="Quantidade" name="quantidade" control={control} decimals={3} minValue={0} allowNegative={false} />
|
|
256
|
+
<SgInputCurrency id="demo-controlled" label="Controlado" name="controlled" control={control} currency="BRL" />
|
|
257
|
+
|
|
258
|
+
<SgGrid columns={{ base: 1, sm: 3 }} gap={8}>
|
|
259
|
+
<SgButton size="sm" appearance="outline" onClick={() => setValue("controlled", "12345.00")}>Set API</SgButton>
|
|
260
|
+
<SgButton size="sm" appearance="outline" onClick={() => setValue("controlled", "0.00")}>Reset</SgButton>
|
|
261
|
+
<SgButton size="sm" appearance="outline" severity="danger" onClick={() => setValue("controlled", "")}>Limpar</SgButton>
|
|
262
|
+
</SgGrid>
|
|
263
|
+
|
|
264
|
+
<p>Estado atual: "{watch("controlled")}" / qtd "{watch("quantidade")}"</p>
|
|
265
|
+
</div>
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
O valor do formulário é uma **string canônica** (`"1234.50"`). Converta com `Number(...)` ao enviar.
|
|
271
|
+
|
|
272
|
+
## SgInputOTP com ref
|
|
273
|
+
|
|
274
|
+
Fonte: `sg-input-otp/samples/acesso-por-ref.tsx.sample`.
|
|
275
|
+
|
|
276
|
+
```tsx
|
|
277
|
+
import * as React from "react";
|
|
278
|
+
import { SgButton, SgGrid, SgInputOTP, type SgInputOTPRef } from "@seedgrid/fe-components";
|
|
279
|
+
|
|
280
|
+
export default function App() {
|
|
281
|
+
const otpRef = React.useRef<SgInputOTPRef | null>(null);
|
|
282
|
+
const [readout, setReadout] = React.useState('Clique em "Ler conteudo".');
|
|
283
|
+
|
|
284
|
+
return (
|
|
285
|
+
<div className="space-y-3">
|
|
286
|
+
<SgInputOTP id="otp-ref" ref={otpRef} label="OTP por ref" hintText="Use os botoes abaixo" mask="###-###-99" />
|
|
287
|
+
|
|
288
|
+
<SgGrid columns={{ base: 1, sm: 3 }} gap={8}>
|
|
289
|
+
<SgButton size="sm" appearance="outline" onClick={() => otpRef.current?.focus()}>Focar</SgButton>
|
|
290
|
+
<SgButton size="sm" appearance="outline" onClick={() => otpRef.current?.clear()}>Limpar</SgButton>
|
|
291
|
+
<SgButton
|
|
292
|
+
size="sm"
|
|
293
|
+
appearance="outline"
|
|
294
|
+
onClick={() => {
|
|
295
|
+
const masked = otpRef.current?.getMaskedValue() ?? "";
|
|
296
|
+
const raw = otpRef.current?.getRawValue() ?? "";
|
|
297
|
+
setReadout(`masked="${masked || "(vazio)"}" | raw="${raw || "(vazio)"}"`);
|
|
298
|
+
}}
|
|
299
|
+
>
|
|
300
|
+
Ler conteudo
|
|
301
|
+
</SgButton>
|
|
302
|
+
</SgGrid>
|
|
303
|
+
|
|
304
|
+
<div className="rounded border border-border bg-muted/40 p-3 text-xs">
|
|
305
|
+
<strong>saida:</strong> {readout}
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
`onComplete` está em `sg-input-otp/samples/colagem-on-complete.tsx.sample`: `onChange` entrega o valor mascarado, `onRawChange` o bruto e `onComplete` dispara quando todos os slots estão cheios.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, component, frontend, react, inputs-texto]
|
|
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 (SgInput*)
|
|
10
|
+
|
|
11
|
+
Este grupo reúne os 15 campos de digitação do pacote `@seedgrid/fe-components` (v`2026.7.1`). Todos estão em `src/inputs/` e todos são exportados pela raiz do pacote. Detalhe de props, eventos e ref: [[SeedGrid/SeedGrid-components/inputs-texto/API|API dos inputs de texto]]. Código: [[SeedGrid/SeedGrid-components/inputs-texto/Exemplos|Exemplos dos inputs de texto]]. Grupos vizinhos: [[SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral|inputs de seleção]], [[SeedGrid/SeedGrid-components/datatable/Visao-geral|SgDatatable]], [[SeedGrid/SeedGrid-components/editor/Visao-geral|SgTextEditor]].
|
|
12
|
+
|
|
13
|
+
## Objetivo
|
|
14
|
+
|
|
15
|
+
Os componentes oferecem campos de formulário prontos, com as seguintes características comuns:
|
|
16
|
+
- rótulo flutuante, no topo ou à esquerda;
|
|
17
|
+
- validação embutida, com mensagens traduzidas;
|
|
18
|
+
- máscaras brasileiras (CPF, CNPJ alfanumérico, telefone, CEP);
|
|
19
|
+
- integração opcional com react-hook-form, por `register` ou por `control`.
|
|
20
|
+
|
|
21
|
+
O padrão de nomes de eventos vem da casa: `onEnter` no foco, `onExit` no blur, `onChange(value)` com o valor já tratado e `onValidation(msg | null)`. **Confirmado**: comentários "padrao seedgrid" nos tipos.
|
|
22
|
+
|
|
23
|
+
## Quando usar cada um
|
|
24
|
+
|
|
25
|
+
| Componente | Use para | Base |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| `SgInputText` | Texto curto livre (nome, título, código). É a base dos demais. | própria |
|
|
28
|
+
| `SgInputTextArea` | Texto longo multilinha, com mínimo de linhas e palavras. | própria (`<textarea>`) |
|
|
29
|
+
| `SgInputTextSearch` | Caixa de busca com debounce (`onSearchChange`). | `SgInputText` |
|
|
30
|
+
| `SgInputEmail` | E-mail com validação de formato e bloqueio de domínios temporários. | `SgInputText` |
|
|
31
|
+
| `SgInputPassword` | Senha com política configurável, barra de força, olho e gerador. | `SgInputText` |
|
|
32
|
+
| `SgInputPhone` | Telefone BR com máscara (10 ou 11 dígitos). | `SgInputText` |
|
|
33
|
+
| `SgInputCPF` | CPF com máscara e dígito verificador. | `SgInputText` |
|
|
34
|
+
| `SgInputCNPJ` | CNPJ numérico ou alfanumérico, com consulta pública opcional. | `SgInputText` |
|
|
35
|
+
| `SgInputCPFCNPJ` | Campo único que aceita CPF ou CNPJ e detecta qual é. | `SgInputText` |
|
|
36
|
+
| `SgInputPostalCode` | CEP/código postal de BR, PT, US, ES, UY, AR e PY, com ViaCEP opcional. | `SgInputText` |
|
|
37
|
+
| `SgInputDate` | Data com o widget nativo (`type="date"`) e limites min/max. | `SgInputText` |
|
|
38
|
+
| `SgInputBirthDate` | Data de nascimento com idade mínima/máxima. | `SgInputDate` |
|
|
39
|
+
| `SgInputNumber` | Número decimal formatado pelo locale, com min/max. | própria |
|
|
40
|
+
| `SgInputCurrency` | Valor monetário com símbolo via `Intl` (padrão BRL). | própria (derivada do código do `SgInputNumber`) |
|
|
41
|
+
| `SgInputOTP` | Código de uso único segmentado, com máscara (`999999`, `###-###`). | própria |
|
|
42
|
+
|
|
43
|
+
Para escolhas fechadas, como combos e listas, use o grupo [[SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral|inputs de seleção]]. Para texto rico, use o [[SeedGrid/SeedGrid-components/editor/Visao-geral|SgTextEditor]]. Esses mesmos encaminhamentos aparecem nos `aiHints.avoidUseCases` de `SgInputText.meta.ts`. **Confirmado**.
|
|
44
|
+
|
|
45
|
+
## Composição
|
|
46
|
+
|
|
47
|
+
```mermaid
|
|
48
|
+
graph TD
|
|
49
|
+
T[SgInputText] --> S[SgInputTextSearch]
|
|
50
|
+
T --> E[SgInputEmail]
|
|
51
|
+
T --> P[SgInputPassword]
|
|
52
|
+
T --> Ph[SgInputPhone]
|
|
53
|
+
T --> CPF[SgInputCPF]
|
|
54
|
+
T --> CNPJ[SgInputCNPJ]
|
|
55
|
+
T --> CC[SgInputCPFCNPJ]
|
|
56
|
+
T --> CEP[SgInputPostalCode]
|
|
57
|
+
T --> D[SgInputDate] --> B[SgInputBirthDate]
|
|
58
|
+
T -.também usado por.-> SEL[SgAutocomplete / SgCombobox / SgMultiSelect]
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
- Os wrappers usam `Omit<SgInputTextProps, …>`, acrescentam as próprias props e repassam o resto ao `SgInputText`. A integração com o RHF fica no `SgInputText`.
|
|
62
|
+
- Cada wrapper mantém **o próprio erro interno** e o passa como `error` ao `SgInputText`, junto com o erro de `fieldState` via `resolveFieldError`. Como o `SgInputText` também valida (required/maxLength…), uma mensagem do wrapper tem precedência sobre a dele. **Confirmado**.
|
|
63
|
+
- `SgInputTextArea`, `SgInputNumber`, `SgInputCurrency` e `SgInputOTP` repetem o padrão visual do `SgInputText`, mas têm implementação própria.
|
|
64
|
+
|
|
65
|
+
## Dependências
|
|
66
|
+
|
|
67
|
+
- **Peers obrigatórios do pacote:**
|
|
68
|
+
- `react` `^18.2.0 || ^19.0.0`;
|
|
69
|
+
- `react-hook-form` `^7.0.0`, importado estaticamente (`Controller`) pelos inputs, mesmo sem uso de formulário;
|
|
70
|
+
- `lucide-react` `^0.468.0 || ^1.0.0` (ícone `X` do botão limpar).
|
|
71
|
+
|
|
72
|
+
**Confirmado** em `package.json` e nos imports.
|
|
73
|
+
- **Peers TipTap:** não são usados por este grupo, mas são carregados pela raiz do pacote. Ver [[SeedGrid/SeedGrid-components/editor/Visao-geral|SgTextEditor]].
|
|
74
|
+
- **Rede:** `SgInputCNPJ` (`validateWithPublicaCnpj`) e `SgInputPostalCode` (`validateWithViaCep`) chamam `fetch` para `publica.cnpj.ws` e `viacep.com.br` por padrão. Ambos aceitam uma função de consulta própria (`publicaCnpjFetch`, `viaCepFetch`).
|
|
75
|
+
- **APIs do navegador:** `SgInputPassword` usa `crypto.getRandomValues` para gerar senha.
|
|
76
|
+
- **"use client":** todos os arquivos começam com `"use client"`, o que serve ao Next.js App Router.
|
|
77
|
+
|
|
78
|
+
## Tema e estilos
|
|
79
|
+
|
|
80
|
+
- O CSS compilado (Tailwind) é **injetado automaticamente** no `<head>` quando o pacote é importado (`ensureSeedgridStylesInjected()` em `src/injectStyles.ts`, chamado no topo de `src/index.ts`). A injeção tem proteção para SSR e para dupla injeção (id `seedgrid-fe-components-styles`). Também existe `@seedgrid/fe-components/style.css` para quem prefere importar o arquivo. **Confirmado**.
|
|
81
|
+
- **Tokens:**
|
|
82
|
+
- Cores via variáveis CSS do tema: `hsl(var(--primary))`, `--destructive`, `--foreground`, `--muted`, `--border`.
|
|
83
|
+
- Variáveis específicas de input, com fallback: `--sg-input-bg`, `--sg-input-fg`, `--sg-input-placeholder`, `--sg-input-disabled-bg`, `--sg-input-disabled-fg`.
|
|
84
|
+
|
|
85
|
+
O pacote `@seedgrid/fe-theme` aparece só como devDependency. A relação exata entre ele e essas variáveis é **Inferência**.
|
|
86
|
+
- **Customização:**
|
|
87
|
+
- Props: `className` (no `SgInputText` **substitui** as classes do input), `labelClassName`, `width`, `borderRadius`, `elevation`, `withBorder`, `filled`.
|
|
88
|
+
- Dark mode do `SgInputDate`: `color-scheme` via `useDarkFlag()`.
|
|
89
|
+
|
|
90
|
+
## Internacionalização
|
|
91
|
+
|
|
92
|
+
- **Provider:** textos padrão vêm de `useComponentsI18n()` (`src/i18n/index.ts`). Locales embutidos: `pt-BR`, `pt-PT`, `en-US` (alias `en`), `es`, `fr`.
|
|
93
|
+
- **Sem provider:** vale o i18n global, que por padrão é **`en-US`**. Para trocar, use `<SgComponentsI18nProvider locale="pt-BR" messages={…}>` ou `setComponentsI18n(...)`. As mensagens passadas sobrescrevem as embutidas, chave por chave.
|
|
94
|
+
- **Chaves deste grupo:** `components.inputs.*`, `components.password.*`, `components.validators.*` e `components.actions.clear`.
|
|
95
|
+
- **Props `*Message`:** sempre têm precedência sobre a tradução.
|
|
96
|
+
|
|
97
|
+
**Confirmado**.
|
|
98
|
+
|
|
99
|
+
## Testes existentes (lidos, **não executados**)
|
|
100
|
+
|
|
101
|
+
- `tests/inputs-dom.test.mjs` (jsdom) cobre:
|
|
102
|
+
- `SgInputText` controlado via `inputProps.value` e via RHF;
|
|
103
|
+
- `onChange` do `SgInputPassword` e o tamanho da senha gerada;
|
|
104
|
+
- asterisco do `SgInputPhone`;
|
|
105
|
+
- debounce, `minChars` e "distinct" do `SgInputTextSearch`.
|
|
106
|
+
- `tests/inputs-i18n.test.mjs`: rótulos de acessibilidade do `SgInputOTP`.
|
|
107
|
+
- `tests/rhf.test.mjs` e `tests/rhf-components-contract.test.mjs`: `resolveFieldError`, `mergeRequiredRule` e presença dos caminhos `register`/`control` no `SgInputTextArea`.
|
|
108
|
+
- `tests/i18n-components-contract.test.mjs`: garante que os componentes usam `t(...)` em vez de texto fixo.
|
|
109
|
+
|
|
110
|
+
O script `test` do pacote roda `pnpm run build` antes.
|
|
111
|
+
|
|
112
|
+
## Limitações e pontos de atenção
|
|
113
|
+
|
|
114
|
+
- `SgInputBirthDate` sem `minAge` nem `maxAge` acusa erro de configuração para qualquer data preenchida. **Confirmado**.
|
|
115
|
+
- `SgInputPassword` tem `maxLength` padrão **15**. `SgInputCPF`, `SgInputCNPJ` e `SgInputCPFCNPJ` têm `maxLength` padrão 18. **Confirmado**.
|
|
116
|
+
- `SgInputCPF`, `SgInputCNPJ`, `SgInputCPFCNPJ`, `SgInputPostalCode`, `SgInputDate` e `SgInputBirthDate` não repassam `required` ao `SgInputText`. Consequências:
|
|
117
|
+
- o rótulo fica sem `*`;
|
|
118
|
+
- as rules do RHF ficam sem `required` automático (a validação interna continua funcionando).
|
|
119
|
+
|
|
120
|
+
`SgInputPhone`, `SgInputEmail` e `SgInputPassword` repassam. **Confirmado** (`required={required}` só aparece nesses três).
|
|
121
|
+
- O erro não é anunciado a leitores de tela no `SgInputText` (sem `aria-invalid`/`aria-describedby`). O `SgToggleSwitch` e o `SgInputOTP` fazem isso. **Confirmado**.
|
|
122
|
+
- Para reagir ao foco, use `onEnter`: o `inputProps.onFocus` não é chamado pelo `SgInputText`. **Confirmado**; ver [[SeedGrid/SeedGrid-components/inputs-texto/API#Contrato base SgInputText|contrato base]].
|
|
123
|
+
- Os tipos de props de `SgInputEmail`, `SgInputPassword`, `SgInputDate` e `SgInputBirthDate` não são reexportados. **Confirmado**.
|