ris_2025 / index.html
riiswa's picture
Update website
682e4d3
<!DOCTYPE html>
<html lang="en" class="dark">
<head>
<meta charset="UTF-8">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RIS - Relative Index for Streetlifting | 2025 Edition Official Calculator</title>
<meta name="description" content="Calculate your Relative Index for Streetlifting (RIS) score. The official 2025 calculator for fair comparison between athletes of different weights.">
<meta name="keywords" content="RIS, Relative Index for Streetlifting, streetlifting, strength calculator, bodyweight ratio, strength comparison, RIS calculator">
<meta name="author" content="Waris Radji & Mathieu Ardoin">
<!-- Open Graph / Social Media -->
<meta property="og:title" content="RIS - Relative Index for Streetlifting | 2025 Edition">
<meta property="og:description" content="Calculate your Relative Index for Streetlifting (RIS) score. The official 2025 calculator for fair comparison between athletes of different weights.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://warisradji.com/ris">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.plot.ly/plotly-3.0.0.min.js" charset="utf-8"></script>
<script src="static/ris.js"></script>
<!-- Add highlight.js for code syntax highlighting -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<!-- Add Excel/Sheets language support -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/javascript.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/excel.min.js"></script>
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
colors: {
dark: {
100: '#0F0F0F',
200: '#1A1A1A',
300: '#2A2A2A',
400: '#3A3A3A',
},
accent: {
100: '#6366F1',
200: '#4F46E5',
}
},
fontFamily: {
sans: ['Inter', 'system-ui', 'sans-serif'],
},
}
}
}
</script>
<<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display&display=swap" rel="stylesheet">
<style>
body { font-family: 'Roboto Flex', sans-serif; }
h1, h2, h3 { font-family: 'DM Serif Display', serif; }
/* Custom scrollbar */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: #1A1A1A;
}
::-webkit-scrollbar-thumb {
background: #3A3A3A;
border-radius: 6px;
}
::-webkit-scrollbar-thumb:hover {
background: #4A4A4A;
}
/* Plot container styling */
.plot-container {
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}
/* Custom tooltip styling */
.js-plotly-plot .plotly .hoverlayer .hover {
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4) !important;
}
/* Code blocks styling */
.hljs {
background: #1A1A1A !important;
border-radius: 4px;
padding: 1rem !important;
font-size: 0.8rem !important;
}
.code-block-wrapper {
position: relative;
}
.copy-button {
position: absolute;
top: 8px;
right: 8px;
background: #3A3A3A;
border: none;
border-radius: 4px;
color: #e2e8f0;
padding: 2px 8px;
font-size: 12px;
cursor: pointer;
opacity: 0;
transition: opacity 0.2s;
}
.code-block-wrapper:hover .copy-button {
opacity: 1;
}
.copy-button:hover {
background: #4F46E5;
}
</style>
</head>
<body class="bg-dark-100 text-gray-200 min-h-screen leading-relaxed">
<main class="container mx-auto px-6 py-4 max-w-9xl">
<header class="mb-5 mx-2 md:mx-14">
<h2 class="text-2xl md:text-3xl font-semibold text-white text-pretty">Relative Index for Streetlifting - 2025 Edition</h2>
<p class="text-xs italic">
Created by
<a href="https://www.instagram.com/riiswa" target="_blank" class="underline hover:text-blue-500">Waris Radji</a>
&
<a href="https://www.instagram.com/mat95.sw" target="_blank" class="underline hover:text-blue-500">Mathieu Ardoin</a>.
</p>
<!-- Navigation below header -->
<nav class="mt-4 border-t border-dark-300 pt-3">
<!-- Desktop horizontal nav (shows on large screens) -->
<div class="flex space-x-6 overflow-x-auto">
<a href="index.html#visualization" class="text-gray-300 hover:text-white nav-link">Visualization</a>
<a href="index.html#integration" class="text-gray-300 hover:text-white nav-link">Integration</a>
<a href="index.html#faq" class="text-gray-300 hover:text-white nav-link">FAQ</a>
</div>
</nav>
</header>
<div class="p-5 md:mx-14">
<p class="text-gray-200 text-sm md:text-base">
The Relative Index for Streetlifting (RIS) is a scoring system that makes fair comparisons possible between athletes of different weights within the same gender. The RIS is created using real competition data from top performers worldwide and shows how strong athletes are relative to their body weight. Each year, the system is updated with new competition results to stay current with how the sport is developing. The score directly shows how an athlete's performance measures up against the very best lifters at the same body weight. This gives athletes, coaches, and fans a reliable way to compare performances, establish records, and determine rankings across weight categories in streetlifting competitions, though it should be noted that current data limitations prevent accurate cross-gender comparisons.
</p>
</div>
<!-- RIS Calculator Section -->
<div class="px-5 rounded-md max-w-2xl mx-auto">
<div class="flex flex-col space-y-4">
<!-- Total input -->
<div>
<label class="block mb-1 text-white">Total (kg)</label>
<input type="number" id="total-input" class="w-full bg-dark-100 border border-dark-300 text-white p-3 rounded-md" placeholder="0" min="0">
</div>
<!-- Bodyweight input -->
<div>
<label class="block mb-1 text-white">Body Weight (kg)</label>
<input type="number" id="bodyweight-input" class="w-full bg-dark-100 border border-dark-300 text-white p-3 rounded-md" placeholder="0" min="0">
</div>
<!-- Gender selection -->
<div>
<label class="block mb-1 text-white">Gender</label>
<div class="flex space-x-6 mt-2">
<label class="inline-flex items-center">
<input type="radio" name="gender" value="male" class="hidden peer" checked>
<span class="w-4 h-4 border rounded-full border-red-600 inline-block mr-2 peer-checked:bg-red-600"></span>
<span class="text-white">♂ Men</span>
</label>
<label class="inline-flex items-center">
<input type="radio" name="gender" value="female" class="hidden peer">
<span class="w-4 h-4 border rounded-full border-white inline-block mr-2 peer-checked:bg-white"></span>
<span class="text-white">♀ Women</span>
</label>
</div>
</div>
<!-- Calculate button -->
<button id="calculate-btn" class="bg-red-700 hover:bg-red-800 text-white py-3 rounded-md text-center font-medium transition-colors w-full">
Calculate
</button>
<!-- Result -->
<div class="flex flex-col justify-center items-center mt-4">
<div id="ris-result" class="text-7xl font-bold text-red-600">0.00</div>
<!-- See Rank button - hidden by default -->
<div id="rank-buttons" class="mt-4 hidden">
<button id="show-on-curve-btn" class="bg-accent-100 hover:bg-accent-200 text-white py-2 px-4 rounded-md text-center font-medium transition-colors">
Show on Performance Curve
</button>
<button id="clear-curve-btn" class="bg-dark-300 hover:bg-dark-400 text-white py-2 px-4 rounded-md text-center font-medium transition-colors ml-2 hidden">
Clear
</button>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Store original plot data
let menPlotOriginal = null;
let womenPlotOriginal = null;
// Flags to track when plots are ready
let menPlotReady = false;
let womenPlotReady = false;
// Reference to the buttons and elements
const calculateBtn = document.getElementById('calculate-btn');
const showOnCurveBtn = document.getElementById('show-on-curve-btn');
const clearCurveBtn = document.getElementById('clear-curve-btn');
const rankButtons = document.getElementById('rank-buttons');
const risResult = document.getElementById('ris-result');
// Function to capture the original plot data
function capturePlotData() {
try {
// Try to capture men plot data
if (!menPlotReady && document.getElementById('men-plot')) {
const menPlot = document.getElementById('men-plot');
if (menPlot.data && menPlot.data.length > 0) {
menPlotOriginal = {
data: JSON.parse(JSON.stringify(menPlot.data)),
layout: JSON.parse(JSON.stringify(menPlot.layout))
};
menPlotReady = true;
console.log('Men plot data captured');
}
}
// Try to capture women plot data
if (!womenPlotReady && document.getElementById('women-plot')) {
const womenPlot = document.getElementById('women-plot');
if (womenPlot.data && womenPlot.data.length > 0) {
womenPlotOriginal = {
data: JSON.parse(JSON.stringify(womenPlot.data)),
layout: JSON.parse(JSON.stringify(womenPlot.layout))
};
womenPlotReady = true;
console.log('Women plot data captured');
}
}
// If not all plots are ready, check again after a delay
if (!menPlotReady || !womenPlotReady) {
setTimeout(capturePlotData, 500);
}
} catch (e) {
console.error('Error capturing plot data:', e);
// Try again after a delay
setTimeout(capturePlotData, 1000);
}
}
// Start capturing plot data
setTimeout(capturePlotData, 1000);
// Calculate button shows the rank button after calculation
if (calculateBtn) {
calculateBtn.addEventListener('click', function() {
const bodyweight = parseFloat(document.getElementById('bodyweight-input').value) || 0;
const total = parseFloat(document.getElementById('total-input').value) || 0;
const gender = document.querySelector('input[name="gender"]:checked').value;
if (bodyweight <= 0 || total <= 0) {
risResult.textContent = '0.00';
rankButtons.classList.add('hidden');
clearCurveBtn.classList.add('hidden');
return;
}
let risScore;
if (gender === 'male') {
// Calculate using men constants from ris.js
risScore = risIndex(bodyweight,
men_const[0],
men_const[1],
men_const[2],
men_const[3],
men_const[4]) * total;
} else {
// Calculate using women constants from ris.js
risScore = risIndex(bodyweight,
women_const[0],
women_const[1],
women_const[2],
women_const[3],
women_const[4]) * total;
}
risResult.textContent = risScore.toFixed(2);
// Show the rank button after calculation
rankButtons.classList.remove('hidden');
});
}
if (showOnCurveBtn) {
showOnCurveBtn.addEventListener('click', function() {
const bodyweight = parseFloat(document.getElementById('bodyweight-input').value) || 0;
const total = parseFloat(document.getElementById('total-input').value) || 0;
const gender = document.querySelector('input[name="gender"]:checked').value;
// Get the correct plot based on gender
const plotId = gender === 'male' ? 'men-plot' : 'women-plot';
// Make sure the plots are ready
if ((plotId === 'men-plot' && !menPlotReady) ||
(plotId === 'women-plot' && !womenPlotReady)) {
alert("Please wait, plot data is still loading.");
return;
}
// Show the clear button
clearCurveBtn.classList.remove('hidden');
// Add the user's data point to the plot
addUserPoint(plotId, bodyweight, total);
// Scroll to the plot
document.getElementById(plotId).scrollIntoView({
behavior: 'smooth',
block: 'center'
});
});
}
if (clearCurveBtn) {
clearCurveBtn.addEventListener('click', function() {
// Reset both plots
resetPlots();
// Hide the clear button
this.classList.add('hidden');
});
}
// Function to reset both plots to original state
function resetPlots() {
// Reset men plot if it's ready
if (menPlotReady && document.getElementById('men-plot') && menPlotOriginal) {
Plotly.react('men-plot', menPlotOriginal.data, menPlotOriginal.layout);
}
// Reset women plot if it's ready
if (womenPlotReady && document.getElementById('women-plot') && womenPlotOriginal) {
Plotly.react('women-plot', womenPlotOriginal.data, womenPlotOriginal.layout);
}
}
// Function to add user's point to the plot
function addUserPoint(plotId, bodyweight, total) {
const plot = document.getElementById(plotId);
if (!plot || !plot.data) return;
// Calculate the expected total for this bodyweight
const gender = plotId === 'men-plot' ? 'male' : 'female';
const constants = gender === 'male' ? men_const : women_const;
// Calculate the expected total for this bodyweight
const expectedTotal = 100 / risIndex(bodyweight,
constants[0],
constants[1],
constants[2],
constants[3],
constants[4]);
// Get the existing data and clone it
const existingData = JSON.parse(JSON.stringify(plot.data));
// Create user point trace
const userPoint = {
x: [bodyweight],
y: [total],
mode: 'markers',
type: 'scatter',
marker: {
size: 16,
color: 'rgba(255, 0, 0, 0.8)',
symbol: 'diamond',
line: {
color: 'white',
width: 2
}
},
name: 'Your Performance',
hoverinfo: 'text',
hovertext: `Your Performance:<br>Bodyweight: ${bodyweight}kg<br>Total: ${total}kg`,
showlegend: false
};
// Create expected point trace
const expectedPoint = {
x: [bodyweight],
y: [expectedTotal],
mode: 'markers',
type: 'scatter',
marker: {
size: 12,
color: 'rgba(255, 215, 0, 0.8)', // Gold color
symbol: 'circle',
line: {
color: 'white',
width: 1
}
},
name: 'Expected at 100 RIS',
hoverinfo: 'text',
hovertext: `Expected at 100 RIS:<br>Bodyweight: ${bodyweight}kg<br>Total: ${expectedTotal.toFixed(1)}kg`,
showlegend: false
};
// Create connection line trace
const connectionLine = {
x: [bodyweight, bodyweight],
y: [total, expectedTotal],
mode: 'lines',
type: 'scatter',
line: {
color: 'rgba(255, 255, 255, 0.5)',
width: 2,
dash: 'dot'
},
name: 'Connection Line',
showlegend: false,
hoverinfo: 'text',
hovertext: `Performance Gap: ${Math.abs(total - expectedTotal).toFixed(1)}kg`,
};
// Add the new traces to existing data
existingData.push(userPoint);
existingData.push(expectedPoint);
existingData.push(connectionLine);
// Update the plot with all data
Plotly.react(plotId, existingData, plot.layout);
// Calculate if the user is above or below the curve
const position = total > expectedTotal ? 'above' : 'below';
const emoji = total > expectedTotal ? '🔥' : '💪';
const message = total > expectedTotal ?
`${emoji} You're ${((total/expectedTotal)*100-100).toFixed(1)}% above the elite curve!` :
`${emoji} You're at ${((total/expectedTotal)*100).toFixed(1)}% of the elite curve`;
// Create annotation
const annotation = {
x: bodyweight,
y: total,
xref: 'x',
yref: 'y',
text: message,
showarrow: true,
arrowhead: 2,
arrowsize: 1,
arrowcolor: 'red',
ax: 0,
ay: -40,
font: {
size: 12,
color: 'white',
family: 'Inter, sans-serif',
},
bgcolor: 'rgba(0, 0, 0, 0.7)',
bordercolor: 'red',
borderwidth: 1,
borderpad: 4,
};
// Add the annotation
Plotly.relayout(plotId, {
annotations: [annotation]
});
}
});
</script>
<div class="p-5 md:mx-14 mt-8">
<h3 class="text-xl font-semibold mb-2 text-white" id="visualization">A data-driven approach</h3>
<p class="text-gray-200 text-sm md:text-base">
The RIS scoring system is built on comprehensive data analysis of elite competition results. Data was collected from the <a href="https://www.allthingsstreetlifting.com/">All Things: Streetlifting</a> database, specifically examining the top 10 performers in each weight class who competed before 2025 in the All-4 competition format. Both bodyweight and total performance figures were analyzed using robust regression analysis—a statistical technique that identifies the relationship between these variables by finding the curve that best fits the data points, while taking in account outliers. In simple terms, this process revealed how lifting performance typically scales with bodyweight among top athletes, creating a function that expresses expected total performance based on bodyweight. This function was then normalized to create the RIS Score. <i>A research paper that describe the scientific methodology will be released soon.</i>
</p>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8 mt-8">
<div id="men-plot" class="w-full h-[500px]"></div>
<div id="women-plot" class="w-full h-[500px]"></div>
</div>
<div class="p-5 md:mx-14">
<p class="text-gray-400 text-xs md:text-sm">
This visualization shows the relationship between body weight (x-axis) and total performance score (y-axis)
for athletes across different weight classes. The size of each point represents the total score, with larger
points indicating higher scores. Hover over points to see detailed athlete information.
</p>
</div>
<!-- Integration Section -->
<div class="p-5 md:mx-14 mt-8">
<h3 class="text-xl font-semibold mb-4 text-white" id="integration">Integration</h3>
<p class="text-gray-200 text-sm md:text-base mb-4">
The RIS formula is available for free integration into any platform or application. You are welcome to use this scoring system without prior request for competitions, websites, apps, or analysis tools. We simply ask that you credit the creators of the RIS system in your implementation.
</p>
<div class="mb-6">
<table id="constants-table" class="w-full text-left">
<thead>
<tr>
<th class="text-white py-2">Constant</th>
<th class="text-white py-2">Men</th>
<th class="text-white py-2">Women</th>
</tr>
</thead>
<tbody>
<!-- Table rows will be populated via JavaScript -->
</tbody>
</table>
</div>
<div class="mb-6">
<p class="text-gray-200 text-sm md:text-base mb-4">
The formula is:
</p>
<!-- MathJax formula -->
<script type="text/javascript" async
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-MML-AM_CHTML">
</script>
<div>
\[
\text{RIS} = \text{Total} \times \frac{100}{A + \frac{K - A}{1 + Q \cdot e^{-B \cdot (\text{BW} - v)}}}
\]
</div>
<p class="text-gray-400 text-xs mt-2">
where BW is body weight in kg, Total is the athlete's total lifted weight in kg, and A, K, B, v, Q are the gender-specific constants defined above.
</p>
</div>
<div class="mb-6">
<h4 class="text-lg font-medium mb-2 text-white">Microsoft Excel</h4>
<p class="text-gray-200 text-sm md:text-base mb-2">Copy these formulas directly into Excel to calculate RIS scores. The formula references cells A2 for body weight and B2 for total weight, but you can adjust these cell references as needed.</p>
<p class="text-white mb-1">For Men:</p>
<div class="mb-3 code-block-wrapper">
<pre><code id="excel-men-formula" class="excel"></code></pre>
<button class="copy-button" data-target="excel-men-formula">Copy</button>
</div>
<p class="text-white mb-1">For Women:</p>
<div class="code-block-wrapper">
<pre><code id="excel-women-formula" class="excel"></code></pre>
<button class="copy-button" data-target="excel-women-formula">Copy</button>
</div>
<p class="text-gray-400 text-xs mt-2">
Assuming A2 = Body Weight in kg, B2 = Total in kg
</p>
</div>
<div>
<h4 class="text-lg font-medium mb-2 text-white">Google Sheets</h4>
<p class="text-gray-200 text-xs mb-2 text-sm md:text-base">For a more convenient implementation in Google Sheets, you can create custom functions that calculate RIS scores with a single function call:</p>
<ol class="text-sm md:text-base text-gray-300 list-decimal pl-4 space-y-1 mb-2">
<li>Open your Google Sheet</li>
<li>Go to Extensions → Apps Script</li>
<li>Paste the following code (constants are automatically filled from the current RIS.js file):</li>
</ol>
<div class="code-block-wrapper">
<pre><code id="google-sheets-code" class="javascript"></code></pre>
<button class="copy-button" data-target="google-sheets-code">Copy</button>
</div>
<p class="text-sm md:text-base text-gray-300 mt-2">After saving the script, you can use the functions directly in your sheet:</p>
<ul class="text-sm md:text-base text-gray-300 list-disc pl-4 space-y-1 mt-1">
<li><code>=RIS_MEN(A2, B2)</code> - where A2 is body weight and B2 is total weight for male athletes</li>
<li><code>=RIS_WOMEN(A2, B2)</code> - where A2 is body weight and B2 is total weight for female athletes</li>
</ul>
</div>
</div>
<!-- FAQ Section -->
<div class="p-5 md:mx-14 mt-8">
<h3 class="text-xl font-semibold mb-4 text-white" id="faq">Frequently Asked Questions</h3>
<div class="space-y-4">
<!-- FAQ Item: What's new in the 2025 Edition -->
<div class="border-b border-dark-300 pb-4">
<button class="faq-toggle flex w-full justify-between items-center text-left focus:outline-none">
<span class="text-white font-medium">What's new in the 2025 Edition of RIS?</span>
<svg class="faq-icon w-5 h-5 text-gray-400 transform transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
</button>
<div class="faq-content hidden mt-2 text-gray-300 text-sm md:text-base">
<p>The 2025 Edition of the RIS includes several important updates while maintaining the core methodology:</p>
<ul class="list-disc pl-5 mt-2 space-y-1">
<li>Integration of all competition data from 2024, providing a more current reflection of performance standards</li>
<li>Inclusion of the new women's -52kg weight category, improving accuracy for lightweight female athletes</li>
<li>Implementation of a more robust statistical method that better handles outliers in the data</li>
</ul>
<p class="mt-2">The fundamental approach remains unchanged, ensuring continuity with previous editions while offering improved accuracy based on the most recent competitive data.</p>
</div>
</div>
<!-- FAQ Item 2 -->
<div class="border-b border-dark-300 pb-4">
<button class="faq-toggle flex w-full justify-between items-center text-left focus:outline-none">
<span class="text-white font-medium">Can I compare men's and women's scores with RIS?</span>
<svg class="faq-icon w-5 h-5 text-gray-400 transform transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
</button>
<div class="faq-content hidden mt-2 text-gray-300 text-sm md:text-base">
<p>Currently, the RIS system is designed to compare athletes within the same gender category. Due to significant differences in strength-to-weight ratio distributions between men and women and limited cross-gender competitive data, making accurate comparisons across genders is challenging with the current model. Each gender has its own set of reference data and constants used in the RIS formula to ensure fair and meaningful comparisons within the same gender group.</p>
</div>
</div>
<!-- FAQ Item 3 -->
<div class="border-b border-dark-300 pb-4">
<button class="faq-toggle flex w-full justify-between items-center text-left focus:outline-none">
<span class="text-white font-medium">How often are the RIS constants updated?</span>
<svg class="faq-icon w-5 h-5 text-gray-400 transform transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
</button>
<div class="faq-content hidden mt-2 text-gray-300 text-sm md:text-base">
<p>The RIS constants are updated annually to incorporate the latest competition data. This ensures that the scoring system remains current with the evolving standards of performance in streetlifting. Each annual update is labeled with its year (e.g., "RIS 2025 Edition") to help users identify which version they're working with.</p>
</div>
</div>
<!-- FAQ Item 4 -->
<div class="border-b border-dark-300 pb-4">
<button class="faq-toggle flex w-full justify-between items-center text-left focus:outline-none">
<span class="text-white font-medium">What is considered a "good" RIS score?</span>
<svg class="faq-icon w-5 h-5 text-gray-400 transform transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
</button>
<div class="faq-content hidden mt-2 text-gray-300 text-sm md:text-base">
<p>RIS scores typically fall within these ranges:</p>
<ul class="list-disc pl-5 mt-2 space-y-1">
<li><strong>Below 70:</strong> Beginner to intermediate level</li>
<li><strong>70-80:</strong> Advanced level</li>
<li><strong>80-90:</strong> Elite level</li>
<li><strong>Above 90:</strong> World-class level</li>
</ul>
<p class="mt-2">A score of 100 would indicate performance equivalent to the statistical average of top athletes in your weight class.</p>
</div>
</div>
<!-- FAQ Item 5 -->
<div class="border-b border-dark-300 pb-4">
<button class="faq-toggle flex w-full justify-between items-center text-left focus:outline-none">
<span class="text-white font-medium">Can I use the RIS calculator for other strength sports?</span>
<svg class="faq-icon w-5 h-5 text-gray-400 transform transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
</button>
<div class="faq-content hidden mt-2 text-gray-300 text-sm md:text-base">
<p>The RIS was specifically developed for streetlifting using data from All-4 competitions. While the mathematical model could theoretically be applied to other strength sports, the constants would need to be recalculated using sport-specific data. Using the current RIS constants for other strength sports would not provide accurate comparisons.</p>
</div>
</div>
</div>
</div>
<!-- Organization Supporters Section -->
<div class="p-5 md:mx-14 mt-8 rounded-md">
<h3 class="text-xl font-semibold mb-6 text-white text-center">Special Thanks</h3>
<p class="text-center mb-6 text-sm md:text-base">
We extend our gratitude to the organizations that have made this research and calculator possible through their support and collaboration.
</p>
<div class="flex justify-center items-center space-x-12">
<div class="h-20 flex items-center justify-center">
<img src="static/img/fnsl.webp" alt="FNSL" class="h-20 w-auto object-contain grayscale hover:grayscale-0 transition-all duration-300 opacity-70 hover:opacity-100">
</div>
<div class="h-20 flex items-center justify-center">
<img src="static/img/atsl.png" alt="All Things: Streetlifting" class="h-20 w-auto object-contain grayscale hover:grayscale-0 transition-all duration-300 opacity-70 hover:opacity-100">
</div>
<div class="h-20 flex items-center justify-center">
<img src="static/img/final-rep.webp" alt="Final Rep" class="h-20 w-auto object-contain grayscale hover:grayscale-0 transition-all duration-300 opacity-70 hover:opacity-100">
</div>
</div>
</div>
</main>
<footer class="mt-auto py-6 border-t border-dark-300 text-center text-gray-500 text-sm">
<div class="container mx-auto px-6">
<div class="mb-4">
<p>© 2025 RIS Calculator. All Rights Reserved.</p>
</div>
<div class="flex justify-center space-x-4">
<a href="https://instagram.com/riiswa" target="_blank" class="text-gray-400 hover:text-white">Instagram</a>
<a href="https://github.com/riiswa" target="_blank" class="text-gray-400 hover:text-white">GitHub</a>
</div>
</div>
</footer>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Parse the JSON data for the graphs
const menData = {"data": [{"customdata": {"dtype": "f8", "bdata": "AAAAAACAMUAAAAAAAEBQQAAAAAAAQF9AAAAAAACwbUAAAAAAACBEQAAAAAAAAFlAAAAAAABgXUAAAAAAACBnQAAAAAAAgDtAAAAAAABwUkAAAAAAAABhQAAAAAAAsGhAAAAAAAAAPkAAAAAAAABUQAAAAAAAgFtAAAAAAAAAaUAAAAAAAMA3QAAAAAAAkFBAAAAAAAAAXkAAAAAAAEBqQAAAAAAAADlAAAAAAABwUkAAAAAAAABeQAAAAAAAsGhAAAAAAAAAOUAAAAAAAMBSQAAAAAAAAFlAAAAAAADgakAAAAAAAAA+QAAAAAAAQFVAAAAAAACAW0AAAAAAAHBnQAAAAAAAwDxAAAAAAABgU0AAAAAAAABZQAAAAAAAAGlA", "shape": "9, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=-66kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Owen Gayle", "Youssef Ashura Bouida", "Julien Capdeville", "Nana Boison", "Domenico Zezza", "Pablo Reveriego", "Alessio Ceragioli", "Florent Geschlecht", "Justin Herbert"], "legendgroup": "-66kg", "marker": {"color": "rgb(165,0,38)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "EgtH4VH2D0A4R8QtZEcPQOL0QXStBQ1A09JtwNeuCUDT0m3A164JQFsSEak3CwlA/x6Q0bbaCECQHqegCIQIQAAAAAAAAAhA"}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "-66kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "AAAAAACAUEAAAAAAAIBQQGdmZmZmJlBAAAAAAABAUEAAAAAAAE5QQAAAAAAAcFBAMzMzMzNTUEAAAAAAAIBQQM3MzMzMjE9A"}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAADQe0AAAAAAAKx7QAAAAAAALHtAAAAAAABAekAAAAAAAEB6QAAAAAAABHpAAAAAAADweUAAAAAAAMh5QAAAAAAAZHlA"}, "yaxis": "y", "type": "scatter"}, {"customdata": {"dtype": "f8", "bdata": "AAAAAAAgR0AAAAAAAABbQAAAAAAAsGNAAAAAAADgakAAAAAAAAA5QAAAAAAAoFRAAAAAAAC4YEAAAAAAAGBuQAAAAAAA4EBAAAAAAAAgV0AAAAAAABBjQAAAAAAAoGlAAAAAAAAAPkAAAAAAACBXQAAAAAAAcGJAAAAAAACwaEAAAAAAAEBAQAAAAAAAQFVAAAAAAABAYEAAAAAAAEBqQAAAAAAAwEJAAAAAAACgVEAAAAAAAOBfQAAAAAAAQGpAAAAAAAAAOUAAAAAAAEBQQAAAAAAAQF9AAAAAAAAQbkAAAAAAAMBCQAAAAAAAQFVAAAAAAACQYEAAAAAAAABpQAAAAAAAQD9AAAAAAAAAVEAAAAAAAABeQAAAAAAAgGtA", "shape": "9, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=-73kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Aubin Chevillard", "Lorenzo Mazzi", "Fran\u00e7ois Li", "Vincenzo Santoro", "Giulio Torelli", "Luca Van Gremberghen", "Israelian Albert", "Lionel Da Silva", "Abderrahmen Dellaoui"], "legendgroup": "-73kg", "marker": {"color": "rgb(215,48,39)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "JOcEGGHqIEBjTKmSj14XQC6h+JueQhdAZbluPFLpE0Bzdq4YKA4SQHN2rhgoDhJASNsij060EUA4vVIPIJ4RQEOlicNr+xBA"}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "-73kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "MzMzMzMjUkDNzMzMzCxSQDMzMzMzI1JAAAAAAAAgUkAzMzMzMxNSQDMzMzMzI1JAMzMzMzMjUkAzMzMzMyNSQM3MzMzMLFJA"}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAAB2gEAAAAAAAER+QAAAAAAAPH5AAAAAAAA4fUAAAAAAAJh8QAAAAAAAmHxAAAAAAAB4fEAAAAAAAHB8QAAAAAAANHxA"}, "yaxis": "y", "type": "scatter"}, {"customdata": {"dtype": "f8", "bdata": "AAAAAAAAREAAAAAAAEBaQAAAAAAA0GFAAAAAAAAAbkAAAAAAAIBGQAAAAAAAwFdAAAAAAAAAZEAAAAAAAIBrQAAAAAAAgEFAAAAAAACAVkAAAAAAAGBjQAAAAAAAIGxAAAAAAAAAPkAAAAAAACBXQAAAAAAAAF5AAAAAAABocEAAAAAAAIA7QAAAAAAAQFVAAAAAAABgY0AAAAAAABBtQAAAAAAAAD5AAAAAAADAV0AAAAAAALBjQAAAAAAAMGtAAAAAAABAQEAAAAAAAMBSQAAAAAAAQF9AAAAAAABocEAAAAAAAEBAQAAAAAAAQFVAAAAAAADgYEAAAAAAALBtQAAAAAAAAD5AAAAAAACgVEAAAAAAAABkQAAAAAAAMGtAAAAAAACANkAAAAAAAKBOQAAAAAAAaGBAAAAAAAC4cEA=", "shape": "10, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=-80kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Raul Teslevici", "Bartlomiej Orchowski", "Shakil Ahmed", "Tony D'Agostino", "Elder Paredes", "Dani\u00ebl Wassenaar", "Cristiano Bellorini", "Abderrahmen Dellaoui", "Carlos Garc\u00eda Pic\u00f3n", "Antonio Sparaneo"], "legendgroup": "-80kg", "marker": {"color": "rgb(244,109,67)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "OONZKIIEIUBM6IG+5gIgQFhwwjYbMhxAWHDCNhsyHEA8JceBO/saQDwlx4E7+xpA/I2PuIrMGUBNhIcaQ6YYQE2EhxpDphhAgMCTJin9FkA="}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "-80kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "w/UoXI/iU0DD9Shcj+JTQAAAAAAAwFNAw/UoXI/iU0DD9Shcj+JTQMP1KFyP4lNAmpmZmZnZU0DNzMzMzOxTQM3MzMzM7FNAmpmZmZn5U0A="}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAAB8gEAAAAAAAECAQAAAAAAAkH9AAAAAAACQf0AAAAAAAEB/QAAAAAAAQH9AAAAAAADwfkAAAAAAAKB+QAAAAAAAoH5AAAAAAAAofkA="}, "yaxis": "y", "type": "scatter"}, {"customdata": {"dtype": "f8", "bdata": "AAAAAACASkAAAAAAABBdQAAAAAAA0GZAAAAAAAAQbUAAAAAAAABEQAAAAAAAwFdAAAAAAAAgYkAAAAAAABhwQAAAAAAAAD5AAAAAAAAQWEAAAAAAAOBgQAAAAAAA+HBAAAAAAABARUAAAAAAAABeQAAAAAAAgGFAAAAAAADAbEAAAAAAACBCQAAAAAAAQFVAAAAAAACAYUAAAAAAAEBwQAAAAAAAADlAAAAAAADAV0AAAAAAACBiQAAAAAAA4G9AAAAAAAAANEAAAAAAAMBSQAAAAAAAwGJAAAAAAABAcEAAAAAAAEBAQAAAAAAAwFdAAAAAAAAgYkAAAAAAAHBsQAAAAAAAQEBAAAAAAADgVUAAAAAAACBiQAAAAAAAYG1AAAAAAADAQkAAAAAAAHBXQAAAAAAAQF9AAAAAAAAQbUA=", "shape": "10, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=-87kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Pere Coll Fernandez", "Lucian Stanut", "Timo Wunnenberg", "Ludovic Adamantium", "Amedeo Pulcini", "Jan Walter", "Marc Altarriba Coronado", "Jos\u00e9 D'Almeida", "Kevin Gogo", "Diego Corazza"], "legendgroup": "-87kg", "marker": {"color": "rgb(253,174,97)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "Zh+ncuSYKUBX260niWgiQOt1MDuqvSFAR2stYcK0IUCy8hVIQy0gQEzogb7mAiBAWHDCNhsyHEA8JceBO/saQDwlx4E7+xpAFc7s7wheGEA="}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "-87kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "ZmZmZmamVUBmZmZmZqZVQGdmZmZmxlVANDMzMzOTVUDNzMzMzGxVQGZmZmZmplVAZmZmZmamVUAAAAAAAMBVQJqZmZmZuVVAZmZmZmamVUA="}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAABCgkAAAAAAAMyAQAAAAAAApoBAAAAAAACkgEAAAAAAAEqAQAAAAAAAQIBAAAAAAACQf0AAAAAAAEB/QAAAAAAAQH9AAAAAAACMfkA="}, "yaxis": "y", "type": "scatter"}, {"customdata": {"dtype": "f8", "bdata": "AAAAAADgRUAAAAAAADBbQAAAAAAAoGRAAAAAAABIckAAAAAAAABEQAAAAAAA4FpAAAAAAABAZUAAAAAAAJBvQAAAAAAAAD5AAAAAAAAgV0AAAAAAAJBlQAAAAAAA8G5AAAAAAAAAOUAAAAAAAMBSQAAAAAAAAGRAAAAAAACYcUAAAAAAAEBAQAAAAAAA4FVAAAAAAACIZkAAAAAAAGBtQAAAAAAAwEJAAAAAAACAW0AAAAAAACBiQAAAAAAAUG5AAAAAAAAAPkAAAAAAACBXQAAAAAAAgGFAAAAAAABwcEAAAAAAAEBAQAAAAAAAQFVAAAAAAADAYkAAAAAAAEBvQAAAAAAAgDZAAAAAAABAVUAAAAAAAMBiQAAAAAAA4G9AAAAAAABAQEAAAAAAACBSQAAAAAAAQGBAAAAAAAAIcUA=", "shape": "10, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=-94kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Xavier Macias", "Dylan Baki Heurteux", "Th\u00e9o Goutte-Toquet", "Daniel Lisek Lis", "Badr Van Der Stoel", "Ludovic Adamantium", "Timo Wunnenberg", "Robin Stoltze", "Charlie Cameron", "Giovanni Lategana"], "legendgroup": "-94kg", "marker": {"color": "rgb(254,224,144)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "AAAAAAAALkAJ3p93qkonQEebcB7FHyNA54jqgtn6IkBqzUlZNBciQBkJoQ42DiJAqHem3wK/IEBibMqIwF0fQP33Vj1OEx5Aw43ws4vQHEA="}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "-94kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "vLu7u7sbV0AAAAAAAEBXQJqZmZmZGVdAmpmZmZl5V0C8u7u7uxtXQM3MzMzMDFdAvLu7u7sbV0CamZmZmTlXQLy7u7u7G1dAzczMzMyMVkA="}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAAAQg0AAAAAAANCBQAAAAAAA9IBAAAAAAADsgEAAAAAAALqAQAAAAAAAuIBAAAAAAABsgEAAAAAAACyAQAAAAAAABIBAAAAAAAC4f0A="}, "yaxis": "y", "type": "scatter"}, {"customdata": {"dtype": "f8", "bdata": "AAAAAAAA9D8AAAAAAIBWQAAAAAAAwGdAAAAAAADAckAAAAAAAAA0QAAAAAAAIFdAAAAAAADAYkAAAAAAAGBzQAAAAAAAADlAAAAAAABwV0AAAAAAALBjQAAAAAAAcHJAAAAAAAAANEAAAAAAAIBWQAAAAAAA4GVAAAAAAADQcUAAAAAAAIAmQAAAAAAA0FZAAAAAAAC4ZUAAAAAAAGhwQAAAAAAAAERAAAAAAACAVkAAAAAAACBiQAAAAAAA4G9AAAAAAAAAOUAAAAAAAEBVQAAAAAAAQGVAAAAAAAAAbkAAAAAAAIBGQAAAAAAAAFlAAAAAAACAYUAAAAAAAIBrQAAAAAAAABRAAAAAAAAgV0AAAAAAAOBgQAAAAAAA6HBAAAAAAACAMUAAAAAAAEBQQAAAAAAAoF5AAAAAAACocUA=", "shape": "10, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=+94kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Valerio Naldi", "Jan Makula", "Leonardo Giliberto", "Tonio Zeidler", "Jovan Mastilovic", "Patryk Dzieniszewski", "Mohamad Houbbi", "Eugeniu Cretu", "Robin Meineke", "Jonas Mees"], "legendgroup": "+94kg", "marker": {"color": "rgb(255,255,191)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "MXriw5gaKUBKizMFbbAnQEXuFhNzfSdACd6fd6pKJ0DPKeLQBZYiQBBP5VIwXCFATOiBvuYCIEBYcMI2GzIcQK/o/N/JtBtA1p2RUloWGEA="}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "+94kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "ZmZmZmbmXkCamZmZmblaQD4K16Nwd1pAPgrXo3B3WkAAAAAAAABcQM3MzMzMbFhAUrgeheuhWEDNzMzMzIxZQAAAAAAAwFtAAAAAAADAV0A="}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAAAqgkAAAAAAAOSBQAAAAAAA2oFAAAAAAADQgUAAAAAAANaAQAAAAAAAkIBAAAAAAABAgEAAAAAAAJB/QAAAAAAAcH9AAAAAAAB4fkA="}, "yaxis": "y", "type": "scatter"}, {"hovertemplate": "Body Weight: %{x:.1f} kg<br>Predicted Total: %{y:.1f}<extra></extra>", "line": {"color": "white", "dash": "solid", "width": 3}, "mode": "lines", "name": "Trend", "x": {"dtype": "f8", "bdata": "AAAAwMyMSkBToNZv4fRKQKZArR/2XEtA+OCDzwrFS0BLgVp/Hy1MQJ4hMS80lUxA8MEH30j9TEBDYt6OXWVNQJYCtT5yzU1A6aKL7oY1TkA8Q2Kem51OQI7jOE6wBU9A4YMP/sRtT0A0JOat2dVPQENi3i73HlBAbbLJhgFTUECWArXeC4dQQL9SoDYWu1BA6aKLjiDvUEAS83bmKiNRQDxDYj41V1FAZZNNlj+LUUCO4zjuSb9RQLgzJEZU81FA4YMPnl4nUkAK1Pr1aFtSQDQk5k1zj1JAXXTRpX3DUkCGxLz9h/dSQLAUqFWSK1NA2WSTrZxfU0ACtX4Fp5NTQCwFal2xx1NAVlVVtbv7U0B/pUANxi9UQKj1K2XQY1RA0kUXvdqXVED7lQIV5ctUQCTm7Wzv/1RATjbZxPkzVUB3hsQcBGhVQKDWr3QOnFVAyiabzBjQVUDzdoYkIwRWQBzHcXwtOFZARhdd1DdsVkBvZ0gsQqBWQJi3M4RM1FZAwgcf3FYIV0DsVwo0YTxXQBWo9YtrcFdAPvjg43WkV0BoSMw7gNhXQJGYt5OKDFhAuuii65RAWEDkOI5Dn3RYQA2JeZupqFhANtlk87PcWEBgKVBLvhBZQIl5O6PIRFlAsskm+9J4WUDcGRJT3axZQAVq/arn4FlALrroAvIUWkBYCtRa/EhaQIJav7IGfVpAq6qqChGxWkDU+pViG+VaQP5KgbolGVtAJ5tsEjBNW0BQ61dqOoFbQHo7Q8JEtVtAo4suGk/pW0DM2xlyWR1cQPYrBcpjUVxAH3zwIW6FXEBIzNt5eLlcQHIcx9GC7VxAm2yyKY0hXUDFvJ2Bl1VdQO4MidmhiV1AF110May9XUBBrV+JtvFdQGr9SuHAJV5AlE02OctZXkC9nSGR1Y1eQObtDOnfwV5AED74QOr1XkA5juOY9ClfQGLezvD+XV9AjC66SAmSX0C1fqWgE8ZfQN7OkPgd+l9AhA8+KBQXYECYtzNUGTFgQK5fKYAeS2BAwgcfrCNlYEDWrxTYKH9gQOxXCgQumWBAAAAAMDOzYEA="}, "y": {"dtype": "f8", "bdata": "9g3fUjX3dkD9AdURXh13QHQi3egQRndA5Kyxc2Bxd0C7Kq/CW593QENxda8N0HdAkn6XL3wDeECHxXqqpzl4QLABY1iKcnhAm+pdsReueEBWGTzzO+x4QDrq68XbLHlAduNLBdRveUBrvNS2+bR5QO6uRzAa/HlAoIfecvtEekDcIl68XI96QNFR/Ez32npAyK5tXn8ne0DXqtVFpXR7QNym7rcWwntAF/nDJIAPfEDkivAejlx8QBiGosHuqHxAWqe3CFP0fECCdxwPcD59QOtQHykAh31AnsB70sPNfUCqoVVqghJ+QB7m+bkKVX5AP03SRTOVfkD4tltq2tJ+QDI9+EjmDX9A2nEOikRGf0DKQwL76Xt/QAz1MQ/Srn9Amr5LS/7ef0AJ5wvROgaAQEuCpeShG4BAY9AbRrwvgEBiv6eQk0KAQM2iPcMyVIBASmmt86VkgECC7NAH+nOAQEhOfHU8goBAMouMCXuPgEBIgCe2w5uAQBqWBmgkp4BAP0B54qqxgEDcIK2hZLuAQLoxtcJexIBAYwe+8KXMgEB0TNlWRtSAQElKzJVL24BApDtTvcDhgED5+FNIsOeAQFs9hRsk7YBAOXYbhiXygEAYHhhEvfaAQHiN5IHz+oBA2prs4M/+gEDaFvh8WQKBQIYGDPKWBYFAhGGlYo4IgUCGBid+RQuBQBSTW4fBDYFA5N/xWgcQgUC+IOB1GxKBQAggnvsBFIFAD9cqvL4VgUCDz9Q5VReBQE5cv67IGIFA8eAgEhwagUAqIDgdUhuBQCTz909tHIFA7udp9W8dgUB5I8knXB6BQESMV9QzH4FAbb/vvvgfgUA6qlaFrCCBQCbdT6JQIYFATtB3cOYhgUASYecsbyKBQHbRo/nrIoFA5obe310jgUAbsgfSxSOBQGTvtq0kJIFARM9sPXskgUC4FDA6yiSBQBtSCU0SJYFArGdfEFQlgUAWQTcRkCWBQKMJWdDGJYFAzOlcw/glgUBkPaFVJiaBQPAOLOlPJoFAEIR513UmgUCaxzhymCaBQGzg+AO4JoFAWMjG0NQmgUA="}, "type": "scatter"}], "layout": {"template": {"data": {"barpolar": [{"marker": {"line": {"color": "rgb(17,17,17)", "width": 0.5}, "pattern": {"fillmode": "overlay", "size": 10, "solidity": 0.2}}, "type": "barpolar"}], "bar": [{"error_x": {"color": "#f2f5fa"}, "error_y": {"color": "#f2f5fa"}, "marker": {"line": {"color": "rgb(17,17,17)", "width": 0.5}, "pattern": {"fillmode": "overlay", "size": 10, "solidity": 0.2}}, "type": "bar"}], "carpet": [{"aaxis": {"endlinecolor": "#A2B1C6", "gridcolor": "#506784", "linecolor": "#506784", "minorgridcolor": "#506784", "startlinecolor": "#A2B1C6"}, "baxis": {"endlinecolor": "#A2B1C6", "gridcolor": "#506784", "linecolor": "#506784", "minorgridcolor": "#506784", "startlinecolor": "#A2B1C6"}, "type": "carpet"}], "choropleth": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "choropleth"}], "contourcarpet": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "contourcarpet"}], "contour": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "contour"}], "heatmap": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "heatmap"}], "histogram2dcontour": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "histogram2dcontour"}], "histogram2d": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "histogram2d"}], "histogram": [{"marker": {"pattern": {"fillmode": "overlay", "size": 10, "solidity": 0.2}}, "type": "histogram"}], "mesh3d": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "mesh3d"}], "parcoords": [{"line": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "parcoords"}], "pie": [{"automargin": true, "type": "pie"}], "scatter3d": [{"line": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatter3d"}], "scattercarpet": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattercarpet"}], "scattergeo": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattergeo"}], "scattergl": [{"marker": {"line": {"color": "#283442"}}, "type": "scattergl"}], "scattermapbox": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattermapbox"}], "scattermap": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattermap"}], "scatterpolargl": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterpolargl"}], "scatterpolar": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterpolar"}], "scatter": [{"marker": {"line": {"color": "#283442"}}, "type": "scatter"}], "scatterternary": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterternary"}], "surface": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "surface"}], "table": [{"cells": {"fill": {"color": "#506784"}, "line": {"color": "rgb(17,17,17)"}}, "header": {"fill": {"color": "#2a3f5f"}, "line": {"color": "rgb(17,17,17)"}}, "type": "table"}]}, "layout": {"annotationdefaults": {"arrowcolor": "#f2f5fa", "arrowhead": 0, "arrowwidth": 1}, "autotypenumbers": "strict", "coloraxis": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "colorscale": {"diverging": [[0, "#8e0152"], [0.1, "#c51b7d"], [0.2, "#de77ae"], [0.3, "#f1b6da"], [0.4, "#fde0ef"], [0.5, "#f7f7f7"], [0.6, "#e6f5d0"], [0.7, "#b8e186"], [0.8, "#7fbc41"], [0.9, "#4d9221"], [1, "#276419"]], "sequential": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "sequentialminus": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]]}, "colorway": ["#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52"], "font": {"color": "#f2f5fa"}, "geo": {"bgcolor": "rgb(17,17,17)", "lakecolor": "rgb(17,17,17)", "landcolor": "rgb(17,17,17)", "showlakes": true, "showland": true, "subunitcolor": "#506784"}, "hoverlabel": {"align": "left"}, "hovermode": "closest", "mapbox": {"style": "dark"}, "paper_bgcolor": "rgb(17,17,17)", "plot_bgcolor": "rgb(17,17,17)", "polar": {"angularaxis": {"gridcolor": "#506784", "linecolor": "#506784", "ticks": ""}, "bgcolor": "rgb(17,17,17)", "radialaxis": {"gridcolor": "#506784", "linecolor": "#506784", "ticks": ""}}, "scene": {"xaxis": {"backgroundcolor": "rgb(17,17,17)", "gridcolor": "#506784", "gridwidth": 2, "linecolor": "#506784", "showbackground": true, "ticks": "", "zerolinecolor": "#C8D4E3"}, "yaxis": {"backgroundcolor": "rgb(17,17,17)", "gridcolor": "#506784", "gridwidth": 2, "linecolor": "#506784", "showbackground": true, "ticks": "", "zerolinecolor": "#C8D4E3"}, "zaxis": {"backgroundcolor": "rgb(17,17,17)", "gridcolor": "#506784", "gridwidth": 2, "linecolor": "#506784", "showbackground": true, "ticks": "", "zerolinecolor": "#C8D4E3"}}, "shapedefaults": {"line": {"color": "#f2f5fa"}}, "sliderdefaults": {"bgcolor": "#C8D4E3", "bordercolor": "rgb(17,17,17)", "borderwidth": 1, "tickwidth": 0}, "ternary": {"aaxis": {"gridcolor": "#506784", "linecolor": "#506784", "ticks": ""}, "baxis": {"gridcolor": "#506784", "linecolor": "#506784", "ticks": ""}, "bgcolor": "rgb(17,17,17)", "caxis": {"gridcolor": "#506784", "linecolor": "#506784", "ticks": ""}}, "title": {"x": 0.05}, "updatemenudefaults": {"bgcolor": "#506784", "borderwidth": 0}, "xaxis": {"automargin": true, "gridcolor": "#283442", "linecolor": "#506784", "ticks": "", "title": {"standoff": 15}, "zerolinecolor": "#283442", "zerolinewidth": 2}, "yaxis": {"automargin": true, "gridcolor": "#283442", "linecolor": "#506784", "ticks": "", "title": {"standoff": 15}, "zerolinecolor": "#283442", "zerolinewidth": 2}}}, "xaxis": {"anchor": "y", "domain": [0.0, 1.0], "title": {"text": "Body Weight (kg)"}, "fixedrange": true}, "yaxis": {"anchor": "x", "domain": [0.0, 1.0], "title": {"text": "Total Value"}, "fixedrange": true}, "legend": {"title": {"text": "Weight Class"}, "tracegroupgap": 0, "itemsizing": "constant", "orientation": "h", "yanchor": "bottom", "y": -0.25, "xanchor": "right", "x": 1}, "title": {"text": "Men", "x": 0.5}, "margin": {"l": 0, "r": 0, "t": 30, "b": 0}, "paper_bgcolor": "#0F0F0F", "plot_bgcolor": "#0F0F0F"}};
const womenData = {"data": [{"customdata": {"dtype": "f8", "bdata": "AAAAAACAK0AAAAAAAIBBQAAAAAAAgEtAAAAAAABAYEAAAAAAAAAkQAAAAAAAQEBAAAAAAAAgTEAAAAAAAJBgQAAAAAAAAC5AAAAAAAAAPkAAAAAAAEBKQAAAAAAAQF9AAAAAAAAAKUAAAAAAAABGQAAAAAAAgEtAAAAAAABAWkAAAAAAAAAkQAAAAAAAgEFAAAAAAABASkAAAAAAACBcQAAAAAAAAARAAAAAAABARUAAAAAAAGBIQAAAAAAAwFxAAAAAAAAAHkAAAAAAAMBCQAAAAAAAAElAAAAAAACAW0AAAAAAAAAkQAAAAAAAgDtAAAAAAACARkAAAAAAAABeQAAAAAAAAB5AAAAAAACANkAAAAAAAABJQAAAAAAAAF5AAAAAAAAA+D8AAAAAAIA2QAAAAAAAoElAAAAAAACgXkA=", "shape": "10, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=-52kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Aurora Riccardi", "Ludivine Compain", "Ana\u00efs Lozano Rojas", "C\u00e9line Chatelain", "Clementine Griffo", "Mona Shafiei", "Eleni Christinaki", "Sarah Taylor", "Miriam Scheld", "Agathe Casanova"], "legendgroup": "-52kg", "marker": {"color": "rgb(165,0,38)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "9lPhWRUHFkCyE4FiYAAVQM6/0k5atxFAC99ibtOJD0CgMUa8G/sLQIS9yAgsYwtAuNHIbwHQCUBhBhagEfYIQKAKz6o4UAhAAAAAAAAACEA="}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "-52kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "mpmZmZnZSUDNzMzMzExJQN/d3d3dfUlA393d3d19SUBmZmZmZmZJQM3MzMzMTElA393d3d19SUDf3d3d3X1JQDMzMzMzs0lAZmZmZmZmSUA="}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAAA4bUAAAAAAAOhsQAAAAAAA0GtAAAAAAAAQa0AAAAAAAEBqQAAAAAAAGGpAAAAAAACgaUAAAAAAAFBpQAAAAAAAAGlAAAAAAAC4aEA="}, "yaxis": "y", "type": "scatter"}, {"customdata": {"dtype": "f8", "bdata": "AAAAAAAALkAAAAAAACBMQAAAAAAAAFRAAAAAAADgYEAAAAAAAIAmQAAAAAAAAD5AAAAAAABAUEAAAAAAAGBjQAAAAAAAAB5AAAAAAACAQUAAAAAAAEBQQAAAAAAAEGNAAAAAAAAANEAAAAAAACBHQAAAAAAAQFBAAAAAAADgX0AAAAAAAIA7QAAAAAAAwExAAAAAAABAUEAAAAAAAEBaQAAAAAAAAC5AAAAAAABARUAAAAAAAGBNQAAAAAAAQGBAAAAAAAAANEAAAAAAAABJQAAAAAAAAElAAAAAAAAAXkAAAAAAAIAxQAAAAAAAgEZAAAAAAABAT0AAAAAAAIBbQAAAAAAAgDFAAAAAAACARkAAAAAAAABJQAAAAAAAAF5AAAAAAAAAGUAAAAAAAKBEQAAAAAAAoElAAAAAAACQYEA=", "shape": "10, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=-57kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Nadine Hettinga", "Sofia Cerdan Bes", "Julie Brion", "Margaux Sanchez", "Martha Lubczynski", "Julia L\u00e4ngerer", "Kara Smith", "Laura Garc\u00eda Bitrian", "Lylia Ammour", "Lorena Latrelle"], "legendgroup": "-57kg", "marker": {"color": "rgb(215,48,39)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "PxqXO1VTKUBUHPqP4r4hQLVkNpSJZiFAUGeAjBIPIUAMBvCTEA4gQIBvmcsyrhtAkIXnG9K/GECOnmuM8I0WQEaKRG6MghVAshOBYmAAFUA="}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "-57kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "i6/4iq/4S0BmZmZmZiZMQIuv+Iqv+EtAZmZmZmbmS0AAAAAAAABMQJqZmZmZGUtAzczMzMxMTECLr/iKr/hLQAAAAAAAgExAmpmZmZnZS0A="}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAADkcUAAAAAAAFRwQAAAAAAAQHBAAAAAAAAscEAAAAAAAOBvQAAAAAAAyG5AAAAAAAAAbkAAAAAAAGBtQAAAAAAAEG1AAAAAAADobEA="}, "yaxis": "y", "type": "scatter"}, {"customdata": {"dtype": "f8", "bdata": "AAAAAAAALkAAAAAAAKBEQAAAAAAAgFFAAAAAAADQYUAAAAAAAIArQAAAAAAA4EVAAAAAAADAUkAAAAAAAOBgQAAAAAAAABlAAAAAAACgREAAAAAAAABOQAAAAAAAwGJAAAAAAAAANEAAAAAAAIBGQAAAAAAAwExAAAAAAACQYEAAAAAAAMAyQAAAAAAAoERAAAAAAACgTkAAAAAAAOBfQAAAAAAAAClAAAAAAACgREAAAAAAAKBOQAAAAAAAQGBAAAAAAAAAKUAAAAAAAMBHQAAAAAAAgFFAAAAAAADAXEAAAAAAAIAxQAAAAAAAAD5AAAAAAABAT0AAAAAAAJBgQAAAAAAAAB5AAAAAAADgQEAAAAAAAIBLQAAAAAAAMGFAAAAAAAAAHkAAAAAAAABEQAAAAAAAgEtAAAAAAABAYEA=", "shape": "10, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=-63kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Laura Garc\u00eda Bitrian", "Faye Butler", "Ines Marius", "Lylia Ammour", "Mar Martinez", "Jelena Mladenovic", "Gianna Webbe", "Nadine Schulz", "Veronika Martin\u010di\u010d", "Taru Riipinen"], "legendgroup": "-63kg", "marker": {"color": "rgb(244,109,67)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "bWhRsgjjI0AaKZjCkIUjQJJ1kMZ/uCBADAbwkxAOIECtY25iiugcQOqdl7wDFBtA6p2XvAMUG0AftC3BwOUZQPZT4VkVBxZAzkxFILtRGUA="}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "-63kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "oA7qoA7qTkAzMzMzMzNOQGZmZmZmJk9AzczMzMyMTkAzMzMzM/NOQJqZmZmZGU9AoA7qoA7qTkCamZmZmVlPQKAO6qAO6k5AmpmZmZkZT0A="}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAADMcEAAAAAAALhwQAAAAAAAGHBAAAAAAADgb0AAAAAAABhvQAAAAAAAoG5AAAAAAACgbkAAAAAAAFBuQAAAAAAAOG1AAAAAAAAobkA="}, "yaxis": "y", "type": "scatter"}, {"customdata": {"dtype": "f8", "bdata": "AAAAAABANUAAAAAAAGBIQAAAAAAAcFJAAAAAAADQYUAAAAAAAAAuQAAAAAAAIEJAAAAAAAAgUkAAAAAAAGBjQAAAAAAAACRAAAAAAADgQEAAAAAAAABOQAAAAAAAYGRAAAAAAABAMEAAAAAAAIBBQAAAAAAA0FJAAAAAAACAYUAAAAAAAIAmQAAAAAAAAElAAAAAAABAT0AAAAAAAIBhQAAAAAAAgDZAAAAAAACARkAAAAAAAIBLQAAAAAAAgGFAAAAAAAAAKUAAAAAAACBMQAAAAAAA4E9AAAAAAADgX0AAAAAAAAA0QAAAAAAAAERAAAAAAACAUUAAAAAAAEBgQAAAAAAAQDVAAAAAAAAASUAAAAAAAEBPQAAAAAAAoF5AAAAAAACANkAAAAAAAKBEQAAAAAAAYE1AAAAAAACQYEA=", "shape": "10, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=-70kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Christina Fr\u00f6hlich", "Lynn Narings", "Milana Popovic", "Nadine Schulz", "Florence Wong", "Sarah Anyamele", "Danae Morgan", "Caroline Vernier", "Karla Ramsden", "Axelle Ditacroute"], "legendgroup": "-70kg", "marker": {"color": "rgb(253,174,97)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "PxqXO1VTKUCuPawH9OsmQKfZ6VXiTSNASyRQAmQ7I0Cul3ODMXIiQM7vk0MbGCJAtWQ2lIlmIUC1ZDaUiWYhQNjGiKLTYiBADAbwkxAOIEA="}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "-70kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "Z2ZmZmYGUUAzMzMzMzNRQKNwPQrXA1FAo3A9CtcDUUCjcD0K1wNRQDMzMzMzE1FAZmZmZmbmUECjcD0K1wNRQAAAAAAA4FBAo3A9CtcDUUA="}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAADkcUAAAAAAAGxxQAAAAAAArHBAAAAAAACocEAAAAAAAHxwQAAAAAAAaHBAAAAAAABAcEAAAAAAAEBwQAAAAAAABHBAAAAAAADgb0A="}, "yaxis": "y", "type": "scatter"}, {"customdata": {"dtype": "f8", "bdata": "AAAAAAAAOUAAAAAAAABEQAAAAAAA4FBAAAAAAADwZEAAAAAAAAAeQAAAAAAAQEVAAAAAAADAUkAAAAAAALBjQAAAAAAAAClAAAAAAADgSkAAAAAAAABOQAAAAAAAgGFAAAAAAAAAAAAAAAAAAEBAQAAAAAAAQEpAAAAAAAAAZEAAAAAAAAAUQAAAAAAAwEJAAAAAAABASkAAAAAAACBiQAAAAAAAAARAAAAAAABARUAAAAAAAIBRQAAAAAAAQF9AAAAAAACAJkAAAAAAAKBJQAAAAAAAIE1AAAAAAABgXUAAAAAAAAAEQAAAAAAAgEFAAAAAAACAS0AAAAAAAEBgQAAAAAAAABRAAAAAAABAQEAAAAAAAABJQAAAAAAAQGBAAAAAAAAAKUAAAAAAAIBBQAAAAAAAAElAAAAAAAAAXkA=", "shape": "10, 4"}, "hovertemplate": "<b>%{hovertext}</b><br><br>Weight Class=+70kg<br>Body Weight (kg)=%{x}<br>Total Value=%{y}<br>size_value=%{marker.size}<br>muscle_up_value=%{customdata[0]}<br>pull_value=%{customdata[1]}<br>dip_value=%{customdata[2]}<br>squat_value=%{customdata[3]}<extra></extra>", "hovertext": ["Sarah Anyamele", "Maria Gajevskaja", "Claudia Van Osch", "Elena Paradiso", "Judith Kleinhansl", "Katerina Najmanov\u00e1", "Malgorzata Luckner", "Anastasija Odzic", "Anais Dethier", "Eva-Sophie M\u00f6rschel"], "legendgroup": "+70kg", "marker": {"color": "rgb(254,224,144)", "opacity": 0.7, "size": {"dtype": "f8", "bdata": "AAAAAAAALkDfV5YePRwoQKv4U0juKCNA6p2XvAMUG0CQhecb0r8YQJCF5xvSvxhAtNvgpA0wGEDOv9JOWrcRQAsIa1IgExBACwhrUiATEEA="}, "sizemode": "area", "sizeref": 0.0375, "symbol": "circle"}, "mode": "markers", "name": "+70kg", "orientation": "v", "showlegend": true, "x": {"dtype": "f8", "bdata": "3d3d3d3lUUDd3d3d3eVRQN3d3d3d5VFAmpmZmZkpUkAzMzMzM3NSQN3d3d3d5VFAZmZmZmamUUBmZmZmZoZRQJqZmZmZ2VFAAAAAAADAUUA="}, "xaxis": "x", "y": {"dtype": "f8", "bdata": "AAAAAADAckAAAAAAAKhxQAAAAAAApHBAAAAAAACgbkAAAAAAAABuQAAAAAAAAG5AAAAAAADYbUAAAAAAANBrQAAAAAAAMGtAAAAAAAAwa0A="}, "yaxis": "y", "type": "scatter"}, {"hovertemplate": "Body Weight: %{x:.1f} kg<br>Predicted Total: %{y:.1f}<extra></extra>", "line": {"color": "white", "dash": "solid", "width": 3}, "mode": "lines", "name": "Trend", "x": {"dtype": "f8", "bdata": "AAAAwMxMREA++OCDp4REQHzwwUeCvERAuuiiC130RED44IPPNyxFQDbZZJMSZEVAdNFFV+2bRUCyySYbyNNFQPDBB9+iC0ZAL7roon1DRkBtsslmWHtGQKuqqiozs0ZA6aKL7g3rRkAnm2yy6CJHQGWTTXbDWkdAo4suOp6SR0Dhgw/+eMpHQB988MFTAkhAXXTRhS46SECbbLJJCXJIQNlkkw3kqUhAF1100b7hSEBWVVWVmRlJQJRNNll0UUlA0kUXHU+JSUAQPvjgKcFJQE422aQE+UlAjC66aN8wSkDKJpssumhKQAgffPCUoEpARhddtG/YSkCEDz54ShBLQMIHHzwlSEtAAAAAAACAS0A++ODD2rdLQHzwwYe170tAuuiiS5AnTED44IMPa19MQDbZZNNFl0xAdNFFlyDPTECyySZb+wZNQPDBBx/WPk1ALrro4rB2TUBsssmmi65NQKuqqmpm5k1A6aKLLkEeTkAnm2zyG1ZOQGWTTbb2jU5Ao4suetHFTkDhgw8+rP1OQB988AGHNU9AXXTRxWFtT0CbbLKJPKVPQNpkk00X3U9AjC66CHkKUECrqqpqZiZQQMomm8xTQlBA6aKLLkFeUEAIH3yQLnpQQCebbPIbllBARhddVAmyUEBlk0229s1QQIQPPhjk6VBAo4suetEFUUDCBx/cviFRQOGDDz6sPVFAAAAAoJlZUUAffPABh3VRQD744GN0kVFAXXTRxWGtUUB88MEnT8lRQJtssok85VFAuuii6ykBUkDZZJNNFx1SQPjgg68EOVJAGF10EfJUUkA22WRz33BSQFZVVdXMjFJAdNFFN7qoUkCUTTaZp8RSQLLJJvuU4FJA0kUXXYL8UkDwwQe/bxhTQBA++CBdNFNALrrogkpQU0BONtnkN2xTQGyyyUYliFNAjC66qBKkU0CrqqoKAMBTQMomm2zt21NA6aKLztr3U0AIH3wwyBNUQCebbJK1L1RARhdd9KJLVEBlk01WkGdUQIQPPrh9g1RAo4suGmufVEDCBx98WLtUQOGDD95F11RAAAAAQDPzVEA="}, "y": {"dtype": "f8", "bdata": "xFdfGNDTZkBsDH6BR/RmQGNza80QFmdAAnOfUS45Z0Az8QkjoV1nQK/Q7Ppog2dAxGwBHYSqZ0CpT3M/79JnQHB9QHWl/GdAGz6TG6AnaEDCQ6nK1lNoQCPe10o/gWhAnD00js2vaEAaUlmvc99oQE+BsvUhEGlANGCb38ZBaUDgJYkyT3RpQFxEUxGmp2lAK0WOGLXbaUDgtseAZBBqQPLYTEabRWpAQhUBVj97akBYnqa+NbFqQHUY3OVi52pAgFf3v6oda0CMGdAJ8VNrQDoqf4MZimtAUioPKwjAa0BZoxx2ofVrQKATa4nKKmxAruCDbWlfbECc7ok/ZZNsQFgIiF2mxmxALiOgjRb5bECch6QfoSptQA6nyAgzW21ARH88+bqKbUA8kqlrKbltQKZ+qq5w5m1ARit16IQSbkAOdwoVXD1uQFfsVP/tZm5Agr2xNTSPbkApPmz6KbZuQEk3vDDM225AgCbbRhkAb0AeGcQdESNvQIrlLe+0RG9AS5pIMgdlb0AOq71/C4RvQLhIZ3XGoW9AXfwmmj2+b0DOkjZCd9lvQDweQXR6829AVlnCZycGcEC1bZg5/hFwQK7ulPNFHXBAtO0mAwMocED8fyf1OTJwQLB9lmzvO3BA3DwoGihFcEDLU6K06E1wQFq1AvI1VnBAAERqgRRecEBYPMIFiWVwQGiJEhGYbHBAgih+IEZzcED1KtqYl3lwQIOV08OQf3BA0EyYzTWFcEDWX/fCiopwQEZM7Y+Tj3BAmkOR/lOUcECg+li2z5hwQJ4hqTsKnXBAMUOp7wahcECAblIQyaRwQHu6sLhTqHBAIFhQ4amrcEC6js9gzq5wQE6cj+zDsXBAGg1/GY20cEA1rfhcLLdwQBC/sg2kuXBA85+6ZPa7cECAeHl+Jb5wQOwCv1szwHBAJNPP4iHCcEBu5nTg8sNwQIWRCgmoxXBA3iyN+ULHcECSIKI4xchwQLgrnDcwynBABPd5U4XLcEBxMN7VxcxwQDiWAPbyzXBA0nqX2Q3PcECqarmVF9BwQBK3ti8R0XBACMHqnfvRcEA="}, "type": "scatter"}], "layout": {"template": {"data": {"barpolar": [{"marker": {"line": {"color": "rgb(17,17,17)", "width": 0.5}, "pattern": {"fillmode": "overlay", "size": 10, "solidity": 0.2}}, "type": "barpolar"}], "bar": [{"error_x": {"color": "#f2f5fa"}, "error_y": {"color": "#f2f5fa"}, "marker": {"line": {"color": "rgb(17,17,17)", "width": 0.5}, "pattern": {"fillmode": "overlay", "size": 10, "solidity": 0.2}}, "type": "bar"}], "carpet": [{"aaxis": {"endlinecolor": "#A2B1C6", "gridcolor": "#506784", "linecolor": "#506784", "minorgridcolor": "#506784", "startlinecolor": "#A2B1C6"}, "baxis": {"endlinecolor": "#A2B1C6", "gridcolor": "#506784", "linecolor": "#506784", "minorgridcolor": "#506784", "startlinecolor": "#A2B1C6"}, "type": "carpet"}], "choropleth": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "choropleth"}], "contourcarpet": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "contourcarpet"}], "contour": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "contour"}], "heatmap": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "heatmap"}], "histogram2dcontour": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "histogram2dcontour"}], "histogram2d": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "histogram2d"}], "histogram": [{"marker": {"pattern": {"fillmode": "overlay", "size": 10, "solidity": 0.2}}, "type": "histogram"}], "mesh3d": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "type": "mesh3d"}], "parcoords": [{"line": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "parcoords"}], "pie": [{"automargin": true, "type": "pie"}], "scatter3d": [{"line": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatter3d"}], "scattercarpet": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattercarpet"}], "scattergeo": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattergeo"}], "scattergl": [{"marker": {"line": {"color": "#283442"}}, "type": "scattergl"}], "scattermapbox": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattermapbox"}], "scattermap": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scattermap"}], "scatterpolargl": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterpolargl"}], "scatterpolar": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterpolar"}], "scatter": [{"marker": {"line": {"color": "#283442"}}, "type": "scatter"}], "scatterternary": [{"marker": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "type": "scatterternary"}], "surface": [{"colorbar": {"outlinewidth": 0, "ticks": ""}, "colorscale": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "type": "surface"}], "table": [{"cells": {"fill": {"color": "#506784"}, "line": {"color": "rgb(17,17,17)"}}, "header": {"fill": {"color": "#2a3f5f"}, "line": {"color": "rgb(17,17,17)"}}, "type": "table"}]}, "layout": {"annotationdefaults": {"arrowcolor": "#f2f5fa", "arrowhead": 0, "arrowwidth": 1}, "autotypenumbers": "strict", "coloraxis": {"colorbar": {"outlinewidth": 0, "ticks": ""}}, "colorscale": {"diverging": [[0, "#8e0152"], [0.1, "#c51b7d"], [0.2, "#de77ae"], [0.3, "#f1b6da"], [0.4, "#fde0ef"], [0.5, "#f7f7f7"], [0.6, "#e6f5d0"], [0.7, "#b8e186"], [0.8, "#7fbc41"], [0.9, "#4d9221"], [1, "#276419"]], "sequential": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]], "sequentialminus": [[0.0, "#0d0887"], [0.1111111111111111, "#46039f"], [0.2222222222222222, "#7201a8"], [0.3333333333333333, "#9c179e"], [0.4444444444444444, "#bd3786"], [0.5555555555555556, "#d8576b"], [0.6666666666666666, "#ed7953"], [0.7777777777777778, "#fb9f3a"], [0.8888888888888888, "#fdca26"], [1.0, "#f0f921"]]}, "colorway": ["#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52"], "font": {"color": "#f2f5fa"}, "geo": {"bgcolor": "rgb(17,17,17)", "lakecolor": "rgb(17,17,17)", "landcolor": "rgb(17,17,17)", "showlakes": true, "showland": true, "subunitcolor": "#506784"}, "hoverlabel": {"align": "left"}, "hovermode": "closest", "mapbox": {"style": "dark"}, "paper_bgcolor": "rgb(17,17,17)", "plot_bgcolor": "rgb(17,17,17)", "polar": {"angularaxis": {"gridcolor": "#506784", "linecolor": "#506784", "ticks": ""}, "bgcolor": "rgb(17,17,17)", "radialaxis": {"gridcolor": "#506784", "linecolor": "#506784", "ticks": ""}}, "scene": {"xaxis": {"backgroundcolor": "rgb(17,17,17)", "gridcolor": "#506784", "gridwidth": 2, "linecolor": "#506784", "showbackground": true, "ticks": "", "zerolinecolor": "#C8D4E3"}, "yaxis": {"backgroundcolor": "rgb(17,17,17)", "gridcolor": "#506784", "gridwidth": 2, "linecolor": "#506784", "showbackground": true, "ticks": "", "zerolinecolor": "#C8D4E3"}, "zaxis": {"backgroundcolor": "rgb(17,17,17)", "gridcolor": "#506784", "gridwidth": 2, "linecolor": "#506784", "showbackground": true, "ticks": "", "zerolinecolor": "#C8D4E3"}}, "shapedefaults": {"line": {"color": "#f2f5fa"}}, "sliderdefaults": {"bgcolor": "#C8D4E3", "bordercolor": "rgb(17,17,17)", "borderwidth": 1, "tickwidth": 0}, "ternary": {"aaxis": {"gridcolor": "#506784", "linecolor": "#506784", "ticks": ""}, "baxis": {"gridcolor": "#506784", "linecolor": "#506784", "ticks": ""}, "bgcolor": "rgb(17,17,17)", "caxis": {"gridcolor": "#506784", "linecolor": "#506784", "ticks": ""}}, "title": {"x": 0.05}, "updatemenudefaults": {"bgcolor": "#506784", "borderwidth": 0}, "xaxis": {"automargin": true, "gridcolor": "#283442", "linecolor": "#506784", "ticks": "", "title": {"standoff": 15}, "zerolinecolor": "#283442", "zerolinewidth": 2}, "yaxis": {"automargin": true, "gridcolor": "#283442", "linecolor": "#506784", "ticks": "", "title": {"standoff": 15}, "zerolinecolor": "#283442", "zerolinewidth": 2}}}, "xaxis": {"anchor": "y", "domain": [0.0, 1.0], "title": {"text": "Body Weight (kg)"}, "fixedrange": true}, "yaxis": {"anchor": "x", "domain": [0.0, 1.0], "title": {"text": "Total Value"}, "fixedrange": true}, "legend": {"title": {"text": "Weight Class"}, "tracegroupgap": 0, "itemsizing": "constant", "orientation": "h", "yanchor": "bottom", "y": -0.25, "xanchor": "right", "x": 1}, "title": {"text": "Women", "x": 0.5}, "margin": {"l": 0, "r": 0, "t": 30, "b": 0}, "paper_bgcolor": "#0F0F0F", "plot_bgcolor": "#0F0F0F"}};
// Configuration for both plots
const config = {
responsive: true,
displaylogo: false,
displayModeBar: false
};
// Check for data and render plots
if (Object.keys(menData).length > 0) {
Plotly.newPlot('men-plot', menData.data, menData.layout, config);
} else {
document.getElementById('men-plot').innerHTML =
'<div class="flex h-full items-center justify-center"><p>No data available</p></div>';
}
if (Object.keys(womenData).length > 0) {
Plotly.newPlot('women-plot', womenData.data, womenData.layout, config);
} else {
document.getElementById('women-plot').innerHTML =
'<div class="flex h-full items-center justify-center"><p>No data available</p></div>';
}
// RIS Calculator functionality
const totalInput = document.getElementById('total-input');
const bodyweightInput = document.getElementById('bodyweight-input');
const calculateBtn = document.getElementById('calculate-btn');
const risResult = document.getElementById('ris-result');
// Calculate RIS score
calculateBtn.addEventListener('click', function() {
const gender = document.querySelector('input[name="gender"]:checked').value;
const bodyweight = parseFloat(bodyweightInput.value) || 0;
const total = parseFloat(totalInput.value) || 0;
if (bodyweight <= 0 || total <= 0) {
risResult.textContent = '0.00';
return;
}
let risScore;
if (gender === 'male') {
// Calculate using men constants from ris.js
risScore = risIndex(bodyweight,
men_const[0],
men_const[1],
men_const[2],
men_const[3],
men_const[4]) * total;
} else {
// Calculate using women constants from ris.js
risScore = risIndex(bodyweight,
women_const[0],
women_const[1],
women_const[2],
women_const[3],
women_const[4]) * total;
}
risResult.textContent = risScore.toFixed(2);
});
// Populate constants table from ris.js
if (typeof men_const !== 'undefined' && typeof women_const !== 'undefined') {
const table = document.getElementById('constants-table');
const tbody = table.querySelector('tbody');
// Labels for the constants
const labels = ['A', 'K', 'B', 'v', 'Q'];
// Create a row for each constant
for (let i = 0; i < 5; i++) {
const row = document.createElement('tr');
row.className = 'border-t border-dark-300';
// Constant name
const nameCell = document.createElement('td');
nameCell.className = 'py-2 text-gray-300';
nameCell.textContent = labels[i];
row.appendChild(nameCell);
// Men value
const menCell = document.createElement('td');
menCell.className = 'py-2 text-gray-300';
menCell.textContent = men_const[i];
row.appendChild(menCell);
// Women value
const womenCell = document.createElement('td');
womenCell.className = 'py-2 text-gray-300';
womenCell.textContent = women_const[i];
row.appendChild(womenCell);
tbody.appendChild(row);
}
// Generate Excel formula for men
const excelMenFormula = `=B2*100/(${men_const[0]}+(${men_const[1]}-${men_const[0]})/(1+${men_const[4]}*EXP(-${men_const[2]}*(A2-${men_const[3]}))))`;
document.getElementById('excel-men-formula').textContent = excelMenFormula;
// Generate Excel formula for women
const excelWomenFormula = `=B2*100/(${women_const[0]}+(${women_const[1]}-${women_const[0]})/(1+${women_const[4]}*EXP(-${women_const[2]}*(A2-${women_const[3]}))))`;
document.getElementById('excel-women-formula').textContent = excelWomenFormula;
// Generate Google Sheets code
const googleSheetsCode = `/**
* Calculates RIS score for male athletes
*
* @param {number} bodyweight The athlete's body weight in kg
* @param {number} total The total weight lifted in kg
* @return {number} The RIS score
* @customfunction
*/
function RIS_MEN(bodyweight, total) {
var A = ${men_const[0]};
var K = ${men_const[1]};
var B = ${men_const[2]};
var v = ${men_const[3]};
var Q = ${men_const[4]};
return total * 100 / (A + (K - A) / (1 + Q * Math.exp(-B * (bodyweight - v))));
}
/**
* Calculates RIS score for female athletes
*
* @param {number} bodyweight The athlete's body weight in kg
* @param {number} total The total weight lifted in kg
* @return {number} The RIS score
* @customfunction
*/
function RIS_WOMEN(bodyweight, total) {
var A = ${women_const[0]};
var K = ${women_const[1]};
var B = ${women_const[2]};
var v = ${women_const[3]};
var Q = ${women_const[4]};
return total * 100 / (A + (K - A) / (1 + Q * Math.exp(-B * (bodyweight - v))));
}`;
document.getElementById('google-sheets-code').textContent = googleSheetsCode;
// Initialize syntax highlighting
hljs.highlightAll();
// Setup copy buttons
const copyButtons = document.querySelectorAll('.copy-button');
copyButtons.forEach(button => {
button.addEventListener('click', function() {
const targetId = this.getAttribute('data-target');
const codeElement = document.getElementById(targetId);
const textToCopy = codeElement.textContent;
navigator.clipboard.writeText(textToCopy).then(() => {
// Change button text to indicate successful copy
const originalText = this.textContent;
this.textContent = 'Copied!';
this.style.background = '#10B981'; // Success green
// Reset button text after a moment
setTimeout(() => {
this.textContent = originalText;
this.style.background = '';
}, 2000);
});
});
});
}
});
</script>
<script>
// Add this to your existing DOMContentLoaded event listener or create a new one
document.addEventListener('DOMContentLoaded', function() {
// FAQ toggle functionality
const faqToggles = document.querySelectorAll('.faq-toggle');
faqToggles.forEach(toggle => {
toggle.addEventListener('click', function() {
const content = this.nextElementSibling;
const icon = this.querySelector('.faq-icon');
// Toggle content visibility
content.classList.toggle('hidden');
// Rotate the icon when expanded
if (content.classList.contains('hidden')) {
icon.classList.remove('rotate-180');
} else {
icon.classList.add('rotate-180');
}
});
});
});
</script>
<!-- Add this script for navigation functionality -->
<script>
document.addEventListener('DOMContentLoaded', function() {
// Mobile menu toggle
const mobileNavButton = document.getElementById('mobile-nav-button');
const mobileNavMenu = document.getElementById('mobile-nav-menu');
const mobileNavIcon = document.getElementById('mobile-nav-icon');
if (mobileNavButton && mobileNavMenu) {
mobileNavButton.addEventListener('click', function() {
mobileNavMenu.classList.toggle('hidden');
mobileNavIcon.classList.toggle('rotate-180');
});
}
// Get all navigation links
const navLinks = document.querySelectorAll('.nav-link, #mobile-nav-menu a');
// Smooth scrolling functionality
navLinks.forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
// Hide mobile menu after clicking
if (mobileNavMenu) {
mobileNavMenu.classList.add('hidden');
if (mobileNavIcon) mobileNavIcon.classList.remove('rotate-180');
}
// Get the target section
const targetId = this.getAttribute('href');
const targetSection = document.querySelector(targetId);
if (targetSection) {
// Scroll to the section
window.scrollTo({
top: targetSection.offsetTop - 20,
behavior: 'smooth'
});
// Update active link
navLinks.forEach(link => link.classList.remove('text-white', 'font-medium'));
this.classList.add('text-white', 'font-medium');
}
});
});
// Highlight current section on scroll
function highlightCurrentSection() {
const sections = document.querySelectorAll('#intro, #calculator, #data-analysis, #visualization, #integration, #faq');
let currentSectionId = '';
sections.forEach(section => {
const sectionTop = section.offsetTop;
const sectionHeight = section.offsetHeight;
if (window.scrollY >= (sectionTop - 100) && window.scrollY < (sectionTop + sectionHeight - 100)) {
currentSectionId = '#' + section.getAttribute('id');
}
});
navLinks.forEach(link => {
if (link.getAttribute('href') === currentSectionId) {
link.classList.add('text-white', 'font-medium');
link.classList.remove('text-gray-300');
} else {
link.classList.remove('text-white', 'font-medium');
link.classList.add('text-gray-300');
}
});
}
// Check active section on scroll
window.addEventListener('scroll', highlightCurrentSection);
// Initialize active section
highlightCurrentSection();
});
</script>
</body>
</html>