MediaWiki:KuranokaPageTransition.css:修订间差异
MediaWiki界面页面
更多操作
无编辑摘要 |
无编辑摘要 |
||
| 第1,089行: | 第1,089行: | ||
width: 24px !important; | width: 24px !important; | ||
height: 24px !important; | height: 24px !important; | ||
} | |||
} | |||
/* V24 · 无缝画面交接 */ | |||
@view-transition { | |||
navigation: auto; | |||
} | |||
::view-transition-old(root) { | |||
animation: 650ms ease-in-out both kkpt-outgoing; | |||
} | |||
::view-transition-new(root) { | |||
animation: 650ms ease-in-out both kkpt-incoming; | |||
} | |||
@keyframes kkpt-outgoing { | |||
0%, 50% { | |||
opacity: 1; | |||
} | |||
100% { | |||
opacity: 0; | |||
} | |||
} | |||
@keyframes kkpt-incoming { | |||
0%, 45% { | |||
opacity: 0; | |||
} | |||
100% { | |||
opacity: 1; | |||
} | |||
} | |||
/* 避免透明页面露出默认白底 */ | |||
body.page-Kuronata { | |||
background-color: #1f0710; | |||
} | |||
body.page-Kuranoka { | |||
background-color: #c0eafe; | |||
} | |||
@media (prefers-reduced-motion: reduce) { | |||
::view-transition-old(root), | |||
::view-transition-new(root) { | |||
animation-duration: 0.01ms !important; | |||
} | } | ||
} | } | ||
2026年10月23日 (五) 21:36的最新版本
/* 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 {
/* 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 > a.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 > a.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 > a.kkpt-fate-gear:is(:hover,:focus-visible)::before {
opacity: .88;
animation-duration: 2.4s;
}
.kkpt-fate-host > a.kkpt-fate-gear.kkpt-fate-gear-turning::before {
opacity: 1;
animation-duration: .65s;
}
.kkpt-fate-host > a.kkpt-fate-gear.kkpt-fate-gear-turning {
animation: kkpt-destiny-awaken 1.5s ease-out;
}
.kkpt-fate-host > a.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)}
}
/* 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 > a.kkpt-fate-gear::before,
.kkpt-fate-host > a.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 > a.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 > a.kkpt-fate-gear::before {
opacity: .15;
}
.kkpt-fate-host > a.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 > a.kkpt-fate-gear:is(:hover,:focus-visible)::before {
opacity: .75;
}
.kkpt-fate-host > a.kkpt-fate-gear .kkpt-fate-gear-svg {
filter: drop-shadow(0 0 2px var(--kkpt-gear-halo));
}
.kkpt-fate-host > a.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 > a.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;
}
}
/* V23 — fate wheel in the Infobox caption's TOP RIGHT CORNER.
Absolute positioning never changes the title's centering. */
.kkpt-fate-host > a.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 > a.kkpt-fate-gear {
top: 5px !important;
right: 5px !important;
width: 24px !important;
height: 24px !important;
}
}
/* V24 · 无缝画面交接 */
@view-transition {
navigation: auto;
}
::view-transition-old(root) {
animation: 650ms ease-in-out both kkpt-outgoing;
}
::view-transition-new(root) {
animation: 650ms ease-in-out both kkpt-incoming;
}
@keyframes kkpt-outgoing {
0%, 50% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@keyframes kkpt-incoming {
0%, 45% {
opacity: 0;
}
100% {
opacity: 1;
}
}
/* 避免透明页面露出默认白底 */
body.page-Kuronata {
background-color: #1f0710;
}
body.page-Kuranoka {
background-color: #c0eafe;
}
@media (prefers-reduced-motion: reduce) {
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 0.01ms !important;
}
}