/* Saitora Living Core v5 «Плазмена сфера» — hero = WebGL canvas (living-core-orb.js), compact = static SVG orb.
   No SVG filters, no SMIL, no sparkles. Everything stops under prefers-reduced-motion / hidden tab ([data-saitora-motion="off"]). */
.saitora-core { display: inline-block; position: relative; line-height: 0; pointer-events: none; user-select: none; --lc-tx: 0px; --lc-ty: 0px; }
.saitora-core > svg, .saitora-core > img, .saitora-core > canvas { width: 100%; height: 100%; display: block; }
.saitora-core > svg { overflow: visible; stroke: none; fill: none; stroke-width: 0; }
.saitora-core > canvas.lc-orb { position: absolute; inset: 0; -webkit-mask-image: radial-gradient(circle at 50% 50%, #000 58%, transparent 71%); mask-image: radial-gradient(circle at 50% 50%, #000 58%, transparent 71%); }
.saitora-core.has-orb > img, .saitora-core.has-orb > svg { visibility: hidden; }
.saitora-core[data-variant="hero"] { width: clamp(260px, 40vw, 600px); aspect-ratio: 1; }
.saitora-core[data-variant="hero"] > img { object-fit: contain; }
.saitora-core[data-variant="compact"] { width: 36px; aspect-ratio: 1; }
.saitora-core[data-variant="static"] { width: 56px; aspect-ratio: 1; opacity: .9; }
.saitora-core[data-variant="hero"] > * { transform: translate(var(--lc-tx), var(--lc-ty)); transition: transform 700ms cubic-bezier(.2,.7,.2,1); }
/* compact orb life: breathing body, slowly turning filaments, flickering corona */
.saitora-core .lc-breathe, .saitora-core .lc-filaments, .saitora-core .lc-corona { transform-box: view-box; transform-origin: 200px 200px; }
.saitora-core[data-active="true"] .lc-breathe { animation: lc-breathe 8s ease-in-out infinite; }
.saitora-core[data-active="true"] .lc-filaments { animation: lc-spin 46s linear infinite; }
.saitora-core[data-active="true"] .lc-corona { animation: lc-spin-rev 70s linear infinite, lc-flicker 5s ease-in-out infinite; }
.saitora-core[data-active="true"] .lc-core { animation: lc-pulse 3.2s ease-in-out infinite; transform-box: fill-box; transform-origin: center; }
.saitora-core.is-wave .lc-breathe { animation: lc-burst 700ms cubic-bezier(.2,.7,.2,1) 1; }
.saitora-core[data-variant="hero"].is-arriving > * { animation: lc-arrive 1s cubic-bezier(.2,.7,.2,1) both; }
@keyframes lc-breathe { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.03); } }
@keyframes lc-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
@keyframes lc-spin-rev { from { transform: rotate(0deg); } to { transform: rotate(-360deg); } }
@keyframes lc-flicker { 0%, 100% { opacity: .75; } 40% { opacity: 1; } 65% { opacity: .6; } }
@keyframes lc-pulse { 0%, 100% { transform: scale(1); opacity: .95; } 50% { transform: scale(1.25); opacity: 1; } }
@keyframes lc-burst { 0% { transform: scale(1); } 40% { transform: scale(1.12); } 100% { transform: scale(1); } }
@keyframes lc-arrive { from { opacity: 0; transform: scale(.8); } to { opacity: 1; transform: scale(1); } }
[data-saitora-motion="off"] .saitora-core *, .saitora-core[data-variant="static"] * { animation: none !important; }
[data-saitora-motion="off"] .saitora-core > * { transform: none !important; transition: none; }
@media (prefers-reduced-motion: reduce) { .saitora-core * { animation: none !important; } .saitora-core > * { transform: none !important; transition: none; } }
/* magical mist layer (home): fixed, behind the sticky header and dialogs, never catches the pointer */
.saitora-mist { position: fixed; inset: 0; width: 100%; height: 100%; z-index: 0; pointer-events: none; mix-blend-mode: screen; opacity: 1; }
[data-saitora-motion="off"] .saitora-mist { display: none; }
@media (prefers-reduced-motion: reduce) { .saitora-mist { display: none; } }
