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

MediaWiki:KuranokaPageTransition.css

MediaWiki界面页面
KK​(留言 | 贡献)2026年10月24日 (六) 17:25的版本

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

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
  • Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
/* Kuranoka Page Transition V41 — clean ring seals and seamless fire handoff
   Load only on /wiki/Kuranoka and /wiki/Kuronata.
   No Citizen.css / Common.css changes. */

:root { --kkpt-css-v41: ready; }

/* One icon, no track title, timer, skip menu or resume popup. */
#kkpt-audio-toggle {
    position: fixed !important;
    z-index: 2147482950 !important;
    left: clamp(18px,3vw,43px) !important;
    bottom: clamp(15px,3vh,30px) !important;
    width: 43px;
    height: 43px;
    display: grid !important;
    place-items: center;
    padding: 0;
    box-sizing: border-box;
    color: #eaf6ff !important;
    background: rgba(9,17,29,.72) !important;
    border: 1px solid rgba(185,214,249,.42) !important;
    border-radius: 50% !important;
    box-shadow: 0 5px 19px #02040ba0,0 0 12px #b8dffb20;
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    cursor: pointer;
    transition: transform .16s ease,box-shadow .16s ease;
}
#kkpt-audio-toggle svg {width:22px;height:22px;display:block;pointer-events:none}
#kkpt-audio-toggle:hover {transform:scale(1.075)}
#kkpt-audio-toggle:focus-visible {outline:2px solid #bfe5ff;outline-offset:3px}
#kkpt-audio-toggle.kkpt-audio-needs-resume {
    color:#fff !important;
    border-color:#91d8ff !important;
    box-shadow:0 0 16px #8fd9ff78,0 5px 19px #02040ba0;
}

