npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@clickmax/browser-sdk

v10.6.8-hotfix.4

Published

SDK de navegador da Clickmax: forms (captura de leads) e tracking (eventos anônimos).

Downloads

3,540

Readme

@clickmax/browser-sdk

SDK de navegador da Clickmax para captura pública de leads.

Ele foi feito para dois cenários:

  • você quer colar um script no site e deixar a Clickmax cuidar do formulário
  • você já tem seu próprio formulário e quer usar apenas uma função JS para enviar o lead

Como escolher

Quero a forma mais simples

Use o bundle via script tag.

Bom para:

  • landing pages
  • Webflow
  • WordPress
  • sites estáticos
  • integrações rápidas

Já tenho meu frontend

Use submitLead() via @clickmax/browser-sdk/forms.

Bom para:

  • apps próprios
  • formulários customizados
  • fluxos em que sua UI já existe

Modo 1: Script Tag

O bundle global inclui:

  • widget renderizado
  • bind de formulários existentes
  • modal
  • auto-init
  • estilos padrão
<script
  src="https://cdn.jsdelivr.net/npm/@clickmax/browser-sdk@latest/dist/forms/clickmax-forms.js"
  defer
></script>

<script>
  async function sendLead() {
    await window.Clickmax.submitLead({
      slug: "abc123",
      data: {
        email: "[email protected]",
        name: "Maria",
      },
    });
  }
</script>

Widget inline

<script
  src="https://cdn.jsdelivr.net/npm/@clickmax/browser-sdk@latest/dist/forms/clickmax-forms.js"
  defer
></script>

<div
  data-cx-form-widget
  data-cx-slug="abc123"
  data-cx-mode="inline"
  data-cx-theme="light"
  data-cx-accent="#111827"
  data-cx-title="Fale com nosso time"
  data-cx-description="Deixe seus dados e entraremos em contato."
></div>

Widget em modal

<script
  src="https://cdn.jsdelivr.net/npm/@clickmax/browser-sdk@latest/dist/forms/clickmax-forms.js"
  defer
></script>

<button data-cx-open="form-contato">Abrir formulário</button>

<div
  data-cx-form-widget
  data-cx-widget-id="form-contato"
  data-cx-slug="abc123"
  data-cx-mode="modal"
  data-cx-title="Solicite contato"
></div>

Usando seu próprio HTML

Se você quer manter seu markup, o script também consegue conectar formulários existentes:

<script
  src="https://cdn.jsdelivr.net/npm/@clickmax/browser-sdk@latest/dist/forms/clickmax-forms.js"
  defer
></script>

<form
  data-cx-ingest-form
  data-cx-slug="abc123"
  data-cx-success-message="Enviado com sucesso!"
>
  <input data-cx-field="name" placeholder="Seu nome" />
  <input data-cx-field="email" placeholder="Seu e-mail" />
  <input data-cx-field="telephone" placeholder="Seu telefone" />
  <input type="checkbox" data-cx-field="lgpdApproved" />
  <input type="text" data-cx-field="website" hidden />
  <button type="submit">Enviar</button>
</form>

O data-cx-field pode ficar no próprio <input> ou em um elemento pai/wrapper próximo. Isso ajuda em builders como Framer, onde o atributo customizado costuma ser aplicado no contêiner do campo em vez do controle nativo.

Se o seu builder também registra listeners próprios de submit e você quer que a SDK assuma o envio sozinha, adicione data-cx-hijack-form no <form>. Nesse modo, a SDK registra o listener em capture phase e interrompe outros listeners de submit do mesmo fluxo.

Se você quiser levar os dados já preenchidos para a próxima página no redirect, adicione data-cx-redirect-with-query. Nesse modo, a SDK acrescenta name, email, phone, utm_source, utm_medium, utm_campaign, utm_content e utm_term na query string final.

Meio-termo: comportamento da SDK com sua própria estilização

Se você quer manter o comportamento em JavaScript da SDK, mas prefere não usar os estilos dela, adicione data-cx-nostyles.

Esse modo mantém:

  • submit
  • validação
  • redirect
  • success/error
  • comportamento de modal

