Fintech · Novo recurso

Sistema de design SumUp Circuit.

Um guia do Circuit com tokens semânticos exatos, propriedades nativas de validação, um editor completo de itens para lojistas e uma prévia ilustrada do lado do cliente.

Guia OpenDesign8 capítulos39 entradas de referênciaGuia de aplicação original
01

Prévia da interface do sistema de design SumUp Circuit

Teste valores inválidos, altere o nome do item, ative ou desative o campo de observações e confira um instantâneo local.

Edite um item e confira a prévia para o clienteAbrir exemplo completo
@sumup/circuit-ui 8.15.0 nativo com tema claro CSS de @sumup/design-tokens 7.3.1; editor de itens local original. · Referência de implementação
02

Referência de design do sistema de design SumUp Circuit

@sumup/circuit-ui 8.15.0 nativo com tema claro CSS de @sumup/design-tokens 7.3.1; editor de itens local original.

Superfícies claras e texto para comerciantes

Fonte
Nome / RegraValor / ConfiguraçãoUso
--cui-bg-normal#fffReferência semântica para o tema claro de comerciantes; não use uma cor de superfície como primeiro plano sem confirmar o par previsto para ela.
--cui-bg-subtle#f0f1f5 Referência semântica para o tema claro de comerciantes; não use uma cor de superfície como primeiro plano sem confirmar o par previsto para ela.
--cui-bg-strong#000Referência semântica para o tema claro de comerciantes; não use uma cor de superfície como primeiro plano sem confirmar o par previsto para ela.
--cui-bg-accent-strong#0f131a Referência semântica para o tema claro de comerciantes; não use uma cor de superfície como primeiro plano sem confirmar o par previsto para ela.
--cui-fg-normal#0f131a Referência semântica para o tema claro de comerciantes; não use uma cor de superfície como primeiro plano sem confirmar o par previsto para ela.
--cui-fg-subtle#6a737c Referência semântica para o tema claro de comerciantes; não use uma cor de superfície como primeiro plano sem confirmar o par previsto para ela.
--cui-fg-on-strong#fffReferência semântica para o tema claro de comerciantes; não use uma cor de superfície como primeiro plano sem confirmar o par previsto para ela.
--cui-fg-success#018850 Referência semântica para o tema claro de comerciantes; não use uma cor de superfície como primeiro plano sem confirmar o par previsto para ela.
--cui-fg-danger#de331d Referência semântica para o tema claro de comerciantes; não use uma cor de superfície como primeiro plano sem confirmar o par previsto para ela.
--cui-border-normal#aeb6be Referência semântica para o tema claro de comerciantes; não use uma cor de superfície como primeiro plano sem confirmar o par previsto para ela.

Unidades de espaçamento

Fonte
Nome / RegraValor / ConfiguraçãoUso
--cui-spacings-bit4pxEtapas de espaçamento nomeadas, copiadas da exportação fixada de CSS.
--cui-spacings-byte8pxEtapas de espaçamento nomeadas, copiadas da exportação fixada de CSS.
--cui-spacings-kilo12pxEtapas de espaçamento nomeadas, copiadas da exportação fixada de CSS.
--cui-spacings-mega16pxEtapas de espaçamento nomeadas, copiadas da exportação fixada de CSS.
--cui-spacings-giga24pxEtapas de espaçamento nomeadas, copiadas da exportação fixada de CSS.
--cui-spacings-tera32pxEtapas de espaçamento nomeadas, copiadas da exportação fixada de CSS.
--cui-spacings-peta40pxEtapas de espaçamento nomeadas, copiadas da exportação fixada de CSS.
--cui-spacings-exa48pxEtapas de espaçamento nomeadas, copiadas da exportação fixada de CSS.
--cui-spacings-zetta56pxEtapas de espaçamento nomeadas, copiadas da exportação fixada de CSS.

Raios dos cantos

Fonte
Nome / RegraValor / ConfiguraçãoUso
--cui-border-radius-bit4pxUse as formas de acordo com a função do controle ou da superfície.
--cui-border-radius-byte8pxUse as formas de acordo com a função do controle ou da superfície.
--cui-border-radius-kilo12pxUse as formas de acordo com a função do controle ou da superfície.
--cui-border-radius-mega16pxUse as formas de acordo com a função do controle ou da superfície.
--cui-border-radius-circle100%Use as formas de acordo com a função do controle ou da superfície.
--cui-border-radius-pill999999pxUse as formas de acordo com a função do controle ou da superfície.

