跳转到内容
打开/关闭菜单
  • 450 条目
  • 805 文件
  • 22 用户
  • 9137 编辑
Blockland Wiki
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

MediaWiki:KuranokaPageTransition.css

MediaWiki界面页面
KK​(留言 | 贡献)2026年10月23日 (五) 19:08的版本

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
  • Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
/* Kuranoka Page Transition V18 — vivid V2 fire, lower-overhead ambience / scoped crimson night
   Load only on /wiki/Kuranoka and /wiki/Kuronata.
   No Citizen.css / Common.css changes. */

#kkpt-toggle {
    --kkpt-tone: #a7e7ff;
    --kkpt-panel: rgba(7,28,49,.87);
    position: fixed;
    z-index: 2147483000;
    right: clamp(12px,2.3vw,34px);
    bottom: clamp(14px,3.4vh,34px);
    display: flex;
    align-items: center;
    gap: 10px;
    max-width: calc(100vw - 24px);
    box-sizing: border-box;
    padding: 12px 17px;
    border: 1px solid color-mix(in srgb,var(--kkpt-tone) 60%,transparent);
    border-radius: 999px;
    background: var(--kkpt-panel);
    box-shadow: 0 8px 35px #0007,0 0 20px color-mix(in srgb,var(--kkpt-tone) 25%,transparent);
    color: #f1fcff !important;
    font: 650 13px/1.3 system-ui,sans-serif;
    letter-spacing: .045em;
    text-decoration: none !important;
    cursor: pointer;
    backdrop-filter: blur(18px) saturate(145%);
    -webkit-backdrop-filter: blur(18px) saturate(145%);
    transition: transform .22s,box-shadow .22s,opacity .22s;
}

/* Easter egg mode: no floating button unless SHOW_FLOATING_BUTTON=true. */
#kkpt-toggle[hidden] {display:none !important}

#kkpt-toggle.kkpt-dark {
    --kkpt-tone: #ff6b7e;
    --kkpt-panel: rgba(41,4,14,.88);
    color: #fff1f1 !important;
}

#kkpt-toggle:hover,#kkpt-toggle:focus-visible {
    transform: translateY(-3px);
    box-shadow: 0 9px 38px #0008,0 0 32px var(--kkpt-tone);
}

#kkpt-toggle:focus-visible {outline: 2px solid var(--kkpt-tone);outline-offset: 4px}
#kkpt-toggle .kkpt-icon {font-size: 23px;color: var(--kkpt-tone);text-shadow: 0 0 13px var(--kkpt-tone)}
#kkpt-toggle .kkpt-text {display: flex;flex-direction: column;gap: 2px}
#kkpt-toggle .kkpt-sub {font-size: 10px;opacity: .74}
#kkpt-toggle.kkpt-busy {pointer-events: none}
#kkpt-toggle.kkpt-quiet {opacity: 0;pointer-events: none}

/* Real interactive Wiki page, retained after the transition finishes. */
#kkpt-preview {
    position: fixed !important;
    z-index: 2147481000 !important;
    inset: 0 !important;
    display: block !important;
    box-sizing: border-box !important;
    width: 100vw !important;
    height: 100vh !important;
    padding: 0 !important;
    margin: 0 !important;
    border: 0 !important;
    border-radius: 0 !important;
    overflow: hidden !important;
    clip-path: inset(0 0 0 100%);
    pointer-events: none !important;
    background: #1f0710;
    transform: translateZ(0);
    will-change: clip-path;
}

body.page-Kuronata #kkpt-preview {background: #c0eafe}
#kkpt-preview.kkpt-active {pointer-events: auto !important;clip-path: inset(0)}

/* Atmosphere remains independent of the flame: drifting smoke,
   scattered pages, shockwaves, and blue-white leaves from V14. */
#kkpt-atmosphere {
    position: fixed !important;
    z-index: 2147482000 !important;
    inset: 0 !important;
    display: block !important;
    width: 100vw !important;
    height: 100vh !important;
    pointer-events: none !important;
    transition: opacity 160ms linear;
}

/* V2's incandescent curtain sits ABOVE the dark smoke bank. */
#kkpt-vfx {
    position: fixed !important;
    z-index: 2147482100 !important;
    inset: 0 !important;
    display: block !important;
    width: 100vw !important;
    height: 100vh !important;
    pointer-events: none !important;
    transition: opacity 150ms linear;
}

