SCP文选2025

源页面
2025年10月22日
修订 3

核心指标

更新于 2025年11月6日
评分
22
↑ 24
↓ 2
支持率
92%
总票数 26
Wilson 95% 下界
75.9%
在相同票数下更稳健的支持率估计
争议指数
0.284

评分趋势

按周聚合
加载图表中...

最近修订

1 / 2
编辑内容
4 天前
修改标签
15 天前
已新增标签:中心。
编辑内容
15 天前

最近投票

1 / 3
2025-11-02
2025-11-02
2025-11-02
2025-11-01
2025-10-24
2025-10-24
2025-10-23
2025-10-23
2025-10-23

页面源码

源码字符数 52780文字字数 366
[!--devops:http://localhost:6968/static/manifest.json--]
[[include :scp-wiki:theme:bedrock]]
[[include :scp-wiki:theme:eigenvector]]

[[module css]]
@import url("https://fonts.googleapis.com/css2?family=Caudex:ital,wght@0,400;0,700;1,400;1,700&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Bodoni+Moda+SC:ital,opsz,wght@0,6..96,400..900;1,6..96,400..900&display=swap");
@import url("https://api.fonts.coollabs.io/css2?family=Noto+Serif+Hebrew:wght@100..900&display=swap");

@media (max-width: 768px) {
  :root:root .emanation-menu {
    width: 100vw;
  }

  :root:root .e-description {
    padding: 1.5em;
  }
}

:root {
  --body-font-primary: "Caudex";
  --header-font-primary: "Bodoni Moda SC";
  --body-font-fallback: "Noto Serif Hebrew", "Times New Roman", serif;
  --header-font-fallback: "Noto Serif Hebrew", "Times New Roman", serif;
  --base-font-size: 1.15rem;

  --basalt-primary-color: 29, 30, 43;
  --basalt-secondary-color: 22, 20, 30;
  --basalt-tertiary-color: 49, 47, 63;
  --basalt-bright-element-color: 177, 181, 211;
  --basalt-overtone: 249, 251, 252;
  --basalt-main-text-color: var(--basalt-overtone);
  --modal-fader-background-color: var(--basalt-secondary-color);
  --h-border-color: var(--basalt-tertiary-color);
  --bottom-area-background-color: var(--basalt-secondary-color);
  --basalt-undertone: var(--basalt-bright-element-color);

  --header-title: "SCP 文选 2025";
  --header-subtitle: "从无创有";
  --title-size: min(calc(1.75rem + 2.5vw), 4.5rem);
  --subtitle-size: min(calc(0.875rem + 2.25vw), 1.95rem);
  --header-logo: unset;
  --antho-header: url(https://smlt.wikidot.com/local--files/collab:estrellayoshte:blem2/antho25header.jpg);
  --antho-body: url(https://smlt.wikidot.com/local--files/collab:estrellayoshte:blem2/pillars.jpg);
  --antho-footer: url(https://radian628.wikidot.com/local--files/secret:thingy3/footer-image.png);

  --base-header-height: calc(
    (var(--title-size) + var(--subtitle-size)) * 1.875 + 20.5rem + 7.5svh
  );
  --header-desktop-height: calc(
    var(--base-header-height) + var(--header-border-width) +
      var(--top-bar-mobile-height)
  );
  --header-border-width: 0rem;
  --header-mobile-height: var(--header-desktop-height);
  --top-bar-mobile-height: calc(var(--header-UI-font-size) * 2.675);
  --side-bar-button-width: 3rem;
  --main-content-width: 54.5rem;

  --side-bar-link-font-size: calc(var(--base-font-size) * 0.825);
}

#content-wrap {
  position: relative;
  padding-bottom: calc(100% / (var(--footer-aspect-ratio)) - 2rem);
  margin-block-end: 0;
  --footer-aspect-ratio: 180/67;
}
#content-wrap::before {
  content: "";
  position: absolute;
  bottom: 0;
  width: 100%;
  aspect-ratio: var(--footer-aspect-ratio);
  background-image: linear-gradient(
      to bottom,
      transparent 60%,
      rgb(var(--bottom-area-background-color))
    ),
    var(--antho-footer);
  background-size: cover;
  background-position: bottom center;
  z-index: -1;
}

#header {
  position: sticky;
  top: calc(var(--base-header-height) * -1);
  grid-template-areas:
    ". . search user"
    "h-link h-link h-link h-link"
    "open-menu top-bar top-bar top-bar";
  grid-template-columns:
    var(--side-bar-button-width) 1fr var(--search-button-width)
    var(--user-button-width);
  grid-template-rows: var(--user-button-width) 1fr var(--top-bar-mobile-height);
  background-color: transparent;
  z-index: 7;
}

#header h1 a {
  flex-direction: column;
  width: 100%;
  height: auto;
  justify-content: center;
  gap: 0;
  padding-inline: 0;
  padding-block-start: calc(10.75vw - 2.5rem);
  text-shadow: 0 0 0.325rem rgb(var(--basalt-bright-element-color)),
    0 0 0.875rem rgb(var(--basalt-bright-element-color));
}
#header h1 a::before {
  display: none;
  width: min(var(--base-header-height), 100%);
  min-width: unset;
}

#header h1 a span {
  width: auto;
  height: auto;
  line-height: 1;
}

#top-bar div[class*="top-bar"] > ul > li {
  flex-grow: 1;
}

#top-bar div.mobile-top-bar > .open-menu {
  visibility: visible;
}

#header::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: var(--header-final-height);
  background-image: var(--antho-header);
  background-size: cover;
  background-position: center top;
  -webkit-mask-image: linear-gradient(to bottom, black 60.5%, transparent);
  mask-image: linear-gradient(to bottom, black 60.5%, transparent);
  z-index: -1;
}

@media not all and (max-width: 1024px) {
  #header {
    position: static;
    grid-template-areas:
      ". search user"
      "h-link h-link h-link"
      "top-bar top-bar top-bar";
    grid-template-columns: 1fr var(--search-button-width) var(
        --user-button-width
      );
    contain: unset;
  }
  #header h1 a span::after {
    font-weight: 700;
    mix-blend-mode: overlay;
  }
}

/*--------------------------------*/
/*---SIDEBAR ---*/
/*--------------------------------*/

#side-bar {
  padding: 0;
}

@media not all and (max-width: 1024px) {
  #header .open-menu {
    position: fixed;
    top: 0;
    left: 0;
    width: var(--side-bar-button-width);
    height: var(--side-bar-button-width);
  }

  #side-bar {
    position: fixed;
    top: 0;
    left: calc(var(--side-bar-width) * -1);
    height: 100%;
    margin: 0;
    transition: left var(--side-bar-transition);
  }
  #header:has(.open-menu:is(:hover, :focus-within)) ~ #content-wrap > #side-bar,
  #side-bar:is(:hover, :focus-within) {
    left: 0;
  }

  #main-content {
    width: min(100%, var(--main-content-width));
    max-width: var(--main-content-width);
    box-sizing: border-box;
  }
}

#extra-div-2 {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100lvh;
  background-image: linear-gradient(
      to right,
      rgb(var(--basalt-background-color), 0.875),
      rgb(var(--basalt-background-color), 0.25) 33.3%,
      rgb(var(--basalt-background-color), 0.25) 66.6%,
      rgb(var(--basalt-background-color), 0.875)
    ),
    var(--antho-body);

  background-size: cover;
  background-position: center;
  z-index: -2;
  pointer-events: none;
}

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

