Direção de slide do menu Hamburger

Ei, pessoal! Estou tentando configurar (em dispositivos móveis) o painel hambúrguer para deslizar a partir do lado direito da tela, exatamente como o painel de perfil está configurado. Vejo que existe uma regra left: 0 específica para o painel hambúrguer. Tenho ajustado o CSS, mas não consegui replicar o comportamento de deslizar para a esquerda do painel de perfil. Parece não haver muito CSS específico para o painel hambúrguer, então não tenho certeza do que estou perdendo.

Agradeceria qualquer dica ou insight sobre o que posso estar esquecendo aqui! Obrigado a todos.

Olá Lukas, bem-vindo ao Meta :wave:

Não há muito CSS envolvido aqui. A animação é tratada com CSS, mas os valores do deslocamento são definidos em JavaScript para lidar com o caso em que o usuário rola ou desliza para a direita ou para a esquerda para fechar os menus.

A maior parte dessa lógica está aqui — isso é apenas um método; há alguns outros envolvidos naquele arquivo:
discourse/app/assets/javascripts/discourse/app/components/site-header.js at 8a250a1eac9032485e7d367f93e6ac418014e2ff · discourse/discourse · GitHub

Também há alguma lógica que trata o caso em que o usuário clica no fundo escurecido para fechar os menus.

Para o menu do usuário:

discourse/app/assets/javascripts/discourse/app/widgets/user-menu.js at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub

Para o menu hambúrguer:

discourse/app/assets/javascripts/discourse/app/widgets/hamburger-menu.js at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub

Alterar isso para que o menu hambúrguer abra e feche na direita envolverá duas coisas.

  1. Modificar o componente site-header com ModifyClass para que ele abra todos os menus pelo lado direito. Atualmente, ele verifica uma classe no menu, então simplesmente sobrescrevemos isso assim:

    api.modifyClass("component:site-header", {
      pluginId: "right-side-mobile-hamburger",
      _leftMenuClass() {
        // não queremos nenhum menu à esquerda, então retornamos false
        return false;
      }
    });
    
  2. Ao fechar o menu, também queremos que ele feche pelo lado direito. Para o evento de rolagem/deslize, isso já é tratado pelo trecho de código acima. Agora precisamos corrigir o caso em que o usuário clica no fundo escurecido. O Discourse decide isso com base em se o site usa ou não um idioma RTL. Para modificar isso, precisamos de um método diferente da plugin-api, já que o painel do hambúrguer é um widget.

    O método que vamos usar é reopenWidget, assim:

     api.reopenWidget("hamburger-menu", {
      clickOutsideMobile() {
        // aplica o código do núcleo
        this._super(...arguments);
    
        // então faça sua alteração para que ele feche pelo lado direito
        const panel = document.querySelector(".menu-panel");
        const windowWidth = document.body.offsetWidth;
        panel.style.setProperty("--offset", `${windowWidth}px`);
      }
    });
    

Agora tudo o que você precisa fazer é adicionar algumas linhas de CSS para sobrescrever os estilos padrão daquele menu, assim:

.hamburger-panel,
.user-menu {
  .menu-panel.slide-in {
    left: unset;
    right: 0;
  }
}

Agora, vamos juntar tudo isso. Isso vai na aba mobile > header do seu tema:

<script type="text/discourse-plugin" version="0.8">
api.modifyClass("component:site-header", {
  pluginId: "right-side-mobile-hamburger",
  _leftMenuClass() {
    // não queremos nenhum menu à esquerda, então retornamos false
    return false;
  }
});

api.reopenWidget("hamburger-menu", {
  clickOutsideMobile() {
    // aplica o código do núcleo
    this._super(...arguments);

    // então faça sua alteração para que ele feche pelo lado direito
    const panel = document.querySelector(".menu-panel");
    const windowWidth = document.body.offsetWidth;
    panel.style.setProperty("--offset", `${windowWidth}px`);
  }
});
</script>

E isso vai na aba mobile > CSS.

.hamburger-panel,
.user-menu {
  .menu-panel.slide-in {
    left: unset;
    right: 0;
  }
}

Depois de salvar o tema e atualizar a página, o menu hambúrguer abrirá e fechará pelo lado direito no mobile — exatamente como o menu do usuário.

Isso sim é fornecer uma resposta completa. Muito bem!

Incrível! Muito obrigado pela resposta detalhada, Joe! Atendimento ao cliente nota A+, estou impressionado e muito grato.