Mas deixa de aplicar as classes visuais da SDK.

<script
  src="https://cdn.jsdelivr.net/npm/@clickmax/browser-sdk@latest/dist/forms/clickmax-forms.js"
  defer
></script>

<form
  data-cx-ingest-form
  data-cx-slug="abc123"
  data-cx-nostyles
  data-cx-success-message="Enviado com sucesso!"
>
  <input data-cx-field="name" placeholder="Seu nome" />
  <input data-cx-field="email" placeholder="Seu e-mail" />
  <input data-cx-field="telephone" placeholder="Seu telefone" />
  <button type="submit">Enviar</button>
</form>

Modo 2: API JavaScript

Use esse modo quando a sua interface já existe e você quer controlar tudo por conta própria.

import { submitLead } from "@clickmax/browser-sdk/forms";

await submitLead({
  slug: "abc123",
  data: {
    email: "[email protected]",
    name: "Lead Example",
    telephone: "5511999999999",
  },
});

Exemplo com tratamento de erro

import { submitLead } from "@clickmax/browser-sdk/forms";

try {
  await submitLead({
    slug: "abc123",
    data: {
      email: "[email protected]",
      name: "Maria",
    },
  });

  console.log("Lead enviado com sucesso");
} catch (error) {
  console.error("Não foi possível enviar o lead", error);
}

Atributos suportados

| Atributo | Onde usar | Descrição | | ----------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------- | | data-cx-slug | Formulários existentes, widget renderizado | Slug público do ingest link. | | data-cx-api-url | Formulários existentes, widget renderizado | Override opcional da base da API. | | data-cx-nostyles | Formulários existentes, widget renderizado | Mantém o comportamento JS sem aplicar classes visuais da SDK. | | data-cx-hijack-form | Formulários existentes | Faz a SDK assumir exclusivamente o submit do form. | | data-cx-redirect-url | Formulários existentes, widget renderizado | Redirect local configurado no HTML. Tem prioridade sobre o redirect do CRM. | | data-cx-redirect-with-query | Formulários existentes, widget renderizado | Acrescenta name, email, phone e as UTM da página na query string do redirect final. | | data-cx-success-message | Formulários existentes, widget renderizado | Mensagem exibida após envio com sucesso. | | data-cx-reset-on-success | Formulários existentes, widget renderizado | Reseta o form após sucesso quando ativo. | | data-cx-locale | Formulários existentes, widget renderizado | Localização usada pela SDK (pt-BR ou en). | | data-cx-mode="inline\|modal" | Widget renderizado | Define se o widget abre inline ou em modal. | | data-cx-widget-id | Widget renderizado | Identificador usado pelos gatilhos data-cx-open. | | data-cx-theme="light\|dark\|auto" | Widget renderizado | Tema visual do widget. | | data-cx-accent | Widget renderizado | Cor principal do widget. | | data-cx-title | Widget renderizado | Título do widget. | | data-cx-description | Widget renderizado | Descrição do widget. | | data-cx-submit-label | Widget renderizado | Texto do botão de submit. | | data-cx-fields | Widget renderizado | Lista CSV dos campos renderizados. | | data-cx-required-fields | Widget renderizado | Lista CSV dos campos obrigatórios. | | data-cx-show-lgpd | Widget renderizado | Exibe o checkbox LGPD. | | data-cx-lgpd-required | Widget renderizado | Torna o checkbox LGPD obrigatório. |

Campos suportados no form

| Atributo | Onde usar | Descrição | | ------------------------------ | -------------------------------------- | -------------------------- | | data-cx-field="name" | Input, select, textarea ou wrapper pai | Mapeia o nome do lead. | | data-cx-field="email" | Input, select, textarea ou wrapper pai | Mapeia o e-mail do lead. | | data-cx-field="telephone" | Input, select, textarea ou wrapper pai | Mapeia o telefone do lead. | | data-cx-field="lgpdApproved" | Input checkbox ou wrapper pai | Mapeia a aprovação LGPD. | | data-cx-field="website" | Input hidden ou wrapper pai | Honeypot anti-spam. |