#content-wrap::after {
  content: unset;
}

#page-title {
  display: none;
}

/*--------------------------------*/
/*--- CUSTOM ---*/
/*--------------------------------*/

.aria-only {
  position: absolute;
  border: none;
  font-size: 0.1em;
  opacity: 0.01;
  color: transparent;
  pointer-events: none;
}

.insp-quote {
  position: relative;
  font-size: 1.375em;
  text-align: center;
  width: min(90%, 32.5rem);
  margin-inline: auto;
  margin-block: 1.5rem 0;
  padding-block: 0.5rem;
  padding-inline: 0.875rem;
  box-sizing: border-box;
  line-height: 1.625em;
}
.insp-quote::before {
  content: "“";
  top: 1rem;
  left: -1rem;
}
.insp-quote::after {
  content: "”";
  bottom: 1rem;
  right: -1rem;
}
.insp-quote::before,
.insp-quote::after {
  position: absolute;
  font-size: 2.5em;
  font-weight: bold;
  color: rgb(var(--basalt-undertone));
}

.insp-quote > p:first-letter {
  font-size: 1.75em;
  font-weight: bold;
}

.req-info {
  text-align: center;
}

div.opener2025 {
  isolation: isolate;
  pointer-events: auto;
  inset: unset;
  margin: 1.5rem auto;
}

div.opener2025 .e-description {
  display: block;
  padding-inline: 2.75rem;
}
div.opener2025.emanation-menu .e-description::before {
  all: unset;
}
div.opener2025.emanation-menu .e-description::after {
  opacity: 0.75;
}

/*--------------------------------*/
/*--- MOBILE QUERY ---*/
/*--------------------------------*/
@media all and (max-width: 1024px) {
  :root {
    --header-title: "SCP 文选 2025";
    --top-bar-mobile-height: calc(var(--header-UI-font-size) * 3.5);
    --main-content-side-margin: 2.125rem;
  }

  #header::after {
    content: "";
    display: block;
    grid-column: 1/-1;
    grid-row: 3/4;
    -webkit-backdrop-filter: blur(0.5rem);
    backdrop-filter: blur(0.5rem);
    z-index: -1;
  }
}

/* rounded corners for opening paragraph */

.emanation-menu {
  --notch-size: 1.875rem;
  --border-width: 0.4125rem;
  position: relative;
  top: -1rem;
  width: min(42.5rem, calc(100% - var(--main-content-side-margin) * 2));
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  pointer-events: none;
}

.emanation-menu .e-description {
  position: relative;
  width: 100%;
  box-sizing: border-box;
  min-height: calc((var(--notch-size) + 1rem) * 2);
  padding-inline: 2.25rem;
  padding-block: 0 0.375rem;
  display: grid;
  gap: 0.875rem;
}
.emanation-menu .e-description::before,
.emanation-menu .e-description::after {
  content: "";
  --_bg: rgb(var(--basalt-secondary-color));
  position: absolute;
  inset: 0;
  background-image: radial-gradient(
      circle at 0 0,
      transparent var(--notch-size),
      var(--_bg) calc(var(--notch-size) + 0.05rem),
      var(--_bg) calc(var(--notch-size) + 1rem),
      transparent calc(var(--notch-size) + 1rem)
    ),
    radial-gradient(
      circle at 100% 0,
      transparent var(--notch-size),
      var(--_bg) calc(var(--notch-size) + 0.05rem),
      var(--_bg) calc(var(--notch-size) + 1rem),
      transparent calc(var(--notch-size) + 1rem)
    ),
    radial-gradient(
      circle at 0 100%,
      transparent var(--notch-size),
      var(--_bg) calc(var(--notch-size) + 0.05rem),
      var(--_bg) calc(var(--notch-size) + 1rem),
      transparent calc(var(--notch-size) + 1rem)
    ),
    radial-gradient(
      circle at 100% 100%,
      transparent var(--notch-size),
      var(--_bg) calc(var(--notch-size) + 0.05rem),
      var(--_bg) calc(var(--notch-size) + 1rem),
      transparent calc(var(--notch-size) + 1rem)
    ),
    linear-gradient(
      to right,
      transparent var(--notch-size),
      var(--_bg) var(--notch-size),
      var(--_bg) calc(100% - var(--notch-size)),
      transparent calc(100% - var(--notch-size))
    ),
    linear-gradient(
      to bottom,
      transparent var(--notch-size),
      var(--_bg) var(--notch-size),
      var(--_bg) calc(100% - var(--notch-size)),
      transparent calc(100% - var(--notch-size))
    );
  z-index: -1;
}
.emanation-menu .e-description::before {
  --_bg: var(--accent);
  --notch-size: 1.75rem;
  inset: 0 calc(var(--border-width) * -1 + 0.1rem);
}

[[/module]]


[[div_ class="aria-only" role="heading"]]
SCP 文选 2025 — 从无创有
[[/div]]

[[div class="insp-quote"]]
世上没有一个词,还未出口便可被知晓。
[[/div]]

@@ @@
@@ @@

[[div class="emanation-menu opener2025"]]
[[div class="e-description"]]
= [[size 125%]]**什么是卡巴拉?**[[/size]]

= **生命之树**
 
[[div_ style="text-align: justify; text-align-last: center;"]]
在《光辉之书》中被引入卡巴拉体系中的“生命之树”是一副描述神创世的图谱,代表着上帝的不同属性。这些属性将“无限”[[footnote]]译者注:Ein Sof,可翻译为“无限”或“没有结束”,犹太教术语,象征着通过创世自我显现之前的上帝[[/footnote]]的神圣光芒传递至我们所在的物质世界。这副图谱中的每一个质点都在维系世界的存在中扮演着不同的角色,同时,它们也映射着人类灵魂的某种特质。

[[/div]]

= 今年的恐怖文选以神性为镜,聚焦探究人类灵魂的缺陷。

@@@@

= **十位质点,十一则故事,归于一体。**
[[/div]]
[[/div]]

[[html]]
<style>
  @import url("https://cdn.scpwiki.com/theme/en/basalt/normalize-min.css");
  @import url("https://cdn.scpwiki.com/theme/en/basalt/basalt-bedrock-min.css");
  @import url("https://scp-wiki.wdfiles.com/local--code/theme%3Aeigenvector/1");
</style>
<style>@import url("https://fonts.googleapis.com/css2?family=Caudex:ital,wght@0,400;0,700;1,400;1,700&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Bodoni+Moda+SC:ital,opsz,wght@0,6..96,400..900;1,6..96,400..900&display=swap");
@import url("https://api.fonts.coollabs.io/css2?family=Noto+Serif+Hebrew:wght@100..900&display=swap");

