Base de estilos
O SCSS de um componente é compilado junto com a base de estilos da loja. Conhecer o que já está disponível evita duplicação e garante resultados consistentes.
Escala de unidades: 1rem = 10px
Seção intitulada “Escala de unidades: 1rem = 10px”A base define html { font-size: 62.5% }. Isso significa que 1rem equivale a 10px em toda a loja.
| Pixels | Em rem |
|---|---|
| 10px | 1rem |
| 12px | 1.2rem |
| 14px | 1.4rem |
| 16px | 1.6rem |
| 24px | 2.4rem |
| 32px | 3.2rem |
| 48px | 4.8rem |
Use rem para valores de espaçamento e tipografia. Isso mantém o componente dentro da escala relativa da loja.
Classes de imagem e proporção
Seção intitulada “Classes de imagem e proporção”As classes .image e .video implementam o container de proporção via pseudo-elemento ::after. Use-as para garantir que o espaço da imagem seja reservado antes do carregamento.
<figure class="image -horizontal"> <img class="lazy" loading="lazy" data-src="{{ banner.file_url }}" alt="{{ banner.title }}" /></figure>Variantes disponíveis
Seção intitulada “Variantes disponíveis”| Classe | Proporção aproximada |
|---|---|
.-square | 1:1 |
.-horizontal | ~16:7 |
.-vertical | ~1:1.5 |
Para uma proporção personalizada, sobrescreva padding-bottom no SCSS do componente:
.meu-banner .image::after { padding-bottom: 56.25%; // proporção 16:9}A imagem dentro do container deve ser posicionada de forma absoluta para preencher o espaço:
.meu-banner .image img { position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover;}Para vídeos embed, prefira aspect-ratio - é o padrão moderno e funciona bem sem o pseudo-elemento:
.meu-video .video { aspect-ratio: 16 / 9; overflow: hidden; position: relative;}.meu-video .video iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%;}Lazyload
Seção intitulada “Lazyload”A loja inclui lazyload automático via VanillaLazyLoad. Para que uma imagem seja carregada de forma lazy:
- Use
data-srcno lugar desrc(oudata-srcsetpara imagens responsivas). - Adicione
class="lazy"eloading="lazy"ao elemento<img>.
<img class="lazy" loading="lazy" data-src="{{ produto.image_url }}" alt="{{ produto.name }}"/>Quando a imagem entrar no viewport, o lazyload adiciona data-lazy-loaded="true" e move data-src para src. A base já inclui a transição de opacidade:
// já declarado na base - não redeclare.lazy { opacity: 0; transition: var(--transition); }.lazy.loaded,.lazy[data-lazy-loaded="true"] { opacity: 1; }Imagens acima da dobra (primeiras do carrossel ou do grid, visíveis sem rolar) devem usar src normal para não atrasar o LCP da página:
{% for product in products %} {% if forloop.index <= 2 %} <img src="{{ product.image_url }}" alt="{{ product.name }}" /> {% else %} <img class="lazy" loading="lazy" data-src="{{ product.image_url }}" alt="{{ product.name }}" /> {% endif %}{% endfor %}Variáveis CSS disponíveis
Seção intitulada “Variáveis CSS disponíveis”As variáveis abaixo estão disponíveis no escopo do SCSS de qualquer componente. Use-as se quiser aproveitar o sistema do tema da loja; ou defina seus próprios valores quando o design do componente exigir.
var(--primary-color) // cor principal da lojavar(--secondary-color) // cor secundáriavar(--white) // #fffvar(--black) // #03060Bvar(--gray-1) // #f9f9f9 - fundo suavevar(--gray-2) // #c3c3c3 - bordas e placeholdersvar(--gray-3) // #707070 - texto secundáriovar(--gray-4) // #363636 - texto de destaquevar(--red) // #ff0000 - erros e alertasvar(--white-transparency) // #ffffffb3Tipografia
Seção intitulada “Tipografia”// Tamanhos de títulovar(--font-size-title-small) // 2.4remvar(--font-size-title-medium) // 3.2remvar(--font-size-title-large) // 4.8remvar(--font-size-title-xlarge) // 5.6remvar(--font-size-title-hero) // 7.2rem
// Tamanhos de textovar(--font-size-text-small) // 1.2remvar(--font-size-text-medium) // 1.4remvar(--font-size-text-large) // 1.6remvar(--font-size-text-xlarge) // 1.8rem
// Pesosvar(--font-weight-base) // 400var(--font-weight-title) // 700var(--font-weight-subtitle) // 600var(--font-weight-button) // 600
// Cores de fontevar(--font-color-base) // #03060Bvar(--font-color-title) // #03060BEspaçamentos
Seção intitulada “Espaçamentos”var(--spacing-small) // 1.6remvar(--spacing-medium) // 3.2remvar(--spacing-large) // 4.8remvar(--spacing-xlarge) // 6.4remTransição
Seção intitulada “Transição”var(--transition) // all 0.4s easeImagem de produto
Seção intitulada “Imagem de produto”var(--product-image-height) // proporção definida pela loja (usado em .image::after)var(--product-image-fit) // object-fit definido pela loja