diff --git a/src/componentes/EliInput/EliInput.vue b/src/componentes/EliInput/EliInput.vue new file mode 100644 index 0000000..96c1b91 --- /dev/null +++ b/src/componentes/EliInput/EliInput.vue @@ -0,0 +1,256 @@ + + + + + diff --git a/src/componentes/EliInput/README.md b/src/componentes/EliInput/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/componentes/EliInput/index.ts b/src/componentes/EliInput/index.ts new file mode 100644 index 0000000..d616913 --- /dev/null +++ b/src/componentes/EliInput/index.ts @@ -0,0 +1,4 @@ +import EliInput from "./EliInput.vue"; + +export { EliInput }; +export default EliInput; diff --git a/src/componentes/EliInput/utils/cpfCnpj.ts b/src/componentes/EliInput/utils/cpfCnpj.ts new file mode 100644 index 0000000..8e66ac1 --- /dev/null +++ b/src/componentes/EliInput/utils/cpfCnpj.ts @@ -0,0 +1,24 @@ +function somenteNumeros(v: string): string { + return v.replace(/\D+/g, ""); +} + +export function formatarCpfCnpj(v: string): string { + const d = somenteNumeros(v); + + // CPF + if (d.length <= 11) { + return d + .replace(/(\d{3})(\d)/, "$1.$2") + .replace(/(\d{3})(\d)/, "$1.$2") + .replace(/(\d{3})(\d{1,2})$/, "$1-$2") + .slice(0, 14); + } + + // CNPJ + return d + .replace(/^(\d{2})(\d)/, "$1.$2") + .replace(/^(\d{2})\.(\d{3})(\d)/, "$1.$2.$3") + .replace(/\.(\d{3})(\d)/, ".$1/$2") + .replace(/(\d{4})(\d)/, "$1-$2") + .slice(0, 18); +} diff --git a/src/componentes/EliInput/utils/numerico.ts b/src/componentes/EliInput/utils/numerico.ts new file mode 100644 index 0000000..45b30f7 --- /dev/null +++ b/src/componentes/EliInput/utils/numerico.ts @@ -0,0 +1,17 @@ +export function somenteNumeros(valor: string) { + return valor.replace(/\D+/g, ""); +} + +export function formatarDecimal(valor: string) { + const limpo = valor.replace(/[^\d,]/g, ""); + const partes = limpo.split(","); + return partes.length > 2 ? partes[0] + "," + partes.slice(1).join("") : limpo; +} + +export function formatarMoeda(valor: string) { + const numero = somenteNumeros(valor); + if (!numero) return ""; + + const inteiro = (parseInt(numero, 10) / 100).toFixed(2); + return inteiro.replace(".", ",").replace(/\B(?=(\d{3})+(?!\d))/g, "."); +} diff --git a/src/componentes/EliInput/utils/telefone.ts b/src/componentes/EliInput/utils/telefone.ts new file mode 100644 index 0000000..66fbd46 --- /dev/null +++ b/src/componentes/EliInput/utils/telefone.ts @@ -0,0 +1,31 @@ +// utils/telefone.ts + +/** + * Remove tudo que não é número + */ +export function sanitizeTelefone(value: string): string { + return value.replace(/\D+/g, ""); +} + +/** + * Aplica máscara dinâmica de telefone BR + */ +export function formatTelefone(value: string): string { + const digits = sanitizeTelefone(value); + + if (!digits) return ""; + + // (99) 9999-9999 + if (digits.length <= 10) { + return digits + .replace(/^(\d{2})(\d)/, "($1) $2") + .replace(/(\d{4})(\d)/, "$1-$2") + .slice(0, 14); + } + + // (99) 99999-9999 + return digits + .replace(/^(\d{2})(\d)/, "($1) $2") + .replace(/(\d{5})(\d)/, "$1-$2") + .slice(0, 15); +} diff --git a/src/componentes/EliOlaMundo/EliOlaMundo.vue b/src/componentes/EliOlaMundo/EliOlaMundo.vue index 7949159..f947815 100644 --- a/src/componentes/EliOlaMundo/EliOlaMundo.vue +++ b/src/componentes/EliOlaMundo/EliOlaMundo.vue @@ -1,23 +1,136 @@ diff --git a/src/index.ts b/src/index.ts index ccf79eb..2892810 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,15 +2,18 @@ import type { App } from "vue"; import { EliOlaMundo } from "./componentes/EliOlaMundo"; import { EliBotao } from "./componentes/EliBotao"; import { EliBadge } from "./componentes/EliBadge"; +import { EliInput } from "./componentes/EliInput"; export { EliOlaMundo }; export { EliBotao }; export { EliBadge }; +export { EliInput }; export default { install(app: App) { app.component("EliOlaMundo", EliOlaMundo); app.component("EliBotao", EliBotao); app.component("EliBadge", EliBadge); + app.component("EliInput", EliInput); }, }; diff --git a/src/playground/App.vue b/src/playground/App.vue index c5b1ec5..ab71d04 100644 --- a/src/playground/App.vue +++ b/src/playground/App.vue @@ -1,33 +1,16 @@