Famílias e pesos de fontes

Fonte
Nome / RegraValor / ConfiguraçãoUso
--cui-font-stack-defaultaktiv-grotesk, Helvetica, Arial, system-ui, sans-serif, "Segoe UI", Roboto, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"O exemplo usa fontes alternativas disponíveis; não carrega Aktiv Grotesk.
--cui-font-stack-monoMenlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospaceO exemplo usa fontes alternativas disponíveis; não carrega Aktiv Grotesk.
--cui-font-weight-regular400O exemplo usa fontes alternativas disponíveis; não carrega Aktiv Grotesk.
--cui-font-weight-bold700O exemplo usa fontes alternativas disponíveis; não carrega Aktiv Grotesk.

Estados da ação principal

Fonte
Nome / RegraValor / ConfiguraçãoUso
--cui-bg-accent-strong#0f131a Mantenha estados distintos para normal, ao passar o cursor, pressionado e desativado.
--cui-bg-accent-strong-hovered#3b3f46 Mantenha estados distintos para normal, ao passar o cursor, pressionado e desativado.
--cui-bg-accent-strong-pressed#6a737c Mantenha estados distintos para normal, ao passar o cursor, pressionado e desativado.
--cui-bg-accent-strong-disabledrgba(15, 19, 26, .4)Mantenha estados distintos para normal, ao passar o cursor, pressionado e desativado.

Propriedades públicas de campos e botões

Fonte
Nome / RegraValor / ConfiguraçãoUso
Input.labelrequired stringFinalidade visível do campo.
Input.invalidbooleanEstilo nativo de estado inválido e estado de acessibilidade.
Input.validationHintstringExiba uma instrução específica abaixo do controle.
Button.variantprimary / secondary / tertiaryHierarquia de ações nesta versão fixada.
Button.sizes / mValores de tamanho atuais na versão 8.15.0.
Button.stretchbooleanUse toda a largura do elemento pai para a ação de revisão local.
03

Guia completo do sistema de design SumUp Circuit

Um guia prático para escolher, aplicar e avaliar este sistema em uma interface real.

DESIGN-sumup-circuit.md

Orientações completas, um ponto de partida para a implementação e links para o código-fonte.

Baixar o guia

Composição do editor de comerciantes do sistema de design SumUp Circuit

Separe os dados inseridos pelo comerciante da apresentação para o cliente

O editor de itens e a prévia no estilo de recibo mostram duas visualizações do mesmo estado. Um formulário curto dá nome ao item, define um valor ilustrativo e permite escolher se o campo de observações do cliente será exibido. A prévia demonstra o efeito sem criar um checkout nem solicitar informações de pagamento.

Com base neste guia de OpenDesign

Use uma ilustração original do produto

A imagem com formas geométricas é uma arte original de CSS com descrição acessível. Ela apresenta um objeto reconhecível na prévia do cliente, em vez de um retângulo de imagem vazio, sem recorrer a uma foto falsa de comerciante ou a um recurso de produto copiado da SumUp.

SumUp Circuit Tema semântico e escopo do pacote do sistema de design

Use o tema exato da versão fixada

Este exemplo usa @sumup/circuit-ui 8.15.0 com @sumup/design-tokens 7.3.1. A tabela de referência é lida de light.css desse pacote. A documentação upstream atual passou a usar o namespace @sumup-oss; esta é uma integração reproduzível com versões fixadas, não uma afirmação de que o namespace antigo corresponde à versão mais recente.

Carregue os estilos dos componentes e dos tokens

A entrada de React importa tanto a folha de estilos dos componentes quanto o arquivo de tokens do tema claro. Os nomes de classe dos componentes não bastam quando suas propriedades personalizadas de CSS ainda não foram definidas. Uma paleta escura com escopo próprio também exigiria um tema base completo para fornecer os valores compartilhados que não são de cor.

Superfícies neutras e contraste das ações no sistema de design SumUp Circuit

Mantenha o item como foco visual

O editor usa uma superfície branca e um primeiro plano escuro, enquanto a prévia do cliente fica sobre um fundo neutro sutil. A arte original acrescenta cor controlada à imagem do item, sem prejudicar a legibilidade nem a visibilidade da ação principal nativa.

Deixe claro que a ação da prévia não é interativa