:root {
  --body-font-primary: "Caudex";
  --header-font-primary: "Bodoni Moda SC";
  --body-font-fallback: "Noto Serif Hebrew", "Times New Roman", serif;
  --header-font-fallback: "Noto Serif Hebrew", "Times New Roman", serif;
  --base-font-size: 1.15rem;

  --basalt-primary-color: 29, 30, 43;
  --basalt-secondary-color: 22, 20, 30;
  --basalt-tertiary-color: 49, 47, 63;
  --basalt-bright-element-color: 177, 181, 211;
  --basalt-overtone: 249, 251, 252;
  --basalt-main-text-color: var(--basalt-overtone);
  --modal-fader-background-color: var(--basalt-secondary-color);
  --h-border-color: var(--basalt-tertiary-color);
  --bottom-area-background-color: var(--basalt-secondary-color);
  --basalt-undertone: var(--basalt-bright-element-color);

  --header-title: "SCP Anthology 2025";
  --header-subtitle: "Creatio ex nihilo";
  --title-size: min(calc(1.75rem + 2.5vw), 4.5rem);
  --subtitle-size: min(calc(0.875rem + 2.25vw), 1.95rem);
  --header-logo: unset;
  --antho-header: url(https://smlt.wikidot.com/local--files/collab:estrellayoshte:blem2/antho25header.jpg);
  --antho-body: url(https://smlt.wikidot.com/local--files/collab:estrellayoshte:blem2/pillars.jpg);
  --antho-footer: url(https://radian628.wikidot.com/local--files/secret:thingy3/footer-image.png);

  --base-header-height: calc(
    (var(--title-size) + var(--subtitle-size)) * 1.875 + 20.5rem + 7.5svh
  );
  --header-desktop-height: calc(
    var(--base-header-height) + var(--header-border-width) +
      var(--top-bar-mobile-height)
  );
  --header-border-width: 0rem;
  --header-mobile-height: var(--header-desktop-height);
  --top-bar-mobile-height: calc(var(--header-UI-font-size) * 2.675);
  --side-bar-button-width: 3rem;
  --main-content-width: 54.5rem;

  --side-bar-link-font-size: calc(var(--base-font-size) * 0.825);
}
</style> <style>/*--------------------------------*/
/*--------------------------------*/
/*--------------------------------*/

#u-ka-tree {
  --node-size: min(calc(4.5rem + 4.5vw), 7.75rem);
  --_sqrt3: 1.732051;
  position: relative;
  width: min(25.75rem, calc(100% - var(--node-size)));
  margin-inline: auto;
  margin-block: var(--node-size);

  aspect-ratio: calc(var(--_sqrt3) / 4);
  display: grid;
  grid-template-areas:
    ". . keter .  ."
    ". . . . ."
    "binah . . . hokma"
    ". . . . ."
    ". . . . ."
    ". . . . ."
    "geburah . . . chesed"
    ". . . . ."
    ". . tiphereth . ."
    ". . . . ."
    "hod . . . netzach"
    ". . . . ."
    ". . yesod . ."
    ". . . . ."
    ". . . . ."
    ". . . . ."
    ". . malkuth .  .";
  grid-template-columns: 0px 1fr 0px 1fr 0px;
  grid-template-rows: 0px 1fr 0px 1fr 0px 1fr 0px 1fr 0px 1fr 0px 1fr 0px 1fr 0px 1fr 0px;
}

#u-ka-tree .node {
  width: 0px;
  height: 0px;
  position: relative;
  --_empty: linear-gradient(
      0deg,
      transparent 48%,
      rgb(var(--basalt-background-color)) 48%,
      rgb(var(--basalt-background-color)) 52%,
      transparent 52%
    ),
    linear-gradient(
      90deg,
      transparent 50%,
      rgb(var(--basalt-background-color)) 50%,
      transparent
    );
}

.keter {
  grid-area: keter;
}
.binah {
  grid-area: binah;
}
.hokma {
  grid-area: hokma;
}
.geburah {
  grid-area: geburah;
}
.chesed {
  grid-area: chesed;
}
.tiphereth {
  grid-area: tiphereth;
}
.netzach {
  grid-area: netzach;
}
.hod {
  grid-area: hod;
}
.yesod {
  grid-area: yesod;
}
.malkuth {
  grid-area: malkuth;
}

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

.node > ul,
.node > ul > li {
  list-style: none;
  margin: 0;
  padding: 0;
}

ul.emanation-container {
  position: absolute;
  left: calc(var(--node-size) / -2);
  top: calc(var(--node-size) / -2);
  width: var(--node-size);
  height: var(--node-size);
}

ul.emanation-container::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  width: var(--node-size);
  height: var(--node-size);
  border-radius: 50%;

  background-color: rgb(var(--basalt-secondary-color));
  background-image: var(--icon);
  background-size: cover;
  background-position: center;
  transition: all 0.25s ease-out 0.05s;
}
ul.emanation-container:is(:hover, :focus-within)::before,
#u-ka-tree .node.empty:hover::before {
  filter: brightness(1.25);
  box-shadow: 0 0 1.5em var(--accent, rgb(var(--basalt-undertone), 0.5));
}

ul.emanation-container > li,
ul.emanation-container .menu-toggle {
  display: contents;
}

.menu-toggle > a:nth-child(1) {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border-radius: 50%;
  display: grid;
  place-items: center;
  opacity: 0;
}
.menu-toggle > a:nth-child(2) {
  display: block;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgb(var(--modal-fader-background-color), 0.75);
  color: transparent !important;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.125s ease-out;
  z-index: 11;
}

.node-label {
  position: absolute;
  top: 52.5%;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 0.25rem;
  text-align: center;
  font-family: var(--header-font);
  font-size: min(calc(0.775em + 0.325vw), 1em);
  line-height: 0.925;
  color: var(--accent);
  text-shadow: 0 0 0.375em rgb(var(--basalt-secondary-color));
  transition: all 0.175s ease-out 0.05s;
}
.node-label .hebrew {
  font-size: 1.675em;
}
.node-label .eng {
  font-size: 0.95em;
  font-weight: bold;
}
.node-label :is(.hebrew, .eng) {
  text-shadow: 1px 1px 5px black, 1px 1px 5px black, 1px 1px 5px black;
}

/*--- if empty ---*/
:root #u-ka-tree .node.empty::before {
  content: "";
  position: absolute;
  left: calc(var(--node-size) / -2);
  top: calc(var(--node-size) / -2);
  width: var(--node-size);
  height: var(--node-size);
  border-radius: 50%;
  /* background-color: rgb(var(--basalt-secondary-color)); */
  /* background-image: var(--_empty); */
  cursor: not-allowed;
  transition: all 0.25s ease-out;
  z-index: 999;
  filter: saturate(0.25);
}

.node.empty .node-label {
  display: none;
}

/*--- if preview---*/
.preview-mode-on {
  --icon: var(--_empty) !important;
}
:root ul.preview-mode-on::before {
  background-image: radial-gradient(black, #000c),
    radial-gradient(var(--accent), var(--accent));
}

:root .node:not(.empty) ul.preview-mode-on::before {
  box-shadow: 0 0 1.5em var(--accent);
}

.preview-mode-on :is(.e-image, .e-destination, .e-audio) {
  display: none;
}
.preview-mode-on .e-description {
  padding-block: 0.75rem 1.25rem;
}

/*--- pathways ---*/
#u-ka-tree .pathways {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
  pointer-events: none;
}