/* MediaWiki portal links are normal links until hovered/focused. */
#mw-content-text a.kkpt-portal-link,
.mw-parser-output a.kkpt-portal-link {
    --kkpt-fringe: #ff4662;
    --kkpt-halo: rgba(244,19,51,.30);
    /* Never change inline flow, line breaks or Infobox link dimensions. */
    position: relative;
    isolation: isolate;
    cursor: pointer;
    text-decoration-thickness: 1px;
    text-underline-offset: 3px;
    transition: color .13s, text-shadow .13s, filter .13s;
}
#mw-content-text a.kkpt-portal-blue,
.mw-parser-output a.kkpt-portal-blue {
    --kkpt-fringe: #55e5ff;
    --kkpt-halo: rgba(23,183,255,.35);
}
#mw-content-text a.kkpt-portal-link:is(:hover,:focus-visible),
.mw-parser-output a.kkpt-portal-link:is(:hover,:focus-visible) {
    color: var(--kkpt-fringe) !important;
    text-shadow: -2px 0 var(--kkpt-halo),2px 0 rgba(108,219,255,.42),
                 0 0 11px var(--kkpt-halo);
    animation: kkpt-hover-jitter 800ms steps(1,end) infinite;
}
#mw-content-text a.kkpt-portal-link::before,
#mw-content-text a.kkpt-portal-link::after,
.mw-parser-output a.kkpt-portal-link::before,
.mw-parser-output a.kkpt-portal-link::after {
    position: absolute;
    inset: 0;
    z-index: 1;
    display: block;
    opacity: 0;
    content: attr(data-kkpt-text);
    color: var(--kkpt-fringe);
    line-height: inherit;
    font: inherit;
    font-weight: inherit;
    letter-spacing: inherit;
    text-decoration: none;
    pointer-events: none;
    white-space: nowrap;
    overflow: hidden;
}
#mw-content-text a.kkpt-portal-link:is(:hover,:focus-visible)::before,
.mw-parser-output a.kkpt-portal-link:is(:hover,:focus-visible)::before {
    opacity: .90;
    text-shadow: -2px 0 #fa345c;
    animation: kkpt-slice-a 680ms steps(1,end) infinite;
}
#mw-content-text a.kkpt-portal-link:is(:hover,:focus-visible)::after,
.mw-parser-output a.kkpt-portal-link:is(:hover,:focus-visible)::after {
    opacity: .80;
    color: #8af5ff;
    text-shadow: 2px 0 #39a7ff;
    animation: kkpt-slice-b 580ms steps(1,end) infinite;
}
@keyframes kkpt-hover-jitter {
    0%,12%,40%,72%,100% {transform:translate(0)}
    13% {transform:translate(1px,-1px)}
    15% {transform:translate(-1px,0)}
    42% {transform:translate(2px,0)}
    44% {transform:translate(0)}
    73% {transform:translate(-1px,1px)}
    75% {transform:translate(0)}
}
@keyframes kkpt-slice-a {
    0%,100% {clip-path:inset(0 0 91% 0);transform:translate(0)}
    15% {clip-path:inset(9% 0 70% 0);transform:translate(-3px,1px)}
    26% {clip-path:inset(40% 0 38% 0);transform:translate(4px,-1px)}
    42% {clip-path:inset(76% 0 9% 0);transform:translate(-2px,0)}
    59% {clip-path:inset(22% 0 59% 0);transform:translate(3px,1px)}
    84% {clip-path:inset(56% 0 22% 0);transform:translate(-4px,-1px)}
}
@keyframes kkpt-slice-b {
    0%,100% {clip-path:inset(78% 0 7% 0);transform:translate(0)}
    14% {clip-path:inset(46% 0 29% 0);transform:translate(2px,-1px)}
    37% {clip-path:inset(11% 0 80% 0);transform:translate(-4px,1px)}
    61% {clip-path:inset(65% 0 20% 0);transform:translate(4px,0)}
    83% {clip-path:inset(28% 0 49% 0);transform:translate(-2px,-1px)}
}