O rodapé voltado ao cliente é um bloco de texto identificado como Somente prévia, não um botão Pagar desativado que dê a impressão de que o checkout está quase funcionando. A única ação real de envio pertence ao editor e serve para revisar um item local. Isso ajuda as pessoas a entender os limites reais de interação deste exemplo.

Tipografia e fontes alternativas do sistema de design SumUp Circuit

Represente a pilha de fontes do tema com precisão

A pilha publicada começa com Aktiv Grotesk e inclui Helvetica, Arial e fontes alternativas do sistema. Este exemplo offline não baixa a primeira fonte. Os componentes nativos Headline e Body ainda oferecem a hierarquia pretendida, enquanto as fontes disponíveis determinam o formato final das letras.

Mantenha o valor e a moeda juntos

Espaçamento e superfícies arredondadas do sistema de design SumUp Circuit

Use a sequência de etapas nomeadas

A escala de tokens usa os nomes bit, byte, quilo, mega e outros maiores. São rótulos de design, não potências de dois. A tabela preserva os valores exatos em pixels para evitar que desenvolvedores inventem uma escala com base nessa metáfora de nomenclatura.

Alinhe as bordas dos controles sem nivelar a hierarquia

O formulário usa um espaçamento vertical consistente e uma ação principal que ocupa toda a largura. A prévia usa uma superfície externa maior e arredondada e um interior menor, no estilo de recibo. Em um celular, a prévia aparece após o formulário, com o espaçamento interno reduzido antes de comprimir os controles.

Validação de itens e estado de rascunho no sistema de design SumUp Circuit

Valide a string completa antes de formatar

O aplicativo aceita de um a cinco dígitos inteiros e até duas casas decimais, com um valor numérico positivo. Esta é uma regra definida para o exemplo. Ela evita que parseFloat aceite uma string parcial, como 24abc, e direciona o foco para o primeiro Input nativo inválido após o envio.

Limpe a revisão desatualizada sempre que houver uma edição

O nome, o valor e a visibilidade das observações invalidam a revisão anterior. O estado de sucesso inclui o nome e o valor do item revisado, ficando assim vinculado a um rascunho concreto. O código não armazena esse resultado em um backend nem cria uma solicitação de pagamento.

Recuperação de erros de campos e semântica da prévia no sistema de design SumUp Circuit

Teste os erros dos dois campos

O nome e o preço do item usam rótulos obrigatórios nativos, estado inválido e validationHint. O código mantém referências aos campos de entrada para devolver o foco ao primeiro campo com erro. É possível testar a recuperação de erros sem inserir dados reais de clientes ou cartões.

  1. Apague o nome e envie para conferir o erro do primeiro campo.
  2. Experimente 24abc ou zero e, em seguida, corrija o valor para 24.50.
  3. Faça a revisão local e edite um campo para descartar o instantâneo desatualizado.

Descreva a ilustração e identifique a prévia estática com precisão

A arte tem uma breve descrição de sua função como imagem. A área de observações do cliente é um texto explicativo dentro de uma prévia identificada explicitamente, não um campo editável falso. A caixa de seleção real para as observações permanece no formulário do comerciante e controla se essa área aparece na prévia.

Integração de SumUp Circuit React e CSS no sistema de design

Inclua as dependências peer públicas e as duas folhas de estilo

A entrada usa React 18 e os componentes Circuit fixados, com dependências peer de tokens, ícones, internacionalização e Emotion que correspondem aos requisitos do pacote. O código importa light.css e styles.css explicitamente. Não depende de um provedor não documentado nem de uma configuração de tema oculta no projeto.

  • Estilos dos componentes de @sumup/circuit-ui 8.15.0.
  • Tema claro completo de @sumup/design-tokens 7.3.1.
  • React 18 e dependências peer declaradas pelo pacote de componentes.

Adicione serviços de pagamento somente em um aplicativo real

Exemplos de componentes do sistema de design SumUp Circuit

main.jsx — exemplo funcional completo

Edite um item e confira a prévia para o cliente. O código abaixo é a entrada completa de React, incluindo todos os estados e validações.

