.fx-svg{color:var(--fx-color,var(--accent,#ef4b54));pointer-events:none;overflow:visible;opacity:var(--fx-opacity,.65)}
.fx-svg *{transform-box:fill-box;transform-origin:center}
.fx-spin{animation:fx-spin var(--fx-time,12s) linear infinite;transform-box:view-box!important;transform-origin:50% 50%}
.fx-reverse{animation:fx-spin var(--fx-time,12s) linear infinite reverse;transform-box:view-box!important}
.fx-breathe{animation:fx-breathe calc(var(--fx-time,12s)*.4) ease-in-out infinite alternate}
.fx-twinkle{animation:fx-twinkle calc(var(--fx-time,12s)*.5) ease-in-out infinite alternate}
.fx-float{animation:fx-float var(--fx-time,12s) ease-in-out infinite alternate}
.fx-rain{animation:fx-rain calc(var(--fx-time,12s)*.35) linear infinite}
.fx-wave{animation:fx-wave calc(var(--fx-time,12s)*.5) ease-in-out infinite alternate}
.fx-trace{animation:fx-trace calc(var(--fx-time,12s)*.7) linear infinite}
.fx-sweep{animation:fx-sweep var(--fx-time,12s) ease-in-out infinite}
.fx-scan,.fx-grid-scan{animation:fx-scan var(--fx-time,12s) linear infinite;transform-box:view-box!important}
.fx-background{position:absolute;inset:0;width:100%;height:100%;z-index:0;overflow:hidden}
.bio-stage.public>.fx-background{position:fixed}
.bio-stage .bio-content{position:relative;z-index:1}
.fx-definitions{position:absolute;width:0;height:0;overflow:hidden}
.bio-stage .bio-avatar.fx-avatar-host{position:relative;overflow:visible}
.fx-avatar-host>img{border-radius:inherit}
.fx-avatar{position:absolute;inset:-18%;width:136%;height:136%;transform:scale(var(--fx-size,1))}
.bio-name[data-fx]{position:relative}
.fx-name-text{position:relative}
.bio-name[data-fx="shine"] .fx-name-text{background:linear-gradient(110deg,var(--bio-text) 20%,var(--fx-color) 45%,#fff 50%,var(--bio-text) 65%);background-size:250% 100%;background-clip:text;-webkit-background-clip:text;color:transparent;animation:fx-shine var(--fx-time,12s) linear infinite}
.bio-name[data-fx="neon"] .fx-name-text{text-shadow:0 0 16px color-mix(in srgb,var(--fx-color) calc(var(--fx-opacity)*100%),transparent);animation:fx-neon calc(var(--fx-time,12s)*.4) ease-in-out infinite alternate}
.bio-name[data-fx="glitch"] .fx-name-text{display:inline-block;animation:fx-glitch var(--fx-time,12s) linear infinite}
.bio-name[data-fx="outline"] .fx-name-text{-webkit-text-stroke:1px var(--fx-color);color:color-mix(in srgb,var(--bio-text) 28%,transparent);animation:fx-neon calc(var(--fx-time,12s)*.4) ease-in-out infinite alternate}
.fx-name-line{position:absolute;left:15%;bottom:-8px;width:70%;height:13px;overflow:visible}
.fx-badge-host,.fx-link-host{position:relative;isolation:isolate}
.fx-badge,.fx-link{position:absolute;inset:0;width:100%;height:100%;border-radius:inherit;overflow:hidden}
.fx-card{position:absolute;inset:0;width:100%;height:100%;border-radius:inherit;overflow:hidden;z-index:2}
.fx-badge{inset:-2px;width:calc(100% + 4px);height:calc(100% + 4px)}
.bio-stage .entry-enter-icon.fx-entry-host{width:calc(80px * var(--fx-size));height:calc(80px * var(--fx-size));background:none;border:0;box-shadow:none;display:grid;place-items:center}
.entry-enter-icon .fx-entry{width:100%;height:100%}
.bio-stage .equalizer.fx-equalizer{width:42px;height:36px;flex:0 0 42px;display:block}
.fx-music{width:100%;height:100%}
.fx-bar{animation:fx-bar calc(var(--fx-time,12s)*.09) ease-in-out infinite alternate;transform-origin:center bottom}
.bio-music:not(.playing) .fx-music *{animation-play-state:paused}
.fx-cursor-layer{position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:4}
.fx-cursor{position:absolute;width:24px;height:24px;opacity:0}
.fx-editor>h2{margin:8px 0 12px;font-size:26px;letter-spacing:-1px}
.fx-editor>p{line-height:1.7}
.fx-presets{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:24px 0}
.fx-preset{--fx-color:#ef4b54;--fx-opacity:.85;--fx-time:16s;border:1px solid #3b3b42;background:linear-gradient(145deg,#222225,#131316);color:#eee;border-radius:12px;padding:18px;display:grid;grid-template-columns:44px 1fr;gap:6px 14px;text-align:left;cursor:pointer;transition:border-color .2s}
.fx-preset:hover,.fx-preset:focus-visible{border-color:#ef4b54;outline-offset:3px}
.fx-preset>.fx-svg{width:44px;height:44px;grid-row:span 2}
.fx-preset strong{font-size:14px;align-self:end}
.fx-preset small{color:#aeb0b8;font-size:10px;line-height:1.6}
.fx-controls{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 16px}
.fx-controls>summary{grid-column:1/-1}
.fx-controls>.extra-field{min-width:0;margin:10px 0}
@keyframes fx-spin{to{transform:rotate(360deg)}}
@keyframes fx-breathe{from{opacity:.5}to{opacity:1}}
@keyframes fx-twinkle{from{opacity:.25;transform:scale(.6)}to{opacity:1;transform:scale(var(--particle-scale,1))}}
@keyframes fx-float{from{transform:translate(-10px,12px)}to{transform:translate(16px,-24px)}}
@keyframes fx-rain{from{transform:translate(30px,-160px);opacity:0}30%{opacity:.7}to{transform:translate(-30px,160px);opacity:0}}
@keyframes fx-wave{from{transform:translateY(-4px)}to{transform:translateY(4px)}}
@keyframes fx-trace{to{stroke-dashoffset:-100}}
@keyframes fx-sweep{0%,30%{transform:translateX(-80px);opacity:0}45%{opacity:.5}70%,100%{transform:translateX(180px);opacity:0}}
@keyframes fx-scan{from{transform:translateY(0);opacity:0}20%,80%{opacity:.5}to{transform:translateY(100%);opacity:0}}
@keyframes fx-shine{from{background-position:200% 0}to{background-position:-50% 0}}
@keyframes fx-neon{from{opacity:.75}to{opacity:1}}
@keyframes fx-glitch{0%,90%,94%,100%{transform:none}91%{transform:translateX(1px);text-shadow:2px 0 var(--fx-color)}93%{transform:translateX(-1px);text-shadow:-2px 0 var(--fx-color)}}
@keyframes fx-bar{from{transform:scaleY(.35)}to{transform:scaleY(1)}}
@media(max-width:550px){.fx-controls{grid-template-columns:minmax(0,1fr)}.fx-preset{padding:12px;grid-template-columns:30px 1fr;gap:5px 10px}.fx-preset>.fx-svg{width:30px;height:36px}.fx-preset small{font-size:9px}}

/* Entry effects live above the blur, independently from the profile backdrop. */
.bio-stage .bio-entry {background:color-mix(in srgb,var(--card-color) var(--entry-overlay-opacity,35%),transparent);isolation:isolate;overflow:hidden;}
.bio-stage .bio-entry>.entry-label,.bio-stage .bio-entry>.entry-enter-icon {position:relative;z-index:1;flex-shrink:0;}
.bio-stage .bio-entry>.entry-label {font-size:clamp(14px,6vw,var(--entry-text-size,32px));line-height:1.5;max-width:min(720px,100%);}
.bio-stage .bio-entry>.fx-entry-background {position:absolute;inset:0;width:100%;height:100%;z-index:0;pointer-events:none;}
.bio-stage .entry-enter-icon.fx-entry-host {opacity:1;}
.bio-stage .entry-enter-icon.fx-entry-host>.fx-entry {width:100%;height:100%;}
.fx-expand {animation:fx-expand calc(var(--fx-time,12s)) linear infinite;transform-box:view-box!important;transform-origin:center;}
.fx-pulse-ring {animation:fx-pulse-ring calc(var(--fx-time,12s)*.22) ease-out infinite;transform-box:view-box!important;transform-origin:center;}
.fx-aurora {filter:blur(18px);animation:fx-aurora calc(var(--fx-time,12s)*1.2) ease-in-out infinite alternate;transform-box:view-box!important;}
.fx-meteor {animation:fx-meteor calc(var(--fx-time,12s)*.65) linear infinite;}
.fx-code {animation:fx-code calc(var(--fx-time,12s)*1.1) linear infinite;}
.bio-name[data-fx=chromatic] .fx-name-text,.entry-label[data-fx=chromatic] {animation:fx-chromatic calc(var(--fx-time,12s)*.55) ease-in-out infinite;}
.entry-label[data-fx=shine] {background:linear-gradient(110deg,var(--bio-text) 25%,var(--fx-color) 45%,var(--bio-text) 65%);background-size:250% 100%;background-clip:text;-webkit-background-clip:text;color:transparent;animation:fx-shine var(--fx-time,12s) linear infinite;}
.entry-label[data-fx=neon] {text-shadow:0 0 18px var(--fx-color);animation:fx-neon calc(var(--fx-time,12s)*.4) ease-in-out infinite alternate;}
.entry-label[data-fx=glitch] {animation:fx-glitch calc(var(--fx-time,12s)*.65) linear infinite;}
.animate-enter[data-enter=blur] {animation:vyreFocus var(--enter-speed) both;}
.animate-enter[data-enter=wipe] {animation:vyreWipe var(--enter-speed) both;}
@keyframes vyreFocus {from{filter:blur(16px);opacity:0;transform:translateY(10px)}to{filter:blur(0);opacity:1;transform:none}}
@keyframes vyreWipe {from{clip-path:inset(0 0 100%);opacity:0}to{clip-path:inset(0);opacity:1}}
@keyframes fx-expand {from{transform:scale(.1);opacity:0}25%{opacity:.5}to{transform:scale(4.5);opacity:0}}
@keyframes fx-pulse-ring {from{transform:scale(.5);opacity:.9}to{transform:scale(1.25);opacity:0}}
@keyframes fx-aurora {from{transform:translate(-50px,-70px) skewY(-8deg)}to{transform:translate(40px,80px) skewY(8deg)}}
@keyframes fx-meteor {0%,35%{transform:translate(160px,-160px);opacity:0}40%{opacity:.8}70%,100%{transform:translate(-220px,220px);opacity:0}}
@keyframes fx-code {from{transform:translateY(-250px)}to{transform:translateY(1250px)}}
@keyframes fx-chromatic {0%,100%{text-shadow:-1px 0 var(--fx-color),1px 0 var(--bio-text)}50%{text-shadow:2px 0 var(--fx-color),-2px 0 var(--bio-text)}}
#dashboard .fx-preset {border-radius:4px;background:#18181a;grid-template-columns:36px 1fr;padding:14px;}
#dashboard .fx-preset>.fx-svg {width:36px;height:36px;}
#dashboard .fx-preset strong {font-size:12px;}
#dashboard .fx-preset small {font-size:10px;}
#dashboard .entry-intro {display:none;}
.entry-label[data-fx=shine] .rich-line,.entry-label[data-fx=shine] .rich-line * {color:inherit!important;}
