Ant Design Components Dashboard (React) (^3.0.0) / Ant Design 组件看板

Better view for Ant Design (React) / 更方便的查看 Ant Design (React) 组件

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Ant Design Components Dashboard (React) (^3.0.0) / Ant Design 组件看板
// @namespace    https://github.com/xianghongai/Ant-Design-Components-Dashboard-React
// @version      0.0.3
// @description  Better view for Ant Design (React) / 更方便的查看 Ant Design (React) 组件
// @author       Nicholas Hsiang / 山茶树和葡萄树
// @icon         https://xinlu.ink/favicon.ico
// @match        https://3x.ant.design/*
// @match        https://2x.ant.design/*
// @grant        none
// ==/UserScript==
(function () {
  "use strict";

  let titleText = "Ant Design of React (3.x)";

  if (location.href.includes('2x')) {
    titleText = "Ant Design of React (2.x)";
  }

  const gridSelector = ".aside-container ul.ant-menu-sub";
  const girdIsList = false; // 如果提取的是一个 Node 数组

  const columnSelector = ".ant-menu-item-group";
  const columnTitleSelector = ".ant-menu-item-group-title";
  const menuListSelector = ".ant-menu-item-group-list";
  const menuItemSelector = ".ant-menu-item-group-list .ant-menu-item"; // 这一层尽量在 li 标签上

  const helpEnable = true;
  const helpSelector = ".api-container";

  const customStyleEnable = true; // Light or Dark
  const cloneNodeEnable = false;

  /** 对某些站点的激活状态、左右间距进行重置 */
  function initialExtraStyle() {
    return `
    .hs-dashboard__toggle {
       top: 10px;
     }

    #hs-dashboard.hs-dashboard__wrapper_dark .ant-menu-item-selected a {
      color: #1890ff;
    }

    #hs-dashboard .hs-dashboard__column .hs-dashboard__list .ant-menu-item {
      height: 36px;
      line-height: 36px;
      padding: 0;
      margin: 0;
    }

    .hs-dashboard__list .ant-menu-item .chinese {
      margin-left: 0.5em;
    }

    .hs-dashboard__wrapper_light .hs-dashboard__list .ant-menu-item .chinese {
      opacity: 0.6;
    }
        `;
  }

  /* ------------------------------------------------------------------------- */

  let wrapperEle = null;
  let themeSwitchEle = null;
  let themeSwitchForm = null;

  const bodyContainer = document.querySelector("body");

  function initialDashboard() {
    initialToggle();
    initialStyle(initialExtraStyle);
    initialMenu(cloneNodeEnable);
    initialHelp();
    handleEvent();
    handleTheme(true);
  }

  let interval = null;

  function ready() {
    const originEle = document.querySelector(gridSelector);

    if (originEle) {
      clearInterval(interval);
      // Dashboard
      initialDashboard();
      // Other
    }
  }

  interval = setInterval(ready, 1000);

  // #region MENU
  /** 生成 Menu */
  function initialMenu(clone) {
    // Wrapper
    wrapperEle = document.createElement("section");
    wrapperEle.classList.add("hs-dashboard__wrapper", "hs-hide");

    if (customStyleEnable) {
      wrapperEle.setAttribute("id", "hs-dashboard");
    }

    // Header
    const headerEle = document.createElement("header");
    headerEle.classList.add("hs-dashboard__header");

    // Title → Header
    const titleEle = document.createElement("h1");
    titleEle.classList.add("hs-dashboard__title");
    titleEle.innerText = titleText || "";
    headerEle.appendChild(titleEle);

    // Theme → Header
    if (customStyleEnable) {
      const themeEle = document.createElement("div");
      themeEle.classList.add("hs-theme-switch");
      themeEle.innerHTML = initialThemeTpl();
      headerEle.appendChild(themeEle);
    }

    // Menu
    const containerEle = document.createElement("div");
    containerEle.classList.add("hs-dashboard__container");

    // 1. 先从页面上获取 DOM 生成 gird
    let gridEle = null;
    let nodeTemp = null;

    if (girdIsList) {
      gridEle = document.createElement("div");
      const gridListEle = document.querySelectorAll(gridSelector); //.cloneNode(true);
      gridListEle &&
        gridListEle.forEach((element) => {
          nodeTemp = clone ? element.cloneNode(true) : element;
          gridEle.appendChild(nodeTemp);
        });
    } else {
      nodeTemp = document.querySelector(gridSelector); //.cloneNode(true);
      gridEle = clone ? nodeTemp.cloneNode(true) : nodeTemp;
      gridEle && nodeTemp.removeAttribute("id");
    }

    gridEle.classList.add("hs-dashboard__grid"); // 追加新的样式

    // Menu → Container
    containerEle.appendChild(gridEle);

    // 2. 内部元素追加新的样式
    // 2.1 column
    const columnEle = containerEle.querySelectorAll(columnSelector);
    columnEle.forEach((element) => {
      element.classList.add("hs-dashboard__column");
    });

    // 2.2 title
    const columnTitleEle = containerEle.querySelectorAll(columnTitleSelector);
    columnTitleEle.forEach((element) => {
      element.classList.add("hs-dashboard__title");
    });

    // 2.3 menu list
    const menuListEle = containerEle.querySelectorAll(menuListSelector);
    menuListEle.forEach((element) => {
      element.classList.add("hs-dashboard__list");
    });

    // 2.4 menu item
    const menuItemEle = containerEle.querySelectorAll(menuItemSelector);
    menuItemEle.forEach((element) => {
      element.classList.add("hs-dashboard__item");
    });

    // header,container → wrapper
    wrapperEle.appendChild(headerEle);
    wrapperEle.appendChild(containerEle);

    // wrapper → body
    bodyContainer.appendChild(wrapperEle);
  }
  // #endregion MENU

  // #region Event
  /** 注册事件 */
  function handleEvent() {
    if (!wrapperEle) {
      wrapperEle = document.querySelector(".hs-dashboard__wrapper");
    }

    if (!themeSwitchEle) {
      themeSwitchEle = document.querySelector(".hs-theme-switch");
    }

    if (!themeSwitchForm) {
      themeSwitchForm = document.querySelector(".hs-theme-switch__form-control");
    }

    const toggleMenuBtn = document.querySelector('.hs-dashboard__toggle-menu');
    const toggleHelpBtn = document.querySelector('.hs-dashboard__toggle-help');

    function handler(event) {
      const targetEle = event.target;

      const itemEle = getParents(targetEle, ".hs-dashboard__item");

      const isItem = hasClass(targetEle, "hs-dashboard__item");

      const isItemWrapper = getParents(targetEle, ".hs-dashboard__column") && getParents(targetEle, ".hs-dashboard__list");

      const isToggle = getParents(targetEle, ".hs-dashboard__toggle-menu") || hasClass(targetEle, "hs-dashboard__toggle-menu");

      const isHelp = getParents(targetEle, ".hs-dashboard__toggle-help") || hasClass(targetEle, "hs-dashboard__toggle-help");

      const isTheme = getParents(targetEle, ".hs-theme-switch") || hasClass(targetEle, "hs-theme-switch");

      if (itemEle || isItem || isItemWrapper) {
        window.setTimeout(() => {
          clearStyle(wrapperEle);
        }, 300);

        let itemTemp = null;

        if (itemEle) {
          itemTemp = itemEle;
        } else if (isItem) {
          itemTemp = targetEle;
        }

        if (itemTemp) {
          const items = wrapperEle.querySelectorAll(".hs-dashboard__item");
          items.forEach((element) => {
            element.classList.remove("hs-active");
          });
          itemTemp.classList.add("hs-active");
        }
      } else if (isToggle) {
        wrapperEle.classList.toggle("hs-hide");
        bodyContainer.classList.toggle("hs-body-overflow_hide");
      } else if (isHelp) {
        clearStyle(wrapperEle);
        handleHelp();
      } else if (isTheme) {
        handleTheme();
      }
    }

    bodyContainer.addEventListener("click", handler);

    document.addEventListener('keydown', function (event) {
      if (event.key === 'Tab' || event.code === 'Tab') {
        event.preventDefault();
        event.stopPropagation();
        toggleMenuBtn?.click();
      }
      // else if (event.key === 'Escape' || event.code === 'Escape') {
      //   toggleMenuBtn.click();
      // }
      else if (event.key === 'F1' || event.code === 'F1') {
        event.preventDefault();
        event.stopPropagation();
        toggleHelpBtn?.click();
      }
    });
  }

  /** 退出预览 */
  function clearStyle(wrapperEle) {
    wrapperEle.classList.add("hs-hide");
    bodyContainer.classList.remove("hs-body-overflow_hide");
  }
  // #endregion Event

  // #region HELP
  /** 是否启用‘页面滚动至指定位置’ */
  function initialHelp() {
    if (!helpEnable) {
      const ele = document.querySelector(".hs-dashboard__toggle-help");
      ele.classList.add("hs-hide");
    }
  }

  /** 页面滚动至指定位置 */
  function handleHelp() {
    if (!helpSelector) {
      return false;
    }

    const helpEle = document.querySelector(helpSelector);
    const top = helpEle.getBoundingClientRect().top + window.pageYOffset;

    window.scrollTo({
      top,
      behavior: "smooth",
    });
  }
  // #endregion HELP

  // #region STYLE
  /** 添加样式 */
  function initialStyle(param) {
    let tpl = initialStyleTpl();
    const headEle = document.head || document.getElementsByTagName("head")[0];
    const styleEle = document.createElement("style");

    let str = null;

    if (typeof param === "function") {
      str = param();
    } else if (typeof param === "string") {
      str = param;
    }

    if (typeof str === "string") {
      tpl += str;
    }

    styleEle.type = "text/css";

    if (styleEle.styleSheet) {
      styleEle.styleSheet.cssText = tpl;
    } else {
      styleEle.appendChild(document.createTextNode(tpl));
    }

    headEle.appendChild(styleEle);
  }

  /** 样式表 */
  function initialStyleTpl() {
    return `

:root {
  --item-height: 36px;
  --hs-font-size-base: 15px;
  --hs-global-spacing: 1rem;
  --hs-color-primary: #1890ff;
  --hs-spacing-horizontal: var(--hs-global-spacing);
}
.hs-hide {
  display: none !important;
}

.hs-body-overflow_hide {
  height: 100% !important;
  overflow: hidden !important;
}

/* #region toggle */
.hs-dashboard__toggle {
  position: fixed;
  z-index: 99999;
  top: 15px;
  right: 5px;
}

.hs-dashboard__toggle-item {
  position: relative;
  width: 28px;
  height: 28px;
  margin-top: 10px;
  margin-bottom: 10px;
  overflow: hidden;
  line-height: 1 !important;
  border-radius: 50%;
  border: 1px solid #ccc;
  text-align: center;
  color: #555;
  background-color: #fff;
  cursor: pointer;
  transition: all 0.2s;
}

.hs-dashboard__toggle-item:hover {
  border-color: #aaa;
  color: #111;
}

.hs-dashboard__toggle-icon {
  position: absolute;
  top: 50%;
  left: 50%;
  z-index: 9;
  transform: translate(-50%, -50%);
  font-style: normal !important;
}
/* #endregion toggle */

/* #region wrapper */
.hs-dashboard__wrapper {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 99998;
  overflow-y: auto;
  background-color: #fff;
  font-size: var(--hs-font-size-base);
}

.hs-dashboard__wrapper::-webkit-scrollbar {
  width: 8px;
  height: 6px;
  background: rgba(0, 0, 0, 0.1);
}

.hs-dashboard__wrapper::-webkit-scrollbar-thumb {
  background: rgba(0, 0, 0, 0.3);
}

.hs-dashboard__wrapper::-webkit-scrollbar-track {
  background: rgba(0, 0, 0, 0.1);
}
/* #endregion wrapper */

.hs-dashboard__header {
  position: relative;
  padding-top: 10px;
  text-align: center;
}

.hs-dashboard__header .hs-dashboard__title {
  margin: 0;
  padding-top: 10px;
  padding-bottom: 10px;
  font-size: 1em;
  font-weight: normal;
}

/* #region theme */
.hs-theme-switch {
  display: flex;
  touch-action: pan-x;
  position: relative;
  background-color: #fff;
  border: 0;
  margin: 0;
  padding: 0;
  user-select: none;
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  -webkit-tap-highlight-color: transparent;
  cursor: pointer;
}

.hs-theme-switch {
  width: 50px;
  height: 24px;
  padding: 0;
  border-radius: 30px;
  background-color: #4d4d4d;
  transition: all 0.2s ease;
}

.hs-dashboard__header .hs-theme-switch {
  position: absolute;
  top: 10px;
  left: 10px;
}

.hs-theme-switch__style {
  position: relative;
  width: 24px;
  height: 24px;
  line-height: 1;
  font-size: 20px;
  text-align: center;
}

.hs-theme-switch__icon {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.hs-theme-switch__thumb {
  position: absolute;
  top: 1px;
  left: 1px;
  width: 22px;
  height: 22px;
  border: 1px solid #ff7938;
  border-radius: 50%;
  background-color: #fafafa;
  box-sizing: border-box;
  transition: all 0.25s ease;
}

.hs-theme-switch_checked .hs-theme-switch__thumb {
  left: 27px;
  border-color: #4d4d4d;
}

.hs-toggle-screenreader-only {
  border: 0;
  clip: rect(0 0 0 0);
  height: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
  width: 1px;
}
/* #endregion theme */

/* #region grid */
.hs-dashboard__grid {
  display: flex;
  justify-content: space-evenly;
  margin: 0;
  padding: 0;
  list-style: none;
}

.hs-dashboard__column {
  padding-right: 10px;
  padding-left: 10px;
}

.hs-dashboard__column a {
  display: block;
  padding-left: 20px !important;
  padding-right: 40px !important;
  text-decoration: none;
}

.hs-dashboard__container ul {
  padding: 0;
}

.hs-dashboard__container li {
  padding-left: 0 !important;
  list-style: none;
}

.hs-dashboard__column .hs-dashboard__title {
  display: block;
  padding-left: var(--hs-spacing-horizontal) !important;
  padding-right: calc(var(--hs-spacing-horizontal) * 2) !important;
  text-align: left;
  margin-top: 10px !important;
}

.hs-dashboard__column .hs-dashboard__list {
  margin-top: 10px !important;
}

.hs-dashboard__column .hs-dashboard__list .hs-dashboard__item {
  margin: 0 !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  height: var(--item-height);
  line-height: var(--item-height);
}
/* #endregion grid */

/* #region custom */
#hs-dashboard.hs-dashboard__wrapper {
  transition: all 0.2s ease;
}

#hs-dashboard .hs-dashboard__column .hs-dashboard__title {
  font-size: 14px;
  line-height: 1.5715;
  color: rgba(0, 0, 0, 0.45);
}

#hs-dashboard a {
  overflow: hidden;
  white-space: nowrap;
  font-size: 14px;
  text-overflow: ellipsis;
  text-decoration: none;
  color: rgba(0, 0, 0, 0.85);
  transition: color 0.3s ease;
}

#hs-dashboard a:hover {
  color: var(--hs-color-primary);
  text-decoration: none;
  outline: 0;
}

/* light */
#hs-dashboard.hs-dashboard__wrapper_light,
#hs-dashboard.hs-dashboard__wrapper_light .hs-dashboard__grid,
#hs-dashboard.hs-dashboard__wrapper_light .hs-dashboard__column,
#hs-dashboard.hs-dashboard__wrapper_light .hs-dashboard__list {
  color: #161616;
  background-color: #fff;
}

/* dark */
#hs-dashboard.hs-dashboard__wrapper_dark,
#hs-dashboard.hs-dashboard__wrapper_dark .hs-dashboard__grid,
#hs-dashboard.hs-dashboard__wrapper_dark .hs-dashboard__column,
#hs-dashboard.hs-dashboard__wrapper_dark .hs-dashboard__list {
  color: #fff;
  background-color: #161616;
}

#hs-dashboard.hs-dashboard__wrapper_dark .hs-dashboard__title {
  font-weight: bold;
  color: #fff;
}

#hs-dashboard.hs-dashboard__wrapper_dark a {
  color: #fff;
}

#hs-dashboard.hs-dashboard__wrapper_dark a:hover {
  color: var(--hs-color-primary);
}

#hs-dashboard .hs-dashboard__item.active,
#hs-dashboard .hs-dashboard__item.active a,
#hs-dashboard .hs-dashboard__item .active,
#hs-dashboard .hs-dashboard__item.hs-active,
#hs-dashboard .hs-dashboard__item.hs-active a {
  color: var(--hs-color-primary);
}

#hs-dashboard .hs-dashboard__item.hs-active {
  background-color: #e6f7ff;
}

#hs-dashboard .hs-dashboard__item {
  position: relative;
}

#hs-dashboard .hs-dashboard__item::after {
  content: ' ';
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  border-right: 3px solid var(--hs-color-primary);
  transform: scaleY(0.0001);
  transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1),
    opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1),
    -webkit-transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1);
  opacity: 0;
}

#hs-dashboard .hs-dashboard__item:hover::after,
#hs-dashboard .hs-dashboard__item.hs-active::after {
  transform: scaleY(1);
  opacity: 1;
  transition: transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),
    opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),
    -webkit-transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1);
}
/* #endregion custom */

`;
  }
  // #endregion STYLE

  // #region TOGGLE
  /** 生成 Dashboard 开关 */
  function initialToggle() {
    const tpl = initialToggleTpl();
    const ele = document.createElement("section");
    // ele.className = 'hs-dashboard__toggle';
    // ele.setAttribute("class", "hs-dashboard__toggle");
    ele.classList.add("hs-dashboard__toggle");
    ele.innerHTML = tpl;

    // toggle → body
    bodyContainer.appendChild(ele);
  }
  /** Dashboard 开关 DOM */
  function initialToggleTpl() {
    return `
    <!-- menu -->
    <div class="hs-dashboard__toggle-item hs-dashboard__toggle-menu">
      <i class="hs-dashboard__toggle-icon">
        <svg
          viewBox="64 64 896 896"
          focusable="false"
          data-icon="appstore"
          width="1em"
          height="1em"
          fill="currentColor"
          aria-hidden="true"
        >
          <path
            d="M464 144H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H212V212h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H612V212h200v200zM464 544H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H212V612h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H612V612h200v200z"
          ></path>
        </svg>
      </i>
    </div>
    <!-- api -->
    <div class="hs-dashboard__toggle-item hs-dashboard__toggle-help">
      <i class="hs-dashboard__toggle-icon">
        <svg
          viewBox="64 64 896 896"
          focusable="false"
          class=""
          data-icon="bulb"
          width="1em"
          height="1em"
          fill="currentColor"
          aria-hidden="true"
        >
          <path
            d="M632 888H392c-4.4 0-8 3.6-8 8v32c0 17.7 14.3 32 32 32h192c17.7 0 32-14.3 32-32v-32c0-4.4-3.6-8-8-8zM512 64c-181.1 0-328 146.9-328 328 0 121.4 66 227.4 164 284.1V792c0 17.7 14.3 32 32 32h264c17.7 0 32-14.3 32-32V676.1c98-56.7 164-162.7 164-284.1 0-181.1-146.9-328-328-328zm127.9 549.8L604 634.6V752H420V634.6l-35.9-20.8C305.4 568.3 256 484.5 256 392c0-141.4 114.6-256 256-256s256 114.6 256 256c0 92.5-49.4 176.3-128.1 221.8z"
          ></path>
        </svg>
      </i>
    </div>
      `;
  }
  // #endregion TOGGLE

  // #region THEME
  function handleTheme(isInit) {
    if (isInit) {
      const theme = localStorage.getItem("hs_dashboard_theme");

      if (theme && theme === "dark") {
        themeSwitchForm.checked = true;
      } else {
        themeSwitchForm.checked = false;
      }
    } else {
      themeSwitchForm.click();
    }

    const checked = themeSwitchForm.checked;

    if (checked) {
      localStorage.setItem("hs_dashboard_theme", "dark");
      wrapperEle.classList.add("hs-dashboard__wrapper_dark");
      wrapperEle.classList.remove("hs-dashboard__wrapper_light");
      themeSwitchEle.classList.add("hs-theme-switch_checked");
    } else {
      localStorage.setItem("hs_dashboard_theme", "light");
      wrapperEle.classList.add("hs-dashboard__wrapper_light");
      wrapperEle.classList.remove("hs-dashboard__wrapper_dark");
      themeSwitchEle.classList.remove("hs-theme-switch_checked");
    }
  }

  function initialThemeTpl() {
    return `
  <input type="checkbox" class="hs-toggle-screenreader-only hs-theme-switch__form-control" title="Dark mode" />
  <div class="hs-theme-switch__style hs-theme-switch__style_dark">
    <i class="hs-theme-switch__icon">
      <svg
        t="1588325093630"
        class="icon"
        viewBox="0 0 1024 1024"
        version="1.1"
        xmlns="http://www.w3.org/2000/svg"
        p-id="11008"
        width="1em"
        height="1em"
      >
        <path
          d="M483.555556 964.266667c-164.977778 0-315.733333-85.333333-398.222223-224.711111 19.911111 2.844444 39.822222 2.844444 56.888889 2.844444 275.911111 0 500.622222-224.711111 500.622222-500.622222 0-68.266667-14.222222-133.688889-39.822222-193.422222 201.955556 54.044444 347.022222 238.933333 347.022222 449.422222 0 256-210.488889 466.488889-466.488888 466.488889z"
          fill="#F7FF53"
          p-id="11009"
        ></path>
        <path
          d="M631.466667 73.955556c179.2 62.577778 301.511111 230.4 301.511111 423.822222 0 247.466667-201.955556 449.422222-449.422222 449.422222-147.911111 0-281.6-71.111111-364.088889-187.733333H142.222222c284.444444 0 517.688889-233.244444 517.688889-517.688889 0-56.888889-8.533333-113.777778-28.444444-167.822222M571.733333 22.755556C605.866667 88.177778 625.777778 162.133333 625.777778 241.777778c0 267.377778-216.177778 483.555556-483.555556 483.555555-31.288889 0-59.733333-2.844444-88.177778-8.533333 79.644444 156.444444 241.777778 264.533333 429.511112 264.533333 267.377778 0 483.555556-216.177778 483.555555-483.555555C967.111111 261.688889 796.444444 65.422222 571.733333 22.755556z"
          fill="#303133"
          p-id="11010"
        ></path>
        <path
          d="M787.911111 455.111111c-5.688889-2.844444-8.533333-8.533333-5.688889-14.222222 5.688889-17.066667-2.844444-42.666667-19.911111-48.355556-17.066667-5.688889-39.822222 8.533333-45.511111 22.755556-2.844444 5.688889-8.533333 8.533333-14.222222 5.688889-5.688889-2.844444-8.533333-8.533333-5.688889-14.222222 8.533333-25.6 42.666667-45.511111 73.955555-34.133334 28.444444 11.377778 39.822222 48.355556 31.288889 73.955556-2.844444 5.688889-8.533333 8.533333-14.222222 8.533333"
          fill="#303133"
          p-id="11011"
        ></path>
        <path
          d="M608.711111 620.088889c-14.222222 0-28.444444-2.844444-39.822222-11.377778-31.288889-22.755556-31.288889-65.422222-31.288889-68.266667 0-8.533333 8.533333-17.066667 17.066667-17.066666s17.066667 8.533333 17.066666 17.066666 2.844444 31.288889 17.066667 39.822223c11.377778 8.533333 25.6 8.533333 45.511111 0 8.533333-2.844444 19.911111 2.844444 22.755556 11.377777 2.844444 8.533333-2.844444 19.911111-11.377778 22.755556-14.222222 2.844444-25.6 5.688889-36.977778 5.688889zM571.733333 540.444444z"
          fill="#FF2929"
          p-id="11012"
        ></path>
        <path
          d="M810.666667 588.8c-5.688889 19.911111-36.977778 28.444444-68.266667 19.911111-31.288889-8.533333-54.044444-34.133333-48.355556-54.044444 5.688889-19.911111 36.977778-28.444444 68.266667-19.911111 34.133333 11.377778 54.044444 34.133333 48.355556 54.044444"
          fill="#FFA450"
          p-id="11013"
        ></path>
        <path
          d="M864.711111 270.222222c14.222222 42.666667 19.911111 91.022222 19.911111 136.533334 0 258.844444-213.333333 466.488889-477.866666 466.488888-96.711111 0-187.733333-28.444444-264.533334-76.8 82.488889 93.866667 204.8 156.444444 344.177778 156.444445C736.711111 952.888889 938.666667 756.622222 938.666667 512c0-88.177778-28.444444-173.511111-73.955556-241.777778z"
          fill="#FF7938"
          p-id="11014"
        ></path>
      </svg>
    </i>
  </div>
  <div class="hs-theme-switch__style hs-theme-switch__style_light">
    <i class="hs-theme-switch__icon">
      <svg
        t="1588324703446"
        class="icon"
        viewBox="0 0 1024 1024"
        version="1.1"
        xmlns="http://www.w3.org/2000/svg"
        p-id="6232"
        width="1em"
        height="1em"
      >
        <path
          d="M792.35 835.94l-128.09-30.32c-17.73-4.2-36.12 3.66-45.34 19.37l-66.64 113.52c-15.83 26.97-54.67 27.4-71.1 0.79l-69.14-112.02c-9.57-15.5-28.13-22.95-45.76-18.36l-127.39 33.15c-30.26 7.88-58.03-19.29-50.83-49.72l30.32-128.09c4.2-17.73-3.66-36.12-19.37-45.34L85.49 552.28c-26.97-15.83-27.4-54.67-0.79-71.1l112.02-69.14c15.5-9.57 22.95-28.13 18.36-45.76l-33.15-127.39c-7.88-30.26 19.29-58.03 49.72-50.83l128.09 30.32c17.73 4.2 36.12-3.66 45.34-19.37l66.64-113.52c15.83-26.97 54.67-27.4 71.1-0.79l69.14 112.02c9.57 15.5 28.13 22.95 45.76 18.36l127.39-33.15c30.26-7.88 58.03 19.29 50.83 49.72l-30.32 128.09c-4.2 17.73 3.66 36.12 19.37 45.34l113.52 66.64c26.97 15.83 27.4 54.67 0.79 71.1l-112.02 69.14c-15.5 9.57-22.95 28.13-18.36 45.76l33.15 127.39c7.88 30.26-19.29 58.03-49.72 50.83z"
          fill="#FF7938"
          p-id="6233"
        ></path>
        <path
          d="M512 512m-207.66 0a207.66 207.66 0 1 0 415.32 0 207.66 207.66 0 1 0-415.32 0Z"
          fill="#F7FF53"
          p-id="6234"
        ></path>
        <path
          d="M442.78 468.74m-25.96 0a25.96 25.96 0 1 0 51.92 0 25.96 25.96 0 1 0-51.92 0Z"
          fill="#303133"
          p-id="6235"
        ></path>
        <path
          d="M581.22 468.74m-25.96 0a25.96 25.96 0 1 0 51.92 0 25.96 25.96 0 1 0-51.92 0Z"
          fill="#303133"
          p-id="6236"
        ></path>
        <path
          d="M442.78 582.02s17.31 48.31 69.22 48.31 69.22-48.31 69.22-48.31H442.78z"
          fill="#FF2929"
          p-id="6237"
        ></path>
      </svg>
    </i>
  </div>
  <div class="hs-theme-switch__thumb"></div>
`;
  }
  // #endregion THEME

  // #region COMMON
  function hasClass(el, className) {
    if (el.classList) {
      return el.classList.contains(className);
    } else {
      return !!el.className.match(new RegExp("(\\s|^)" + className + "(\\s|$)"));
    }
  }

  function getParents(elem, selector) {
    // Element.matches() polyfill
    if (!Element.prototype.matches) {
      Element.prototype.matches =
        Element.prototype.matchesSelector ||
        Element.prototype.mozMatchesSelector ||
        Element.prototype.msMatchesSelector ||
        Element.prototype.oMatchesSelector ||
        Element.prototype.webkitMatchesSelector ||
        function (s) {
          var matches = (this.document || this.ownerDocument).querySelectorAll(s),
            i = matches.length;
          while (--i >= 0 && matches.item(i) !== this) { }
          return i > -1;
        };
    }

    // Get the closest matching element
    for (; elem && elem !== document; elem = elem.parentNode) {
      if (elem.matches(selector)) return elem;
    }
    return null;
  }
  // #endregion
})();