Template personalizado vs. bloco Custom code
- Um template personalizado substitui a renderização de um bloco existente pela sua própria marcação e entrega a você os dados daquele bloco (o título e a contagem de itens do Header, os totais do Summary e assim por diante). Ele não adiciona nada novo; ele reestiliza um bloco.
- O bloco Custom code adiciona um novo bloco de HTML ou React arbitrário em qualquer lugar do carrinho.
Usando um template personalizado
- Selecione um bloco no editor e abra sua aba Code.
- Edite o template padrão. Templates personalizados são somente JSX (a escolha entre HTML ou JSX é exclusiva do bloco Custom code).
- Clique em Compile. Compilar remove os tipos e transpila o JSX, então captura erros de sintaxe. Erros de tipo não impedem a compilação — o editor os marca inline conforme você digita, com o mesmo IntelliSense que faz autocompletar das props do bloco.
- Ative o template para que o carrinho o use em vez da renderização nativa.
- Reset to default restaura o template original do bloco a qualquer momento.
Escrevendo um template com IA
- As regras de compilação (expressão única, sem
export default, sem imports) - As props exatas que o bloco recebe, correspondendo ao que o IntelliSense do editor mostra
- A assinatura de função travada que o editor impõe
- Regras específicas do bloco (formatos de dinheiro, quais handlers conectar, requisitos de acessibilidade)
- Uma seção para preencher, onde você cola seu template atual e descreve a mudança que quer
O prompt é específico de cada bloco. O botão Copy AI prompt só aparece em blocos que suportam templates personalizados.
O que seu template substitui
O que você mantém: a posição do bloco no carrinho, seu botão de visibilidade, suas configurações (que continuam alimentando as props que você recebe), o painel de Custom CSS do carrinho e o skeleton de carregamento nativo.
Esse último surpreende as pessoas. O bloco verifica se o carrinho ainda está carregando antes de chegar ao seu template, então o skeleton nativo é renderizado durante o carregamento e seu template só executa quando o carrinho está pronto. Você não precisa construir um estado de carregamento.
O que está disponível dentro de um template
- Você tem cinco hooks:
useState,useEffect,useMemo,useRefeuseCallback. MaisFragment, para<>…</>. - Não há imports. Você não pode fazer
importde nada, e não há objetoReactno escopo, então nada deReact.useReducernemReact.Children. Se um hook não está na lista acima, ele não está disponível. - As props são somente leitura. Mutar uma prop não vai fazer nada útil. Para alterar o carrinho, use as props de handler que o bloco fornece (
onClose,increment,selectPlane assim por diante) em vez de escrever nas props diretamente. windowé alcançável, então um template pode chamar o Cart SDK viawindow.aftersell.cartquando precisa de algo que as props do bloco não cobrem.
Convenções em todos os blocos
- Props
*Htmlsão rich text pré-sanitizado. Renderize-as comdangerouslySetInnerHTML. Elas já passaram pelo sanitizador do carrinho, e tokens do lojista como{{total_price}}já estão resolvidos. - Preços que chegam como
stringjá estão formatados no formato de dinheiro da loja. Preços comonumberestão em centavos. Um bloco fornece um ou outro, e a tabela de cada bloco diz qual. isLoadingé semprefalsedentro de um template. O bloco renderiza seu skeleton nativo e só chama seu template quando o carrinho carregou, então a prop é passada por completude, não para você ramificar sobre ela.
Alguns blocos não retornam nada em certos estados, então seu template nunca é chamado com dados vazios. O template do Rewards nunca vê um
milestones vazio, e o template do Subscription upgrade nunca vê um view nulo. A referência de cada bloco indica onde isso se aplica, para que você possa pular a ramificação de estado vazio.Estilizando um template personalizado
As duas famílias de classes
Então
cart-internal-header__title é o que faz o título parecer com o título nativo, e cart-external-header__title é a alça que você deve agarrar quando quer mudar sua aparência.
Mudanças pequenas: mantenha os dois nomes de classe
cart-external-*.
Reestruturação: descarte os dois nomes de classe
cart-internal-* porque o CSS nativo foi escrito para o DOM nativo. Mantenha essas classes em uma marcação reestruturada e você herda regras de layout que pressupõem elementos que você não tem mais: contêineres flex esperando filhos diferentes, espaçamento entre elementos que se moveram, posicionamento relativo a algo que você removeu. Isso geralmente aparece como o seu próprio CSS “não funcionando” quando as regras nativas são as que estão vencendo.
Duas formas de estilizar o que você construiu:
Opção 1: seus próprios nomes de classe mais Custom CSS
.header ou .title corre o risco de colidir com as classes do próprio carrinho, com o template de outro app ou com um bloco futuro.
Opção 2: estilos inline
:hover ou outras pseudoclasses, sem media queries e sem reutilização entre blocos. Recorra à Opção 1 quando quiser qualquer uma dessas coisas.
Escolhendo uma abordagem
O carrinho é renderizado em um shadow root, então a folha de estilos do seu tema não consegue alcançar seu interior. Os estilos de um template personalizado precisam vir do painel Custom CSS do próprio carrinho ou de estilos inline, não do seu tema. Veja CSS personalizado.
Quando um template falha
Como o bloco desaparece silenciosamente em vez de mostrar um erro visível, sempre verifique um template na pré-visualização antes de publicar. Se um bloco sumiu, abra o console do navegador primeiro.
Duas coisas que vale a pena proteger, já que ambas quebram um template que pressupõe o contrário:
- Props anuláveis. Muitas props são
nullem condições normais (logoUrlsem logo,imageUrlsem imagem,variantTitleem um produto de variante única). Verifique antes de usá-las. - Arrays que podem estar vazios.
discountTagsediscountCodessão[]na maioria das vezes.
Limitações
- Templates personalizados são substituições de exibição. Para executar lógica no carrinho (assinar eventos, adicionar itens, reagir a mudanças), use Scripts personalizados e o Cart SDK.
- Quase todo bloco suporta um. As exceções são o bloco Express payments, que hospeda os botões de pagamento da própria Shopify, e o contêiner Cart items em si, embora a linha Product dentro dele suporte um template personalizado.
- Um template não pode mudar o que um bloco fundamentalmente faz. Ele muda como os dados do bloco são apresentados, não os dados ou o comportamento por trás deles.
Props de cada bloco
O bloco Custom code é a única superfície que adiciona marcação em vez de substituir a renderização de um bloco, então suas props são diferentes: o carrinho inteiro, mais uma ação de adicionar ao carrinho. Veja Blocos Custom code → Props.