Направление слайда гамбургер-меню

Всем привет! Я пытаюсь настроить (на мобильных устройствах) панель с «гамбургером», чтобы она выезжала справа, точно так же, как это настроено для панели профиля. Я вижу, что для панели «гамбургер» существует правило left: 0. Я поправлял CSS, но не смог воспроизвести поведение панели профиля, которая выезжает слева. По-видимому, в CSS не так много специфичных правил для панели «гамбургер», поэтому я точно не понимаю, чего мне не хватает.

Буду признателен за любые советы или подсказки, чего именно я могу не замечать! Спасибо всем.

Привет, Лукас, добро пожаловать в Meta :wave:

Здесь задействовано не так много CSS. Анимация обрабатывается через CSS, но значения смещения задаются в JavaScript для обработки случая, когда пользователь прокручивает или перемещает меню вправо или влево, чтобы закрыть его.

Большая часть этой логики находится здесь — это лишь один метод; в этом файле задействовано ещё несколько:
discourse/app/assets/javascripts/discourse/app/components/site-header.js at 8a250a1eac9032485e7d367f93e6ac418014e2ff · discourse/discourse · GitHub

Также есть логика, обрабатывающая случай, когда пользователь кликает по затемнённому фону, чтобы закрыть меню.

Для меню пользователя:

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

Для гамбургер-меню:

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

Изменение логики, чтобы гамбургер-меню открывалось и закрывалось справа, потребует двух шагов.

  1. Модифицируйте компонент site-header с помощью ModifyClass, чтобы все меню открывались с правой стороны. В настоящее время он проверяет наличие класса у меню, поэтому мы просто переопределим это следующим образом:

    api.modifyClass("component:site-header", {
      pluginId: "right-side-mobile-hamburger",
      _leftMenuClass() {
        // нам не нужны левые меню, поэтому возвращаем false
        return false;
      }
    });
    
  2. При закрытии меню мы также хотим, чтобы оно закрывалось вправо. Для событий прокрутки/перемещения это уже обрабатывается приведённым выше фрагментом. Теперь нужно исправить случай, когда пользователь кликает по затемнённому фону. Discourse принимает решение на основе того, использует ли сайт язык с направлением справа налево (RTL). Чтобы изменить это, нам понадобится другой метод plugin-api, поскольку панель гамбургера является виджетом.

    Метод, который мы будем использовать, — reopenWidget, вот так:

     api.reopenWidget("hamburger-menu", {
      clickOutsideMobile() {
        // применяем код из ядра
        this._super(...arguments);
    
        // затем вносим изменение, чтобы меню закрывалось вправо
        const panel = document.querySelector(".menu-panel");
        const windowWidth = document.body.offsetWidth;
        panel.style.setProperty("--offset", `${windowWidth}px`);
      }
    });
    

Затем вам останется лишь добавить несколько строк CSS, чтобы переопределить стили по умолчанию для этого меню:

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

Теперь соберём всё вместе. Этот код размещается во вкладке mobile > header вашей темы:

<script type="text/discourse-plugin" version="0.8">
api.modifyClass("component:site-header", {
  pluginId: "right-side-mobile-hamburger",
  _leftMenuClass() {
    // нам не нужны левые меню, поэтому возвращаем false
    return false;
  }
});

api.reopenWidget("hamburger-menu", {
  clickOutsideMobile() {
    // применяем код из ядра
    this._super(...arguments);

    // затем вносим изменение, чтобы меню закрывалось вправо
    const panel = document.querySelector(".menu-panel");
    const windowWidth = document.body.offsetWidth;
    panel.style.setProperty("--offset", `${windowWidth}px`);
  }
});
</script>

А этот код — во вкладке mobile > CSS:

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

После сохранения темы и обновления страницы гамбургер-меню на мобильных устройствах будет открываться и закрываться справа — точно так же, как меню пользователя.

Вот это называется дать полный ответ. Молодец!

Великолепно! Большое спасибо за подробный ответ, Джо! Уровень обслуживания клиентов — высший балл, я под впечатлением и очень благодарен.