/* Three seconds of cinematic omen. V25 draws the real fire curtain. */
#kkpt-omen {
    position:fixed !important;
    inset:0 !important;
    z-index:2147480900 !important;
    overflow:hidden !important;
    pointer-events:none !important;
    isolation:isolate;
    background:linear-gradient(130deg,rgba(34,0,9,.03),rgba(91,0,15,.42)),
        radial-gradient(ellipse at 50% 100%,rgba(131,0,14,.30),transparent 68%);
    opacity:0;
    animation:kkpt-omen-tension 3s linear both;
}
#kkpt-omen .kkpt-omen-glow {
    position:absolute;
    inset:-15%;
    display:block;
    background:radial-gradient(ellipse at 55% 105%,rgba(243,46,25,.19),transparent 55%),
        linear-gradient(145deg,transparent 36%,rgba(90,0,20,.09) 58%,transparent 76%);
    animation:kkpt-omen-drift 13s ease-in-out infinite alternate;
}
#kkpt-omen .kkpt-omen-line {
    position:absolute;
    inset:0;
    display:block;
    opacity:.23;
    background:repeating-linear-gradient(0deg,transparent 0 6px,
        rgba(230,42,49,.10) 7px,transparent 8px);
    animation:kkpt-omen-scan 19s steps(8,end) infinite;
}
@keyframes kkpt-omen-tension {
    0%{opacity:.02}
    25%{opacity:.11}
    53%{opacity:.25}
    80%{opacity:.45}
    100%{opacity:.75}
}
@keyframes kkpt-omen-drift {
    from{transform:translate3d(-1.5%,0,0) scale(1.02)}
    to{transform:translate3d(2%,-2%,0) scale(1.1)}
}
@keyframes kkpt-omen-scan {
    from{transform:translate3d(0,-2.3%,0)}
    to{transform:translate3d(0,2.3%,0)}
}
#kkpt-omen.kkpt-omen-closing {
    animation:none !important;
    transition:opacity 1420ms ease-out !important;
}
@media (prefers-reduced-motion:reduce){#kkpt-omen{display:none !important}}

/* Fate summoning. A 5.5s atmospheric sigil overlaps 2.5 seconds of
   V25's original fire, without changing the music's 3s prelude cue. */
#kkpt-fate-prelude {
    --kkpt-fate-color:rgba(254,75,93,.91);
    --kkpt-fate-halo:rgba(228,18,64,.31);
    position:fixed !important;
    inset:0 !important;
    z-index:2147481400 !important;
    pointer-events:none !important;
    overflow:hidden !important;
    contain:layout style paint;
    opacity:1;
    /* Do not dissolve the seal until the V25 flame has its first frame. */
    transition:opacity 1350ms cubic-bezier(.13,.64,.27,1);
}
#kkpt-fate-prelude.kkpt-fate-light {
    --kkpt-fate-color:rgba(218,251,244,.94);
    --kkpt-fate-halo:rgba(104,225,255,.26);
}
#kkpt-fate-prelude.kkpt-fate-merging {opacity:0}
#kkpt-fate-prelude::after {
    content:'';
    position:absolute;
    inset:0;
    background:radial-gradient(circle 280px at var(--kkpt-fate-x) var(--kkpt-fate-y),
        var(--kkpt-fate-halo),transparent 100%);
    opacity:0;
    animation:kkpt-fate-pressure 5.3s ease-in-out both;
}
#kkpt-fate-prelude::before {
    content:'';
    position:absolute;
    inset:0;
    background:radial-gradient(circle 380px at 50% 50%,
        var(--kkpt-fate-halo),transparent 100%);
    opacity:0;
    animation:kkpt-fate-center-arrival 5.3s ease-in-out both;
}
#kkpt-fate-prelude .kkpt-fate-orbit {
    position:absolute;
    left:var(--kkpt-fate-x);
    top:var(--kkpt-fate-y);
    width:0;height:0;
    pointer-events:none;
    transform-origin:0 0;
    will-change:transform;
    animation:kkpt-fate-orbit-journey 5.15s cubic-bezier(.18,.8,.25,1) both;
}
#kkpt-fate-prelude .kkpt-fate-orbit > i {
    display:block;
    position:absolute;
    left:0;
    top:0;
    box-sizing:border-box;
    transform-origin:center;
    pointer-events:none;
    will-change:transform,opacity;
}
#kkpt-fate-prelude .kkpt-fate-ring {
    width:205px;
    height:205px;
    margin:-102.5px 0 0 -102.5px;
    border-radius:50%;
    border:1px solid var(--kkpt-fate-color);
    box-shadow:inset 0 0 12px var(--kkpt-fate-halo),
        0 0 18px var(--kkpt-fate-halo);
    opacity:0;
    animation:kkpt-fate-ring-expansion 4.9s cubic-bezier(.16,.69,.16,1) both;
}
#kkpt-fate-prelude .kkpt-fate-ring-b {
    animation-delay:.46s;
    animation-duration:4.45s;
    border-style:dashed;
}
#kkpt-fate-prelude .kkpt-fate-arc {
    width:265px;
    height:265px;
    margin:-132.5px 0 0 -132.5px;
    border-radius:50%;
    background:conic-gradient(from 0deg,transparent 0 30deg,
        var(--kkpt-fate-color) 35deg 45deg,transparent 48deg 115deg,
        var(--kkpt-fate-color) 123deg 131deg,transparent 137deg 227deg,
        var(--kkpt-fate-color) 233deg 242deg,transparent 247deg 360deg);
    -webkit-mask:radial-gradient(circle,transparent 0 49%,#000 54% 58%,transparent 66%);
    mask:radial-gradient(circle,transparent 0 49%,#000 54% 58%,transparent 66%);
    animation:kkpt-fate-arc-spin 5.15s cubic-bezier(.15,.3,.16,1) both;
}
#kkpt-fate-prelude .kkpt-fate-spark {
    width:255px;
    height:255px;
    margin:-127.5px 0 0 -127.5px;
    border-radius:50%;
    background:repeating-conic-gradient(from 12deg,transparent 0 32deg,
        var(--kkpt-fate-color) 33deg 34deg,transparent 35deg 60deg);
    -webkit-mask:radial-gradient(circle,transparent 0 42%,#000 47% 57%,transparent 69%);
    mask:radial-gradient(circle,transparent 0 42%,#000 47% 57%,transparent 69%);
    animation:kkpt-fate-arc-spin 5.1s reverse ease-out both;
}
#kkpt-fate-prelude .kkpt-fate-wave {
    width:300px;
    height:300px;
    margin:-150px 0 0 -150px;
    border:2px solid var(--kkpt-fate-color);
    border-radius:50%;
    box-shadow:0 0 24px 4px var(--kkpt-fate-halo),
        inset 0 0 28px var(--kkpt-fate-halo);
    opacity:0;
    animation:kkpt-fate-wave-strike 5.05s cubic-bezier(.14,.77,.29,1) both;
}
#kkpt-fate-prelude .kkpt-fate-aura {
    width:470px;height:470px;
    margin:-235px 0 0 -235px;
    border-radius:50%;
    background:radial-gradient(circle,
        rgba(91,0,24,.36),rgba(47,0,17,.25) 26%,
        rgba(146,7,45,.09) 50%,transparent 72%);
    opacity:0;
    animation:kkpt-fate-aura-bloom 5.1s ease-in-out both;
}
#kkpt-fate-prelude.kkpt-fate-light .kkpt-fate-aura {
    background:radial-gradient(circle,rgba(255,248,208,.14),
        rgba(170,240,255,.15) 29%,rgba(104,218,254,.06) 51%,
        transparent 76%);
}
#kkpt-fate-prelude .kkpt-fate-sigil {
    position:absolute;
    left:0;top:0;
    width:390px;height:390px;
    overflow:visible;
    pointer-events:none;
    color:var(--kkpt-fate-color);
    transform:translate(-50%,-50%);
    opacity:0;
    filter:drop-shadow(0 0 10px var(--kkpt-fate-halo));
    animation:kkpt-fate-sigil-manifest 2.4s ease-out both;
}
#kkpt-fate-prelude .kkpt-fate-sigil :is(path,polygon,circle) {
    vector-effect:non-scaling-stroke;
    stroke:currentColor;
    stroke-width:1.45px;
    fill:none;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-turning {
    transform-origin:150px 150px;
    /* The symbol stays upright while the OUTER mechanism rotates. */
    animation:none;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-mark {
    stroke-width:1.0px;
    opacity:.52;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-major {
    stroke-width:2px;
    opacity:.85;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-outer {
    stroke-width:1.6px;
    stroke-dasharray:91 6 3 6;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-trace {
    stroke-width:.75px;
    opacity:.72;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-needle {
    stroke-width:1.45px;
    opacity:.77;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-orbit {
    stroke-dasharray:3 12;
    stroke-width:2.6px;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-seal {
    stroke-width:1.8px;
    stroke-dasharray:40 8 6 8;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-ghost {
    stroke-width:.85px;
    stroke-dasharray:2 7;
    opacity:.75;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-diamond {
    stroke-width:1.28px;
    opacity:.8;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-core-orbit {
    stroke-width:1.5px;
    opacity:.79;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-inner-orbit {
    stroke-width:.85px;
    stroke-dasharray:14 7;
    opacity:.65;
}
#kkpt-fate-prelude .kkpt-fate-sigil .kkpt-sigil-axis {
    stroke-width:1.4px;
    opacity:.63;
}
#kkpt-fate-prelude .kkpt-sigil-ominous .kkpt-sigil-dark-mark {
    stroke:#ffc0c9;
    stroke-width:2px;
    fill:rgba(103,0,32,.11);
}
#kkpt-fate-prelude .kkpt-sigil-ominous .kkpt-sigil-dark-cut {
    stroke:#f35b77;
    stroke-width:1.2px;
    fill:rgba(27,0,10,.45);
}
#kkpt-fate-prelude .kkpt-sigil-hope .kkpt-sigil-light-mark {
    stroke:#fff4cc;
    stroke-width:1.8px;
    fill:rgba(255,244,205,.08);
}
#kkpt-fate-prelude .kkpt-sigil-hope .kkpt-sigil-center {
    fill:rgba(255,246,211,.70);
    stroke:#ffffff;
    stroke-width:1.2px;
}
@keyframes kkpt-fate-ring-expansion {
    0%{opacity:0;transform:scale(.22) rotate(-20deg)}
    18%{opacity:.8}
    56%{opacity:.48}
    83%{opacity:.25}
    100%{opacity:.22;transform:scale(2.75) rotate(155deg)}
}
@keyframes kkpt-fate-arc-spin {
    0%{opacity:0;transform:scale(.32) rotate(0deg)}
    18%{opacity:.71}
    65%{opacity:.62}
    100%{opacity:.22;transform:scale(1.75) rotate(1080deg)}
}
@keyframes kkpt-fate-pressure {
    0%{opacity:0}
    24%{opacity:.5}
    65%{opacity:.82}
    100%{opacity:0}
}
@keyframes kkpt-fate-center-arrival {
    0%,28%{opacity:0}
    58%{opacity:.46}
    70%{opacity:.53}
    100%{opacity:0}
}
@keyframes kkpt-fate-orbit-journey {
    0%{transform:translate3d(0,0,0) scale(.48)}
    16%{transform:translate3d(var(--kkpt-fate-dx),
        var(--kkpt-fate-dy),0) scale(1.42)}
    100%{transform:translate3d(var(--kkpt-fate-dx),
        var(--kkpt-fate-dy),0) scale(1.58)}
}
@keyframes kkpt-fate-wave-strike {
    0%,10%{opacity:0;transform:scale(.18) rotate(-35deg)}
    27%{opacity:.72;transform:scale(.56) rotate(36deg)}
    35%{opacity:.20}
    50%{opacity:.66;transform:scale(.99) rotate(91deg)}
    65%{opacity:.22}
    78%{opacity:.42;transform:scale(1.80) rotate(180deg)}
    100%{opacity:.11;transform:scale(2.9) rotate(320deg)}
}
@keyframes kkpt-fate-aura-bloom {
    0%{opacity:.22;transform:scale(.2)}
    12%{opacity:.65;transform:scale(.42)}
    32%{opacity:.68;transform:scale(.64)}
    63%{opacity:.89;transform:scale(1.04)}
    83%{opacity:.61}
    100%{opacity:.15;transform:scale(1.75)}
}
@keyframes kkpt-fate-sigil-manifest {
    0%{opacity:.72;transform:translate(-50%,-50%) scale(.65)}
    12%{opacity:.98}
    27%{opacity:.96}
    57%{opacity:.95;transform:translate(-50%,-50%) scale(1)}
    77%{opacity:.91}
    100%{opacity:.91;transform:translate(-50%,-50%) scale(1.13)}
}
@keyframes kkpt-fate-sigil-counterturn {
    from{transform:rotate(0deg)}
    to{transform:rotate(0deg)}
}
@media (prefers-reduced-motion:reduce){#kkpt-fate-prelude{display:none !important}}

/* AFTERMATH ONLY. Eight-beat bass accents control a slow whole-camera
   push-in and release. This never scales down to expose page edges. */
#kkpt-beat-scene {
    --kkpt-beat-dark:.60;
    --kkpt-beat-scale:1.025;
    --kkpt-beat-blur:.28px;
    --kkpt-beat-glitch:.12;
    --kkpt-beat-shear:0px;
    --kkpt-beat-shear-reverse:0px;
    --kkpt-beat-scars:.035;
    position:fixed !important;
    inset:0 !important;
    /* Heartbeat vignette must be visible over the fire as well; its
       transparent center keeps the original V25 flame incandescent. */
    z-index:2147482120 !important;
    pointer-events:none !important;
    overflow:hidden !important;
    isolation:isolate;
    contain:layout style paint;
    transition:opacity 680ms ease-out;
}
/* Whole viewport, not merely the article. The camera origin follows the
   center of the visible scrolled viewport and the zoom stays >= 1. */
html.kkpt-camera-running {overflow-x:clip}
html.kkpt-camera-running body.page-Kuronata {
    transform:translateZ(0) scale(var(--kkpt-camera-zoom,1.008));
    transform-origin:50% var(--kkpt-camera-focus-y,50vh);
    transition:transform 140ms cubic-bezier(.2,.7,.25,1);
    will-change:transform;
}
html.kkpt-camera-running body.page-Kuronata #firstHeading {
    text-shadow:var(--kkpt-chroma-red,0px) 0 rgba(255,31,83,.50),
        var(--kkpt-chroma-shadow,0px) 0 rgba(117,2,32,.74);
    transition:text-shadow 130ms ease-out;
}
#kkpt-beat-scene.kkpt-beat-after {
    animation:kkpt-dark-aftermath-arrive 850ms ease-out both;
}
#kkpt-beat-scene.kkpt-beat-resumed {
    animation:none !important;
    opacity:1;
}
@keyframes kkpt-dark-aftermath-arrive {
    0%{opacity:0}
    100%{opacity:1}
}
#kkpt-beat-scene .kkpt-beat-lens {
    position:absolute;
    inset:-15%;
    background:radial-gradient(ellipse at 50% 47%,transparent 16%,
        rgba(12,0,8,.26) 39%,rgba(3,0,5,.71) 70%,
        rgba(0,0,2,.99) 100%);
    opacity:var(--kkpt-beat-dark);
    transform:scale(var(--kkpt-beat-scale));
    will-change:opacity,transform;
}
#kkpt-beat-scene .kkpt-beat-focus {
    position:absolute;
    inset:0;
    background:rgba(8,0,13,.012);
    backdrop-filter:blur(2px) contrast(1.035);
    -webkit-backdrop-filter:blur(2px) contrast(1.035);
    opacity:calc(var(--kkpt-beat-glitch) * .53);
}
#kkpt-beat-scene .kkpt-beat-fringe {
    position:absolute;
    inset:0;
    opacity:var(--kkpt-beat-glitch);
    transform:translate3d(var(--kkpt-beat-shear),0,0);
    background:radial-gradient(ellipse at 50% 130%,
        transparent 32%,rgba(94,1,24,.24) 70%,rgba(31,0,9,.58) 100%),
        linear-gradient(94deg,rgba(180,5,37,.55),transparent 17%,
        transparent 82%,rgba(71,0,16,.72));
    mix-blend-mode:multiply;
    will-change:opacity,transform;
}
#kkpt-beat-scene .kkpt-beat-rupture {
    position:absolute;
    inset:0;
    opacity:var(--kkpt-beat-glitch);
    transform:translate3d(var(--kkpt-beat-shear-reverse),0,0);
    background:repeating-linear-gradient(159deg,
        transparent 0 33px,rgba(61,0,20,.44) 35px,
        rgba(8,0,9,.56) 36px,transparent 39px 74px);
    clip-path:polygon(0 10%,23% 9%,31% 17%,43% 11%,58% 15%,
        72% 10%,100% 16%,100% 18%,70% 12%,56% 18%,42% 14%,
        31% 20%,20% 11%,0 13%,0 70%,18% 67%,36% 76%,
        49% 69%,65% 79%,86% 72%,100% 77%,100% 80%,
        86% 75%,65% 82%,49% 72%,36% 79%,18% 70%,0 73%);
}
#kkpt-beat-scene .kkpt-beat-scars {
    position:absolute;
    inset:0;
    pointer-events:none;
    width:100%;
    height:100%;
    opacity:var(--kkpt-beat-scars);
    transform:translate3d(var(--kkpt-beat-shear),0,0);
    will-change:opacity,transform;
}
#kkpt-beat-scene .kkpt-beat-scars path {
    fill:none;
    stroke:#be1839;
    stroke-width:1.7px;
    stroke-linejoin:bevel;
    stroke-dasharray:84 11 21 36;
    filter:drop-shadow(0 0 8px #8c001d);
}
#kkpt-beat-scene .kkpt-beat-scars path:nth-child(2) {
    stroke:#23000e;
    stroke-width:5px;
}
#kkpt-beat-scene .kkpt-beat-scars path:nth-child(3) {
    stroke:#ed3354;
    stroke-width:1px;
}
#kkpt-beat-scene.kkpt-beat-outro {
    opacity:0 !important;
    transition:opacity 2150ms cubic-bezier(.12,.54,.22,1);
}
#kkpt-beat-scene.kkpt-beat-idle .kkpt-beat-rupture {
    animation:kkpt-aftermath-static-glitch 9s steps(1,end) infinite;
}
@keyframes kkpt-aftermath-static-glitch {
    0%,13%,15%,48%,50%,78%,80%,100%{opacity:.028}
    14%,49%,79%{opacity:.14;transform:translate3d(-3px,0,0)}
}
#kkpt-lightning-layer {
    position:fixed !important;
    inset:0 !important;
    z-index:2147482130 !important;
    pointer-events:none !important;
    overflow:hidden !important;
}
#kkpt-lightning-layer .kkpt-storm-bolt {
    position:absolute;
    inset:0;
    display:block;
    width:100%;height:100%;
    overflow:visible;
    pointer-events:none;
    animation:kkpt-lightning-attack 360ms steps(1,end) both;
}
#kkpt-lightning-layer .kkpt-storm-bolt path {fill:none;stroke-linecap:round;stroke-linejoin:bevel}
.kkpt-storm-bolt .kkpt-bolt-haze {
    stroke:#748dff;stroke-width:12px;opacity:.18;
}
.kkpt-storm-bolt .kkpt-bolt-core {
    stroke:#e7faff;stroke-width:2.5px;opacity:.96;
}
.kkpt-storm-bolt .kkpt-bolt-branch {
    stroke:#a9e7ff;stroke-width:1.4px;opacity:.68;
}
@keyframes kkpt-lightning-attack {
    0%{opacity:0}
    11%{opacity:1}
    25%{opacity:.1}
    39%{opacity:.77}
    64%{opacity:.24}
    100%{opacity:0}
}
@media (prefers-reduced-motion:reduce) {
    #kkpt-beat-scene .kkpt-beat-rupture {animation:none !important}
}