/* Pure overlay: NO styles or markup changes to native Infobox/caption. */
.kkpt-fate-gear {
    --kkpt-gear-ink: #f2feff;
    --kkpt-gear-halo: rgba(58,175,220,.42);
    position: absolute !important;
    z-index: 2147481100;
    box-sizing: border-box;
    top: 0;
    left: 0;
    width: 42px;
    height: 42px;
    display: grid !important;
    place-items: center;
    padding: 7px;
    border-radius: 50%;
    border: 1px solid rgba(255,255,255,.57);
    background: rgba(15,91,142,.15);
    box-shadow: inset 0 0 9px rgba(255,255,255,.18),
        0 0 11px var(--kkpt-gear-halo);
    color: var(--kkpt-gear-ink) !important;
    text-decoration: none !important;
    cursor: pointer;
    backdrop-filter: blur(5px);
    -webkit-backdrop-filter: blur(5px);
    transition: background .25s,box-shadow .25s,border-color .25s;
}

.kkpt-fate-gear[hidden] {display:none !important}

body.kkpt-other-active > .kkpt-fate-gear {
    visibility: hidden !important;
    pointer-events: none !important;
}
body.page-Kuronata .kkpt-fate-gear {
    --kkpt-gear-ink: #ffe7ec;
    --kkpt-gear-halo: rgba(245,58,82,.43);
    background: rgba(87,11,28,.38);
}

.kkpt-fate-gear:hover,
.kkpt-fate-gear:focus-visible {
    border-color: #fff;
    background: rgba(255,255,255,.15);
    box-shadow: inset 0 0 10px rgba(255,255,255,.22),
        0 0 24px var(--kkpt-gear-halo);
}

.kkpt-fate-gear:focus-visible {outline: 2px solid #fff;outline-offset: 3px}

.kkpt-fate-gear .kkpt-fate-gear-svg {
    display: block;
    width: 100%;
    height: 100%;
    overflow: visible;
    filter: drop-shadow(0 0 4px var(--kkpt-gear-halo));
    transform-origin: center;
}
.kkpt-fate-gear-svg path {fill: currentColor}
.kkpt-fate-gear-svg circle:first-of-type {
    fill: rgba(20,71,111,.45);
    stroke: currentColor;
    stroke-width: 1.2;
}
.kkpt-fate-gear-svg circle:last-of-type {fill:currentColor}

.kkpt-fate-gear-turning .kkpt-fate-gear-svg {
    animation: kkpt-fate-rotation 3.85s cubic-bezier(.19,.69,.25,1) both;
}
.kkpt-fate-gear::after {
    position: absolute;
    inset: -8px;
    border: 1px dashed var(--kkpt-gear-ink);
    border-radius: 50%;
    content: '';
    opacity: 0;
    pointer-events: none;
    transform: scale(.72);
}
.kkpt-fate-gear-turning::after {
    animation: kkpt-fate-ripple 1.15s ease-out both;
}
@keyframes kkpt-fate-rotation {
    0% {transform:rotate(0deg)}
    18% {transform:rotate(108deg)}
    57% {transform:rotate(594deg)}
    100% {transform:rotate(1080deg)}
}
@keyframes kkpt-fate-ripple {
    0% {opacity:0;transform:scale(.75) rotate(0deg)}
    20% {opacity:.85}
    100% {opacity:0;transform:scale(1.7) rotate(100deg)}
}

/* ==================================================================
   In-article FORM SWITCH: plain [[Kuronata|...]] / [[Kuranoka|...]].
   Place beside or inside an Infobox; no loader changes or inline JS.
   ================================================================== */
.mw-parser-output .kkpt-form-switch,
#mw-content-text .kkpt-form-switch {
    --kkpt-switch-tone: #58cfff;
    --kkpt-switch-ink: #e9faff;
    --kkpt-switch-background: rgba(9,36,61,.91);
    display: table;
    width: max-content;
    max-width: min(100%,320px);
    margin: .65em 0 1em;
    border-radius: 14px;
    isolation: isolate;
}

/* Respect any old in-article switch wikitext: never hide user content.
   Delete its wikitext manually if you prefer only the fate gear. */

/* After a right-floated Infobox, the switch floats alongside it when
   space allows; otherwise it falls below the box on narrow screens. */
.mw-parser-output .kkpt-form-switch--beside,
#mw-content-text .kkpt-form-switch--beside {
    float: right;
    clear: none;
    margin: .35em .8em 1em .5em;
}
.mw-parser-output .kkpt-form-switch--under,
#mw-content-text .kkpt-form-switch--under {
    float: right;
    clear: right;
}