O atributo pode estar no campo nativo ou em um wrapper pai, desde que esse wrapper envolva o input/select/textarea correspondente.

O que o script faz automaticamente

Quando você usa o bundle global, ele inicializa apenas estes seletores:

  • [data-cx-form-widget]
  • form[data-cx-ingest-form]

Em páginas CSR, como Framer, ele também observa o DOM e inicializa esses mesmos seletores quando eles aparecerem depois do carregamento inicial.

Ou seja: nada de comportamento implícito fora do que estiver marcado explicitamente.

Comportamentos importantes

UTM

  • os parâmetros UTM da página são enviados junto com o lead quando presentes

Anti-spam

  • o campo website funciona como honeypot
  • se ele vier preenchido, o envio é ignorado

Redirect

  • você pode configurar redirect via data-cx-redirect-url
  • se esse atributo não existir, a SDK usa o redirectUrl configurado no ingest link do CRM
  • quando os dois existirem, data-cx-redirect-url tem prioridade
  • por padrão não adicionamos parâmetros sensíveis na URL

Quando usar cada abordagem

Use script tag quando:

  • quer colocar para rodar rápido
  • quer usar o widget pronto
  • quer reaproveitar HTML simples sem escrever JS

Use submitLead() quando:

  • seu app já controla validação, loading e erros
  • você quer integrar com sua própria UI
  • você não quer nenhum comportamento automático de DOM

Tracking

Além dos formulários, a SDK publica um bundle independente de tracking que dispara eventos anônimos (clicks em botões, submits, scroll, visibilidade, page view) para o pages-server da Clickmax. Funciona em páginas externas (Webflow, WP, sites estáticos) e não depende do bundle de forms.

<script
  src="https://cdn.jsdelivr.net/npm/@clickmax/browser-sdk@latest/dist/tracking/clickmax-tracking.js"
  data-cx-api-url="https://api.clickmax.io/tracking"
  data-cx-track-clicks
  data-cx-track-scroll="25,50,75,90"
  data-cx-track-visibility
  data-cx-pixel-fb
  defer
></script>

Atributos do script

| Atributo | Default | Descrição | | -------------------------- | ----------- | ----------------------------------------------------------------------- | | data-cx-api-url | same-origin | Base URL do pages-server. Obrigatório para páginas externas. | | data-cx-track-clicks | ligado | Captura clicks em .cm-checkout-button, [data-cx-track="click"]. | | data-cx-track-scroll | desligado | Thresholds de scroll em %, separados por vírgula (ex.: 25,50,75,90). | | data-cx-track-visibility | desligado | Dispara eventos ao entrar na viewport ([data-cx-track="visibility"]). | | data-cx-pixel-fb | desligado | Ecoa eventos para o Facebook Pixel se fbq estiver presente. |

O que é enviado

Cada evento vira um POST (via navigator.sendBeacon com fallback para fetch keepalive) com Content-Type: application/vnd.clickmax.tracking+json. Bots são descartados no servidor.

Forms + Tracking em um único script

Se você quer forms e tracking na mesma página, dá para carregar os dois bundles em uma única requisição usando o endpoint combine do jsDelivr:

<script
  src="https://cdn.jsdelivr.net/combine/npm/@clickmax/browser-sdk@latest/dist/forms/clickmax-forms.js,npm/@clickmax/browser-sdk@latest/dist/tracking/clickmax-tracking.js"
  data-cx-api-url="https://api.clickmax.io/tracking"
  data-cx-track-clicks
  defer
></script>

Os atributos data-cx-* do tracking continuam funcionando normalmente na própria tag combinada. Os bundles são independentes (window.Clickmax para forms, window.ClickmaxTracking para tracking) e não colidem.

Use bundles separados quando a página precisa apenas de tracking — o bundle de forms traz CSS e ~13 KB extras que não serão usados.

Seletores reconhecidos

| Seletor | Evento | | ------------------------------ | ----------------- | | .cm-checkout-button | button_click | | [data-cx-track="click"] | button_click | | .cm-next-funnel-node | link_click | | [data-cx-track="link"] | link_click | | form.cm-form (submit) | form_submit | | [data-cx-track="visibility"] | element_visible |