/* The cloudbreak follows the actual URL load. Its timestamp lives in
   sessionStorage, so the light never snaps away between two documents. */
#kkpt-cloudbreak {
    position:fixed !important;
    inset:0 !important;
    z-index:2147482160 !important;
    pointer-events:none !important;
    overflow:hidden !important;
    contain:layout style paint;
    isolation:isolate;
}
#kkpt-cloudbreak > i {
    display:block;
    position:absolute;
    inset:-12%;
    pointer-events:none;
    will-change:opacity,transform;
}
#kkpt-cloudbreak .kkpt-dawn-dark-rim {
    background:radial-gradient(ellipse at 50% 47%,
        transparent 20%,rgba(5,0,9,.28) 47%,
        rgba(2,0,6,.81) 86%,rgba(0,0,2,.94) 100%);
    animation:kkpt-dawn-dissolve 6900ms
        cubic-bezier(.15,.46,.25,1) var(--kkpt-dawn-delay,0ms) both;
}
#kkpt-cloudbreak .kkpt-dawn-bright-rim {
    background:
        radial-gradient(ellipse at 50% 48%,transparent 19%,
            rgba(226,246,255,.13) 46%,rgba(247,253,255,.68) 82%,
            rgba(255,255,250,.88) 100%),
        radial-gradient(ellipse at 45% 105%,transparent 12%,
            rgba(221,245,255,.23) 62%,rgba(255,251,222,.54) 100%);
    mix-blend-mode:screen;
    animation:kkpt-dawn-bloom 6900ms
        cubic-bezier(.12,.54,.23,1) var(--kkpt-dawn-delay,0ms) both;
}
#kkpt-cloudbreak .kkpt-dawn-cloud-sweep {
    inset:-24% -12%;
    background:
        radial-gradient(ellipse at 16% 90%,rgba(251,253,255,.68),
            rgba(238,248,255,.20) 35%,transparent 59%),
        radial-gradient(ellipse at 83% 100%,rgba(250,253,255,.71),
            rgba(241,247,255,.23) 32%,transparent 62%),
        radial-gradient(ellipse at 50% 119%,rgba(255,250,222,.29),
            transparent 70%);
    animation:kkpt-dawn-rise 6900ms
        cubic-bezier(.16,.56,.24,1) var(--kkpt-dawn-delay,0ms) both;
}
@keyframes kkpt-dawn-dissolve {
    0%,11%{opacity:.77}
    32%{opacity:.49}
    52%{opacity:.03}
    100%{opacity:0}
}
@keyframes kkpt-dawn-bloom {
    0%,17%{opacity:0}
    30%{opacity:.23}
    48%{opacity:.86}
    66%{opacity:.60}
    83%{opacity:.18}
    100%{opacity:0}
}
@keyframes kkpt-dawn-rise {
    0%,22%{opacity:0;transform:translate3d(0,9%,0) scale(1.02)}
    44%{opacity:.28}
    64%{opacity:.66;transform:translate3d(0,-2%,0) scale(1.04)}
    100%{opacity:0;transform:translate3d(0,-12%,0) scale(1.08)}
}
@media (prefers-reduced-motion:reduce){#kkpt-cloudbreak{display:none !important}}

/* Blue-world recovery. Fog gives way to receding rain, restrained pastel
   rainbow arcs and a small field of floating essence — no white-screen flash. */
#kkpt-rebirth-visual {
    position:fixed !important;
    inset:0 !important;
    /* Above falling smoke, below the bright V25 blue recovery edge. */
    z-index:2147482070 !important;
    pointer-events:none !important;
    overflow:hidden !important;
    opacity:1;
    contain:layout style paint;
    transition:opacity 1050ms ease-out;
}
#kkpt-rebirth-visual.kkpt-rebirth-finish {opacity:0}
#kkpt-rebirth-visual .kkpt-rebirth-rain {
    position:absolute;
    inset:0;
    background:repeating-linear-gradient(107deg,
        transparent 0 26px,rgba(183,221,255,.20) 27px,
        transparent 28px 61px);
    transform:translate3d(-8px,5px,0);
    pointer-events:none;
}
#kkpt-rebirth-visual .kkpt-rebirth-sunlight {
    position:absolute;
    inset:0;
    background:radial-gradient(ellipse at 37% 21%,
        rgba(220,251,255,.30),rgba(150,207,255,.12) 31%,transparent 72%);
    pointer-events:none;
}
#kkpt-rebirth-visual .kkpt-rebirth-rainbow {
    position:absolute;
    inset:0;
    width:100%;height:100%;
    pointer-events:none;
    overflow:visible;
    mix-blend-mode:screen;
    filter:blur(3px);
}
#kkpt-rebirth-visual .kkpt-rebirth-essence {
    position:absolute;
    inset:0;
    opacity:0;
    pointer-events:none;
}
#kkpt-rebirth-visual .kkpt-rebirth-mote {
    position:absolute;
    width:4px;height:4px;
    border-radius:50%;
    background:rgba(244,255,255,.86);
    box-shadow:0 0 7px 1px rgba(181,241,255,.46);
    animation:kkpt-rebirth-float 3s ease-in-out infinite;
    will-change:transform,opacity;
}
@keyframes kkpt-rebirth-float {
    0%,100%{opacity:0;transform:translate3d(-12px,23px,0) scale(.55)}
    22%{opacity:.68}
    58%{opacity:.92;transform:translate3d(7px,-27px,0) scale(1.3)}
    82%{opacity:.44}
}
@media (prefers-reduced-motion:reduce){#kkpt-rebirth-visual .kkpt-rebirth-mote{animation:none}}

#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 url('https://blockland.wiki/images/a/ab/%E9%BB%84%E6%98%8F%EF%BC%8C%E9%BB%91%E4%BA%91.png') center center / cover no-repeat;
    transform: translateZ(0);
    will-change: clip-path;
}

