Discourse - Collapse Boosts

Collapse Discourse boosts: show first two by default, expand on hover, and display an “N+” counter when there are more.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

/* ==UserStyle==
@name:zh-CN           Discourse - 自动折叠 boost
@name                 Discourse - Collapse Boosts
@namespace            https://github.com/utags
@version              5.0.0
@description          Collapse Discourse boosts: show first two by default, expand on hover, and display an “N+” counter when there are more.
@description:zh-CN    折叠 Discourse Boost:默认仅显示前两个,悬停展开其余,超过 2 个时显示“N+”计数。
@author               Pipecraft
@license              MIT
@icon                 https://www.google.com/s2/favicons?sz=64&domain=meta.discourse.org
==/UserStyle== */

@-moz-document domain("meta.discourse.org"), domain("linux.do"), domain("idcflare.com") {
  .discourse-boosts__list {
    max-width: fit-content;
    /* 初始化计数器 */
    counter-reset: boosts;
  }
  .discourse-boosts__bubble {
    /* 计数器累加 */
    counter-increment: boosts;
    /*如果想尽可能减少 boosts 对信息流干扰,可开启下方透明度*/
    /*opacity: 70%;*/
    transition: opacity 180ms ease;
  }
  /* boosts 列表后添加数值 */
  .discourse-boosts__list::after {
    /*减去默认显示数量*/
    counter-increment: boosts -2;
    content: counter(boosts) "+";
    opacity: 0%;
    display: inline-flex;
    pointer-events: none;
    max-inline-size: 0;
    max-block-size: 0;
    overflow: hidden;
    font-size: var(--font-down-2);
    line-height: 1;
    transition-property: opacity, max-inline-size, max-block-size;
    transition-duration: 180ms, 0ms, 0ms;
    transition-timing-function: ease, linear, linear;
    transition-delay: 0ms, 0ms, 0ms;
  }

  @supports not selector(.x:has(.y)) {
    /* 第二个 boost */
    .discourse-boosts__list > .discourse-boosts__bubble:nth-of-type(2) {
      /* opacity: 50%; */
      position: relative;
      margin-right: 50px;
      transition-property: opacity, margin-right;
      transition-duration: 180ms, 0ms;
      transition-timing-function: ease, linear;
      transition-delay: 0ms, 0ms;
    }

    .discourse-boosts__list
      > .discourse-boosts__bubble:nth-of-type(2):not(:last-of-type)::after {
      content: "+ more";
      opacity: 50%;
      position: absolute;
      inset-inline-start: calc(100% + var(--space-1));
      inset-block-start: 50%;
      transform: translateY(-50%);
      white-space: nowrap;
      pointer-events: none;
    }

    /* 鼠标移到第二个 boost 上面时,延迟收起右侧空白,避免 hover 抖动 */
    .discourse-boosts__list:hover > .discourse-boosts__bubble:nth-of-type(2),
    .discourse-boosts__list:focus-within
      > .discourse-boosts__bubble:nth-of-type(2) {
      opacity: 100%;
      margin-right: 0;
      transition-delay: 0ms, 120ms;
    }
    /* 仅有两个 boost 时,立即收起右侧空白 */
    .discourse-boosts__list
      > .discourse-boosts__bubble:nth-of-type(2):last-of-type {
      opacity: 100%;
      margin-right: 0;
      transition-delay: 0ms, 0ms;
    }
    .discourse-boosts__list:hover
      > .discourse-boosts__bubble:nth-of-type(2)::after,
    .discourse-boosts__list:focus-within
      > .discourse-boosts__bubble:nth-of-type(2)::after {
      display: none;
    }
  }
  .discourse-boosts__list:has(> .discourse-boosts__bubble:nth-child(3))::after,
  .discourse-boosts__list:has(
      > .discourse-boosts__bubble:nth-of-type(3)
    )::after {
    opacity: 50%;
    max-inline-size: 999px;
    max-block-size: 999px;
    transition-delay: 0ms, 0ms, 0ms;
  }
  /* 鼠标悬停时隐藏数值*/
  .discourse-boosts__list:hover:has(
      > .discourse-boosts__bubble:nth-child(3)
    )::after,
  .discourse-boosts__list:focus-within:has(
      > .discourse-boosts__bubble:nth-child(3)
    )::after,
  .discourse-boosts__list:hover:has(
      > .discourse-boosts__bubble:nth-of-type(3)
    )::after,
  .discourse-boosts__list:focus-within:has(
      > .discourse-boosts__bubble:nth-of-type(3)
    )::after {
    opacity: 0%;
    max-inline-size: 0;
    max-block-size: 0;
    /* 延迟变小,使数值隐藏更平滑,防止 hover 抖动现象 */
    transition-delay: 0ms, 120ms, 120ms;
  }

  /* 第三个和它后面的 boost */
  .discourse-boosts__bubble:nth-child(n + 3) {
    opacity: 0%;
    display: inline-flex;
    max-inline-size: 0;
    max-block-size: 0;
    padding: 0;
    margin-inline-start: calc(var(--space-1) * -1);
    overflow: hidden;
    pointer-events: none;
    transition-property:
      opacity, max-inline-size, max-block-size, padding, margin-inline-start;
    transition-duration: 180ms, 0ms, 0ms, 0ms, 0ms;
    transition-delay: 0ms, 0ms, 0ms, 0ms, 0ms;
    transition-timing-function: ease, linear, linear, linear, linear;
  }
  /* 鼠标移到 boost 上面时 */
  .discourse-boosts__list:hover .discourse-boosts__bubble,
  .discourse-boosts__list:focus-within .discourse-boosts__bubble {
    opacity: 100%;
    max-inline-size: 999px;
    max-block-size: 999px;
    padding: var(--space-1) var(--space-2) var(--space-1) var(--space-1);
    margin-inline-start: 0;
    pointer-events: auto;
    transition-delay: 120ms, 120ms, 120ms, 120ms, 120ms;
  }

  .discourse-boosts-trigger {
    order: -1;
  }

  @media (max-width: 560px) or (max-height: 560px) {
    .discourse-boosts__list {
      max-block-size: 30dvh;
      overflow-y: auto;
    }
  }
}