.pathways > br {
  display: none;
}
.pathways > span {
  --c: 1;
  --r: 1;
  --l: 1;
  --angle: 0;
  --o: 0;
  --_width: 1.625rem;
  --_opacity: 0;
  position: absolute;
  left: calc(50% * (var(--c) - 1) - var(--_width) / 2);
  top: calc(12.5% * (var(--r) - 1));
  width: var(--_width);
  height: calc(12.5% * var(--l));
  transform-origin: 50% 0;
  transform: rotate(calc(1deg * var(--angle)));

  display: flex;
  flex-direction: column;
  justify-content: center;
  place-items: center;
  text-align: center;
  font-size: 1.75em;

  background-color: rgb(var(--basalt-undertone), calc(var(--_opacity) + 0.1));
  color: rgb(var(--basalt-main-text-color), var(--_opacity));
  transition: all 0.175s ease-out 0.05s;
}

.pathways > span > strong {
  font-weight: normal;
  display: block;
  transform: rotate(calc(-1deg * var(--angle)));
}

/*--- pathways character offset ---*/

.pathways > span::before,
.pathways > span::after {
  content: "";
  display: block;
  height: max(var(--o), 0rem);
}
.pathways > span::after {
  height: calc(min(var(--o), 0rem) * -1);
}

/*--- pathways glow logic ---*/
.malkuth:is(:hover, :focus-within) ~ .pathways > .c-malkuth,
.yesod:is(:hover, :focus-within) ~ .pathways > .c-yesod,
.hod:is(:hover, :focus-within) ~ .pathways > .c-hod,
.netzach:is(:hover, :focus-within) ~ .pathways > .c-netzach,
.tiphereth:is(:hover, :focus-within) ~ .pathways > .c-tiphereth,
.chesed:is(:hover, :focus-within) ~ .pathways > .c-chesed,
.geburah:is(:hover, :focus-within) ~ .pathways > .c-geburah,
.hokma:is(:hover, :focus-within) ~ .pathways > .c-hokma,
.binah:is(:hover, :focus-within) ~ .pathways > .c-binah,
.keter:is(:hover, :focus-within) ~ .pathways > .c-keter {
  --_opacity: 0.925;
  animation: path-pulse 2.25s infinite;
  animation-timing-function: ease-in-out;
}

.blargh:is(:hover, :focus-within) ~ .pathways > span {
  --_opacity: 0.75;
  background-color: rgb(
    var(--basalt-main-text-color),
    calc(var(--_opacity) + 0.175)
  );
  box-shadow: 0 0 1em rgb(var(--basalt-undertone), 0.875);
  color: rgb(var(--basalt-light-text-color));
}
#u-ka-tree:has(.blargh:is(:hover, :focus-within))
  > .node:where(:not(.blargh))
  .emanation-container::before {
  filter: contrast(0.95) brightness(1.75) saturate(0.25);
}
#u-ka-tree:has(.blargh:is(:hover, :focus-within))
  > .node:where(:not(.blargh))
  .node-label {
  opacity: 0;
}

@keyframes path-pulse {
  0% {
    filter: brightness(1);
    box-shadow: 0 0 0 transparent;
  }
  45%,
  53% {
    filter: brightness(1.25);
    box-shadow: 0 0 1em rgb(var(--basalt-undertone), 0.5);
  }
  100% {
    filter: brightness(1);
    box-shadow: 0 0 0 transparent;
  }
}

/*--------------------------------*/
/*--- MOBILE QUERY ---*/
/*--------------------------------*/
@media all and (max-width: 1024px) {
  .pathways > span {
    --_width: 1.25rem;
  }
}
</style>
<div id="page-content">
  <div id="u-ka-tree">
    <div class="pathways">
      <span class="c-malkuth c-yesod" style="--c: 2; --r: 7; --l: 2"
        ><strong>ת</strong></span
      ><br />
      <span class="c-yesod c-hod" style="--c: 2; --r: 7; --l: 2; --angle: 120"
        ><strong>ל</strong></span
      ><br />
      <span
        class="c-yesod c-netzach"
        style="--c: 2; --r: 7; --l: 2; --angle: 240"
        ><strong>נ</strong></span
      ><br />
      <span
        class="c-yesod c-tiphereth"
        style="--c: 2; --r: 7; --l: 2; --angle: 180; --o: -30.5%"
        ><strong>ר</strong></span
      ><br />
      <span
        class="c-hod c-netzach"
        style="--c: 1; --r: 6; --l: calc(2 * var(--_sqrt3)); --angle: 270"
        ><strong>מ</strong></span
      ><br />
      <span
        class="c-hod c-tiphereth"
        style="--c: 1; --r: 6; --l: 2; --angle: 240"
        ><strong>ס</strong></span
      ><br />
      <span class="c-hod c-geburah" style="--c: 1; --r: 6; --l: 2; --angle: 180"
        ><strong>פ</strong></span
      ><br />
      <span
        class="c-netzach c-tiphereth"
        style="--c: 3; --r: 6; --l: 2; --angle: 120"
        ><strong>י</strong></span
      ><br />
      <span
        class="c-netzach c-chesed"
        style="--c: 3; --r: 6; --l: 2; --angle: 180"
        ><strong>כ</strong></span
      ><br />
      <span
        class="c-tiphereth c-geburah"
        style="--c: 2; --r: 5; --l: 2; --angle: 120"
        ><strong>צ</strong></span
      ><br />
      <span
        class="c-tiphereth c-chesed"
        style="--c: 2; --r: 5; --l: 2; --angle: 240"
        ><strong>ח</strong></span
      ><br />
      <span
        class="c-tiphereth c-binah"
        style="
          --c: 2;
          --r: 5;
          --l: calc(2 * var(--_sqrt3));
          --angle: 150;
          --o: 33.3%;
        "
        ><strong>ע</strong></span
      ><br />
      <span
        class="c-tiphereth c-hokma"
        style="
          --c: 2;
          --r: 5;
          --l: calc(2 * var(--_sqrt3));
          --angle: 210;
          --o: 33.3%;
        "
        ><strong>ט</strong></span
      ><br />
      <span
        class="c-geburah c-binah"
        style="--c: 1; --r: 4; --l: 2; --angle: 180"
        ><strong>ג</strong></span
      ><br />
      <span
        class="c-geburah c-hokma"
        style="--c: 1; --r: 4; --l: 4; --angle: 240; --o: 50%"
        ><strong>ז</strong></span
      ><br />
      <span
        class="c-chesed c-hokma"
        style="--c: 3; --r: 4; --l: 2; --angle: 180"
        ><strong>ב</strong></span
      ><br />
      <span
        class="c-chesed c-binah"
        style="--c: 3; --r: 4; --l: 4; --angle: 120; --o: 50%"
        ><strong>ק</strong></span
      ><br />
      <span
        class="c-tiphereth c-keter"
        style="--c: 2; --r: 5; --l: 4; --angle: 180; --o: 33.3%"
        ><strong>ד</strong></span
      ><br />
      <span
        class="c-geburah c-chesed"
        style="--c: 1; --r: 4; --l: calc(2 * var(--_sqrt3)); --angle: 270"
        ><strong>א</strong></span
      ><br />
      <span
        class="c-hokma c-binah"
        style="--c: 1; --r: 2; --l: calc(2 * var(--_sqrt3)); --angle: 270"
        ><strong>ש</strong></span
      ><br />
      <span class="c-keter c-binah" style="--c: 2; --r: 1; --l: 2; --angle: 60"
        ><strong>ו</strong></span
      ><br />
      <span class="c-keter c-hokma" style="--c: 2; --r: 1; --l: 2; --angle: 300"
        ><strong>ה</strong></span
      >
    </div>
  </div>
