Список (для ul и ol)

Особенности

  1. Проставление иконки у пунктов.
    Путь к иконке берет из атрибута "data-ico"
  2. Переключение списка когда список с типом выбора слева.
JS
Код
      const appList = (function () {
    const lists = document.querySelectorAll('.list');
    return {
        init: function() {
            if (lists) {
                lists.forEach(list => {
                    this.addIcons(list);
                    if (list.classList.contains("list-type-left")) {
                        this.listTypeLeft(list);
                    }
                });
            }
        },

        listTypeLeft: function(list) {
            const firstElement = list.querySelector('.list__item');
            firstElement.classList.add('is-hover');
            if (firstElement.querySelector('.list-level-0')) {
                list.closest(".list-wrapper").querySelector(".list-type-left-content").appendChild(firstElement.querySelector(".list-level-0").cloneNode(true));
            }
            list.querySelectorAll('.list__item .list__title a').forEach(link => {
                link.addEventListener("mouseenter", e => {
                    list.querySelectorAll('.list__item .list__title a').forEach(link => {
                        link.closest('.list__item').classList.remove('is-hover');
                    });
                    e.currentTarget.closest('.list__item').classList.add('is-hover');
                    list.closest('.list-wrapper').querySelector(".list-type-left-content").innerHTML = "";
                    if (link.closest('.list__item').querySelector('.list-level-0')) {
                        list.closest('.list-wrapper').querySelector(".list-type-left-content").appendChild(link.closest('.list__item').querySelector('.list-level-0').cloneNode(true));
                    }
                });
            });
        },

        addIcons: function(list) {
            list.querySelectorAll("li").forEach((item) => {
                if (!item.classList.contains('js-icon-processed')) {
                    if (item.getAttribute("data-ico")) {
                        item.classList.add('js-icon-processed');
                        item.querySelector(".list__title a").insertAdjacentHTML('afterbegin', ``)
                    }
                }
            });
        },

    }
})();

appList.init();