/* ChatEngine — оформление из магазина: рамки аватара, эффекты профиля, стили имени.
   Файл раздаётся сервером, поэтому новые предметы видны всем, даже без обновления программы. */
.pefx:focus-within { border-color: var(--acc); box-shadow: 0 0 0 3px var(--acc-bg); }
.becmd .pefx { display: flex; align-items: center; border-radius: 9px; background: var(--rail); border: 1px solid var(--line2); padding: 0 8px; }
.becmd .pefx i { font-style: normal; color: var(--acc); font-weight: 700; }
.becmd .pefx input { flex: 1; min-width: 0; border: 0; background: none; outline: none; color: var(--txt); padding: 9px 4px; font: inherit; }
.becmd textarea:focus, .becmd .pefx:focus-within { border-color: var(--acc); }
/* =====================================================================
   ChatEngine 2.4 — миссии, магазин, рамки, эффекты, стримы
   ===================================================================== */
/* --- рамки аватара --- */
.av.fr { overflow: visible; }
.av.fr::before { content: ''; position: absolute; inset: calc(var(--s) * -.1); border-radius: 50%; pointer-events: none; z-index: 2; --t: max(2px, calc(var(--s) * .075));
  -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - var(--t)), #000 calc(100% - var(--t) + .5px)); mask: radial-gradient(farthest-side, transparent calc(100% - var(--t)), #000 calc(100% - var(--t) + .5px)); }