</div>

<script>
  const config = { id: 0, source: "main" };
</script>

<script>let msgid = config.id * 100_000_000;
function send(dst, type, data, timeout) {
  let id = msgid++;

  const promise = new Promise((resolve, reject) => {
    let resolved = false;
    const listener = (e) => {
      if (!e.data || e.data.id !== id || e.data.type) return;
      window.removeEventListener("message", listener);
      resolve(e.data.data);
      resolved = true;
    };

    if (timeout) {
      setTimeout(() => {
        if (!resolved) reject();
      }, timeout);
    }

    window.addEventListener("message", listener);
  });

  dst.postMessage({ type, data, id }, "*");
  return promise;
}

function registerListener(type, callback) {
  window.addEventListener("message", async (e) => {
    if (!e.data || e.data.type !== type) return;
    e.source.postMessage(
      { data: await callback(e.data.data), id: e.data.id },
      "*"
    );
  });
}

registerListener("identify", (d) => {
  return config.source;
});

registerListener("print", (d) => {
  console.log(`${config.source}: `, d);
});

const subdomain = window.location.hostname.split(".")?.[0];

let iframe;

function setHeight(d) {
  console.log(config.source, "set height", d);
  if (iframe) iframe.parentElement.removeChild(iframe);
  iframe = document.createElement("iframe");
  document.body.appendChild(iframe);
  iframe.src = `https://${subdomain}.wikidot.com/common--javascript/resize-iframe.html#${d}/${window.location.pathname
    .split("/")
    .at(-3)}`;
  iframe.style.display = "none";
}

registerListener("setHeight", (d) => {
  setHeight(d);
});

function waitForFrame(name) {
  return new Promise((resolve, reject) => {
    let resolved = false;
    let callback = async () => {
      if (resolved) return;
      for (let i = 0; i < window.parent.frames.length; i++) {
        const f = window.parent.frames[i];
        try {
          const identity = await send(f, "identify", undefined, 1000);
          if (identity == name) {
            resolve(f);
            clearInterval(callback);
            resolved = true;
            break;
          }
        } catch (e) {}
      }
      if (!resolved) setTimeout(callback, 0);
    };
    let interval = setInterval(callback, 200);
  });
}
</script>

<script>
  const overlay = waitForFrame("overlay");

  function instantiateNodeTemplate(params) {
    const {
      nodeclass,
      eng,
      hebrew,
      accent,
      icon,
      banner,
      description,
      slug,
      author,
      preview,
    } = params;

    const dom = new DOMParser().parseFromString(
      `<div class="node ${nodeclass} ${preview === "hide" ? "empty" : ""}">
                                              <style>
  .${nodeclass} .emanation-container::before {
  --icon: ${icon};
                                          
  }
                                              </style>
      <ul
        class="emanation-container ${
          preview === "true" || preview === "hide" ? "preview-mode-on" : ""
        }"
        style="--icon: ${icon}; --banner: ${banner}; --accent: ${accent};"
      >
        <li class="folded">
          <div class="node-label">
            <span class="hebrew">${hebrew}</span><span class="eng">${eng}</span>
          </div>
          <div class="foldable-list-container menu-toggle">
            <a href="javascript:;" id="${nodeclass}-open">open</a><a href="javascript:;">close</a>
          </div>
        </li>
      </ul>
    </div>`,
      "text/html"
    );
    if (preview !== "hide") {
      dom
        .getElementById(nodeclass + "-open")
        .addEventListener("click", async (e) => {
          send(await overlay, "open", params, 1000);
        });
    }
    return dom.querySelector(".node");
  }

  const NODE_TEMPLATE_LIST = [];
</script>

[[include fragment:sephirot]]

<script>
  const tree = document.getElementById("u-ka-tree");
  const pathways = document.querySelector(".pathways");
  for (const template of NODE_TEMPLATE_LIST) {
    tree.insertBefore(instantiateNodeTemplate(template), pathways);
  }
</script>

[[/html]]

[[module css]]

.iframe-overlay {
  display: none;
}

.iframe-overlay[style$="1px;"] {
  display: block;
  top: 0;
  left: 0;
  width: 100vw !important;
  height: 100vh !important;
  position: fixed;
  background-color: #0008;
  z-index: 11;
}
[[/module]]

[[html class="iframe-overlay"]]
<style>
  @import url("https://cdn.scpwiki.com/theme/en/basalt/normalize-min.css");
  @import url("https://cdn.scpwiki.com/theme/en/basalt/basalt-bedrock-min.css");
  @import url("https://scp-wiki.wdfiles.com/local--code/theme%3Aeigenvector/1");

  html#html-block-html#html-block-html body {
    width: 100vw;
    height: 100vh;
  }
</style>
<style>@import url("https://fonts.googleapis.com/css2?family=Caudex:ital,wght@0,400;0,700;1,400;1,700&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Bodoni+Moda+SC:ital,opsz,wght@0,6..96,400..900;1,6..96,400..900&display=swap");
@import url("https://api.fonts.coollabs.io/css2?family=Noto+Serif+Hebrew:wght@100..900&display=swap");

:root {
  --body-font-primary: "Caudex";
  --header-font-primary: "Bodoni Moda SC";
  --body-font-fallback: "Noto Serif Hebrew", "Times New Roman", serif;
  --header-font-fallback: "Noto Serif Hebrew", "Times New Roman", serif;
  --base-font-size: 1.15rem;

  --basalt-primary-color: 29, 30, 43;
  --basalt-secondary-color: 22, 20, 30;
  --basalt-tertiary-color: 49, 47, 63;
  --basalt-bright-element-color: 177, 181, 211;
  --basalt-overtone: 249, 251, 252;
  --basalt-main-text-color: var(--basalt-overtone);
  --modal-fader-background-color: var(--basalt-secondary-color);
  --h-border-color: var(--basalt-tertiary-color);
  --bottom-area-background-color: var(--basalt-secondary-color);
  --basalt-undertone: var(--basalt-bright-element-color);

  --header-title: "SCP文选2025";
  --header-subtitle: "从无创有";
  --title-size: min(calc(1.75rem + 2.5vw), 4.5rem);
  --subtitle-size: min(calc(0.875rem + 2.25vw), 1.95rem);
  --header-logo: unset;
  --antho-header: url(https://smlt.wikidot.com/local--files/collab:estrellayoshte:blem2/antho25header.jpg);
  --antho-body: url(https://smlt.wikidot.com/local--files/collab:estrellayoshte:blem2/pillars.jpg);
  --antho-footer: url(https://radian628.wikidot.com/local--files/secret:thingy3/footer-image.png);

  --base-header-height: calc(
    (var(--title-size) + var(--subtitle-size)) * 1.875 + 20.5rem + 7.5svh
  );
  --header-desktop-height: calc(
    var(--base-header-height) + var(--header-border-width) +
      var(--top-bar-mobile-height)
  );
  --header-border-width: 0rem;
  --header-mobile-height: var(--header-desktop-height);
  --top-bar-mobile-height: calc(var(--header-UI-font-size) * 2.675);
  --side-bar-button-width: 3rem;
  --main-content-width: 54.5rem;

  --side-bar-link-font-size: calc(var(--base-font-size) * 0.825);
}
</style> <style>/* audio player */

#audio-volume {
  writing-mode: vertical-rl;
  position: absolute;
  right: 0;
  border-color: var(--accent);
}

.audio-controls {
  width: 100%;
  display: flex;
}

#audio-volume-controls {
  width: 2.5em;
  height: 2.5em;
  position: relative;
}

#audio-volume {
  bottom: 100%;
  right: 0%;
  position: absolute;
  display: none;
  z-index: 3;
  width: 2.5em;
  height: 4em;
}