body.page-Kuronata .kkpt-form-switch {
    --kkpt-switch-tone: #ff6279;
    --kkpt-switch-ink: #fff1f0;
    --kkpt-switch-background: rgba(47,7,19,.94);
}

#mw-content-text .kkpt-form-switch a.kkpt-portal-link,
.mw-parser-output .kkpt-form-switch a.kkpt-portal-link,
.mw-parser-output .kkpt-form-switch > a,
#mw-content-text .kkpt-form-switch > a {
    position: relative;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 47px;
    width: 100%;
    max-width: 320px;
    padding: 11px 19px;
    border: 1px solid color-mix(in srgb,var(--kkpt-switch-tone) 73%,transparent);
    border-radius: 14px;
    background: linear-gradient(135deg,
        color-mix(in srgb,var(--kkpt-switch-tone) 15%,transparent),
        transparent 50%),var(--kkpt-switch-background);
    box-shadow: 0 4px 18px rgba(0,0,0,.32),
        inset 0 1px 0 rgba(255,255,255,.12),
        0 0 16px color-mix(in srgb,var(--kkpt-switch-tone) 20%,transparent);
    color: var(--kkpt-switch-ink) !important;
    text-align: center;
    font: 700 12.5px/1.45 system-ui,sans-serif;
    letter-spacing: .075em;
    text-decoration: none !important;
    overflow: hidden;
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    transition: transform .22s,box-shadow .22s,border-color .22s;
}

#mw-content-text .kkpt-form-switch a.kkpt-portal-link:is(:hover,:focus-visible),
.mw-parser-output .kkpt-form-switch a.kkpt-portal-link:is(:hover,:focus-visible) {
    color: #fff !important;
    transform: translateY(-2px);
    border-color: #f5ffff;
    box-shadow: 0 6px 24px rgba(0,0,0,.42),
        0 0 22px color-mix(in srgb,var(--kkpt-switch-tone) 55%,transparent);
}

/* Keep the hidden second copy of the text inside the button's padding,
   so the hover glitch doesn't spill past the rounded silhouette. */
#mw-content-text .kkpt-form-switch a.kkpt-portal-link::before,
#mw-content-text .kkpt-form-switch a.kkpt-portal-link::after,
.mw-parser-output .kkpt-form-switch a.kkpt-portal-link::before,
.mw-parser-output .kkpt-form-switch a.kkpt-portal-link::after {
    inset: 11px 19px;
    text-align: center;
}

@media (max-width: 670px) {
    .mw-parser-output .kkpt-form-switch--beside,
    #mw-content-text .kkpt-form-switch--beside {
        float: none;
        clear: both;
        margin: .75em 0;
    }
}

@media (max-width: 600px) {
    #kkpt-toggle {padding: 10px 13px;gap: 8px}
    #kkpt-toggle .kkpt-sub {display:none}
}
@media (prefers-reduced-motion: reduce) {
    #kkpt-toggle {transition:none !important}
    #kkpt-vfx,#kkpt-atmosphere {display:none !important}
    #mw-content-text a.kkpt-portal-link,
    .mw-parser-output a.kkpt-portal-link {animation:none !important}
    #mw-content-text a.kkpt-portal-link::before,
    #mw-content-text a.kkpt-portal-link::after,
    .mw-parser-output a.kkpt-portal-link::before,
    .mw-parser-output a.kkpt-portal-link::after {animation:none !important;opacity:0 !important}
    .kkpt-fate-gear-turning .kkpt-fate-gear-svg,
    .kkpt-fate-gear-turning::after {animation:none !important}
}

/* ==============================================================
   KURONATA ONLY — Crimson Night
   Never targets Kuranoka or any other article. Keep native layout.
   JS opts just the Kuronata document into Citizen's night palette;
   these scoped values also cover a preview iframe before JS runs.
   ============================================================== */

html.kkpt-kuronata-dark,
body.page-Kuronata {
    color-scheme: dark;
    --color-base: #f1e8eb;
    --color-emphasized: #fff4f5;
    --color-subtle: #d5b7c0;
    --color-link: #ffb8c4;
    --color-progressive-oklch__h: 19;
    --color-progressive-hsl__h: 351;
    --color-surface-1: rgba(28, 15, 20, .94);
    --color-surface-2: rgba(42, 20, 28, .90);
    --color-surface-3: rgba(63, 26, 37, .90);
    --color-surface-4: rgba(84, 29, 45, .90);
}

