/**
 * Opitek Interactive Layer — Cursor System (style)
 *
 * Kolor ringu/plusa NIE jest tu zaszyty w regułach CSS per klasa — Cursor
 * Renderer ustawia --oil-cursor-color bezpośrednio na elementach, na
 * podstawie Environment.colorFor('cursor', ...). Kolor ikony jest osobny
 * (--oil-cursor-icon-color, polish pass pkt 5) — branding, NIE
 * Environment-driven.
 *
 * v0.8.9 — hierarchia źródła koloru ikony (patrz oil-color-tokens-divi-
 * adapter.css po pełne uzasadnienie): (1) `cfg.icons.color`, jeśli jawnie
 * ustawiony w configu — Renderer wtedy ustawia --oil-cursor-icon-color
 * WPROST (inline style, wygrywa z regułą poniżej niezależnie od
 * specyficzności); (2) w przeciwnym razie ZOSTAJE wartość zdefiniowana
 * TU w CSS — token `--oil-primary-color`, który sam w sobie już
 * (w adapterze) łańcuchuje się do Divi `--gcid-primary-color`, a gdy i
 * tego brak — do bezpiecznego fallbacku OIL. Runtime JS nie musi nic
 * wiedzieć o Divi ani o tym łańcuchu — czysto deklaratywny CSS var().
 *
 * Rozmiary/grubości/opacity też przychodzą z configu (JS ustawia je jako
 * custom properties przy starcie) — CSS tu jest wyłącznie strukturalny/
 * layoutowy, wartości poniżej to tylko fallbacki zanim JS się wykona.
 *
 * WAŻNE: kształt "kropli" to od correction pass #3 prawdziwy SVG <path>
 * (nie CSS border-radius — ten miał twardy sufit geometryczny, patrz
 * cursor-renderer.js) i mask-image ringu (przerwa pod ikonę) — oba
 * liczone i ustawiane co klatkę przez Renderer. Nie dokładamy tu
 * żadnego CSS transition na te właściwości, bo gryzłoby się z JS (ten
 * sam problem co przy oddychaniu — patrz cursor-motion.js).
 */