#audio-volume-controls:hover #audio-volume {
  display: block;
}

#audio-progress {
  width: calc(100% - 5em);
  height: 2.5em;
  background-image: linear-gradient(
    to right,
    var(--accent) 0%,
    var(--accent) var(--percent-done),
    transparent var(--percent-done),
    transparent 100%
  );
}

.audio-controls {
  border: 1px solid var(--accent);
}

#audio-play-pause {
  border: none;
  border-right: 1px solid var(--accent);
  width: 2.5em;
  height: 2.5em;
}

#audio-volume-controls {
  border: none;
  border-left: 1px solid var(--accent);
}

.audio-controls {
  border: 1px solid var(--accent);
  width: 75% !important;
  margin: auto;
}

#audio-play-pause {
  border: none;
  border-right: 1px solid var(--accent);
}

#audio-volume-controls {
  border: none;
  border-left: 1px solid var(--accent);
  cursor: pointer;
}

#audio-volume-controls-inverted {
  height: 2.5em;
  width: 2.5em;
  background-color: var(--accent);
  clip-path: polygon(
    0% 100%,
    100% 100%,
    100% var(--volume-amount),
    0% var(--volume-amount)
  );
}

#audio-progress {
  margin: 0.5em;
  height: 1.5em !important;
}

/* .node {
  animation: fadein 1.8s;
  animation-fill-mode: both;
  list-style: none;
}

@keyframes fadein {
  0% {
    transform: translateY(100vh);
  }

  100% {
    transform: translateY(0);
  }
} */

/* card */

.emanation-menu {
  height: 90vh;
  position: absolute;
  bottom: 0;
  left: 50%;
  transform: translateX(-50%);
  width: calc(min(40em, 100vw - 2em));
  list-style: none;
  margin: 0;
  padding: 0;
}

@media (max-width: 800px) {
  .emanation-menu {
    height: calc(100vh + 50px);
  }

  .emanation-menu .e-content {
    padding-left: 1em;
    padding-right: 1em;
  }
}

.folded .emanation-menu {
  height: 70vh;
}

.e-scroll-contents {
  display: flex;
  flex-direction: column;
  height: 100%;
  border: 0.5em solid var(--accent);
  border-bottom: none;
  padding-bottom: 2em;
  background-color: #16141ecc;
  backdrop-filter: blur(8px);
  box-sizing: border-box;
}

.e-image {
  flex-grow: 1;
  background-image: var(--banner);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  min-height: 270px;
}

:root:root .e-link {
  width: 90%;
  display: block;
  text-align: center;
  font-size: 150%;
  color: var(--accent);
  margin: auto;
  margin-top: 1em;
  padding-top: 0.5em;
  padding-bottom: 0.5em;
  border: 2px solid var(--accent);
  background-color: #16141ecc;
  transition: background-color 0.5s, filter 0.5s;
}

:root:root .e-link:hover {
  background-color: #2b273dcc;
  filter: drop-shadow(0 0 10px var(--accent));
  text-decoration: none;
}

.e-content {
  padding-left: 2em;
  padding-right: 2em;
}

.e-destination {
  padding-left: 2em;
  padding-right: 2em;
}

.e-audio {
  margin-top: 1.2em;
  margin-bottom: 0.6em;
}

.by-author {
  text-align: center;
  margin: auto;
  display: block;
}

/* scroll */

.e-scroll-container .e-scroll {
  width: 155%;
  aspect-ratio: 5;
  background-size: cover;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: scaleY(0.7) translate(-50%, -80%);
}

.e-scroll-container {
  position: relative;
  width: 100%;
  overflow: visible;
}

.emanation-container {
  overflow: visible;
}

.e-scroll-container {
  z-index: 2;
  animation: scroll 2s;
  animation-fill-mode: both;
  position: absolute;
  animation-timing-function: ease-out;
  height: 0;
}

@keyframes scroll {
  0% {
    top: 120%;
  }

  100% {
    top: 0;
  }
}

.e-scroll-contents {
  animation: scroll-contents 2s;
  animation-fill-mode: both;
  height: 100%;
  animation-timing-function: ease-out;
  overflow: auto;
}

@keyframes scroll-contents {
  0% {
    clip-path: polygon(0% 120%, 0% 100%, 100% 100%, 100% 120%);
  }

  100% {
    clip-path: polygon(0% 0%, 0% 100%, 100% 100%, 100% 0%);
  }
}

.folded .e-scroll-contents {
  display: flex;
  flex-direction: column;
  justify-content: start;
  align-items: center;
}

:root:root .folded .e-content {
  text-align: center;
}

:root:root .unfolded .e-title-container {
  background-color: var(--accent);
  opacity: 0.9;
  font-family: monospace;
  text-align: right;
  color: black;
  font-size: 150%;
  width: 100%;
  padding: 0em 0.2em;
  box-sizing: border-box;
}

:root:root h2 {
  font-family: monospace;
  padding: 0;
  margin: 0;
}

:root:root .unfolded .e-title-container h2 {
  font-size: 160%;
}

.unfolded .e-title-container .e-author {
  font-size: 80%;
  margin-top: -0.5em;
}

:root:root .folded h2 {
  font-size: min(15vw, 600%);
  color: var(--accent);
  text-align: center;
  margin-top: 0.6em;
  margin-bottom: 0;
}

.folded p.timestamp {
  font-size: 150%;
  color: var(--accent);
  font-weight: bold;
}

.e-sephirot-container {
  height: 0;
  position: relative;
}

.e-sephirot {
  position: absolute;
  bottom: 0;
  right: 0;
  font-size: 250%;
  margin-right: 0.3em;
  font-family: monospace;
  color: var(--accent);
  text-shadow: 0 0 10px #000, 0 0 10px #000;
}

/* close button */

.e-close-button {
  position: absolute;
  top: 10px;
  right: 10px;
  width: 35px;
  height: 35px;
  border-radius: 50%;
  background-color: black;
  border: 2.5px solid var(--accent);
  color: var(--accent);
  font-size: 20px;
}

.e-close-button div {
  top: 50%;
  left: 50%;
  position: absolute;
  transform: translate(-50%, -50%);
}

/* other stuff */

ul,
li {
  list-style: none;
}

/* timer */
#e-timer {
  text-align: center;
  font-family: monospace;
  font-size: min(450%, 12vw);
  color: var(--accent);

  margin-bottom: 0.5em;
  border: 0.05em solid var(--accent);
  padding: 0 0.2em;
  background-image: linear-gradient(#000d, #000d),
    linear-gradient(
      45deg,
      black 0%,
      black 55%,
      var(--accent) 60%,
      var(--accent) 70%,
      black 75%,
      black
    );
  text-shadow: 0 0 10px var(--accent);
  margin-top: 0.25em;
}
</style>
<div id="root"></div>
<script>
  const config = { id: 1, source: "overlay" };
</script>