/* Preserve the storm background and glass, only recolor the foreground. */
body.page-Kuronata,
body.page-Kuronata .citizen-page-container,
body.page-Kuronata .citizen-body-container,
body.page-Kuronata .mw-parser-output,
body.page-Kuronata #mw-content-text {
    color: #f1e8eb !important;
}

body.page-Kuronata :is(
    .mw-page-title-main,
    .mw-headline,
    .citizen-page-heading,
    .citizen-page-title,
    .mw-parser-output h1,
    .mw-parser-output h2,
    .mw-parser-output h3,
    .mw-parser-output h4,
    .mw-parser-output h5,
    .mw-parser-output h6
) {
    color: #fff3f4 !important;
}

/* Blue hyperlinks break the blood-red theme. Retain recognizable links. */
body.page-Kuronata :is(
    #mw-content-text,
    .mw-parser-output,
    .citizen-toc,
    .citizen-page-header
) a[href]:not(.new):not(.kkpt-fate-gear) {
    color: #ffb6c2 !important;
}
body.page-Kuronata :is(#mw-content-text,.mw-parser-output) a.new {
    color: #ff849b !important;
}
body.page-Kuronata :is(#mw-content-text,.mw-parser-output) a[href]:hover {
    color: #ffe0e5 !important;
}
body.page-Kuronata a.kkpt-portal-blue {
    --kkpt-fringe: #ffcad5;
    --kkpt-halo: rgba(255, 77, 115, .42);
}

/* Infobox: leave all rows/columns exactly as the template generated them.
   Correct only the old light-mode backgrounds and black foreground text. */
