Reportagens e pesquisa sobre Shopify e e-commerce
O hero do Horizon tem 36 configurações de secção e 8 tipos de bloco que somam mais 104, e o seu menu de Altura muda de rem para svh à medida que o ecrã cresce. Lido do código-fonte do tema no commit 8b42ace.
O Horizon é o tema que a Shopify entrega às lojas novas, e a sua secção Hero é a primeira coisa em que a maioria dos comerciantes mexe. O editor de temas mostra um menu de Altura com seis opções e um espaço para imagem. Não diz que três dessas opções mudam de unidade de medida consoante a largura do ecrã, nem que “Large” aqui significa algo completamente diferente de “Large” no Dawn.
Como chegámos a estes números. A 1 de setembro de 2026 lemos o repositório público Shopify/horizon no commit 8b42ace (2026-08-31) — o Horizon não publica releases nem tags, por isso o commit é a versão. Retirámos o schema de configurações e as escalas de srcset de sections/hero.liquid, 1496 linhas; as variáveis de altura de snippets/theme-styles-variables.liquid; e as regras da secção de assets/base.css. As descrições dos blocos foram resolvidas a partir da biblioteca partilhada blocks/ do tema, porque o schema do hero apenas os nomeia. Todos os valores foram extraídos desses ficheiros por script.
Esta é a parte que surpreende as pessoas. O Horizon não tem uma altura por opção — tem três, ao longo de dois breakpoints, e a unidade muda:
| Configuração | Mobile | ≥40em | ≥60em |
|---|---|---|---|
| Small | 15rem = 240px | 40svh | 50svh |
| Medium | 25rem = 400px | 55svh | 65svh |
| Large | 35rem = 560px | 70svh | 80svh |
Abaixo de 40em as alturas são fixas em rem. Acima disso passam a svh, a unidade de small viewport height — uma percentagem do ecrã visível. Ou seja, num telemóvel um hero Large tem uns fixos 560px de altura, e num desktop largo tem 80% do que quer que seja a janela do visitante.
Mais duas alturas ignoram a tabela por completo. full-screen define 100svh. custom expõe um slider, section_height_custom, que vai de 0 a 100% com predefinição de 50 — e esse valor também é escrito diretamente como svh, não em píxeis.
Ambos os temas oferecem um hero Large. Não são comparáveis, por duas razões distintas.
A base do rem é diferente. Pesquisámos todos os ficheiros do tema: o Horizon nunca substitui o tamanho de letra raiz, por isso 1rem é a predefinição do browser, 16px. O Dawn define font-size: calc(var(--font-body-scale) * 62.5%), o que torna 1rem em 10px. Os mesmos 35rem significariam 560px no Horizon e 350px no Dawn.
A unidade é diferente acima do breakpoint. O Large do Dawn são uns fixos 720px no desktop, iguais em todos os ecrãs. O Large do Horizon são 80svh, por isso cresce com o ecrã: cerca de 720px numa janela de 900px de altura e cerca de 1152px numa de 1440px.
Se está a transportar um design entre os dois temas, esta é a configuração com maior probabilidade de o quebrar.
O Horizon constrói um srcset a partir de duas escalas fixas no código, nas linhas 103 e 105 da secção:
| Escala | Intervalo | Passos | Larguras pedidas |
|---|---|---|---|
| Media de largura total | 832–3840px | 6 | 832, 1200, 1600, 1920, 2560, 3840 |
| Media dividida | 416–1600px | 5 | 416, 600, 800, 1200, 1600 |
Carregue 3840px de largura para um hero que ocupe toda a página. A escala mais estreita termina nos 1600px porque aí cada imagem ocupa sempre apenas parte da largura.
Repare no degrau mais baixo: o Horizon começa nos 832px onde o Dawn começa nos 375px. O Horizon simplesmente não serve uma versão do tamanho de telemóvel de uma imagem hero de largura total, o que vale a pena saber se o seu tráfego é maioritariamente mobile e em ligações lentas.
O Dawn descreve os seus blocos dentro do schema da secção. O Horizon nomeia-os e guarda as descrições numa biblioteca partilhada, por isso ler apenas sections/hero.liquid não diz nada sobre o que um bloco pode fazer. Resolvidos, os 8 tipos somam 104 configurações entre si:
| Tipo | Nome | Configurações | Definido em |
|---|---|---|---|
@theme | — | 0 | wildcard |
text | Texto | 19 | blocks/text.liquid |
button | Botão | 12 | blocks/button.liquid |
logo | Logo | 15 | blocks/logo.liquid |
jumbo-text | Texto jumbo | 9 | blocks/jumbo-text.liquid |
spacer | Espaçador | 7 | blocks/spacer.liquid |
group | Grupo | 36 | blocks/group.liquid |
_marquee | Marquee | 6 | blocks/_marquee.liquid |
@theme é um wildcard: aceita qualquer bloco do tema, e é por isso que não tem configurações próprias. group é o mais pesado, com 36 configurações, porque é um contentor de layout que repete a maior parte dos controlos de alinhamento e espaçamento da própria secção um nível abaixo.
Para ter noção da escala: o banner de imagem do Dawn oferece 3 tipos de bloco com 12 configurações no total. O hero do Horizon oferece 8 com 104. É essa a verdadeira diferença entre os dois temas, e não é visível em lado nenhum no editor de temas.
36 configurações, tal como aparecem no editor:
| ID no código | Etiqueta no editor | Tipo | Predefinição | Intervalo / opções |
|---|---|---|---|---|
media_type_1 | Tipo | select | image | 2 opções |
image_1 | Imagem | image_picker | — | — |
video_1 | Vídeo | video | — | — |
media_type_2 | Tipo | select | image | 2 opções |
image_2 | Imagem | image_picker | — | — |
video_2 | Vídeo | video | — | — |
stack_media_on_mobile | Empilhar media | checkbox | false | — |
custom_mobile_media | Mostrar media diferente no mobile | checkbox | false | — |
media_type_1_mobile | Tipo | select | image | 2 opções |
image_1_mobile | Imagem | image_picker | — | — |
video_1_mobile | Vídeo | video | — | — |
media_type_2_mobile | Tipo | select | image | 2 opções |
image_2_mobile | Imagem | image_picker | — | — |
video_2_mobile | Vídeo | video | — | — |
link | Link | url | — | — |
open_in_new_tab | Abrir link num separador novo | checkbox | false | — |
content_direction | Direção | select | column | 2 opções |
vertical_on_mobile | Vertical no mobile | checkbox | true | — |
horizontal_alignment | Alinhamento | select | flex-start | 4 opções |
vertical_alignment | Posição | select | center | 3 opções |
align_baseline | Alinhar linha de base do texto | checkbox | false | — |
horizontal_alignment_flex_direction_column | Alinhamento | select | flex-start | 3 opções |
vertical_alignment_flex_direction_column | Posição | select | center | 4 opções |
gap | Espaçamento | range | 12 | 0–100px, passo 1 |
section_width | Largura | select | page-width | 2 opções |
section_height | Altura | select | medium | 6 opções |
section_height_custom | Altura personalizada | range | 50 | 0–100%, passo 1 |
background_color | Cor de fundo | color | — | — |
toggle_overlay | Overlay de media | checkbox | — | — |
overlay_color | Cor do overlay | color | #00000026 | — |
overlay_style | Estilo do overlay | select | solid | 2 opções |
gradient_direction | Direção do gradiente | select | to top | 2 opções |
blurred_reflection | Reflexo desfocado | checkbox | false | — |
reflection_opacity | Opacidade do reflexo | range | 75 | 0–100%, passo 1 |
padding-block-start | Topo | range | 0 | 0–100px, passo 1 |
padding-block-end | Fundo | range | 0 | 0–100px, passo 1 |
Vale a pena destacar:
Quatro configurações de alinhamento separadas. horizontal_alignment e vertical_alignment aplicam-se quando o conteúdo flui em linha; horizontal_alignment_flex_direction_column e vertical_alignment_flex_direction_column aplicam-se quando empilha. Mude uma e a outra mantém o valor antigo, que é a razão habitual para um hero ficar bem no desktop e mal no mobile.
reflection_opacity — um slider de 0 a 100%, predefinição 75, emparelhado com blurred_reflection. O Dawn não tem equivalente.
Quatro espaços para imagem e quatro para vídeo. O hero recebe media duas vezes — desktop e um conjunto mobile separado por trás de custom_mobile_media, que está predefinido como false.
Abra sections/hero.liquid e leia o bloco {% schema %} no fim para ver as configurações. As alturas estão nas linhas 143 a 157 de snippets/theme-styles-variables.liquid. As descrições dos blocos estão em blocks/ — um ficheiro por tipo, com o nome exato da coluna type acima.
O Horizon não tem releases, por isso não há número de versão para citar. Esta página nomeia antes o commit a partir do qual foi lida; se o tema mudar, estes valores mudam com ele.
3840px de largura para um hero de largura total. O Horizon pede 6 larguras, de 832px a 3840px. Para media dividida usa uma segunda escala de 5 larguras que termina nos 1600px, por isso 1600px chega nesse caso.
No mobile as opções fixas são 240px, 400px e 560px. Acima de 40em passam a 40svh, 55svh e 70svh, e acima de 60em a 50svh, 65svh e 80svh. Full-screen são 100svh e Custom é um slider lido diretamente como svh.
Por duas razões. O Horizon nunca substitui o tamanho de letra raiz, por isso 1rem são os 16px predefinidos do browser, enquanto o Dawn define 62.5% e obtém 10px. E acima do breakpoint o Horizon mede em svh, uma percentagem da janela, enquanto o Dawn mantém um valor fixo.
36 na própria secção, mais 8 tipos de bloco que somam 104 configurações entre si. As configurações dos blocos não estão no ficheiro da secção — o Horizon guarda-as numa biblioteca blocks/ partilhada.
Num ficheiro por tipo de bloco dentro de blocks/ no tema. O schema do hero lista apenas os nomes dos tipos, por isso ler só a secção mostra blocos sem configuração nenhuma. A entrada @theme é um wildcard que aceita qualquer bloco do tema.