body.page-Kuronata #kkpt-preview {
    background:#456e8a url('https://blockland.wiki/images/0/05/%E7%A7%AF%E9%9B%A8%E4%BA%911.png') center center / cover no-repeat;
}
#kkpt-preview.kkpt-active {pointer-events: auto !important;clip-path: inset(0)}
/* Don't reserve a full-screen animated compositor layer for a hidden iframe. */
#kkpt-preview:not(.kkpt-active):not(.kkpt-animating) {
    will-change: auto;
}

/* 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;
}

/* A small GPU ember overlay; no fullscreen WebGL flames or light curtains. */
#kkpt-webgl {
    position: fixed !important;
    z-index: 2147482050 !important;
    inset: 0 !important;
    display: block !important;
    width: 100vw !important;
    height: 100vh !important;
    pointer-events: none !important;
    background: transparent !important;
}

/* 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);
    appearance: none;
    -webkit-appearance: none;
    font: inherit;
    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 {
    /* Wide, feathered side-banks built from asymmetric elliptical lobes.
       No border-radius or single radial disk: no floating grey circles. */
    width: calc(var(--size) * 1.75);
    height: calc(var(--size) * .82);
    border-radius: 0;
    background:
        radial-gradient(ellipse 37% 53% at 12% 62%,
            rgba(128,124,137,.20) 0%, rgba(77,71,83,.15) 45%,
            transparent 100%),
        radial-gradient(ellipse 48% 60% at 42% 42%,
            rgba(113,111,128,.29) 0%, rgba(71,65,83,.17) 44%,
            transparent 100%),
        radial-gradient(ellipse 43% 58% at 79% 52%,
            rgba(139,99,109,.17) 0%, rgba(83,71,83,.12) 51%,
            transparent 100%),
        radial-gradient(ellipse 31% 45% at 57% 82%,
            rgba(103,95,108,.18) 0%, transparent 100%);
    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,45px,0) scale(.85,.76)}
    24%  {opacity:.76}
    59%  {opacity:.57}
    83%  {opacity:.32}
    100% {opacity:0;transform:translate3d(var(--wind),-215px,0) scale(1.10,1.24)}
}
@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;
    }
}

