Menus (desktop, submenu e mobile)
Os 3 menus têm modelos Personalizado independentes: ative só o que for personalizar. Todos são manuais puros (@foreach + CSS próprio, sem componentes).Menu desktop: barra horizontal (só ≥1200px). INÍCIO + 5 primeiras categorias com dropdown CSS no hover + MAIS CATEGORIAS com o restante (offset 5). O botão some sozinho sem excedente (regra :has() no CSS; sem suporte, degrada para botão visível). Some se o menu estiver desativado na loja — proteja com @if(feature('mostrar_menu_categorias')).
Submenu desktop: mega-menu das subcategorias (grupos com título, "Ver Tudo", imagem e contagem). Independente: aparece dentro do menu fixo; no menu desktop personalizado o dropdown vive no próprio template (não há inclusão automática).
Menu mobile: drawer lateral à esquerda com overlay, visual espelhando o Modelo 3 (header com Início, linhas 42px com ícone/contagem/chevron, divisor, seção "Acesso e suporte"). Abre no hambúrguer, fecha no X, no overlay ou com Escape. Subcategorias com accordion (data-fz-toggle). A seção de categorias respeita o menu da loja; busca e atalhos sempre aparecem. Minha conta usa link('account') (sem cadastro + deslogado, a linha fica inativa).
Links de categoria levam class="link-categoria" + data-categoria-id/nome/superior para navegar sem recarregar a página.Exemplos prontos#
@if(feature('mostrar_menu_categorias'))
<a href="{{ link('home') }}">INÍCIO</a>
@foreach(categories as category limit 5)
<a href="{{ category.url }}">{{ category.name }}</a>
@endforeach
@endif
@if(feature('mostrar_menu_categorias'))
@foreach(categories as category)
@foreach(category.subcategories as subcategory)
<a href="{{ subcategory.url }}">{{ subcategory.name }}</a>
@endforeach
@endforeach
@endif
<strong>{{ store.name }}</strong>
@foreach(categories as category)
<a href="{{ category.url }}">{{ category.name }}</a>
@endforeach
<a href="{{ link('lancamentos') }}">Lançamentos</a>
<a href="{{ link('mais_vendidos') }}">Mais vendidos</a>
<a href="{{ link('promocoes') }}">Promoções</a>
<a href="{{ link('novidades_semana') }}">Novidades da semana</a>
@foreach(categories as category)
<a href="{{ category.url }}">
<img src="{{ category.image_thumb }}" alt="{{ category.name }}" loading="lazy">
{{ category.name }}
</a>
@endforeach
Padrões CSS prontos#
Todos usam só CSS escopado (sem JavaScript próprio):Cabeçalho fixo no topo: .fz-custom-header { position: sticky; top: 0; z-index: 1000; } — gruda no scroll sem cobrir o conteúdo global (não use position: fixed com body, que é bloqueado).
Dropdown do menu desktop: container position: relative + submenu position: absolute; top: 100%; left: 0; display: none; + container:hover submenu { display: block; } — mesmo padrão dos modelos fixos, puro :hover.
Drawer mobile: o painel leva data-fz-drawer + position: fixed; top: 0; left: 0; height: 100dvh; width: min(86vw, 340px); z-index: 9998; transform: translateX(-102%); e a regra [data-fz-drawer].open { transform: none; }, com overlay em z-index: 9997. A abertura/fechamento usa o mecanismo da plataforma: botão com data-fz-action="menu-mobile" alterna a classe open no painel (o X, o clique no overlay e o Escape já vêm prontos; enquanto aberto, o body recebe fz-menu-mobile-starter-open). Mantenha-se abaixo de 10000 para não cobrir modais da plataforma (carrinho, busca, políticas) — diferente dos drawers fixos (que ficam acima de tudo, ~999998), o drawer custom abre esses recursos por cima dele.
Resto além das 5 primeiras#
@foreach(categories as category offset 5)
<a href="{{ category.url }}">{{ category.name }}</a>
@endforeach
Modificado em 2026-09-09 02:01:40