jsx
import React, { useState, useRef } from "react";
import { createRoot } from "react-dom/client";
import { Input, Checkbox, Button, Headline, Body } from "@sumup/circuit-ui";
import "@sumup/design-tokens/light.css";
import "@sumup/circuit-ui/styles.css";
import "./circuit.css";
function App() {
  const [name, setName] = useState("Studio print"),
    [price, setPrice] = useState("24.00"),
    [note, setNote] = useState(true),
    [errors, setErrors] = useState({}),
    [review, setReview] = useState(null);
  const nameRef = useRef(),
    priceRef = useRef();
  const valid = /^\d{1,5}(\.\d{1,2})?$/.test(price) && Number(price) > 0;
  const amount = valid
    ? new Intl.NumberFormat("en-IE", {
        style: "currency",
        currency: "EUR",
      }).format(Number(price))
    : "—";
  function change(fn) {
    fn();
    setReview(null);
    setErrors({});
  }
  function submit(e) {
    e.preventDefault();
    const next = {};
    if (!name.trim()) next.name = "Enter an item name.";
    if (!valid)
      next.price = "Use a positive amount with up to two decimal places.";
    setErrors(next);
    if (next.name) {
      nameRef.current.focus();
      return;
    }
    if (next.price) {
      priceRef.current.focus();
      return;
    }
    setReview({ name: name.trim(), amount, note });
  }
  return (
    <main className="circuit-example">
      <header>
        <p className="eyebrow">MERCHANT TOOLS / LOCAL SPECIMEN</p>
        <Headline as="h1">Prepare a simple item</Headline>
        <Body>
          Review how an item could appear to a customer. This example never
          creates a payment link.
        </Body>
      </header>
      <div className="circuit-grid">
        <form onSubmit={submit} noValidate>
          <h2>Item details</h2>
          <Input
            ref={nameRef}
            label="Item name"
            required
            value={name}
            maxLength={80}
            invalid={!!errors.name}
            validationHint={
              errors.name || "Use a short name the customer can recognize."
            }
            onChange={(e) => change(() => setName(e.target.value))}
          />
          <Input
            ref={priceRef}
            label="Price in EUR"
            required
            inputMode="decimal"
            value={price}
            invalid={!!errors.price}
            validationHint={
              errors.price || "Example amount only; no charge will be made."
            }
            onChange={(e) => change(() => setPrice(e.target.value))}
          />
          <Checkbox
            label="Show a customer note field"
            checked={note}
            onChange={(e) => change(() => setNote(e.target.checked))}
          />
          <Button variant="primary" type="submit" stretch>
            Review item locally
          </Button>
          {review && (
            <div className="review" role="status">
              <strong>Item reviewed</strong>
              <p>
                {review.name} · {review.amount}
              </p>
              <small>
                Local snapshot only. No payment link or charge created.
              </small>
            </div>
          )}
        </form>
        <section className="preview-surface" aria-labelledby="preview-heading">
          <h2 id="preview-heading">Customer-side preview</h2>
          <div className="receipt">
            <div className="shop-mark" aria-hidden="true">
              N
            </div>
            <p className="shop-name">Northstar Studio</p>
            <div
              className="print-art"
              role="img"
              aria-label="Original geometric print illustration"
            >
              <i></i>
              <b></b>
              <span></span>
            </div>
            <h3>{name.trim() || "Your item name"}</h3>
            <p className="receipt-price">{amount}</p>
            {note && (
              <div className="note-placeholder">
                <span>Customer note</span>
                <p>A note field would appear here.</p>
              </div>
            )}
            <div className="preview-action">
              Preview only · checkout unavailable
            </div>
          </div>
        </section>
      </div>
      <footer>
        Native Circuit UI 8.15.0 components and design tokens 7.3.1. Original
        item editor and illustration by OpenDesign.
      </footer>
    </main>
  );
}
createRoot(document.getElementById("root")).render(<App />);

Referência de código

  • Crie um projeto Vite React, mantenha <div id="root"></div> e carregue este arquivo como src/main.jsx.

circuit.css — composição responsiva original

Layout da aplicação organizado em torno dos componentes nativos.

