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

MediaWiki:KuranokaPageTransition.css:修订间差异

MediaWiki界面页面
 
无编辑摘要
 
(未显示同一用户的5个中间版本)
第1行: 第1行:
/* ================================================================
/* Kuranoka Page Transition V6 — CATACLYSM / DAWN
   KURANOKA / KURONATA — PAGE TRANSITION 1.0
   Load only on /wiki/Kuranoka and /wiki/Kuronata.
   Paste the ENTIRE file at the end of MediaWiki:Citizen.css.
   No Citizen.css / Common.css changes. */
  This does not change the Citizen glass layout or Stormbreak FX.
  ================================================================ */


/* Allow same-origin document navigation to retain old/new snapshots.
  The default transition for unrelated Wiki pages stays very short. */
@view-transition {
    navigation: auto;
}
::view-transition-old(root),
::view-transition-new(root) {
    animation-duration: 0.16s;
}
/* Button: mounted by MediaWiki:PageTransition.js. */
#kkpt-toggle {
#kkpt-toggle {
     --kkpt-accent: #94dcff;
     --kkpt-tone: #a7e7ff;
     --kkpt-ink: #e8f8ff;
     --kkpt-panel: rgba(7,28,49,.87);
    --kkpt-back: rgba(7, 26, 44, 0.76);
     position: fixed;
     position: fixed;
     right: clamp(12px, 2.3vw, 34px);
    z-index: 2147483000;
     bottom: clamp(14px, 3.4vh, 34px);
     right: clamp(12px,2.3vw,34px);
    z-index: 2147481000;
     bottom: clamp(14px,3.4vh,34px);
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
     gap: 11px;
     gap: 10px;
    max-width: calc(100vw - 24px);
     box-sizing: border-box;
     box-sizing: border-box;
    max-width: min(340px, calc(100vw - 24px));
     padding: 12px 17px;
     padding: 11px 16px;
     border: 1px solid color-mix(in srgb,var(--kkpt-tone) 60%,transparent);
     border: 1px solid color-mix(in srgb, var(--kkpt-accent) 65%, transparent);
     border-radius: 999px;
     border-radius: 999px;
     background: var(--kkpt-back);
     background: var(--kkpt-panel);
     -webkit-backdrop-filter: blur(16px) saturate(145%);
     box-shadow: 0 8px 35px #0007,0 0 20px color-mix(in srgb,var(--kkpt-tone) 25%,transparent);
    backdrop-filter: blur(16px) saturate(145%);
     color: #f1fcff !important;
     color: var(--kkpt-ink) !important;
     font: 650 13px/1.3 system-ui,sans-serif;
     font: 600 13px/1.35 system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
     letter-spacing: .045em;
     letter-spacing: .035em;
     text-decoration: none !important;
     text-decoration: none !important;
    box-shadow: 0 5px 26px rgba(0, 0, 0, .22),
                0 0 22px color-mix(in srgb, var(--kkpt-accent) 15%, transparent);
    transition: transform .24s ease, border-color .24s ease,
                box-shadow .24s ease, background .24s ease;
     cursor: pointer;
     cursor: pointer;
     isolation: isolate;
     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:hover,#kkpt-toggle:focus-visible {
#kkpt-toggle:focus-visible {
     transform: translateY(-3px);
     transform: translateY(-3px);
    border-color: var(--kkpt-accent);
     box-shadow: 0 9px 38px #0008,0 0 32px var(--kkpt-tone);
     box-shadow: 0 8px 30px rgba(0, 0, 0, .34),
                0 0 30px color-mix(in srgb, var(--kkpt-accent) 38%, transparent);
}
}


#kkpt-toggle:focus-visible {
#kkpt-toggle:focus-visible {outline: 2px solid var(--kkpt-tone);outline-offset: 4px}
    outline: 2px solid var(--kkpt-accent);
#kkpt-toggle .kkpt-icon {font-size: 23px;color: var(--kkpt-tone);text-shadow: 0 0 13px var(--kkpt-tone)}
    outline-offset: 4px;