<script>let msgid = config.id * 100_000_000;
function send(dst, type, data, timeout) {
  let id = msgid++;

  const promise = new Promise((resolve, reject) => {
    let resolved = false;
    const listener = (e) => {
      if (!e.data || e.data.id !== id || e.data.type) return;
      window.removeEventListener("message", listener);
      resolve(e.data.data);
      resolved = true;
    };

    if (timeout) {
      setTimeout(() => {
        if (!resolved) reject();
      }, timeout);
    }

    window.addEventListener("message", listener);
  });

  dst.postMessage({ type, data, id }, "*");
  return promise;
}

function registerListener(type, callback) {
  window.addEventListener("message", async (e) => {
    if (!e.data || e.data.type !== type) return;
    e.source.postMessage(
      { data: await callback(e.data.data), id: e.data.id },
      "*"
    );
  });
}

registerListener("identify", (d) => {
  return config.source;
});

registerListener("print", (d) => {
  console.log(`${config.source}: `, d);
});

const subdomain = window.location.hostname.split(".")?.[0];

let iframe;

function setHeight(d) {
  console.log(config.source, "set height", d);
  if (iframe) iframe.parentElement.removeChild(iframe);
  iframe = document.createElement("iframe");
  document.body.appendChild(iframe);
  iframe.src = `https://${subdomain}.wikidot.com/common--javascript/resize-iframe.html#${d}/${window.location.pathname
    .split("/")
    .at(-3)}`;
  iframe.style.display = "none";
}

registerListener("setHeight", (d) => {
  setHeight(d);
});

function waitForFrame(name) {
  return new Promise((resolve, reject) => {
    let resolved = false;
    let callback = async () => {
      if (resolved) return;
      for (let i = 0; i < window.parent.frames.length; i++) {
        const f = window.parent.frames[i];
        try {
          const identity = await send(f, "identify", undefined, 1000);
          if (identity == name) {
            resolve(f);
            clearInterval(callback);
            resolved = true;
            break;
          }
        } catch (e) {}
      }
      if (!resolved) setTimeout(callback, 0);
    };
    let interval = setInterval(callback, 200);
  });
}
</script>
<script>
  const scrollSvgRaw = (async () =>
    await (
      await fetch(
        `https://scp-wiki-cn.wdfiles.com/local--files/scp-anthology-2025/scroll.svg`
      )
    ).text())();

  setHeight("10");

  let currentVolume = 1.0;
  let currentAccent;
  let ispreview = false;
  let targetTime;

  function instantiateOverlayTemplate(params) {
    const {
      nodeclass,
      eng,
      hebrew,
      accent,
      icon,
      banner,
      description,
      slug,
      author,
      audioFile,
      preview,
      title,
      time,
    } = params;

    ispreview = preview === "true";

    currentAccent = accent;
    targetTime = time;

    const dom =
      preview === "true"
        ? new DOMParser().parseFromString(
            `<div class="node ${nodeclass}">
                                              <style>
  .${nodeclass} .emanation-container::before {
  --icon: ${icon};
  }
                                              </style>
      <ul
        class="emanation-container"
        style="--icon: ${icon}; --banner: ${banner}; --accent: ${accent};"
      >
        <li class="folded">
          <div class="emanation-menu-wrapper">
            <div class="emanation-menu">
              <div class="e-scroll-container">
                <div class="e-scroll"></div>
              </div>
              <div class="e-scroll-contents">
                <h2>${eng.toUpperCase()}</h2>
                <div id="e-timer"></div>
                <div class="e-content">
                  ${description}
                </div>
              </div>
            </div>
          </div>
          <br />
        </li>
      </ul>
    </div>`,
            "text/html"
          )
        : new DOMParser().parseFromString(
            `<div class="node ${nodeclass}">
                                              <style>
  .${nodeclass} .emanation-container::before {
  --icon: ${icon};
  }
                                              </style>
      <ul
        class="emanation-container"
        style="--icon: ${icon}; --banner: ${banner}; --accent: ${accent};"
      >
        <li class="unfolded">
          <div class="emanation-menu-wrapper">
            <div class="emanation-menu">
              <div class="e-scroll-container">
                <div class="e-scroll"></div>
              </div>
              <div class="e-scroll-contents">
              <div class="e-image"></div>
              <div class="e-description">
                <div class="e-sephirot-container">
                  <div class="e-sephirot">
                    ${eng.toUpperCase()}
                  </div>
                </div>
                <div class="e-title-container">
                  <h2 id="toc9"><span>${title.toUpperCase()}</span></h2>
                  <div class="e-author">
                    by <strong>${author}</strong>
                  </div>
                </div>
                <div class="e-audio">
                  <div class="audio_iframe ${eng}">
                    <audio id="audio" autoplay>
                      <source src="${audioFile}" type="audio/mpeg">
                    </audio>
                    <div class="audio-controls">
                      <button id="audio-play-pause"></button>
                      <div id="audio-progress"></div>
                      <div id="audio-volume-controls" tabindex="0">
                        <div id="audio-volume-controls-inverted">
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
                <div class="e-content">
                  ${description}    
                </div>
                <div class="e-destination">
                  <a target="_parent" class="e-link" href="/${slug}">${slug.toUpperCase()}</a
                  >
                </div>
              </div>
              </div>
            </div>
          </div>
          <br />
        </li>
      </ul>
    </div>`,
            "text/html"
          );

    return dom.querySelector(".node");
  }

  let audio;

  function wait(ms) {
    return new Promise((resolve, reject) => {
      setTimeout(resolve, ms);
    });
  }

  let opened = false;

  registerListener("open", async (data) => {
    if (opened) return;
    opened = true;
    setHeight("1");
    const root = document.querySelector("#root");

    root.appendChild(instantiateOverlayTemplate(data));

    const closeButton = document.createElement("button");
    closeButton.className = "e-close-button";
    root.appendChild(closeButton);
    closeButton.style.setProperty("--accent", currentAccent);
    closeButton.innerHTML = "<div>✖</div>";
    closeButton.onclick = () => {
      closeOverlay();
    };
    closeButton.ontouchstart = () => {
      closeOverlay();
    };

    audio = document.getElementById("audio");

    // (async () => {
    const scrollElement = document.querySelector(".e-scroll");
    const scrollWithColors = (await scrollSvgRaw)
      .replaceAll("#aaaaaa", currentAccent)
      .replaceAll("#e6e6e6", currentAccent)
      .replaceAll("#333333", "#16141E");
    scrollElement.style.backgroundImage = `url('data:image/svg+xml;base64,${btoa(
      scrollWithColors
    )}')`;
    // })();

    if (ispreview) {
      const timer = document.getElementById("e-timer");

      setInterval(() => {
        const currentTime = Date.now();
        const releaseTime = new Date(targetTime).getTime();

        const timeUntilRelease = releaseTime - currentTime;

        if (timeUntilRelease > 0) {
          const seconds = Math.floor(timeUntilRelease / 1000);
          const minutes = Math.floor(seconds / 60);
          const hours = Math.floor(minutes / 60);
          const days = Math.floor(hours / 24);
          timer.innerText = `${days}:${(hours % 24)
            .toString()
            .padStart(2, "0")}:${(minutes % 60).toString().padStart(2, "0")}:${(
            seconds % 60
          )
            .toString()
            .padStart(2, "0")}`;
        }
      }, 100);

      return;
    }

    const playPauseButton = document.getElementById("audio-play-pause");
    const audioProgress = document.getElementById("audio-progress");
    const volumeSlider = document.getElementById("audio-volume-controls");
    const volumeSliderAmount = document.getElementById(
      "audio-volume-controls-inverted"
    );

    function getVolumeIcon(variant, color) {
      const svg = {
        high: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>volume-high</title><path fill="${color}" d="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z" /></svg>`,
        med: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>volume-medium</title><path fill="${color}" d="M5,9V15H9L14,20V4L9,9M18.5,12C18.5,10.23 17.5,8.71 16,7.97V16C17.5,15.29 18.5,13.76 18.5,12Z" /></svg>`,
        low: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>volume-low</title><path fill="${color}" d="M7,9V15H11L16,20V4L11,9H7Z" /></svg>`,
        off: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>volume-mute</title><path fill="${color}" d="M3,9H7L12,4V20L7,15H3V9M16.59,12L14,9.41L15.41,8L18,10.59L20.59,8L22,9.41L19.41,12L22,14.59L20.59,16L18,13.41L15.41,16L14,14.59L16.59,12Z" /></svg>`,
      }[variant];
      return `url('data:image/svg+xml,${encodeURIComponent(svg)}')`;
    }

    function getVolumeBackgroundOffset(variant) {
      return {
        high: "-0.02em 0",
        med: "-0.22em 0",
        low: "-0.45em 0",
        off: "0 0",
      }[variant];
    }

    function setPlayIcon() {
      playPauseButton.style.backgroundImage = `url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>play</title><path fill="${encodeURIComponent(
        currentAccent
      )}" d="M8,5.14V19.14L19,12.14L8,5.14Z" /></svg>')`;
    }

    function setPauseIcon() {
      playPauseButton.style.backgroundImage = `url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>pause</title><path fill="${encodeURIComponent(
        currentAccent
      )}" d="M14,19H18V5H14M6,19H10V5H6V19Z" /></svg>')`;
    }

    setPauseIcon();

    audio.volume = currentVolume;

    audio.onended = () => {
      setPlayIcon();
    };

    let clickingVolume = false;

    function updateVolumeSliderStyling() {
      volumeSliderAmount.style.setProperty(
        "--volume-amount",
        `${(1 - currentVolume) * 100}%`
      );

      let volumeSliderVariant = "off";
      if (currentVolume > 0) volumeSliderVariant = "low";
      if (currentVolume > 0.333) volumeSliderVariant = "med";
      if (currentVolume > 0.666) volumeSliderVariant = "high";
      volumeSlider.style.backgroundImage = getVolumeIcon(
        volumeSliderVariant,
        currentAccent
      );
      volumeSliderAmount.style.backgroundImage = getVolumeIcon(
        volumeSliderVariant,
        "#16141E"
      );

      volumeSlider.style.backgroundPosition =
        getVolumeBackgroundOffset(volumeSliderVariant);
      volumeSliderAmount.style.backgroundPosition =
        getVolumeBackgroundOffset(volumeSliderVariant);
    }

    updateVolumeSliderStyling();

    function calculateVolumeFromOffset(offset) {
      const rect = volumeSlider.getBoundingClientRect();
      const fract = 1 - (offset - rect.top) / rect.height;
      calculateVolume(fract);
    }

    function calculateVolume(fract) {
      currentVolume = Math.min(Math.max(0, fract), 1);
      audio.volume = currentVolume;
      updateVolumeSliderStyling();
    }

    volumeSlider.addEventListener("keydown", (e) => {
      // if (document.activeElement !== volumeSlider) return;
      if (e.key === "ArrowUp") {
        calculateVolume(currentVolume + 0.05);
      } else if (e.key === "ArrowDown") {
        calculateVolume(currentVolume - 0.05);
      }
    });

    volumeSlider.onmousedown = (e) => {
      calculateVolumeFromOffset(e.clientY);

      const mousemoveListener = (e) => {
        calculateVolumeFromOffset(e.clientY);
      };

      const mouseupListener = () => {
        document.removeEventListener("mouseup", mouseupListener);
        document.removeEventListener("mousemove", mousemoveListener);
      };
      document.addEventListener("mouseup", mouseupListener);
      document.addEventListener("mousemove", mousemoveListener);
    };

    playPauseButton.onclick = () => {
      if (audio.paused) {
        setPauseIcon();
        audio.play();
      } else {
        setPlayIcon();
        audio.pause();
      }
    };

    playPauseButton.ontouch = playPauseButton.onclick;

    audio.ontimeupdate = () => {
      const fraction = audio.currentTime / audio.duration;
      const percentDone = fraction * 100;
      audioProgress.style.setProperty("--percent-done", `${percentDone}%`);
    };

    audioProgress.onclick = (e) => {
      const rect = audioProgress.getBoundingClientRect();
      const fraction = e.offsetX / rect.width;
      const seconds = fraction * audio.duration;
      audio.currentTime = seconds;
    };
  });

  function closeOverlay() {
    opened = false;
    setHeight("10");
    if (audio) audio.pause();
    document.querySelector("#root").innerHTML = "";
  }

  registerListener("close", () => {
    closeOverlay();
  });

  document.body.addEventListener("click", (e) => {
    if (e.target === document.body) {
      closeOverlay();
    }
  });

  window.onload = () => {
    throw new Error(
      "ignore this error; this is just to disable the normal iframe resizing behavior by deliberately making wikidot's builtin code crash."
    );
  };