.av.fr::after { position: absolute; pointer-events: none; z-index: 3; line-height: 1; font-size: calc(var(--s) * .34); }
.av.fr > .st { z-index: 4; }
@keyframes frSpin { to { transform: rotate(360deg); } }
@keyframes frGlow { 50% { opacity: .55; } }
.av.f_leaf::before { background: conic-gradient(#2e7d32, #a8e063, #56ab2f, #c5e86c, #2e7d32); }
.av.f_leaf::after { content: '🍃'; right: -12%; bottom: -10%; }
.av.f_neon::before { background: conic-gradient(#00f0ff, #ff00e6, #00f0ff); animation: frSpin 3s linear infinite; }
.av.f_neon::after { content: ''; inset: calc(var(--s) * -.1); border-radius: 50%; box-shadow: 0 0 calc(var(--s) * .12) #00e5ff, 0 0 calc(var(--s) * .22) #ff00e6aa; animation: frGlow 2s ease-in-out infinite; }
.av.f_ice::before { background: conic-gradient(#e0f7ff, #7fd3ff, #ffffff, #4fb3ff, #e0f7ff); }
.av.f_ice::after { content: '❄️'; left: -12%; top: -12%; }
.av.f_hearts::before { background: conic-gradient(#ff5f9e, #ffb3d1, #ff2e7e, #ffb3d1, #ff5f9e); }
.av.f_hearts::after { content: '💖'; right: -14%; bottom: -10%; }
.av.f_gold::before { background: conic-gradient(#8a6d1d, #ffe58a, #c9a227, #fff3c4, #a07c1c, #ffe58a, #8a6d1d); }
.av.f_gold::after { content: ''; inset: calc(var(--s) * -.1); border-radius: 50%; box-shadow: 0 0 calc(var(--s) * .16) #ffd54a88; }
.av.f_cyber::before { background: repeating-conic-gradient(#00ffd5 0 18deg, transparent 18deg 30deg); animation: frSpin 6s linear infinite; }
.av.f_cyber::after { content: ''; inset: calc(var(--s) * -.1); border-radius: 50%; box-shadow: 0 0 calc(var(--s) * .14) #00ffd5aa, inset 0 0 calc(var(--s) * .08) #00ffd5; }
.av.f_fire::before { background: conic-gradient(#ff3d00, #ffb300, #ff6d00, #ffd54f, #ff1744, #ff3d00); animation: frSpin 1.6s linear infinite; }
.av.f_fire::after { content: '🔥'; left: 50%; bottom: -16%; transform: translateX(-50%); font-size: calc(var(--s) * .4); filter: drop-shadow(0 0 4px #ff6d00); }
.av.f_rainbow::before { background: conic-gradient(#ff4d4d, #ffb84d, #fff64d, #4dff88, #4dc3ff, #b84dff, #ff4d4d); animation: frSpin 2.5s linear infinite; }
.av.f_galaxy::before { background: conic-gradient(#1a0b3d, #7b2ff7, #00c6ff, #f107a3, #1a0b3d); animation: frSpin 5s linear infinite; }
.av.f_galaxy::after { content: '✨'; right: -14%; top: -14%; animation: frGlow 1.6s ease-in-out infinite; }
.av.f_crown::before { background: conic-gradient(#b8860b, #fff1a8, #d4a017, #fff8d6, #b8860b); }
.av.f_crown::after { content: '👑'; left: 50%; top: -30%; transform: translateX(-50%) rotate(-12deg); font-size: calc(var(--s) * .42); filter: drop-shadow(0 2px 3px rgba(0,0,0,.4)); }
/* мелкие аватарки — без значков-эмодзи */
.av.fr[style*="--s:2"]::after, .av.fr[style*="--s:1"]::after { display: none; }
/* --- стиль имени --- */
@keyframes nfxShine { to { background-position: -200% 0; } }
.nfx { font: 800 20px var(--head); }
.nfx.n_sunset { background: linear-gradient(90deg,#ff7e5f,#feb47b); -webkit-background-clip: text; background-clip: text; color: transparent; }
.nfx.n_ocean { background: linear-gradient(90deg,#00c6ff,#3a7bd5); -webkit-background-clip: text; background-clip: text; color: transparent; }
.nfx.n_neon { color: #7df9ff; text-shadow: 0 0 6px #00e5ff, 0 0 14px #00b3ff; }
.nfx.n_gold { background: linear-gradient(100deg,#b8860b 20%,#ffe58a 40%,#d4a017 60%,#b8860b 80%); background-size: 200% 100%; -webkit-background-clip: text; background-clip: text; color: transparent; animation: nfxShine 3s linear infinite; }
.nfx.n_rainbow { background: linear-gradient(90deg,#ff4d4d,#ffb84d,#fff64d,#4dff88,#4dc3ff,#b84dff,#ff4d4d); background-size: 300% 100%; -webkit-background-clip: text; background-clip: text; color: transparent; animation: nfxShine 4s linear infinite; }
/* --- эффекты профиля --- */
.pefx { position: absolute; inset: 0; border-radius: inherit; pointer-events: none; z-index: 5; overflow: hidden; }
@keyframes pfxFall { to { background-position: 0 300px, 40px 300px, 80px 300px; } }
@keyframes pfxRise { to { background-position: 0 -300px, 50px -300px, 20px -300px; } }
@keyframes pfxTw { 50% { opacity: .35; } }
.pefx.e_snow { background-image: radial-gradient(4px 4px at 20px 30px, #fff, transparent), radial-gradient(3px 3px at 80px 70px, #fff, transparent), radial-gradient(3.5px 3.5px at 140px 20px, #ffffffdd, transparent); background-size: 160px 100px, 120px 110px, 180px 120px; filter: drop-shadow(0 0 2px #fff); animation: pfxFall 9s linear infinite; }
.pefx.e_bubbles { background-image: radial-gradient(circle at 30px 60px, transparent 6px, #9fe7ff88 7px, transparent 8px), radial-gradient(circle at 90px 20px, transparent 4px, #b5f0ff88 5px, transparent 6px), radial-gradient(circle at 150px 80px, transparent 9px, #8fdcff66 10px, transparent 11px); background-size: 180px 120px, 140px 100px, 200px 140px; animation: pfxRise 10s linear infinite; }
.pefx.e_hearts { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='90' height='90'%3E%3Ctext x='10' y='30' font-size='16'%3E💗%3C/text%3E%3Ctext x='55' y='75' font-size='12'%3E💕%3C/text%3E%3C/svg%3E"), url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='130' height='130'%3E%3Ctext x='70' y='40' font-size='14'%3E❤️%3C/text%3E%3C/svg%3E"), none; background-size: 90px 90px, 130px 130px; opacity: .75; animation: pfxRise 12s linear infinite; }
.pefx.e_sparkle { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='110' height='110'%3E%3Cpath d='M20 10l2 6 6 2-6 2-2 6-2-6-6-2 6-2z' fill='%23fff6b0'/%3E%3Cpath d='M80 60l1.5 4.5 4.5 1.5-4.5 1.5-1.5 4.5-1.5-4.5-4.5-1.5 4.5-1.5z' fill='%23fff'/%3E%3C/svg%3E"); background-size: 110px 110px; animation: pfxTw 1.8s ease-in-out infinite; }
.pefx.e_stars { background-image: radial-gradient(2.5px 2.5px at 15px 25px, #fff, transparent), radial-gradient(2px 2px at 60px 80px, #fff, transparent), radial-gradient(3px 3px at 120px 40px, #cfe3ff, transparent), radial-gradient(2px 2px at 170px 110px, #fff, transparent), radial-gradient(1.5px 1.5px at 95px 15px, #fff, transparent), radial-gradient(2px 2px at 40px 125px, #ffe9a8, transparent); background-size: 190px 140px; filter: drop-shadow(0 0 2px #fff); animation: pfxTw 2.4s ease-in-out infinite; }
.pefx.e_aurora { background: radial-gradient(70% 40% at 20% 0%, #00ffa399, transparent 70%), radial-gradient(60% 40% at 80% 5%, #7b2ff799, transparent 70%), radial-gradient(50% 35% at 50% 0%, #00c6ff77, transparent 70%); background-size: 200% 100%; animation: nfxShine 8s ease-in-out infinite alternate; mix-blend-mode: screen; }
@media (prefers-reduced-motion: reduce) { .av.fr::before, .av.fr::after, .pefx, .nfx { animation: none !important; } }
/* ===== 2.5.1 — 3D-рамки, две цены ===== */
@property --fa { syntax: '<angle>'; inherits: false; initial-value: 0deg; }
@keyframes faSpin { to { --fa: 360deg; } }
@keyframes frSpinR { to { transform: rotate(-360deg); } }
@keyframes frPulse { 0% { transform: scale(1); opacity: .9; } 100% { transform: scale(1.45); opacity: 0; } }
@keyframes frHue { to { filter: hue-rotate(360deg); } }
.av.f_orbit, .av.f_atom, .av.f_portal { isolation: isolate; }
/* Орбита: наклонённое кольцо как у Сатурна — задняя половина за аватаркой, передняя — перед ней, по кольцу бежит спутник */
.av.f_orbit::before, .av.f_orbit::after, .av.f_atom::before, .av.f_atom::after {
  content: ''; position: absolute; inset: calc(var(--s) * -.3); border-radius: 50%; padding: max(2px, calc(var(--s) * .045)); box-sizing: border-box; display: block; font-size: 0;
  -webkit-mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0); mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
  animation: faSpin 2.6s linear infinite; }
.av.f_orbit::before, .av.f_orbit::after { background: conic-gradient(from var(--fa), #fff 0 10deg, #7df9ff 18deg, #a46bff 120deg, #ff6ad5 220deg, #7df9ff 340deg, #fff 360deg); transform: rotate(-18deg) rotateX(74deg); filter: drop-shadow(0 0 3px #7df9ffaa); }
.av.f_orbit::before { z-index: -1; }
.av.f_orbit::after { z-index: 3; clip-path: inset(50% 0 0 0); }
/* Атом: два электрона на скрещённых орбитах */
.av.f_atom::before, .av.f_atom::after { z-index: 3; background: conic-gradient(from var(--fa), #ffe066 0 14deg, #ffe06600 40deg, #39d0ff55 200deg, #ffe06600 330deg, #ffe066 360deg); }
.av.f_atom::before { transform: rotate(35deg) rotateX(72deg); }
.av.f_atom::after { transform: rotate(-35deg) rotateX(72deg); animation-duration: 1.9s; animation-direction: reverse; }
/* Двойное кольцо: два кольца крутятся навстречу */
.av.f_dual::before { background: conic-gradient(#ff3d6e, #ffb84d, #ff3d6e00 50%, #ff3d6e); animation: frSpin 2s linear infinite; }
.av.f_dual::after { content: ''; inset: calc(var(--s) * -.2); border-radius: 50%; border: max(2px, calc(var(--s) * .035)) dashed #7df9ff; box-shadow: 0 0 calc(var(--s) * .1) #7df9ff88; animation: frSpinR 4s linear infinite; }
/* Голограмма: переливается всеми цветами, по кольцу пробегает блик */
.av.f_holo::before { background: conic-gradient(from var(--fa), #9cf, #f9c, #cf9, #fc9, #c9f, #9cf); animation: faSpin 3s linear infinite, frHue 6s linear infinite; }
.av.f_holo::after { content: ''; inset: calc(var(--s) * -.1); border-radius: 50%; background: conic-gradient(from var(--fa), transparent 0 300deg, #ffffffcc 330deg, transparent 360deg); -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - max(2px, calc(var(--s) * .075))), #000 calc(100% - max(2px, calc(var(--s) * .075)) + .5px)); mask: radial-gradient(farthest-side, transparent calc(100% - max(2px, calc(var(--s) * .075))), #000 calc(100% - max(2px, calc(var(--s) * .075)) + .5px)); animation: faSpin 1.4s linear infinite; }
/* Пульс: от аватарки расходятся световые волны */
.av.f_pulse::before { background: conic-gradient(#00ffa3, #00c6ff, #00ffa3); }
.av.f_pulse::after { content: ''; inset: calc(var(--s) * -.1); border-radius: 50%; border: max(2px, calc(var(--s) * .04)) solid #00ffa3; animation: frPulse 1.6s ease-out infinite; }
/* Портал: воронка из света вращается за аватаркой */
.av.f_portal::before { background: conic-gradient(from var(--fa), #00f0ff, #7b2ff7, #f107a3, #00f0ff); animation: faSpin 1.2s linear infinite; filter: drop-shadow(0 0 4px #7b2ff7); }
.av.f_portal::after { content: ''; inset: calc(var(--s) * -.32); border-radius: 50%; z-index: -1; background: conic-gradient(from var(--fa), #7b2ff700, #7b2ff7aa, #00f0ff88, #f107a3aa, #7b2ff700); -webkit-mask: radial-gradient(closest-side, transparent 55%, #000 70%, transparent 100%); mask: radial-gradient(closest-side, transparent 55%, #000 70%, transparent 100%); filter: blur(calc(var(--s) * .04)); animation: faSpin 2.2s linear infinite reverse; }
/* ===== 2.6 — новые рамки, эффекты, цвета имени ===== */
@keyframes nfxPulse { 50% { text-shadow: 0 0 2px #6bff00, 0 0 6px #2fd400; } }
@keyframes nfxGlitch { 0% { text-shadow: 2px 0 #ff004c, -2px 0 #00e5ff; } 25% { text-shadow: -2px 1px #ff004c, 2px -1px #00e5ff; } 50% { text-shadow: 1px -1px #ff004c, -1px 1px #00e5ff; } 75% { text-shadow: -1px 0 #ff004c, 1px 0 #00e5ff; } }
@keyframes frFlicker { 0%, 100% { opacity: 1; } 45% { opacity: 1; } 48% { opacity: .3; } 52% { opacity: 1; } 70% { opacity: .6; } 72% { opacity: 1; } }
@keyframes frBob { 50% { transform: translateY(-8%) rotate(6deg); } }
@keyframes frFloat { 50% { transform: translate(-50%, -10%); } }
@keyframes frCube { to { transform: rotateX(360deg) rotateY(360deg); } }
/* плоские рамки */
.av.f_sakura::before { background: conic-gradient(#ffc0d9, #ff7eb3, #ffe4ef, #ff9ac4, #ffc0d9); }
.av.f_sakura::after { content: '🌸'; right: -12%; top: -10%; animation: frBob 2.4s ease-in-out infinite; }
.av.f_toxic::before { background: conic-gradient(#9dff3a, #1f8f00, #c6ff5e, #2fd400, #9dff3a); animation: frSpin 4s linear infinite; }
.av.f_toxic::after { content: ''; inset: calc(var(--s) * -.1); border-radius: 50%; box-shadow: 0 0 calc(var(--s) * .14) #6bff00, inset 0 0 calc(var(--s) * .06) #6bff00; animation: frGlow 1.4s ease-in-out infinite; }
.av.f_ocean::before { background: conic-gradient(from var(--fa), #00c6ff, #0072ff, #00e5ff, #003f9e, #00c6ff); animation: faSpin 3.5s linear infinite; }
.av.f_ocean::after { content: '🌊'; left: -14%; bottom: -10%; }
.av.f_thunder::before { background: conic-gradient(#fff36b, #ffb300, #fff9c4, #ffcc00, #fff36b); animation: frFlicker 2.2s linear infinite; }
.av.f_thunder::after { content: '⚡'; right: -14%; top: -14%; filter: drop-shadow(0 0 4px #ffe600); animation: frFlicker 1.7s linear infinite; }
.av.f_pixel::before { background: repeating-conic-gradient(#00e5ff 0 22.5deg, #ff2fd1 22.5deg 45deg); -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - max(3px, calc(var(--s) * .09))), #000 calc(100% - max(3px, calc(var(--s) * .09)))); mask: radial-gradient(farthest-side, transparent calc(100% - max(3px, calc(var(--s) * .09))), #000 calc(100% - max(3px, calc(var(--s) * .09)))); animation: frSpin 8s steps(16) infinite; }
.av.f_ghost::before { background: conic-gradient(#ffffff, #cfd8ff55, #ffffff, #cfd8ff22, #ffffff); filter: blur(.5px); }
.av.f_ghost::after { content: '👻'; left: 50%; top: -24%; transform: translateX(-50%); animation: frFloat 2.8s ease-in-out infinite; }
.av.f_pumpkin::before { background: conic-gradient(#ff7a00, #6a1b9a, #ff7a00, #2b0a3d, #ff7a00); animation: frSpin 6s linear infinite; }
.av.f_pumpkin::after { content: '🎃'; right: -14%; bottom: -12%; }
.av.f_candy::before { background: repeating-conic-gradient(#ff2e4d 0 15deg, #ffffff 15deg 30deg); animation: frSpin 5s linear infinite; }
.av.f_candy::after { content: '🍭'; left: -14%; top: -12%; }
.av.f_lava::before { background: conic-gradient(from var(--fa), #ff2a00, #ffb300, #7a0d00, #ff5a00, #ffd000, #ff2a00); animation: faSpin 2s linear infinite; filter: drop-shadow(0 0 4px #ff3d00); }
.av.f_lava::after { content: ''; inset: calc(var(--s) * -.12); border-radius: 50%; box-shadow: 0 0 calc(var(--s) * .18) #ff3d0088; animation: frGlow 1.2s ease-in-out infinite; }
.av.f_diamond::before { background: conic-gradient(from var(--fa), #ffffff, #b9f2ff, #e0e7ff, #ffffff, #a5d8ff, #fff0fb, #ffffff); animation: faSpin 3s linear infinite; }
.av.f_diamond::after { content: '💎'; right: -14%; top: -14%; filter: drop-shadow(0 0 5px #b9f2ff); animation: frBob 2.2s ease-in-out infinite; }
.av.f_dragon::before { background: conic-gradient(from var(--fa), #00ff9c, #007a4d, #ffe14d, #00ff9c); animation: faSpin 2.4s linear infinite; filter: drop-shadow(0 0 4px #00ff9c); }
.av.f_dragon::after { content: '🐉'; left: 50%; top: -34%; transform: translateX(-50%); font-size: calc(var(--s) * .46); filter: drop-shadow(0 2px 4px rgba(0,0,0,.5)); animation: frFloat 3s ease-in-out infinite; }
/* 3D: гироскоп — три кольца крутятся в разных плоскостях */
.av.f_gyro { isolation: isolate; perspective: calc(var(--s) * 4); }
.av.f_gyro::before, .av.f_gyro::after { content: ''; position: absolute; inset: calc(var(--s) * -.2); border-radius: 50%; border: max(2px, calc(var(--s) * .04)) solid #f5c542; box-shadow: 0 0 calc(var(--s) * .08) #f5c54299; -webkit-mask: none; mask: none; z-index: 3; }
.av.f_gyro::before { animation: gyroA 3s linear infinite; }
.av.f_gyro::after { inset: calc(var(--s) * -.28); border-color: #7df9ff; box-shadow: 0 0 calc(var(--s) * .08) #7df9ff99; animation: gyroB 4.2s linear infinite; }
@keyframes gyroA { from { transform: rotateY(0) rotateX(60deg); } to { transform: rotateY(360deg) rotateX(60deg); } }
@keyframes gyroB { from { transform: rotateX(0) rotateY(70deg); } to { transform: rotateX(360deg) rotateY(70deg); } }
/* 3D: комета — летит по наклонной орбите с хвостом */
.av.f_comet { isolation: isolate; }
.av.f_comet::before, .av.f_comet::after { content: ''; position: absolute; inset: calc(var(--s) * -.3); border-radius: 50%; padding: max(2px, calc(var(--s) * .05)); box-sizing: border-box; background: conic-gradient(from var(--fa), #ffffff 0 6deg, #ffd27a 12deg, #ff8a3d55 60deg, transparent 120deg 360deg); -webkit-mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0); mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0); transform: rotate(25deg) rotateX(70deg); animation: faSpin 2.2s linear infinite; filter: drop-shadow(0 0 4px #ffb347); }
.av.f_comet::before { z-index: -1; }
.av.f_comet::after { z-index: 3; clip-path: inset(50% 0 0 0); }
/* 3D: куб — вокруг аватарки вращается каркас куба */
.av.f_cube { perspective: calc(var(--s) * 3); }
.av.f_cube::before { content: ''; position: absolute; inset: calc(var(--s) * -.14); border-radius: 18%; -webkit-mask: none; mask: none; border: max(2px, calc(var(--s) * .035)) solid #a46bff; box-shadow: 0 0 calc(var(--s) * .1) #a46bff, inset 0 0 calc(var(--s) * .1) #a46bff88; animation: frCube 6s linear infinite; z-index: 3; }
.av.f_cube::after { content: ''; position: absolute; inset: calc(var(--s) * -.14); border-radius: 18%; border: max(1px, calc(var(--s) * .025)) solid #00e5ff; animation: frCube 6s linear infinite reverse; z-index: 3; opacity: .8; }
/* эффекты профиля */
@keyframes pfxFall2 { to { background-position: 0 300px, 60px 300px, 120px 300px; } }
@keyframes pfxRain { to { background-position: -12px 80px, -6px 110px; } }
@keyframes pfxFlash { 0%, 89%, 93%, 100% { opacity: 0; } 90%, 92% { opacity: .9; } }
@keyframes pfxFly { 50% { background-position: 30px -20px, -40px 30px, 20px 40px; opacity: .6; } }
.pefx.e_fire { background-image: radial-gradient(3.5px 3.5px at 20px 80px, #ffb347, transparent), radial-gradient(3px 3px at 90px 40px, #ff6a00, transparent), radial-gradient(4px 4px at 150px 100px, #ffd200, transparent), radial-gradient(2.5px 2.5px at 60px 20px, #ff8c1a, transparent); background-size: 170px 120px, 130px 110px, 190px 130px, 150px 140px; filter: drop-shadow(0 0 3px #ff6a00); animation: pfxRise 5s linear infinite; }
.pefx.e_fire::after { content: ''; position: absolute; inset: auto 0 0 0; height: 40%; background: linear-gradient(0deg, #ff3d0044, transparent); }
.pefx.e_rain { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='60' height='80'%3E%3Cg stroke='%239fd3ff' stroke-width='1.4' stroke-linecap='round'%3E%3Cline x1='10' y1='5' x2='7' y2='19' opacity='.8'/%3E%3Cline x1='34' y1='35' x2='31' y2='49' opacity='.6'/%3E%3Cline x1='52' y1='58' x2='49' y2='72' opacity='.7'/%3E%3C/g%3E%3C/svg%3E"), url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='90' height='110'%3E%3Cg stroke='%239fd3ff' stroke-width='1' stroke-linecap='round' opacity='.45'%3E%3Cline x1='20' y1='20' x2='18' y2='30'/%3E%3Cline x1='70' y1='70' x2='68' y2='80'/%3E%3C/g%3E%3C/svg%3E"); background-size: 60px 80px, 90px 110px; animation: pfxRain .7s linear infinite; }
.pefx.e_sakura { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Ctext x='10' y='30' font-size='14'%3E🌸%3C/text%3E%3Ctext x='70' y='90' font-size='11'%3E🌸%3C/text%3E%3C/svg%3E"), url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Ctext x='90' y='40' font-size='12'%3E🌸%3C/text%3E%3C/svg%3E"), none; background-size: 120px 120px, 160px 160px; opacity: .8; animation: pfxFall2 10s linear infinite; }
.pefx.e_matrix { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='60' height='120'%3E%3Ctext x='4' y='20' font-family='monospace' font-size='12' fill='%2300ff6a'%3E1%3C/text%3E%3Ctext x='24' y='50' font-family='monospace' font-size='12' fill='%2300ff6a99'%3E0%3C/text%3E%3Ctext x='44' y='86' font-family='monospace' font-size='12' fill='%2300ff6a'%3E7%3C/text%3E%3Ctext x='14' y='110' font-family='monospace' font-size='12' fill='%2300ff6a66'%3Eア%3C/text%3E%3C/svg%3E"), linear-gradient(#001a0855, #001a0822); background-size: 60px 120px, 100% 100%; animation: pfxFall 4s linear infinite; }
.pefx.e_confetti { background-image: linear-gradient(45deg, #ff4d6d 0 0), linear-gradient(45deg, #ffd166 0 0), linear-gradient(45deg, #06d6a0 0 0), linear-gradient(45deg, #4cc9f0 0 0); background-size: 5px 9px, 6px 6px, 4px 8px, 7px 5px; background-repeat: no-repeat; background-position: 20% 0, 50% 20%, 75% 10%, 35% 40%; animation: confetti 3.5s linear infinite; }
@keyframes confetti { 0% { background-position: 20% -10%, 50% -30%, 75% -20%, 35% -40%; } 100% { background-position: 25% 110%, 45% 110%, 80% 110%, 30% 110%; } }
.pefx.e_fireflies { background-image: radial-gradient(4px 4px at 30px 40px, #fff6a0, transparent), radial-gradient(3.5px 3.5px at 110px 90px, #d4ff7a, transparent), radial-gradient(4px 4px at 170px 30px, #fff6a0, transparent), radial-gradient(3px 3px at 70px 120px, #fff6a0, transparent); background-size: 200px 150px; filter: drop-shadow(0 0 4px #fff6a0) drop-shadow(0 0 8px #d4ff7a); animation: pfxFly 4s ease-in-out infinite, pfxTw 1.3s ease-in-out infinite; }
.pefx.e_nebula { background: radial-gradient(50% 40% at 25% 20%, #ff2fd188, transparent 70%), radial-gradient(45% 35% at 80% 35%, #4f6bff88, transparent 70%), radial-gradient(40% 30% at 50% 70%, #00e5ff66, transparent 70%); background-size: 200% 200%; animation: nfxShine 10s ease-in-out infinite alternate; mix-blend-mode: screen; }
.pefx.e_lightning { background: linear-gradient(180deg, #2b3a6b55, transparent 60%); }
.pefx.e_lightning::after { content: ''; position: absolute; inset: 0; background: radial-gradient(60% 40% at 60% 10%, #ffffffcc, transparent 70%); animation: pfxFlash 4s linear infinite; }
.nfx { display: inline-block; }