:root {
	--oil-cursor-color: #ffffff;
	/* v0.8.9 — było var(--oil-cursor-color) (podążało za Environment, jak
	   ring); teraz token brandingowy (patrz oil-color-tokens-divi-
	   adapter.css) z własnym, redundantnym fallbackiem #ff5a36 (na wypadek
	   gdyby adapter nie był załadowany w ogóle) — icon NIE ma już żadnego
	   związku z kolorem sekcji/ringu. */
	--oil-cursor-icon-color: var(--oil-primary-color, #ff5a36);
	--oil-cursor-size: 30px;
	--oil-cursor-plus-size: 10px;
	--oil-cursor-ring-border: 1px;
	--oil-cursor-plus-thickness: 1px;
	--oil-cursor-icon-size: 14px;
	--oil-cursor-icon-fade: 180ms;
	--oil-cursor-z: 999999;
	/* polish pass, pkt 3/4/9 — fallbacki; realne wartości z cfg.ring.opacity/
	   cfg.idle.opacityReduction/cfg.disabled.opacity, patrz cursor-renderer.js. */
	--oil-cursor-ring-opacity: 0.5;
	--oil-cursor-idle-mult: 0.75;
	--oil-cursor-disabled-opacity: 0.25;
}

/* Chowamy natywny kursor tam, gdzie nasz jest aktywny — poza polami
   tekstowymi, gdzie natywny caret jest ważniejszy niż nasz efekt. Ta
   blankietowa reguła na body pokrywa zwykłe tło/tekst, ale NIE dociera do
   linków/przycisków — `cursor` się dziedziczy, a UA-arkusz przeglądarki
   ma WŁASNĄ regułę `cursor:pointer` bezpośrednio na <a>/podobnych, która
   wygrywa z odziedziczoną wartością niezależnie od specyficzności. Dlatego
   polish pass, pkt 1 dodaje OSOBNE, wstrzyknięte w JS nadpisanie celowane
   dokładnie w te elementy — patrz injectNativeCursorOverride() w
   cursor-renderer.js (#oil-cursor-native-override). Tu zostaje tylko ta
   blankietowa reguła + wyjątki dla pól tekstowych. */
body.use-custom-cursor {
	cursor: none;
}
body.use-custom-cursor input,
body.use-custom-cursor textarea,
body.use-custom-cursor select,
body.use-custom-cursor [contenteditable='true'] {
	cursor: text;
}

.oil-cursor-plus,
.oil-cursor-ring,
.oil-cursor-icon {
	position: fixed;
	top: 0;
	left: 0;
	pointer-events: none;
	z-index: var(--oil-cursor-z);
	will-change: transform;
}

/* --- Plus: cienki krzyżyk, podąża 1:1 za myszką. Zostaje "pełniejszy
   wizualnie" niż ring (client, polish pass pkt 3) — bazowa opacity 1, nie
   cfg.ring.opacity (ten dotyczy WYŁĄCZNIE ringu). --- */
.oil-cursor-plus {
	width: 0;
	height: 0;
	opacity: 1;
	transition: opacity 0.2s ease;
}
.oil-cursor-plus::before,
.oil-cursor-plus::after {
	content: '';
	position: absolute;
	top: 0;
	left: 0;
	background: var(--oil-cursor-color);
	transform: translate(-50%, -50%);
}
.oil-cursor-plus::before {
	width: var(--oil-cursor-plus-size);
	height: var(--oil-cursor-plus-thickness);
}
.oil-cursor-plus::after {
	width: var(--oil-cursor-plus-thickness);
	height: var(--oil-cursor-plus-size);
}
/* polish pass, pkt 4 — dodatkowe wygaszenie w idle, mnożnik (nie różnica)
   na bazowej opacity (1 dla plusa) — patrz komentarz przy :root. Musi
   stać PRZED is-hidden/over-text w pliku, żeby przy równej specyficzności
   te dwa (ważniejsze, !important) zawsze wygrywały. */
.oil-cursor-plus.is-idle {
	opacity: var(--oil-cursor-idle-mult);
}
.oil-cursor-plus.is-hidden,
.oil-cursor-plus.over-text {
	opacity: 0;
}
/* polish pass, pkt 9 — disabled wygrywa ze WSZYSTKIM oprócz is-hidden
   (patrz kolejność niżej dla ringu, ten sam wzorzec). */
.oil-cursor-plus.is-disabled {
	opacity: var(--oil-cursor-disabled-opacity) !important;
}

/* --- Ring: "kropla żelu" — prawdziwy kształt SVG (<path>, d liczone w
   JS co klatkę), tu tylko rozmiar/grubość obrysu/kolor/przezroczystość.
   overflow:visible, żeby hover-scale (>1) nie ucinał się na krawędzi
   viewBox — Renderer dobiera viewBox pod rozmiar spoczynkowy, nie
   przelicza go co klatkę.
   polish pass, pkt 3 — bazowa opacity ringu to teraz cfg.ring.opacity
   (domyślnie 0.5), nie sztywne 1 — ring ma być LŻEJSZY niż plus. --- */
.oil-cursor-ring {
	overflow: visible;
	opacity: 0;
	transition: opacity 0.25s ease;
}
.oil-cursor-ring path {
	fill: none;
	stroke: var(--oil-cursor-color);
	stroke-width: var(--oil-cursor-ring-border);
	transition: stroke 0.25s ease;
}
.oil-cursor-ring.is-active {
	opacity: var(--oil-cursor-ring-opacity);
}
.oil-cursor-ring.is-interactive {
	opacity: var(--oil-cursor-ring-opacity);
}
/* polish pass, pkt 4 — musi stać PO is-active/is-interactive: gdy idle
   nakłada się z hover (użytkownik znieruchomiał nad linkiem), wygaszenie
   ma wygrać — to jest cały sens "dodatkowego wygaszenia w idle". Mnożnik
   na bazowej opacity ringu (nie na sztywnym 1), więc realnie ~0.375
   domyślnie (0.5 × 0.75). */
.oil-cursor-ring.is-idle {
	opacity: calc(var(--oil-cursor-ring-opacity) * var(--oil-cursor-idle-mult));
}
/* polish pass, pkt 9 — subtelny stan disabled: stała, niska opacity,
   niezależna od active/idle/interactive (żeby wyglądał SPÓJNIE wyłączony
   niezależnie od fazy), ale wciąż przegrywa z is-hidden/over-text (cursor
   naprawdę zniknął — to ma priorytet nad "przygaszony"). */
.oil-cursor-ring.is-disabled {
	opacity: var(--oil-cursor-disabled-opacity) !important;
}
.oil-cursor-ring.is-hidden,
.oil-cursor-ring.over-text {
	opacity: 0 !important;
}

/* --- Ikona stanu: mask-image, płynny fade, nie deformowana rozciągnięciem
   ringu (osobny, nietransformowany element). polish pass, pkt 5 — kolor to
   teraz --oil-cursor-icon-color (branding, config), NIE --oil-cursor-color
   (środowisko) — ikona nie ma już dziedziczyć koloru ringu. --- */
.oil-cursor-icon {
	width: var(--oil-cursor-icon-size);
	height: var(--oil-cursor-icon-size);
	background-color: var(--oil-cursor-icon-color);
	mask-repeat: no-repeat;
	mask-position: center;
	mask-size: contain;
	-webkit-mask-repeat: no-repeat;
	-webkit-mask-position: center;
	-webkit-mask-size: contain;
	opacity: 0;
	transition: opacity var(--oil-cursor-icon-fade) ease;
}
.oil-cursor-icon.is-visible {
	opacity: 1;
}
/* polish pass, pkt 4 — "ikonę aktywnego stanu, jeśli jest widoczna":
   warunek na OBU klasach, żeby nie podbić opacity ikony, która i tak jest
   ukryta (bazowe 0 z .oil-cursor-icon powyżej). */
.oil-cursor-icon.is-visible.is-idle {
	opacity: var(--oil-cursor-idle-mult);
}
.oil-cursor-icon.is-hidden {
	opacity: 0 !important;
}
