/* ===== SLOT ANALYTICS / CASINOHARBOR STYLE ===== */
.ch-analytics * { box-sizing: border-box; }
.ch-analytics {
--bg: #071124;
--bg2: #0b1830;
--bg3: #0f1f3d;
--card: #0c1730;
--card2: #0e1c38;
--border: rgba(255,255,255,0.07);
--border-strong: rgba(70,140,255,0.18);
--text: #f4f7ff;
--muted: #8ea2c8;
--blue: #35a8ff;
--blue-2: #67c1ff;
--cyan: #31d7ff;
--teal: #19d7b5;
--green: #22c55e;
--amber: #fbbf24;
--red: #fb7185;
--purple: #8b5cf6;
--radius: 22px;
--shadow: 0 10px 30px rgba(0,0,0,0.28);
width: 100%;
color: var(--text);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
margin: 18px 0;
}.ch-analytics .ca-panel,
.ch-analytics .ca-card,
.ch-analytics .ca-verdict,
.ch-analytics .ca-pros,
.ch-analytics .ca-cons {
background:
linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.00)),
linear-gradient(135deg, #0a1630 0%, #091328 100%);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: var(--shadow);
}.ch-analytics .ca-panel {
padding: 26px;
margin-bottom: 16px;
position: relative;
overflow: hidden;
}.ch-analytics .ca-panel::before {
content: "";
position: absolute;
inset: auto -80px -80px auto;
width: 220px;
height: 220px;
background: radial-gradient(circle, rgba(53,168,255,0.10) 0%, transparent 70%);
pointer-events: none;
}.ch-analytics .ca-grid-4,
.ch-analytics .ca-grid-2,
.ch-analytics .ca-grid-3,
.ch-analytics .ca-pros-cons {
display: grid;
gap: 14px;
margin-bottom: 16px;
}.ch-analytics .ca-grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.ch-analytics .ca-grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.ch-analytics .ca-grid-2,
.ch-analytics .ca-pros-cons { grid-template-columns: repeat(2, minmax(0, 1fr)); }@media (max-width: 980px) {
.ch-analytics .ca-grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.ch-analytics .ca-grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 680px) {
.ch-analytics .ca-grid-2,
.ch-analytics .ca-pros-cons,
.ch-analytics .ca-grid-3,
.ch-analytics .ca-grid-4 {
grid-template-columns: 1fr;
}
.ch-analytics .ca-panel { padding: 18px; }
}/* header */
.ch-analytics .ca-head {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 18px;
flex-wrap: wrap;
margin-bottom: 16px;
}
.ch-analytics .ca-eyebrow {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 11px;
line-height: 1;
font-weight: 700;
letter-spacing: .16em;
text-transform: uppercase;
color: var(--blue-2);
margin-bottom: 10px;
}
.ch-analytics .ca-eyebrow::before {
content: "";
width: 18px;
height: 2px;
border-radius: 999px;
background: linear-gradient(90deg, var(--blue), var(--cyan));
}
.ch-analytics .ca-title {
font-size: clamp(26px, 4vw, 38px);
line-height: 1.08;
font-weight: 800;
letter-spacing: -0.03em;
margin: 0;
max-width: 700px;
}
.ch-analytics .ca-title span {
color: var(--blue-2);
}
.ch-analytics .ca-summary {
font-size: 14px;
color: var(--muted);
margin-top: 10px;
max-width: 720px;
line-height: 1.65;
}
.ch-analytics .ca-score {
min-width: 120px;
padding: 16px 18px;
border-radius: 18px;
background: linear-gradient(180deg, rgba(53,168,255,0.12), rgba(49,215,255,0.04));
border: 1px solid rgba(53,168,255,0.20);
text-align: center;
}
.ch-analytics .ca-score-num {
font-size: 42px;
font-weight: 800;
letter-spacing: -0.03em;
color: #fff;
line-height: 1;
}
.ch-analytics .ca-score-den {
font-size: 13px;
color: var(--muted);
margin-top: 4px;
}
.ch-analytics .ca-score-label {
font-size: 10px;
text-transform: uppercase;
letter-spacing: .14em;
color: var(--blue-2);
margin-top: 8px;
font-weight: 700;
}
.ch-analytics .ca-tags {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.ch-analytics .ca-tag {
display: inline-flex;
align-items: center;
padding: 7px 11px;
border-radius: 999px;
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.06);
font-size: 12px;
font-weight: 700;
color: #cfe4ff;
line-height: 1;
}
.ch-analytics .ca-tag.blue {
color: #9fd8ff;
border-color: rgba(53,168,255,0.22);
background: rgba(53,168,255,0.08);
}
.ch-analytics .ca-tag.teal {
color: #88f4dc;
border-color: rgba(25,215,181,0.20);
background: rgba(25,215,181,0.08);
}
.ch-analytics .ca-tag.amber {
color: #ffd977;
border-color: rgba(251,191,36,0.20);
background: rgba(251,191,36,0.08);
}/* generic cards */
.ch-analytics .ca-card,
.ch-analytics .ca-pros,
.ch-analytics .ca-cons,
.ch-analytics .ca-verdict {
padding: 20px;
position: relative;
overflow: hidden;
}
.ch-analytics .ca-kpi-label,
.ch-analytics .ca-section-title {
font-size: 11px;
text-transform: uppercase;
letter-spacing: .14em;
font-weight: 700;
color: var(--blue-2);
}
.ch-analytics .ca-kpi-label { margin-bottom: 10px; }
.ch-analytics .ca-kpi-value {
font-size: clamp(28px, 3vw, 36px);
line-height: 1;
font-weight: 800;
letter-spacing: -0.03em;
color: #fff;
}
.ch-analytics .ca-kpi-value.accent { color: var(--cyan); }
.ch-analytics .ca-kpi-sub {
margin-top: 8px;
font-size: 13px;
line-height: 1.5;
color: var(--muted);
}/* section headings */
.ch-analytics .ca-section-head {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 16px;
}
.ch-analytics .ca-section-title {
white-space: nowrap;
}
.ch-analytics .ca-section-head::after {
content: "";
height: 1px;
flex: 1;
background: linear-gradient(90deg, rgba(53,168,255,0.22), rgba(255,255,255,0.02));
}/* progress rows */
.ch-analytics .ca-bar-row { margin-bottom: 14px; }
.ch-analytics .ca-bar-row:last-child { margin-bottom: 0; }
.ch-analytics .ca-bar-meta {
display: flex;
justify-content: space-between;
gap: 10px;
margin-bottom: 7px;
font-size: 13px;
}
.ch-analytics .ca-bar-meta span:first-child { color: #dfeaff; }
.ch-analytics .ca-bar-meta span:last-child { color: #fff; font-weight: 700; }
.ch-analytics .ca-track,
.ch-analytics .ca-tier-track,
.ch-analytics .ca-paybar,
.ch-analytics .ca-mini-track {
width: 100%;
overflow: hidden;
border-radius: 999px;
background: rgba(255,255,255,0.06);
}
.ch-analytics .ca-track,
.ch-analytics .ca-tier-track { height: 8px; }
.ch-analytics .ca-paybar,
.ch-analytics .ca-mini-track { height: 4px; }.ch-analytics .ca-fill,
.ch-analytics .ca-tier-fill,
.ch-analytics .ca-payfill,
.ch-analytics .ca-mini-fill {
width: 0;
height: 100%;
border-radius: inherit;
transition: width 1.2s cubic-bezier(.16,1,.3,1);
}
.ch-analytics .ca-fill.blue { background: linear-gradient(90deg, #2563eb, var(--blue)); }
.ch-analytics .ca-fill.teal { background: linear-gradient(90deg, #0f766e, var(--teal)); }
.ch-analytics .ca-fill.red { background: linear-gradient(90deg, #be123c, var(--red)); }/* donut */
.ch-analytics .ca-donut-wrap {
display: flex;
align-items: center;
gap: 24px;
flex-wrap: wrap;
}
.ch-analytics .ca-donut {
position: relative;
width: 150px;
height: 150px;
flex-shrink: 0;
}
.ch-analytics .ca-donut svg {
width: 150px;
height: 150px;
transform: rotate(-90deg);
}
.ch-analytics .ca-donut-center {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
}
.ch-analytics .ca-donut-num {
font-size: 24px;
font-weight: 800;
letter-spacing: -0.03em;
}
.ch-analytics .ca-donut-sub {
font-size: 11px;
color: var(--muted);
text-transform: uppercase;
letter-spacing: .12em;
}
.ch-analytics .ca-legend { flex: 1; min-width: 220px; }
.ch-analytics .ca-legend-item {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 10px;
}
.ch-analytics .ca-dot {
width: 10px;
height: 10px;
border-radius: 50%;
flex-shrink: 0;
}
.ch-analytics .ca-legend-name {
flex: 1;
font-size: 14px;
color: #dce8ff;
}
.ch-analytics .ca-legend-val {
font-size: 14px;
font-weight: 800;
}/* polar */
.ch-analytics .ca-polar-wrap {
display: flex;
align-items: center;
gap: 22px;
flex-wrap: wrap;
}
.ch-analytics .ca-polar-box {
width: 190px;
height: 190px;
flex-shrink: 0;
}
.ch-analytics canvas.ca-polar {
width: 190px;
height: 190px;
display: block;
}
.ch-analytics .ca-metric-list {
flex: 1;
min-width: 220px;
}
.ch-analytics .ca-metric-row {
display: grid;
grid-template-columns: 10px 1fr 86px 32px;
gap: 10px;
align-items: center;
margin-bottom: 11px;
}
.ch-analytics .ca-metric-dot {
width: 10px;
height: 10px;
border-radius: 50%;
}
.ch-analytics .ca-metric-name {
font-size: 13px;
color: #dbe6fb;
}
.ch-analytics .ca-metric-score {
font-size: 13px;
font-weight: 800;
text-align: right;
}/* jackpot tiers */
.ch-analytics .ca-tier {
display: grid;
grid-template-columns: 88px 1fr 110px;
gap: 14px;
align-items: center;
padding: 12px 0;
border-bottom: 1px solid rgba(255,255,255,0.05);
}
.ch-analytics .ca-tier:last-child { border-bottom: none; }
@media (max-width: 560px) {
.ch-analytics .ca-tier {
grid-template-columns: 1fr;
gap: 8px;
}
}
.ch-analytics .ca-pill {
display: inline-flex;
justify-content: center;
align-items: center;
padding: 7px 10px;
border-radius: 999px;
font-size: 11px;
font-weight: 800;
text-transform: uppercase;
letter-spacing: .08em;
}
.ch-analytics .ca-pill.gold {
color: #ffe7a3;
background: rgba(251,191,36,0.10);
border: 1px solid rgba(251,191,36,0.22);
}
.ch-analytics .ca-pill.teal {
color: #95f7e4;
background: rgba(25,215,181,0.10);
border: 1px solid rgba(25,215,181,0.22);
}
.ch-analytics .ca-pill.blue {
color: #a6ddff;
background: rgba(53,168,255,0.10);
border: 1px solid rgba(53,168,255,0.22);
}
.ch-analytics .ca-pill.gray {
color: #c1cbda;
background: rgba(148,163,184,0.10);
border: 1px solid rgba(148,163,184,0.18);
}
.ch-analytics .ca-tier-name {
font-size: 14px;
font-weight: 700;
color: #fff;
margin-bottom: 6px;
}
.ch-analytics .ca-tier-seed {
font-size: 12px;
color: var(--muted);
text-align: right;
}
.ch-analytics .ca-tier-seed strong {
display: block;
color: #fff;
font-size: 14px;
margin-bottom: 2px;
}/* journey */
.ch-analytics .ca-journey {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
}
@media (max-width: 720px) {
.ch-analytics .ca-journey { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 480px) {
.ch-analytics .ca-journey { grid-template-columns: 1fr; }
}
.ch-analytics .ca-step {
padding: 16px;
border-radius: 18px;
background: linear-gradient(180deg, rgba(255,255,255,0.025), rgba(255,255,255,0.01));
border: 1px solid rgba(255,255,255,0.06);
}
.ch-analytics .ca-step.active {
border-color: rgba(53,168,255,0.25);
background: linear-gradient(180deg, rgba(53,168,255,0.12), rgba(53,168,255,0.03));
}
.ch-analytics .ca-step-top {
font-size: 11px;
color: var(--muted);
text-transform: uppercase;
letter-spacing: .12em;
margin-bottom: 10px;
font-weight: 700;
}
.ch-analytics .ca-step-mult {
font-size: 34px;
font-weight: 800;
line-height: 1;
letter-spacing: -0.03em;
margin-bottom: 8px;
}
.ch-analytics .ca-step:nth-child(1) .ca-step-mult { color: #b8c6db; }
.ch-analytics .ca-step:nth-child(2) .ca-step-mult { color: var(--blue-2); }
.ch-analytics .ca-step:nth-child(3) .ca-step-mult { color: var(--teal); }
.ch-analytics .ca-step:nth-child(4) .ca-step-mult { color: var(--cyan); }
.ch-analytics .ca-step-desc {
font-size: 13px;
color: var(--muted);
line-height: 1.5;
}/* tables */
.ch-analytics .ca-scroll { overflow-x: auto; }
.ch-analytics table {
width: 100%;
border-collapse: collapse;
min-width: 640px;
}
.ch-analytics th {
text-align: left;
padding: 10px 8px;
font-size: 11px;
text-transform: uppercase;
letter-spacing: .12em;
color: var(--blue-2);
border-bottom: 1px solid rgba(255,255,255,0.08);
}
.ch-analytics td {
padding: 12px 8px;
font-size: 14px;
color: #dce6f7;
border-bottom: 1px solid rgba(255,255,255,0.04);
}
.ch-analytics tr:last-child td { border-bottom: none; }
.ch-analytics .ca-td-val {
text-align: right;
font-weight: 800;
color: #fff;
}
.ch-analytics .ca-pay-cell { width: 88px; }/* pros cons */
.ch-analytics .ca-pros { border-color: rgba(34,197,94,0.20); }
.ch-analytics .ca-cons { border-color: rgba(251,113,133,0.18); }
.ch-analytics .ca-pc-head {
display: flex;
align-items: center;
gap: 8px;
font-size: 11px;
font-weight: 800;
text-transform: uppercase;
letter-spacing: .14em;
margin-bottom: 12px;
}
.ch-analytics .ca-pros .ca-pc-head { color: #86efac; }
.ch-analytics .ca-cons .ca-pc-head { color: #fda4af; }
.ch-analytics .ca-pc-dot {
width: 8px;
height: 8px;
border-radius: 50%;
}
.ch-analytics .ca-pros .ca-pc-dot { background: #22c55e; }
.ch-analytics .ca-cons .ca-pc-dot { background: #fb7185; }
.ch-analytics .ca-pc-item {
display: flex;
gap: 10px;
align-items: flex-start;
margin-bottom: 10px;
color: var(--muted);
line-height: 1.55;
font-size: 14px;
}
.ch-analytics .ca-pc-item::before {
content: "";
width: 5px;
height: 5px;
border-radius: 50%;
margin-top: 8px;
flex-shrink: 0;
}
.ch-analytics .ca-pros .ca-pc-item::before { background: rgba(34,197,94,0.75); }
.ch-analytics .ca-cons .ca-pc-item::before { background: rgba(251,113,133,0.75); }/* verdict */
.ch-analytics .ca-verdict {
padding: 24px;
background:
radial-gradient(circle at top right, rgba(53,168,255,0.16), transparent 32%),
linear-gradient(135deg, #0a1631 0%, #091327 100%);
border-color: rgba(53,168,255,0.16);
}
.ch-analytics .ca-verdict-top {
display: flex;
align-items: center;
gap: 16px;
flex-wrap: wrap;
margin-bottom: 14px;
}
.ch-analytics .ca-verdict-big {
font-size: 58px;
font-weight: 800;
line-height: 1;
letter-spacing: -0.04em;
color: #fff;
}
.ch-analytics .ca-verdict-stars {
font-size: 20px;
letter-spacing: 2px;
}
.ch-analytics .ca-verdict-desc {
font-size: 14px;
color: var(--muted);
margin-top: 4px;
}
.ch-analytics .ca-verdict-text {
font-size: 15px;
color: #c7d6f0;
line-height: 1.8;
border-top: 1px solid rgba(255,255,255,0.06);
padding-top: 14px;
margin-top: 10px;
}
.ch-analytics .ca-tag-row {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 14px;
}/* animations */
@keyframes caFadeUp {
from { opacity: 0; transform: translateY(16px); }
to { opacity: 1; transform: translateY(0); }
}
.ch-analytics .ca-card,
.ch-analytics .ca-panel,
.ch-analytics .ca-pros,
.ch-analytics .ca-cons,
.ch-analytics .ca-verdict {
animation: caFadeUp .45s ease both;
}
Advanced Slot Analytics
Age of the Gods: God of Storms Data Breakdown
This Playtech slot blends a relatively strong RTP with a progressive jackpot network and a simple respin multiplier mechanic, making it more session-friendly than many jackpot-led games.
Playtech · 2017
RTP 96.14%
Low–Medium Volatility
25 Paylines
Progressive Jackpot
Theoretical RTP
0%
Above many jackpot slot averages
Hit Frequency
0%
Roughly 1 in 2 spins pays
Max Base Win
2,500×
With the 5× multiplier active
Jackpot Seed
£100k
Ultimate Power starting floor
Jackpot contribution
0.99%
Without the jackpot layer, players are effectively on a 95.15% base return, which still holds up well for a networked progressive title.
Progressive Jackpot Tiers
Ultimate
£100,000 seed£500k–£850k+
Super
£5,000 seedTens of £k
The jackpot is mystery-triggered on a paid spin, and all four tiers remain accessible from the minimum £0.25 stake.
Wild Wind Respins — Multiplier Journey
Trigger
1×
Base spin before the Ship Wild starts moving.
Respin 1
2×
Ship moves left and raises the multiplier.
Respin 2
3×
Second movement extends the payout ceiling again.
Respin 3
5×
Maximum travel distance and peak multiplier outcome.
The best setup is a Ship Wild landing on reel 4, because it has the longest path to travel before leaving the grid, giving the multiplier time to reach 5×.
Symbol Paytable — 5 of a Kind
With the full 5× Wild Wind multiplier active, the Spartan Warrior reaches the non-jackpot ceiling of 2,500× total stake.
Strengths
96.14% RTP is unusually strong for a progressive jackpot slot.
45.41% hit rate supports longer, steadier bankroll sessions.
The top jackpot is available even from low entry stakes.
Wild movement creates regular feature interaction without needing free spins.
Once the jackpot screen triggers, a payout is guaranteed.
Weaknesses
2,500× base cap is modest compared with newer high-volatility releases.
There is no Bonus Buy feature.
The single main mechanic can feel repetitive across very long sessions.
There is no classic scatter-led free spins round.
7.8
⭐⭐⭐⭐
Recommended for jackpot-focused session play
God of Storms still works well as an entry point into the Age of the Gods jackpot network. Its RTP remains competitive for a progressive title, and the Wild Wind feature adds enough movement and anticipation to keep the gameplay from feeling flat. Players chasing huge headline wins may prefer newer, more volatile slots, but this one still stands out for balance and accessibility.
Best for: Session play
Best for: Jackpot hunting
Style: Lower stress progressive
(function () {
function animateCounter(el) {
var target = parseFloat(el.dataset.target || "0");
var decimals = parseInt(el.dataset.decimals || "0", 10);
var suffix = el.dataset.suffix || "";
var duration = 1200;
var start = null;function frame(ts) {
if (!start) start = ts;
var progress = Math.min((ts - start) / duration, 1);
var eased = 1 - Math.pow(1 - progress, 3);
var value = target * eased;
el.textContent = value.toFixed(decimals) + suffix;
if (progress < 1) requestAnimationFrame(frame);
}
requestAnimationFrame(frame);
}function animateWidths() {
document.querySelectorAll('.ch-analytics [data-w]').forEach(function (el) {
el.style.width = el.dataset.w + '%';
});
}function animateDonut() {
var base = document.getElementById('ca-donut-base');
var jack = document.getElementById('ca-donut-jack');
var house = document.getElementById('ca-donut-house');
if (!base || !jack || !house) return;var r = 15.9155;
var circumference = 2 * Math.PI * r;var baseP = 95.15;
var jackP = 0.99;
var houseP = 3.86;var baseLen = (baseP / 100) * circumference;
var jackLen = (jackP / 100) * circumference;
var houseLen = (houseP / 100) * circumference;base.style.strokeDasharray = baseLen + ' ' + circumference;
base.style.strokeDashoffset = '0';jack.style.strokeDasharray = jackLen + ' ' + circumference;
jack.style.strokeDashoffset = -baseLen;house.style.strokeDasharray = houseLen + ' ' + circumference;
house.style.strokeDashoffset = -(baseLen + jackLen);
}function drawPolar() {
var canvas = document.getElementById('caPolar');
if (!canvas) return;var dpr = window.devicePixelRatio || 1;
var size = 190;
canvas.width = size * dpr;
canvas.height = size * dpr;
var ctx = canvas.getContext('2d');
ctx.scale(dpr, dpr);var cx = size / 2;
var cy = size / 2;
var maxR = 78;var metrics = [
{ label: 'Jackpot Value', score: 9.5, color: 'rgba(49,215,255,0.82)' },
{ label: 'Base Game Depth', score: 5.0, color: 'rgba(251,113,133,0.78)' },
{ label: 'Feature Engagement', score: 6.5, color: 'rgba(25,215,181,0.78)' },
{ label: 'Visual Design', score: 8.5, color: 'rgba(53,168,255,0.78)' },
{ label: 'Variance Appeal', score: 8.0, color: 'rgba(139,92,246,0.78)' }
];var n = metrics.length;
var step = (Math.PI * 2) / n;
var start = -Math.PI / 2;ctx.clearRect(0, 0, size, size);[2, 4, 6, 8, 10].forEach(function (v) {
var rr = (v / 10) * maxR;
ctx.beginPath();
ctx.arc(cx, cy, rr, 0, Math.PI * 2);
ctx.strokeStyle = 'rgba(255,255,255,0.07)';
ctx.lineWidth = 1;
ctx.stroke();
});metrics.forEach(function (_, i) {
var a = start + i * step;
ctx.beginPath();
ctx.moveTo(cx, cy);
ctx.lineTo(cx + Math.cos(a) * maxR, cy + Math.sin(a) * maxR);
ctx.strokeStyle = 'rgba(255,255,255,0.07)';
ctx.lineWidth = 1;
ctx.stroke();
});metrics.forEach(function (m, i) {
var a0 = start + i * step;
var a1 = a0 + step;
var rr = (m.score / 10) * maxR;
ctx.beginPath();
ctx.moveTo(cx, cy);
ctx.arc(cx, cy, rr, a0, a1);
ctx.closePath();
ctx.fillStyle = m.color;
ctx.fill();
ctx.strokeStyle = 'rgba(7,17,36,0.7)';
ctx.lineWidth = 1.5;
ctx.stroke();
});var list = document.getElementById('caMetricList');
if (list) {
list.innerHTML = '';
metrics.forEach(function (m) {
var row = document.createElement('div');
row.className = 'ca-metric-row';
row.innerHTML =
'
' +
'
' + m.label + '
' +
'
' +
'
' + m.score + '
';
list.appendChild(row);
});
}setTimeout(function () {
document.querySelectorAll('.ch-analytics .ca-mini-fill').forEach(function (el) {
el.style.width = el.dataset.w + '%';
});
}, 300);
}var root = document.querySelector('.ch-analytics');
if (!root) return;drawPolar();var fired = false;
var io = new IntersectionObserver(function (entries) {
entries.forEach(function (entry) {
if (entry.isIntersecting && !fired) {
fired = true;
root.querySelectorAll('.ca-counter').forEach(animateCounter);
animateDonut();
setTimeout(animateWidths, 150);
io.disconnect();
}
});
}, { threshold: 0.15 });io.observe(root);
})();