SWCore
SWCore / Componentes / Contador de caracteres

Contador de caracteres Componentes

Um contador embaixo do campo que mostra quanto já foi escrito — fica amarelo perto do limite e vermelho se passar. <textarea sw-textlimit sw-textlimit-max='160'>.

O que é

Sabe o campo de "Mensagem" ou "Descrição do produto" que só aceita um tanto de letras? O contador mostra, enquanto a pessoa digita, quantos caracteres ela já usou e quantos ainda cabem — "42/160" ou "Faltam 118 caracteres". Você só coloca sw-textlimit no campo e diz o limite em sw-textlimit-max.

Um JavaScript pequeno do núcleo cria um <span class="sw-textlimit-cnt"> logo depois do campo e atualiza o texto a cada tecla. Ele também coloca o maxlength no campo com o mesmo número, então o navegador não deixa digitar além do limite. A cor muda sozinha: normal → amarelo quando faltam 20% ou menos → vermelho se o texto já veio maior que o limite. Funciona em <textarea> e em <input>, no tema claro e no escuro.

Quando usar

  • Mensagem de contato ou pedido de orçamento com tamanho máximo — a pessoa vê quanto ainda pode escrever.
  • Título e descrição para Google/redes (título até 60, descrição até 160): o contador evita texto cortado.
  • Bio de perfil, recado, depoimento — qualquer texto curto com limite.
  • Painel admin: resumo de produto, chamada de banner, texto de SMS/WhatsApp.

Comece aqui

  1. 1

    Coloque o SWCore na página (uma vez só, vale para todos os componentes): o CSS no <head> e o JS no fim do <body>. O contador precisa dos dois.

    <link rel="stylesheet" href="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.css">
    
    <!-- fim do <body> -->
    <script src="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.js"></script>
  2. 2

    Coloque sw-textlimit no campo e o limite em sw-textlimit-max. Digite no campo abaixo e olhe o contador.

    <div sw-fld>
      <label for="mensagem">Sua mensagem</label>
      <textarea sw-inp id="mensagem" sw-textlimit sw-textlimit-max="160"></textarea>
    </div>
  3. 3

    Quer outro texto no contador? Use sw-textlimit-txt com as palavras-chave {count}, {max} e {remaining}.

    <div sw-fld>
      <label for="descricao">Descrição para o Google</label>
      <input sw-inp id="descricao" sw-textlimit sw-textlimit-max="160"
             sw-textlimit-txt="Faltam {remaining} caracteres">
    </div>

Todas as variações

Cada quadro abaixo é o componente de verdade, rodando. O código embaixo é exatamente o que está no quadro: copie e cole.

1. Texto do contador

O texto é um molde: você escreve a frase e coloca as palavras-chave entre chaves. {count} = quantos já foram digitados, {max} = o limite, {remaining} = quantos ainda cabem. Sem sw-textlimit-txt ele mostra {count}/{max}.

Padrão — {count}/{max} <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="140" placeholder="Digite aqui…"></textarea> </div>
Quanto falta — {remaining} <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="140" sw-textlimit-txt="Faltam {remaining} caracteres" placeholder="Digite aqui…"></textarea> </div>
Frase completa — {count} de {max} <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="140" sw-textlimit-txt="{count} de {max} usados" placeholder="Digite aqui…"></textarea> </div>
Só o que resta, curtinho <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="140" sw-textlimit-txt="{remaining}" placeholder="Digite aqui…"></textarea> </div>

2. Posição do contador

Por padrão o contador fica à direita, embaixo do campo. sw-textlimit-align aceita left, center e right. O atalho sw-textlimit-center (sem valor) centraliza o contador e também o texto digitado dentro do campo.

Padrão — à direita <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="120" placeholder="Contador à direita"></textarea> </div>
sw-textlimit-align="left" <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="120" sw-textlimit-align="left" placeholder="Contador à esquerda"></textarea> </div>
sw-textlimit-align="center" <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="120" sw-textlimit-align="center" placeholder="Contador no meio"></textarea> </div>
sw-textlimit-center — contador e texto no meio <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="120" sw-textlimit-center placeholder="Tudo centralizado"></textarea> </div>

3. Cores automáticas

Você não configura nada: a cor muda sozinha conforme o texto. Os quadros abaixo já nascem com texto dentro para mostrar cada cor.

Normal — longe do limite <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="200">Corte + barba com hora marcada. Atendimento até as 20h.</textarea> </div>
Amarelo — faltam 20% ou menos <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="60">Corte + barba com hora marcada. Atendimento até as 20h.</textarea> </div>
Vermelho — texto maior que o limite <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="70">Promoção de inauguração: 20% de desconto em todos os serviços da casa nesta semana!</textarea> </div>

4. Tipos de campo

Funciona em caixa de texto grande (<textarea>) e em campo de uma linha (<input>). Se o campo já tiver maxlength, pode deixar sem sw-textlimit-max: ele usa o maxlength. Sem nenhum dos dois, o limite é 150.

Em textarea <div sw-fld> <textarea sw-inp="p" sw-textlimit sw-textlimit-max="300" placeholder="Depoimento do cliente"></textarea> </div>
Em input de uma linha <div sw-fld><input sw-inp sw-textlimit sw-textlimit-max="60" placeholder="Título da página"></div>
Usando o maxlength do campo <div sw-fld><input sw-inp maxlength="30" sw-textlimit placeholder="Nome de exibição"></div>
Sem limite escrito — vale 150 <div sw-fld><textarea sw-inp="p" sw-textlimit placeholder="Recado"></textarea></div>