body.page-Kuronata :is(#mw-content-text,.mw-parser-output) table.infobox {
    background-color: rgba(24, 13, 19, .94) !important;
    color: #fff0f2 !important;
}
body.page-Kuronata :is(#mw-content-text,.mw-parser-output)
    table.infobox :is(caption,th,td) {
    color: #fff0f2 !important;
}
body.page-Kuronata :is(#mw-content-text,.mw-parser-output)
    table.infobox td {
    background-color: rgba(27, 18, 24, .88) !important;
}
body.page-Kuronata :is(#mw-content-text,.mw-parser-output)
    table.infobox th:not([colspan]) {
    background-color: rgba(73, 31, 43, .93) !important;
}
body.page-Kuronata :is(#mw-content-text,.mw-parser-output)
    table.infobox :is(th[colspan],.infobox-header) {
    color: #fff3f4 !important;
}
body.page-Kuronata :is(#mw-content-text,.mw-parser-output)
    table.infobox a[href] {
    color: #ffc1ca !important;
}
body.page-Kuronata ::selection {
    background: rgba(202, 47, 77, .64);
    color: #fff9fa;
}

/* Kuronata spoilers / 黑幕: the original white-on-white censor becomes
   soot black, with the text revealed only on hover or keyboard focus. */
body.page-Kuronata :is(#mw-content-text,.mw-parser-output) .heimu,
body.page-Kuronata :is(#mw-content-text,.mw-parser-output) .heimu a {
    background-color: #08080b !important;
    color: #08080b !important;
    text-shadow: none;
    -webkit-text-fill-color: #08080b !important;
    box-shadow: inset 0 0 0 1px rgba(112,32,48,.65);
    border-radius: 2px;
}
body.page-Kuronata :is(#mw-content-text,.mw-parser-output)
    .heimu:is(:hover,:focus,:focus-within),
body.page-Kuronata :is(#mw-content-text,.mw-parser-output)
    .heimu:is(:hover,:focus,:focus-within) a {
    background-color: #2d111c !important;
    color: #ffe3e8 !important;
    -webkit-text-fill-color: #ffe3e8 !important;
}

/* Kuronata 黑幕:直接让 span 本身出现彩色信号撕裂。
   无须 data 属性或 JS 注入,因此即使文章通过 AJAX 更新也生效。 */
body.page-Kuronata span.heimu {
    cursor: crosshair;
}
body.page-Kuronata span.heimu:is(:hover,:focus-visible,:focus-within) {
    color: #ffe3e8 !important;
    -webkit-text-fill-color: #ffe3e8 !important;
    background-color: #2d111c !important;
    animation: kkpt-heimu-interference 440ms steps(1,end) infinite !important;
}
@keyframes kkpt-heimu-interference {
    0%,8%,55%,100% {
        filter: none;
        text-shadow: -1px 0 #c93856,1px 0 #5dcfff;
        box-shadow: inset 0 0 0 1px #752738;
    }
    9%,15% {
        filter: contrast(1.65) brightness(1.22);
        text-shadow: -3px 0 #ff234f,3px 0 #52ecff,
                     0 2px #111;
        box-shadow: inset 0 -3px 0 #ff275b,
                    inset 0 2px 0 #66dfff;
    }
    27%,33% {
        filter: brightness(1.7);
        text-shadow: 3px 0 #ed2b70,-3px 0 #35dcff;
        box-shadow: inset 0 2px 0 #eb356b,
                    inset 0 -1px 0 #89f6ff;
    }
    65%,71% {
        filter: contrast(2) brightness(.83);
        text-shadow: -2px 0 #ff2851,4px 0 #5cf7ff;
        box-shadow: inset 0 -2px 0 #7f2840;
    }
    83%,87% {
        filter: brightness(1.45);
        text-shadow: 2px 0 #f35a8a,-2px 0 #49deee;
        box-shadow: inset 0 1px 0 #fff;
    }
}
@media (prefers-reduced-motion: reduce) {
    body.page-Kuronata span.heimu:is(:hover,:focus-visible,:focus-within) {
        animation: none !important;
    }
}

@media print {
    #kkpt-toggle,#kkpt-preview,#kkpt-vfx,#kkpt-atmosphere,
    .kkpt-form-switch {display:none !important}
}


/* ===============================================================
   V19: Kuronata spoiler fade + sliced text displacement.
   The existing native .heimu markup and Infobox remain untouched.
   =============================================================== */
body.page-Kuronata :is(#mw-content-text,.mw-parser-output) span.heimu,
body.page-Kuronata :is(#mw-content-text,.mw-parser-output) span.heimu a {
    transition: background-color .29s ease, color .29s ease,
                -webkit-text-fill-color .29s ease !important;
}
body.page-Kuronata span.heimu[data-kkpt-glitch] {
    position: relative;
    isolation: isolate;
}
body.page-Kuronata span.heimu[data-kkpt-glitch]::before,
body.page-Kuronata span.heimu[data-kkpt-glitch]::after {
    content: attr(data-kkpt-glitch);
    position: absolute;
    inset: 0;
    z-index: 2;
    display: inline;
    width: 100%;
    height: 100%;
    overflow: hidden;
    pointer-events: none;
    user-select: none;
    white-space: nowrap;
    font: inherit;
    font-weight: inherit;
    line-height: inherit;
    letter-spacing: inherit;
    opacity: 0;
    transition: opacity .24s ease;
}
body.page-Kuronata span.heimu[data-kkpt-glitch]::before {
    color: #ff385e;
    -webkit-text-fill-color: #ff385e;
    text-shadow: -2px 0 #ff385e;
}
body.page-Kuronata span.heimu[data-kkpt-glitch]::after {
    color: #6be9ff;
    -webkit-text-fill-color: #6be9ff;
    text-shadow: 2px 0 #6be9ff;
}
body.page-Kuronata span.heimu[data-kkpt-glitch]:is(:hover,:focus-visible,:focus-within)::before {
    opacity: .84;
    animation: kkpt-slice-a 570ms steps(1,end) infinite;
}
body.page-Kuronata span.heimu[data-kkpt-glitch]:is(:hover,:focus-visible,:focus-within)::after {
    opacity: .79;
    animation: kkpt-slice-b 490ms steps(1,end) infinite;
}

/* Always-on aftermath: a small number of GPU-composited smoke/ash
   sprites, without a second persistent requestAnimationFrame loop. */
body.page-Kuronata #kkpt-afterglow {
    position: fixed;
    inset: 0;
    z-index: 2147480950;
    overflow: hidden;
    pointer-events: none;
    user-select: none;
    contain: layout style paint;
}
body.page-Kuronata #kkpt-afterglow .kkpt-soot-cell,
body.page-Kuronata #kkpt-afterglow .kkpt-ash-cell {
    position: absolute;
    display: block;
    pointer-events: none;
    will-change: transform, opacity;
    animation-delay: var(--delay);
    animation-duration: var(--duration);
    animation-iteration-count: infinite;
    animation-timing-function: linear;
}
body.page-Kuronata #kkpt-afterglow .kkpt-soot-cell {
    width: var(--size);
    height: var(--size);
    border-radius: 50%;
    /* Grey-lit soot against the nearly black Kuronata world.
       Multiple ragged lobes read as smoke, not a black invisible disk. */
    background:
        radial-gradient(ellipse at 28% 60%,
            rgba(125,121,133,.22) 0%, rgba(67,59,68,.19) 29%,
            transparent 65%),
        radial-gradient(ellipse at 72% 39%,
            rgba(131,91,96,.17) 0%, rgba(67,50,60,.17) 36%,
            transparent 68%),
        radial-gradient(ellipse at 53% 54%,
            rgba(111,110,122,.35) 0%, rgba(61,60,72,.27) 34%,
            rgba(130,104,109,.09) 62%, transparent 79%);
    opacity: 0;
    animation-name: kkpt-soot-rise;
}
body.page-Kuronata #kkpt-afterglow .kkpt-ash-cell {
    width: var(--size);
    height: calc(var(--size) * 2.6);
    border-radius: 50%;
    background: radial-gradient(ellipse,
                rgba(255,251,202,.87) 0%, rgba(248,98,28,.70) 28%,
                rgba(124,24,11,.32) 64%, transparent 83%);
    box-shadow: 0 0 5px rgba(238,61,19,.28);
    opacity: 0;
    animation-name: kkpt-ash-float;
}
@keyframes kkpt-soot-rise {
    0%   { opacity: 0; transform: translate3d(0,35px,0) scale(.67); }
    22%  { opacity: .69; }
    67%  { opacity: .39; }
    100% { opacity: 0; transform: translate3d(var(--wind),-210px,0) scale(1.26); }
}
@keyframes kkpt-ash-float {
    0%   { opacity: 0; transform: translate3d(0,18px,0) rotate(0deg); }
    18%  { opacity: .78; }
    65%  { opacity: .56; }
    100% { opacity: 0; transform: translate3d(var(--wind),-210px,0) rotate(92deg); }
}
html.kkpt-world-suspended body.page-Kuronata #kkpt-afterglow {
    visibility: hidden;
}
html.kkpt-frame-inactive body.page-Kuronata #kkpt-afterglow *,
html.kkpt-world-suspended body.page-Kuronata #kkpt-afterglow * {
    animation-play-state: paused !important;
}

/* Infrequent, sharp spatial corruption: no full-screen strobe.
   Different text layers lurch by distinct offsets. */
html.kkpt-rift body.page-Kuronata #mw-content-text {
    animation: kkpt-rift-content 360ms steps(1,end) both !important;
}
html.kkpt-rift body.page-Kuronata :is(.mw-page-title-main,.mw-headline) {
    animation: kkpt-rift-heading 360ms steps(1,end) both !important;
}
html.kkpt-rift body.page-Kuronata #kkpt-afterglow::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: var(--kkpt-rift-y,42%);
    height: 3px;
    opacity: .58;
    background: linear-gradient(90deg,transparent 0%,rgba(255,62,105,.35) 21%,
               rgba(111,220,255,.67) 49%,rgba(255,62,105,.22) 84%,transparent);
    box-shadow: 0 9px 0 rgba(13,3,11,.47),0 -7px 0 rgba(250,37,64,.17);
    transform: translateX(-9px);
    animation: kkpt-rift-scan 360ms steps(1,end) both;
}
@keyframes kkpt-rift-content {
    0%,14%,100% { transform: translateX(0) skewX(0); text-shadow: none; }
    15%,23% { transform: translateX(-6px) skewX(-.42deg);
              text-shadow: -3px 0 #ef2257,3px 0 #26b5c9; }
    24%,38% { transform: translateX(4px) skewX(.22deg);
              text-shadow: 2px 0 #e62256,-2px 0 #54bbdf; }
    39%,59% { transform: translateX(0); text-shadow: none; }
    60%,68% { transform: translateX(7px) skewX(-.26deg);
              text-shadow: -3px 0 #ff2968,3px 0 #42aabf; }
    69%,89% { transform: translateX(-2px); text-shadow: none; }
}
@keyframes kkpt-rift-heading {
    0%,10%,100% { transform: translateX(0); text-shadow: none; }
    11%,33% { transform: translateX(7px); text-shadow: -5px 0 #d82454,4px 0 #46c5df; }
    34%,63% { transform: translateX(-4px); text-shadow: 4px 0 #d82454,-3px 0 #46c5df; }
    64%,85% { transform: translateX(2px); text-shadow: none; }
}
@keyframes kkpt-rift-scan {
    0%,100% { opacity: 0; transform: translateX(0); }
    17%,25% { opacity: .62; transform: translateX(9px); }
    49%,62% { opacity: .37; transform: translateX(-12px); }
}
@media (prefers-reduced-motion: reduce) {
    body.page-Kuronata #kkpt-afterglow,
    body.page-Kuronata span.heimu[data-kkpt-glitch]::before,
    body.page-Kuronata span.heimu[data-kkpt-glitch]::after {
        display: none !important;
    }
    html.kkpt-rift body.page-Kuronata #mw-content-text,
    html.kkpt-rift body.page-Kuronata :is(.mw-page-title-main,.mw-headline) {
        animation: none !important;
    }
}
@media print {
    #kkpt-afterglow { display: none !important; }
}

/* Scroll cost: the gear is now absolute, not a sticky glass layer. */
@media (max-width:760px) {
    .kkpt-fate-gear { backdrop-filter:none !important; -webkit-backdrop-filter:none !important; }
}

/* =============================================================
   V19 — corrections made against the actual rendered Infobox HTML
   and multiline screenshot. No original page layout is rewritten.
   ============================================================= */

/* Actual Infobox caption: the gear is a real descendant, not a
   document-level follower. Caption sizing/text centering is unchanged. */
.infobox caption.kkpt-fate-host,
.infobox th.kkpt-fate-host {
    position: relative !important;
}
.kkpt-fate-host > .kkpt-fate-gear {
    position: absolute !important;
    left: auto !important;
    right: 5px !important;
    top: 50% !important;
    transform: translateY(-50%) !important;
}
body.kkpt-other-active .kkpt-fate-gear {
    visibility: hidden !important;
    pointer-events: none !important;
}

/* A multiline inline span must not repeat its entire text at line 1.
   Instead render per-line chromatic slices from DOM Range metrics. */
body.page-Kuronata span.heimu[data-kkpt-multiline]::before,
body.page-Kuronata span.heimu[data-kkpt-multiline]::after {
    display: none !important;
    content: none !important;
}
body.page-Kuronata .kkpt-heimu-fault {
    position: fixed;
    inset: 0;
    z-index: 2147480955;
    pointer-events: none;
    user-select: none;
    contain: layout style paint;
    opacity: 1;
    transition: opacity 190ms ease-out;
}
body.page-Kuronata .kkpt-heimu-fault.kkpt-fault-away {
    opacity: 0;
}
body.page-Kuronata .kkpt-heimu-fault-line {
    display: block;
    position: fixed;
    pointer-events: none;
    white-space: pre;
    color: transparent;
    overflow: visible;
    padding: 0;
    margin: 0;
}
body.page-Kuronata .kkpt-heimu-fault-line::before,
body.page-Kuronata .kkpt-heimu-fault-line::after {
    content: attr(data-copy);
    position: absolute;
    top: 0;
    left: 0;
    white-space: pre;
    display: block;
    font: inherit;
    line-height: inherit;
    letter-spacing: inherit;
    pointer-events: none;
}
body.page-Kuronata .kkpt-heimu-fault-line::before {
    color: #ff3967;
    -webkit-text-fill-color: #ff3967;
    text-shadow: -2px 0 rgba(255,37,69,.85);
    animation: kkpt-slice-a 610ms steps(1,end) infinite;
}
body.page-Kuronata .kkpt-heimu-fault-line::after {
    color: #73ebff;
    -webkit-text-fill-color: #73ebff;
    text-shadow: 2px 0 rgba(43,196,255,.8);
    animation: kkpt-slice-b 490ms steps(1,end) infinite;
}

/* The afterglow must be a visible, restrained foreground film.
   This is above Citizen's article glass but behind the live iframe. */
body.page-Kuronata #kkpt-afterglow .kkpt-soot-cell {
    opacity: 0;
}
@media (max-width:760px) {
    /* Mobile: avoid expensive glow/blur composite work. */
    body.page-Kuronata #kkpt-afterglow .kkpt-soot-cell {
        box-shadow: none !important;
        filter: none !important;
    }
}
@media (prefers-reduced-motion: reduce) {
    body.page-Kuronata .kkpt-heimu-fault {
        display: none !important;
    }
}