#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}


#kkpt-toggle .kkpt-mark {
/* Real interactive Wiki page, retained after the transition finishes. */
     display: grid;
#kkpt-preview {
     place-items: center;
    position: fixed !important;
     width: 25px;
    z-index: 2147481000 !important;
     height: 25px;
    inset: 0 !important;
     flex: none;
     display: block !important;
     border-radius: 50%;
     box-sizing: border-box !important;
     background: color-mix(in srgb, var(--kkpt-accent) 18%, transparent);
     width: 100vw !important;
     color: var(--kkpt-accent);
     height: 100vh !important;
     font-size: 17px;
    padding: 0 !important;
     font-weight: 500;
    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;
}
}


#kkpt-toggle .kkpt-copy { display: flex; flex-direction: column; gap: 1px; }
body.page-Kuronata #kkpt-preview {background: #c0eafe}
#kkpt-toggle .kkpt-title { font-size: 13px; font-weight: 700; }
#kkpt-preview.kkpt-active {pointer-events: auto !important;clip-path: inset(0)}
#kkpt-toggle .kkpt-subtitle { font-size: 10px; font-weight: 500; opacity: .72; }


body.page-Kuronata #kkpt-toggle {
/* Rolling turbulent smoke, soot, sparks and shockwave halos. */
     --kkpt-accent: #ff8898;
#kkpt-atmosphere {
     --kkpt-ink: #fff2f3;
     position: fixed !important;
     --kkpt-back: rgba(60, 4, 19, .79);
    /* Above the fire shader: V5 rendered the smoke UNDER opaque soot,
      making its independently generated particles effectively invisible. */
    z-index: 2147482100 !important;
    inset: 0 !important;
    display: block !important;
    width: 100vw !important;
    height: 100vh !important;
     pointer-events: none !important;
     transition: opacity 180ms linear;
}
}


/* --------------------------------------------------------------
/* WebGL incandescent front / cold electrical aurora; visual only. */
  ENTER KURONATA — consume the old page from the right edge.
#kkpt-vfx {
  The new page is already painted beneath the old page snapshot.
    position: fixed !important;
  -------------------------------------------------------------- */
    z-index: 2147482000 !important;
html:has(body.page-Kuronata)::view-transition-group(root),
    inset: 0 !important;
html:has(body.page-Kuranoka)::view-transition-group(root) {
    display: block !important;
     animation-duration: 2.7s;
    width: 100vw !important;
    height: 100vh !important;
    pointer-events: none !important;
     transition: opacity 180ms linear;
}
}


html:has(body.page-Kuronata)::view-transition-old(root) {
/* A truly short combustion / cold-ionization flash, tracking the tear. */
     z-index: 2;
#kkpt-impact {
     animation: kkpt-burn 2.7s linear both;
    --kkpt-impact-x: 50vw;
     transform-origin: center;
    position: fixed !important;
    z-index: 2147482200 !important;
    inset: 0 !important;
    display: block !important;
    pointer-events: none !important;
    width: 100vw !important;
    height: 100vh !important;
    opacity: 0;
     mix-blend-mode: screen;
     will-change: opacity;
}
#kkpt-impact.kkpt-impact-red {
     background:
        radial-gradient(ellipse 36vw 82vh at var(--kkpt-impact-x) 51%,
            rgba(255,253,231,.93) 0%,
            rgba(255,177,69,.74) 16%,
            rgba(255,53,17,.26) 48%,
            transparent 78%),
        linear-gradient(90deg,rgba(255,70,18,.12),rgba(255,124,24,.15));
}
}
 
#kkpt-impact.kkpt-impact-blue {
html:has(body.page-Kuronata)::view-transition-new(root) {
     background:
     z-index: 1;
        radial-gradient(ellipse 32vw 80vh at var(--kkpt-impact-x) 51%,
    animation: kkpt-blood-arrive 2.7s linear both;
            rgba(255,255,255,.98) 0%,
            rgba(157,235,255,.71) 18%,
            rgba(37,101,255,.21) 49%,
            transparent 79%),
        linear-gradient(90deg,rgba(30,140,255,.11),rgba(165,238,255,.11));
}
}


