Roadmap
Avançado

Ecommerce em 2024

O jeito mais moderno de criar um ecommerce

tailwind
vercel
github
medusajs
render
nuxt

Para começar a fazer as páginas vamos criar dois layouts, um layout que terá o cabeçalho e o rodapé como todo site hoje em dia e mais um layout com tudo em branco.

Você pode criar quantos layouts quiser, desde que siga as regras da documentação do Nuxt.

Salvando algumas imagens necessárias para o projeto

Abra essa imagem, baixe e renomeie para hero.png, depois disso salve dentro da pasta ecommerce-storefront/public.

Agora abra essa logo, baixe e renomeie para logo.svg, depois disso salve também dentro da pasta ecommerce-storefront/public.

Fique à vontade para usar uma outra logo no projeto, encontre logos gratuitas aqui.

Criando o componente de rodapé

Dentro da pasta medusa-storefront/components crie um arquivo chamado Footer.vue e cole o seguinte código:

Footer.vue
<script setup lang="ts">
const client = useMedusaClient();
const { product_categories } = await client.productCategories.list();
const { collections } = await client.collections.list();
</script>

<template>
  <footer class="bg-zinc-50">
    <div class="container py-20 mt-20 grid grid-cols-[repeat(auto-fill,_minmax(280px,_1fr))] gap-4 gap-y-10">
      <div>
        <img src="/logo.svg" height="20" class="h-[20px] w-auto pr-4" />
      </div>
      <div class="text-sm space-y-4">
        <div class="font-medium">
          Categorias
        </div>
        <div v-for="category in product_categories" :key="category.id">
          <nuxt-link :to="`/categorias/${category.id}`" class="hover:underline text-zinc-500 hover:text-zinc-900 transition">
            {{ category.name }}
          </nuxt-link>
        </div>
      </div>
      <div class="text-sm space-y-4">
        <div class="font-medium">
          Coleções
        </div>
        <div v-for="collection in collections" :key="collection.id">
          <nuxt-link :to="`/colecoes/${collection.id}`" class="hover:underline text-zinc-500 hover:text-zinc-900 transition">
            {{ collection.title }}
          </nuxt-link>
        </div>
      </div>
    </div>
  </footer>
</template>
Clique aqui para expandir

Para entender um pouquinho mais, nós só estamos buscando as categorias da nossa loja com a função client.productCategories.list() e as coleções com a função client.collections.list().

Essas funções são do Medusa Client para deixar todas as requisições fortemente tipadas.

Com os dados retornados da api nós estamos estilizando o rodapé com tailwind e fazendo um v-for para listar todas as coleções e categorias da loja.

Criando o layout com cabeçalho e rodapé

Na raiz do projeto medusa-storefront crie uma pasta chamada layouts e dentro dela crie um arquivo default.vue. Dentro desse arquivo cole o seguinte código:

default.vue
<template>
  <main>
    <div class="flex items-center justify-center py-3 px-4 fixed top-0 left-0 w-full pointer-events-none z-10">
      <div class="rounded-full py-2 px-6 bg-white border border-zinc-200 shadow-sm flex items-center gap-2 pointer-events-auto">
        <img src="/logo.svg" height="20" class="h-[20px] w-auto pr-4" />
        <nuxt-link to="/" active-class="[&>*]:font-bold">
          <Button variant="ghost" size="sm">
            Início
          </Button>
        </nuxt-link>
        <nuxt-link to="/categorias" active-class="[&>*]:font-bold">
          <Button variant="ghost" size="sm">
            Categorias
          </Button>
        </nuxt-link>
        <nuxt-link to="/carrinho" active-class="[&>*]:font-bold">
          <Button variant="ghost" size="sm">
            Carrinho
          </Button>
        </nuxt-link>
      </div>
    </div>
    <slot />
    <Footer />
  </main>
</template>
Clique aqui para expandir

Nesse código nós adicionamos a parte do cabeçalho que mostra três itens no menu: "Início", "Categorias" e "Carrinho".

Criando o layout em branco

Agora dentro da pasta layouts, crie um arquivo blank.vue e cole o seguinte código:

blank.vue
<template>
  <main>
    <slot />
  </main>
</template>
Clique aqui para expandir

Esse layout será utilizado para as páginas que não precisam de cabeçalho e rodapé, como a página de checkout.

Atualizando o arquivo raiz do projeto nuxt

Vá no arquivo app.vue dentro da pasta medusa-storefront e atualize com o seguinte código:

app.vue
<template>
  <NuxtLayout class="text-zinc-950 bg-white">
    <NuxtPage />
  </NuxtLayout>
</template>
Clique aqui para expandir

Nesse código a gente só preparou o projeto Nuxt para começar a aceitar os arquivos de layout que adicionamos anteriormente.

Opa, calma aí!

Parece que você não está logado, caso tenha interesse em salvar seu progresso de estudo faça login agora.