css
* {
  box-sizing: border-box;
}
body {
  margin: 0;
  background: var(--cui-bg-normal);
  color: var(--cui-fg-normal);
  font: 16px/1.5 var(--cui-font-stack-default);
}
.circuit-example {
  padding: 32px;
}
.circuit-example header {
  max-width: 720px;
  margin-bottom: 32px;
}
.eyebrow {
  font-size: 12px;
  letter-spacing: 0.08em;
  margin-bottom: 12px;
  color: var(--cui-fg-subtle);
}
.circuit-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(300px, 1fr);
  gap: 48px;
}
.circuit-example h2 {
  font-size: 20px;
  font-weight: 700;
  margin: 0 0 24px;
}
.circuit-example form {
  max-width: 540px;
  display: flex;
  flex-direction: column;
  gap: 24px;
}
.circuit-example form h2 {
  margin: 0;
}
.preview-surface {
  background: var(--cui-bg-subtle);
  padding: 28px;
  border-radius: 16px;
}
.preview-surface > h2 {
  font-size: 14px;
  color: var(--cui-fg-subtle);
  text-align: center;
}
.receipt {
  max-width: 340px;
  margin: auto;
  background: white;
  border-radius: 12px;
  box-shadow: 0 4px 20px #0000000d;
  padding: 24px;
}
.shop-mark {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: #0f131a;
  color: #fff;
  display: grid;
  place-items: center;
  font-weight: 700;
  margin: auto;
}
.shop-name {
  text-align: center;
  font-size: 14px;
  margin: 12px 0 20px;
}
.print-art {
  height: 150px;
  background: #f5dfbb;
  position: relative;
  overflow: hidden;
  border-radius: 8px;
}
.print-art i {
  position: absolute;
  left: 24px;
  bottom: 0;
  width: 100px;
  height: 130px;
  border-radius: 60px 60px 0 0;
  background: #ce663d;
}
.print-art b {
  position: absolute;
  right: 20px;
  top: 20px;
  width: 90px;
  height: 90px;
  border-radius: 50%;
  background: #385d50;
}
.print-art span {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 24px;
  background: #202e2a;
}
.receipt h3 {
  font-size: 20px;
  line-height: 1.3;
  margin: 20px 0 8px;
  overflow-wrap: anywhere;
}
.receipt-price {
  font-size: 28px;
  font-weight: 700;
  margin: 0 0 24px;
}
.note-placeholder {
  padding: 12px;
  border: 1px solid #bfc6cf;
  border-radius: 8px;
  margin-bottom: 16px;
  font-size: 12px;
}
.note-placeholder span {
  font-weight: 700;
}
.note-placeholder p {
  margin: 4px 0 0;
  color: #4f5a65;
}
.preview-action {
  background: #e9edf2;
  text-align: center;
  border-radius: 999px;
  padding: 12px;
  font-size: 12px;
  color: #4f5a65;
}
.review {
  padding: 20px;
  background: #e7f5ef;
  border-radius: 8px;
}
.review p {
  margin: 8px 0;
}
.review small {
  font-size: 12px;
}
.circuit-example footer {
  font-size: 12px;
  color: var(--cui-fg-subtle);
  margin-top: 32px;
}
@media (max-width: 850px) {
  .circuit-grid {
    grid-template-columns: 1fr;
    gap: 32px;
  }
  .circuit-example form {
    max-width: none;
  }
}
@media (max-width: 550px) {
  .circuit-example {
    padding: 20px 16px;
  }
  .preview-surface {
    padding: 20px;
  }
  .receipt {
    padding: 20px;
  }
}

Referência de código

  • Salve junto de main.jsx. Estas regras de composição personalizadas são distintas da referência de tokens da biblioteca.
04

Configuração do agente de IA do sistema de design SumUp Circuit

Ponto de partida para implementação

O exemplo nativo com versões fixadas foi empacotado e verificado localmente no navegador. O exemplo usa apenas o estado local da aplicação.

sh
npm create vite@latest circuit-item -- --template react
cd circuit-item
npm install
npm install [email protected] [email protected] @sumup/[email protected] @sumup/[email protected] @sumup/icons @sumup/intl@1 @emotion/react @emotion/styled @emotion/is-prop-valid
# Replace src/main.jsx and add src/circuit.css.
npm run dev

Um prompt para seu projeto

Prompt para agente de IA
Crie um editor de itens do Circuit usando os controles nativos fixados e as duas folhas de estilo obrigatórias. Valide strings de valor completas, preserve a formatação da moeda, limpe a revisão local desatualizada após edições e mantenha a prévia do cliente distinta de um checkout real. Use a ilustração original e as funções semânticas exatas dos tokens.
05

Fontes e escopo do sistema de design SumUp Circuit

Guia da aplicação OpenDesign para uma geração específica do pacote Circuit. A ilustração, o valor e o item são exemplos. Este editor local não cria links de pagamento nem cobranças, e não realiza ações na conta SumUp; os pacotes upstream atuais usam o namespace mais recente @sumup-oss.