/* ===========================================================
   V20 · Fate wheel / fog banks / Kuronata hyperlink faults
   =========================================================== */

/* Inline beside the first-line Infobox TITLE, not on the far right
   of the table. Also works beside the article heading as fallback. */
.kkpt-fate-host > .kkpt-fate-gear {
    display: inline-grid !important;
    position: relative !important;
    left: auto !important;
    right: auto !important;
    top: auto !important;
    bottom: auto !important;
    vertical-align: middle !important;
    transform: translateY(-2px) !important;
    width: 31px !important;
    height: 31px !important;
    padding: 5px !important;
    margin: 0 0 0 8px !important;
    flex: none !important;
    float: none !important;
    line-height: 1 !important;
    border-color: rgba(255,255,255,.45);
}
.kkpt-fate-host > .kkpt-fate-gear::before {
    content: '';
    position: absolute;
    inset: -6px;
    border-radius: 50%;
    pointer-events: none;
    background: conic-gradient(
        from 12deg, transparent 0deg 27deg,
        var(--kkpt-gear-ink) 29deg 36deg,
        transparent 39deg 110deg,
        var(--kkpt-gear-ink) 115deg 122deg,
        transparent 126deg 210deg,
        var(--kkpt-gear-ink) 213deg 221deg,
        transparent 226deg 320deg,
        var(--kkpt-gear-ink) 323deg 332deg,
        transparent 337deg 360deg);
    -webkit-mask: radial-gradient(circle, transparent 56%, #000 62%, #000 65%, transparent 74%);
    mask: radial-gradient(circle, transparent 56%, #000 62%, #000 65%, transparent 74%);
    opacity: .34;
    animation: kkpt-destiny-orbit 9s linear infinite;
}
.kkpt-fate-host > .kkpt-fate-gear:is(:hover,:focus-visible)::before {
    opacity: .88;
    animation-duration: 2.4s;
}
.kkpt-fate-host > .kkpt-fate-gear.kkpt-fate-gear-turning::before {
    opacity: 1;
    animation-duration: .65s;
}
.kkpt-fate-host > .kkpt-fate-gear.kkpt-fate-gear-turning {
    animation: kkpt-destiny-awaken 1.5s ease-out;
}
.kkpt-fate-host > .kkpt-fate-gear .kkpt-fate-gear-svg {
    filter: drop-shadow(0 0 5px var(--kkpt-gear-halo));
}
@keyframes kkpt-destiny-orbit {
    to {transform:rotate(360deg)}
}
@keyframes kkpt-destiny-awaken {
    0%,100% {box-shadow:0 0 11px var(--kkpt-gear-halo)}
    21% {box-shadow:0 0 13px 4px var(--kkpt-gear-halo),0 0 32px 9px var(--kkpt-gear-halo)}
    48% {box-shadow:0 0 18px 2px var(--kkpt-gear-halo)}
}

/* V35: the actual fate wheel spins, hesitates, then accelerates over
   the entire 3-second opening instead of stopping after half a second. */
.kkpt-fate-host > .kkpt-fate-gear.kkpt-fate-gear-turning {
    animation:kkpt-destiny-awaken-v35 3s ease-in-out both;
}
.kkpt-fate-gear-turning .kkpt-fate-gear-svg {
    animation:kkpt-fate-rotation 3s cubic-bezier(.14,.33,.13,1) both;
}
.kkpt-fate-gear-turning::after {
    animation:kkpt-fate-ripple 2.85s cubic-bezier(.09,.6,.2,1) both;
}
.kkpt-fate-host > .kkpt-fate-gear.kkpt-fate-gear-turning::before {
    animation-duration:.55s;
}
@keyframes kkpt-destiny-awaken-v35 {
    0%{box-shadow:0 0 5px var(--kkpt-gear-halo)}
    22%{box-shadow:0 0 18px 3px var(--kkpt-gear-halo)}
    55%{box-shadow:0 0 26px 6px var(--kkpt-gear-halo),0 0 45px 10px var(--kkpt-gear-halo)}
    78%{box-shadow:0 0 32px 7px var(--kkpt-gear-halo)}
    100%{box-shadow:0 0 6px var(--kkpt-gear-halo)}
}

/* Every text link in the darker world has an unstable signal.
   Ordinary links jitter subtly; the way back to Kuranoka tears
   apart harder. The original link palette is preserved. */
body.page-Kuronata #mw-content-text a.kkpt-link-glitch {
    position: relative;
    transition: text-shadow .15s ease-out;
}
body.page-Kuronata #mw-content-text a.kkpt-link-glitch:is(:hover,:focus-visible) {
    animation: kkpt-link-interference 580ms steps(1,end) infinite;
}
body.page-Kuronata #mw-content-text a.kkpt-link-origin:is(:hover,:focus-visible) {
    animation: kkpt-link-origin-tear 420ms steps(1,end) infinite;
}
@keyframes kkpt-link-interference {
    0%,14%,47%,75%,100% {left:0;text-shadow:none}
    15%,24% {left:-1px;text-shadow:-2px 0 #ff4369,2px 0 #71c9e9}
    25%,46% {left:1px;text-shadow:1px 0 #ff4369,-2px 0 #71c9e9}
    48%,55% {left:2px;text-shadow:-2px 0 #ff4369,2px 0 #71c9e9}
    56%,74% {left:0;text-shadow:0 0 3px rgba(240,56,83,.55)}
    76%,82% {left:-2px;text-shadow:2px 0 #ff4369,-2px 0 #71c9e9}
}
@keyframes kkpt-link-origin-tear {
    0%,12%,42%,70%,100% {left:0;text-shadow:0 0 3px rgba(249,43,73,.25)}
    13%,23% {left:-4px;text-shadow:-5px 0 #ff1457,5px 0 #1fd8ff}
    24%,41% {left:3px;text-shadow:5px 0 #ff3069,-4px 0 #45e8ff}
    43%,51% {left:-2px;text-shadow:-4px 0 #ff3e55,6px 0 #47a5ee}
    52%,69% {left:4px;text-shadow:3px 0 #ff174e,-6px 0 #49ddff}
    71%,80% {left:-3px;text-shadow:-6px 0 #ff174e,4px 0 #49ddff}
}
body.page-Kuronata #mw-content-text a.kkpt-link-origin[data-kkpt-link-copy]:not(.kkpt-portal-link) {
    isolation: isolate;
}
body.page-Kuronata #mw-content-text a.kkpt-link-origin[data-kkpt-link-copy]:not(.kkpt-portal-link)::before,
body.page-Kuronata #mw-content-text a.kkpt-link-origin[data-kkpt-link-copy]:not(.kkpt-portal-link)::after {
    content: attr(data-kkpt-link-copy);
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    z-index: 2;
    white-space: nowrap;
    overflow: hidden;
    pointer-events: none;
    user-select: none;
    font: inherit;
    letter-spacing: inherit;
    opacity: 0;
}
body.page-Kuronata #mw-content-text a.kkpt-link-origin[data-kkpt-link-copy]:not(.kkpt-portal-link)::before {
    color: #ff315f;
    -webkit-text-fill-color: #ff315f;
}
body.page-Kuronata #mw-content-text a.kkpt-link-origin[data-kkpt-link-copy]:not(.kkpt-portal-link)::after {
    color: #68e8ff;
    -webkit-text-fill-color: #68e8ff;
}
body.page-Kuronata #mw-content-text a.kkpt-link-origin[data-kkpt-link-copy]:not(.kkpt-portal-link):is(:hover,:focus-visible)::before {
    opacity: .95;
    animation: kkpt-slice-a 360ms steps(1,end) infinite;
}
body.page-Kuronata #mw-content-text a.kkpt-link-origin[data-kkpt-link-copy]:not(.kkpt-portal-link):is(:hover,:focus-visible)::after {
    opacity: .89;
    animation: kkpt-slice-b 310ms steps(1,end) infinite;
}
@media (prefers-reduced-motion: reduce) {
    body.page-Kuronata #mw-content-text a.kkpt-link-glitch:is(:hover,:focus-visible),
    .kkpt-fate-host > .kkpt-fate-gear::before,
    .kkpt-fate-host > .kkpt-fate-gear.kkpt-fate-gear-turning {
        animation: none !important;
    }
}

/* ==============================================================
   V21 — Title stays centered; pearl-toned fate gear floats next
   to the FIRST title line without affecting any text flow.
   Only wheel placement/appearance changes. Other FX untouched.
   ============================================================== */
.kkpt-fate-host {
    position: relative !important;
}
.kkpt-fate-host > .kkpt-fate-gear {
    display: grid !important;
    position: absolute !important;
    left: var(--kkpt-gear-left, calc(50% + 75px)) !important;
    top: var(--kkpt-gear-top, 17px) !important;
    right: auto !important;
    bottom: auto !important;
    transform: translateY(-50%) !important;
    margin: 0 !important;
    float: none !important;
    vertical-align: baseline !important;
    width: 27px !important;
    height: 27px !important;
    padding: 4px !important;
    --kkpt-gear-ink: rgba(248, 253, 255, .87);
    --kkpt-gear-halo: rgba(220, 241, 250, .18);
    background: rgba(243, 253, 255, .055) !important;
    color: var(--kkpt-gear-ink) !important;
    border-color: rgba(250, 255, 255, .26) !important;
    box-shadow: inset 0 0 5px rgba(255,255,255,.06),
        0 0 7px rgba(216,240,250,.08);
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
}
.kkpt-fate-host > .kkpt-fate-gear::before {
    opacity: .15;
}
.kkpt-fate-host > .kkpt-fate-gear:is(:hover,:focus-visible) {
    background: rgba(240, 253, 255, .15) !important;
    border-color: rgba(255, 255, 255, .62) !important;
    box-shadow: 0 0 13px var(--kkpt-gear-halo);
}
.kkpt-fate-host > .kkpt-fate-gear:is(:hover,:focus-visible)::before {
    opacity: .75;
}
.kkpt-fate-host > .kkpt-fate-gear .kkpt-fate-gear-svg {
    filter: drop-shadow(0 0 2px var(--kkpt-gear-halo));
}
.kkpt-fate-host > .kkpt-fate-gear .kkpt-fate-gear-svg circle:first-of-type {
    fill: rgba(176, 212, 228, .14) !important;
    stroke: var(--kkpt-gear-ink);
}
body.page-Kuronata .kkpt-fate-host > .kkpt-fate-gear {
    --kkpt-gear-ink: rgba(255, 233, 239, .84);
    --kkpt-gear-halo: rgba(255, 201, 213, .20);
    background: rgba(255, 231, 237, .05) !important;
    border-color: rgba(255, 221, 230, .22) !important;
}

/* ==============================================================
   V22 — Real cross-document navigation after the visual handoff.
   The iframe exists ONLY during the effects; browser navigation
   restores the Citizen sidebar and the document's native scrollbar.
   Supported browsers receive a brief native page-to-page dissolve.
   ============================================================== */
@view-transition {
    navigation: auto;
}
::view-transition-old(root) {
    animation-duration: 160ms;
}
::view-transition-new(root) {
    animation-duration: 220ms;
}
@media (prefers-reduced-motion: reduce) {
    ::view-transition-old(root),
    ::view-transition-new(root) {
        animation-duration: .01ms !important;
    }
}

/* Kuronata: the names of the lost daylight identity glitch at rest. */
body.page-Kuronata #mw-content-text .kkpt-identity-glitch {
    position: relative;
    isolation: isolate;
    white-space: nowrap;
    animation: kkpt-identity-body-fault 1.7s steps(1,end) infinite;
    animation-delay: var(--kkpt-identity-delay,0s);
}
body.page-Kuronata #mw-content-text .kkpt-identity-glitch::before,
body.page-Kuronata #mw-content-text .kkpt-identity-glitch::after {
    content: attr(data-kkpt-identity);
    position: absolute;
    inset: 0;
    font: inherit;
    letter-spacing: inherit;
    white-space: nowrap;
    pointer-events: none;
    user-select: none;
    opacity: 0;
    z-index: 2;
}
body.page-Kuronata #mw-content-text .kkpt-identity-glitch::before {
    color: #ff245b;
    -webkit-text-fill-color: #ff245b;
    animation: kkpt-identity-red-fault 1.7s steps(1,end) infinite;
    animation-delay: var(--kkpt-identity-delay,0s);
}
body.page-Kuronata #mw-content-text .kkpt-identity-glitch::after {
    color: #65e7ff;
    -webkit-text-fill-color: #65e7ff;
    animation: kkpt-identity-blue-fault 1.7s steps(1,end) infinite;
    animation-delay: var(--kkpt-identity-delay,0s);
}
@keyframes kkpt-identity-body-fault {
    0%,66%,76%,89%,94%,100% {left:0;text-shadow:none}
    67%,70% {left:-2px;text-shadow:-3px 0 #ff245b,3px 0 #55d6f9}
    71%,75% {left:2px;text-shadow:3px 0 #ff245b,-3px 0 #55d6f9}
    90%,92% {left:-3px;text-shadow:-4px 0 #fb2450,5px 0 #55d6f9}
    93% {left:2px;text-shadow:3px 0 #fb2450,-3px 0 #55d6f9}
}
@keyframes kkpt-identity-red-fault {
    0%,66%,76%,89%,94%,100% {opacity:0;transform:translateX(0)}
    67%,70% {opacity:.90;transform:translateX(-5px);clip-path:inset(8% 0 66%)}
    71%,75% {opacity:.75;transform:translateX(4px);clip-path:inset(61% 0 12%)}
    90%,93% {opacity:.95;transform:translateX(-7px);clip-path:inset(30% 0 49%)}
}
@keyframes kkpt-identity-blue-fault {
    0%,66%,76%,89%,94%,100% {opacity:0;transform:translateX(0)}
    67%,70% {opacity:.89;transform:translateX(6px);clip-path:inset(52% 0 22%)}
    71%,75% {opacity:.86;transform:translateX(-4px);clip-path:inset(17% 0 61%)}
    90%,93% {opacity:.90;transform:translateX(7px);clip-path:inset(70% 0 6%)}
}
/* Link to Kuranoka glitches without hover, too. */
body.page-Kuronata #mw-content-text a.kkpt-link-origin {
    animation: kkpt-link-origin-tear 520ms steps(1,end) infinite !important;
}
body.page-Kuronata #mw-content-text a.kkpt-link-origin[data-kkpt-link-copy]:not(.kkpt-portal-link)::before {
    opacity: .95;
    animation: kkpt-slice-a 360ms steps(1,end) infinite;
}
body.page-Kuronata #mw-content-text a.kkpt-link-origin[data-kkpt-link-copy]:not(.kkpt-portal-link)::after {
    opacity: .89;
    animation: kkpt-slice-b 310ms steps(1,end) infinite;
}
@media (prefers-reduced-motion: reduce) {
    body.page-Kuronata #mw-content-text .kkpt-identity-glitch,
    body.page-Kuronata #mw-content-text a.kkpt-link-origin {
        animation: none !important;
    }
    body.page-Kuronata #mw-content-text .kkpt-identity-glitch::before,
    body.page-Kuronata #mw-content-text .kkpt-identity-glitch::after,
    body.page-Kuronata #mw-content-text a.kkpt-link-origin::before,
    body.page-Kuronata #mw-content-text a.kkpt-link-origin::after {
        animation: none !important;
        opacity: 0 !important;
    }
}