5. Dentro de um campo com rótulo

Combine com o campo do SWCore (sw-fld) para ter rótulo em cima e contador embaixo, alinhado com o formulário.

sw-fld + textarea com contador
<div sw-fld>
  <label for="bio">Bio do perfil</label>
  <textarea sw-inp id="bio" sw-textlimit sw-textlimit-max="150"
            sw-textlimit-txt="{count}/{max} — cabe no Instagram"></textarea>
</div>

Tabela de opções

PalavraO que fazExemplo
Ligar
sw-textlimitLiga o contador no campo. Não leva valor.<textarea sw-textlimit>
Limite
sw-textlimit-maxQuantos caracteres cabem. Também vira o maxlength do campo. Se faltar, usa o maxlength do campo; se faltar os dois, 150.sw-textlimit-max="160"
Texto do contador
sw-textlimit-txtA frase do contador. Padrão: {count}/{max}.sw-textlimit-txt="Faltam {remaining}"
{count}Vira o número de caracteres já digitados.{count}/{max}
{max}Vira o limite.{count} de {max}
{remaining}Vira quantos ainda cabem.Faltam {remaining}
Posição
(nenhum)Contador à direita, embaixo do campo.
sw-textlimit-alignleft, center ou right.sw-textlimit-align="center"
sw-textlimit-centerAtalho sem valor: centraliza o contador e o texto dentro do campo.<textarea sw-textlimit sw-textlimit-center>
Cor (automática)
is-aleClasse que o JS coloca no contador quando faltam 20% ou menos: fica amarelo.
is-errClasse que o JS coloca quando o texto passou do limite: fica vermelho.

Receitas prontas — usos reais

Situações que aparecem em quase todo site. Copie a que servir.

Formulário de contato com mensagem limitada Ao vivo
<form sw-frm action="/contato" method="post">
  <div sw-fld>
    <label for="nome">Seu nome</label>
    <input sw-inp id="nome" name="nome">
  </div>
  <div sw-fld>
    <label for="msg">Mensagem</label>
    <textarea sw-inp id="msg" name="msg" sw-textlimit sw-textlimit-max="500"
              sw-textlimit-txt="Faltam {remaining} caracteres"></textarea>
  </div>
  <button type="submit" sw-btn="pri">Enviar mensagem</button>
</form>
Painel admin: título e descrição para o Google Ao vivo
<div sw-fld>
  <label for="seo-titulo">Título da página</label>
  <input sw-inp id="seo-titulo" name="seo_titulo" sw-textlimit sw-textlimit-max="60">
</div>
<div sw-fld>
  <label for="seo-desc">Descrição</label>
  <textarea sw-inp="p" id="seo-desc" name="seo_desc" sw-textlimit sw-textlimit-max="160"></textarea>
</div>
Recado curto centralizado (cartão de presente) Ao vivo
<div sw-fld>
  <label for="cartao">Mensagem do cartão</label>
  <textarea sw-inp id="cartao" sw-textlimit sw-textlimit-max="90"
            sw-textlimit-center sw-textlimit-txt="{count} de {max}"></textarea>
</div>
Campo criado depois (via JavaScript) Referência
// O SWCore percebe sozinho HTML novo na página e liga o contador.
// Se você trocou o conteúdo de uma área inteira com innerHTML e o
// contador não apareceu, peça para ele olhar aquela área de novo:
area.innerHTML = '<textarea sw-textlimit sw-textlimit-max="200"></textarea>';
SW.reinit(area);

API (JavaScript)

SW.Textlimit.initAll(raiz)
Liga o contador em todo [sw-textlimit] dentro de raiz que ainda não tenha. Normalmente você não precisa chamar: o núcleo faz sozinho.
SW.reinit(raiz)
Reinicia todos os componentes de uma área (inclui o contador). Use depois de colocar HTML novo com innerHTML.

Precisa de quê

  • swcore.min.css — o visual do contador.
  • swcore.min.js — cria e atualiza o contador.

Cuidados — erros comuns

  • Esquecer o swcore.min.js: sem o JS o campo funciona, mas o contador não aparece.
  • Escrever as palavras-chave com outra grafia ({total}, {restante}) — elas aparecem escritas do jeito que estão. As únicas que funcionam são {count}, {max} e {remaining}.
  • Usar a mesma palavra-chave duas vezes na frase: só a primeira é trocada pelo número.
  • Trocar o texto do campo por JavaScript (campo.value = "…") não atualiza o contador sozinho. Depois de mudar, dispare o evento: campo.dispatchEvent(new Event("input")).
  • O sw-textlimit-center centraliza também o texto digitado. Se quiser só o contador no meio, use sw-textlimit-align="center".

O que ele não faz

  • Ele conta caracteres, não palavras.
  • O limite do navegador (maxlength) só impede a digitação. Texto que já veio preenchido no HTML ou foi colocado por JavaScript pode passar do limite — o contador fica vermelho, mas não corta. Confira o tamanho também no servidor.
  • Mudar sw-textlimit-max depois que a página abriu não tem efeito: o limite é lido uma vez, quando o contador é criado.