</script>

[[/html]]

[[include :scp-wiki-cn:component:license-box
|author=Yossipossi
|translator=Agt Darkwall
]]
=====
> **文件名:** Anthology 2025 Header
> **图像作者:**[[EstrellaYoshte]]
> **授权协议:**CC BY-SA 4.0
> **来源链接:**本页
> **衍生自:**
=====
> **文件名:** Брокенський привид на Шпицях
> **图像作者:**Михайло Пецкович
> **授权协议:**CC BY-SA 4.0
> **来源链接:**[[[https://commons.wikimedia.org/wiki/File:%D0%91%D1%80%D0%BE%D0%BA%D0%B5%D0%BD%D1%81%D1%8C%D0%BA%D0%B8%D0%B9_%D0%BF%D1%80%D0%B8%D0%B2%D0%B8%D0%B4_%D0%BD%D0%B0_%D0%A8%D0%BF%D0%B8%D1%86%D1%8F%D1%85.jpg |Wikimedia Commons]]]
=====
> **类型:** 开头引语
> **作者:**摩西·德·莱昂
> **授权协议:**公有领域
> **来源:**《光辉之书》第二卷,Balak 193b[[footnote]]译者注:译者未能找到《光辉之书》的完整中文译本,因此斗胆对开头引语进行个人翻译。若有热心者找到《光辉之书》中文版并在其中寻得对开头引语更正式的翻译,请直接替换之,不必联系译者[[/footnote]]
=====
> **文件名:** Pillars of creation 2014 HST WFC3-UVIS
> **图像作者:** NASA, ESA, and the Hubble Heritage Team
> **授权协议:**CC BY-SA 4.0
> **来源链接:**[[[https://en.wikipedia.org/wiki/File:Pillars_of_creation_2014_HST_WFC3-UVIS_full-res_denoised.jpg |Wikimedia Commons]]]
[[include :scp-wiki-cn:component:license-box-end]]