/* V23 — fate wheel in the Infobox caption's TOP RIGHT CORNER.
   Absolute positioning never changes the title's centering. */
.kkpt-fate-host > .kkpt-fate-gear {
    left: auto !important;
    right: 7px !important;
    top: 7px !important;
    bottom: auto !important;
    transform: none !important;
    margin: 0 !important;
    width: 26px !important;
    height: 26px !important;
}
@media (max-width:600px) {
    .kkpt-fate-host > .kkpt-fate-gear {
        top: 5px !important;
        right: 5px !important;
        width: 24px !important;
        height: 24px !important;
    }
}


/* ==============================================================
   V24 — Fix OS-theme inheritance and blue/white handoff flashes.
   Kuranoka is daylight; Kuronata is crimson night on ALL systems.
   Background fallbacks now visually match the respective photos
   while the actual image bytes/texture become ready.
   ============================================================== */
html:has(body.page-Kuranoka) { color-scheme: light !important; }
html:has(body.page-Kuronata) { color-scheme: dark !important; }
html body.skin-citizen.page-Kuranoka {
    color-scheme: light !important;
    background-color: #197ebd !important;
}
html body.skin-citizen.page-Kuronata {
    color-scheme: dark !important;
    background-color: #160a13 !important;
}

/* Keep the OLD fully-rendered scene in place while the destination
   document finishes its first paint. Then dissolve once, smoothly. */
@keyframes kkpt-native-handoff-out {
    0%, 48% { opacity: 1; }
    100% { opacity: 0; }
}
@keyframes kkpt-native-handoff-in {
    0%, 42% { opacity: 0; }
    100% { opacity: 1; }
}
::view-transition-old(root) {
    animation: kkpt-native-handoff-out 880ms ease-in-out both;
}
::view-transition-new(root) {
    animation: kkpt-native-handoff-in 880ms ease-in-out both;
}
@media (prefers-reduced-motion: reduce) {
    ::view-transition-old(root),
    ::view-transition-new(root) {
        animation-duration: .01ms !important;
    }
}