@keyframes kkpt-burn {
/* MediaWiki portal links are normal links until hovered/focused. */
    0% {
#mw-content-text a.kkpt-portal-link,
        clip-path: polygon(0 0, 100% 0, 100% 10%, 100% 20%, 100% 30%, 100% 40%, 100% 50%, 100% 60%, 100% 70%, 100% 80%, 100% 90%, 100% 100%, 0 100%);
.mw-parser-output a.kkpt-portal-link {
        filter: brightness(1) saturate(1) drop-shadow(0 0 0 transparent);
     --kkpt-fringe: #ff4662;
     }
     --kkpt-halo: rgba(244,19,51,.30);
    10% {
    display: inline-block;
        clip-path: polygon(0 0, 99% 0, 97% 10%, 93% 20%, 98% 30%, 95% 40%, 91% 50%, 97% 60%, 93% 70%, 98% 80%, 94% 90%, 97% 100%, 0 100%);
     position: relative;
        filter: brightness(.89) sepia(.12) drop-shadow(10px 0 16px #ff772c);
     isolation: isolate;
     }
    cursor: pointer;
    29% {
     text-decoration-thickness: 1px;
        clip-path: polygon(0 0, 77% 0, 71% 10%, 78% 20%, 69% 30%, 73% 40%, 65% 50%, 75% 60%, 69% 70%, 74% 80%, 68% 90%, 72% 100%, 0 100%);
     text-underline-offset: 3px;
        filter: brightness(.78) sepia(.4) drop-shadow(12px 0 23px #ff360c);
     transition: color .13s, text-shadow .13s, filter .13s;
     }
     49% {
        clip-path: polygon(0 0, 52% 0, 45% 10%, 53% 20%, 43% 30%, 50% 40%, 39% 50%, 47% 60%, 42% 70%, 50% 80%, 40% 90%, 46% 100%, 0 100%);
        filter: brightness(.64) sepia(.65) drop-shadow(11px 0 28px #ff3a10);
     }
    71% {
        clip-path: polygon(0 0, 27% 0, 20% 10%, 25% 20%, 15% 30%, 23% 40%, 11% 50%, 22% 60%, 17% 70%, 25% 80%, 14% 90%, 20% 100%, 0 100%);
        filter: brightness(.41) sepia(.85) drop-shadow(10px 0 28px #ff260b);
    }
     91% {
        clip-path: polygon(0 0, 5% 0, -1% 10%, 6% 20%, -4% 30%, 3% 40%, -7% 50%, 4% 60%, -2% 70%, 6% 80%, -5% 90%, 2% 100%, 0 100%);
        filter: brightness(.3) sepia(1) drop-shadow(9px 0 17px #ff3b15);
     }
    100% {
        clip-path: polygon(-14% 0, -14% 0, -14% 10%, -14% 20%, -14% 30%, -14% 40%, -14% 50%, -14% 60%, -14% 70%, -14% 80%, -14% 90%, -14% 100%, -14% 100%);
        filter: brightness(.2) sepia(1) drop-shadow(0 0 0 transparent);
    }
}
}
 
#mw-content-text a.kkpt-portal-blue,
@keyframes kkpt-blood-arrive {
.mw-parser-output a.kkpt-portal-blue {
    0%, 12% { filter: brightness(.23) saturate(1.7) sepia(.33); }
     --kkpt-fringe: #55e5ff;
     35% { filter: brightness(.52) saturate(1.4) sepia(.15); }
     --kkpt-halo: rgba(23,183,255,.35);
     72% { filter: brightness(.9) saturate(1.1); }
    100% { filter: brightness(1) saturate(1) sepia(0); }
}
}
 
#mw-content-text a.kkpt-portal-link:is(:hover,:focus-visible),
/* --------------------------------------------------------------
.mw-parser-output a.kkpt-portal-link:is(:hover,:focus-visible) {
  ENTER KURANOKA — a white-blue break of dawn from the left.
    color: var(--kkpt-fringe) !important;
  -------------------------------------------------------------- */
    text-shadow: -2px 0 var(--kkpt-halo),2px 0 rgba(108,219,255,.42),
html:has(body.page-Kuranoka)::view-transition-old(root) {
                0 0 11px var(--kkpt-halo);
    z-index: 2;
     animation: kkpt-hover-jitter 800ms steps(1,end) infinite;
     animation: kkpt-dawn 2.45s linear both;
}
}
 
#mw-content-text a.kkpt-portal-link::before,
html:has(body.page-Kuranoka)::view-transition-new(root) {
#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;
     z-index: 1;
     animation: kkpt-sky-arrive 2.45s ease-out both;
    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 {
@keyframes kkpt-dawn {
     0%,100% {clip-path:inset(0 0 91% 0);transform:translate(0)}
     0% {
    15% {clip-path:inset(9% 0 70% 0);transform:translate(-3px,1px)}
        clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 0 90%, 0 80%, 0 70%, 0 60%, 0 50%, 0 40%, 0 30%, 0 20%, 0 10%);
     26% {clip-path:inset(40% 0 38% 0);transform:translate(4px,-1px)}
        filter: brightness(1) drop-shadow(0 0 0 transparent);
     42% {clip-path:inset(76% 0 9% 0);transform:translate(-2px,0)}
    }
     59% {clip-path:inset(22% 0 59% 0);transform:translate(3px,1px)}
     25% {
     84% {clip-path:inset(56% 0 22% 0);transform:translate(-4px,-1px)}
        clip-path: polygon(18% 0, 100% 0, 100% 100%, 21% 100%, 25% 90%, 20% 80%, 28% 70%, 23% 60%, 31% 50%, 22% 40%, 29% 30%, 19% 20%, 24% 10%);
        filter: brightness(1.25) drop-shadow(-9px 0 23px #b0eaff);
    }
     55% {
        clip-path: polygon(56% 0, 100% 0, 100% 100%, 60% 100%, 65% 90%, 58% 80%, 69% 70%, 61% 60%, 72% 50%, 62% 40%, 68% 30%, 57% 20%, 64% 10%);
        filter: brightness(1.65) drop-shadow(-12px 0 30px #f1fbff);
    }
     84% {
        clip-path: polygon(89% 0, 100% 0, 100% 100%, 94% 100%, 101% 90%, 93% 80%, 103% 70%, 95% 60%, 107% 50%, 96% 40%, 104% 30%, 91% 20%, 99% 10%);
        filter: brightness(1.85) drop-shadow(-9px 0 19px #d0f6ff);
    }
     100% {
        clip-path: polygon(115% 0, 115% 0, 115% 100%, 115% 100%, 115% 90%, 115% 80%, 115% 70%, 115% 60%, 115% 50%, 115% 40%, 115% 30%, 115% 20%, 115% 10%);
        filter: brightness(1) drop-shadow(0 0 0 transparent);
    }
}
}
 
@keyframes kkpt-slice-b {
@keyframes kkpt-sky-arrive {
     0%,100% {clip-path:inset(78% 0 7% 0);transform:translate(0)}
     0%, 17% { filter: brightness(1.65) saturate(.7); }
    14% {clip-path:inset(46% 0 29% 0);transform:translate(2px,-1px)}
     51% { filter: brightness(1.22) saturate(.95); }
     37% {clip-path:inset(11% 0 80% 0);transform:translate(-4px,1px)}
     100% { filter: brightness(1) saturate(1); }
    61% {clip-path:inset(65% 0 20% 0);transform:translate(4px,0)}
     83% {clip-path:inset(28% 0 49% 0);transform:translate(-2px,-1px)}
}
}


@media (max-width: 600px) {
@media (max-width: 600px) {
     #kkpt-toggle { padding: 10px 13px; gap: 8px; }
     #kkpt-toggle {padding: 10px 13px;gap: 8px}
     #kkpt-toggle .kkpt-subtitle { display: none; }
     #kkpt-toggle .kkpt-sub {display:none}
}
}
@media (prefers-reduced-motion: reduce) {
@media (prefers-reduced-motion: reduce) {
     html:has(body.page-Kuronata)::view-transition-group(root),
     #kkpt-toggle {transition:none !important}
     html:has(body.page-Kuranoka)::view-transition-group(root),
    #kkpt-vfx,#kkpt-atmosphere,#kkpt-impact {display:none !important}
     html:has(body.page-Kuronata)::view-transition-old(root),
    #mw-content-text a.kkpt-portal-link,
     html:has(body.page-Kuranoka)::view-transition-old(root),
     .mw-parser-output a.kkpt-portal-link {animation:none !important}
     html:has(body.page-Kuronata)::view-transition-new(root),
     #mw-content-text a.kkpt-portal-link::before,
     html:has(body.page-Kuranoka)::view-transition-new(root) {
     #mw-content-text a.kkpt-portal-link::after,
        animation-duration: .01ms !important;
     .mw-parser-output a.kkpt-portal-link::before,
    }
     .mw-parser-output a.kkpt-portal-link::after {animation:none !important;opacity:0 !important}
     #kkpt-toggle { transition: none; }
}
@media print {
     #kkpt-toggle,#kkpt-preview,#kkpt-vfx,#kkpt-atmosphere,#kkpt-impact {display:none !important}
}
}
@media print { #kkpt-toggle { display: none !important; } }

2026年10月23日 (五) 13:34的最新版本

/* Kuranoka Page Transition V6 — CATACLYSM / DAWN
   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)}

/* Rolling turbulent smoke, soot, sparks and shockwave halos. */
#kkpt-atmosphere {
    position: fixed !important;
    /* Above the fire shader: V5 rendered the smoke UNDER opaque soot,
       making its independently generated particles effectively invisible. */
    z-index: 2147482100 !important;
    inset: 0 !important;
    display: block !important;
    width: 100vw !important;
    height: 100vh !important;
    pointer-events: none !important;
    transition: opacity 180ms linear;
}

/* WebGL incandescent front / cold electrical aurora; visual only. */
#kkpt-vfx {
    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 180ms linear;
}

/* A truly short combustion / cold-ionization flash, tracking the tear. */
#kkpt-impact {
    --kkpt-impact-x: 50vw;
    position: fixed !important;
    z-index: 2147482200 !important;
    inset: 0 !important;
    display: block !important;
    pointer-events: none !important;
    width: 100vw !important;
    height: 100vh !important;
    opacity: 0;
    mix-blend-mode: screen;
    will-change: opacity;
}
#kkpt-impact.kkpt-impact-red {
    background:
        radial-gradient(ellipse 36vw 82vh at var(--kkpt-impact-x) 51%,
            rgba(255,253,231,.93) 0%,
            rgba(255,177,69,.74) 16%,
            rgba(255,53,17,.26) 48%,
            transparent 78%),
        linear-gradient(90deg,rgba(255,70,18,.12),rgba(255,124,24,.15));
}
#kkpt-impact.kkpt-impact-blue {
    background:
        radial-gradient(ellipse 32vw 80vh at var(--kkpt-impact-x) 51%,
            rgba(255,255,255,.98) 0%,
            rgba(157,235,255,.71) 18%,
            rgba(37,101,255,.21) 49%,
            transparent 79%),
        linear-gradient(90deg,rgba(30,140,255,.11),rgba(165,238,255,.11));
}

/* 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);
    display: inline-block;
    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)}
}

@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,#kkpt-impact {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}
}
@media print {
    #kkpt-toggle,#kkpt-preview,#kkpt-vfx,#kkpt-atmosphere,#kkpt-impact {display:none !important}
}