I created a easy to use online react bakers hydration sheet. Just enter your desired state for hydration, how many pizza of what size, I even put the poolish part in for you!
Dough Hydration Calculator
Use this calculator to determine the hydration level of your bread dough.
Advanced Pizza Dough Calculator
Results:
Total Dough Weight: 1440.00 g
Flour Needed (Final Dough): 527.59 g
Water Needed (Final Dough): 312.41 g
Poolish Flour: 300.00 g
Poolish Water: 300.00 g
Salt Amount: 28.80 g
So lets look at that code
First we'll look at the component code:
import React, { useState } from 'react';
const AdvancedDoughCalculator: React.FC = () => {
const [hydration, setHydration] = useState<number>(74); // Desired hydration %
const [ballWeight, setBallWeight] = useState<number>(240); // Weight of each dough ball
const [ballCount, setBallCount] = useState<number>(6); // Number of dough balls
const [poolishAmount, setPoolishAmount] = useState<number>(600); // Amount of poolish
const [poolishHydration, setPoolishHydration] = useState<number>(100); // Poolish hydration %
const [saltPercentage, setSaltPercentage] = useState<number>(2); // Salt percentage of final dough weight
// Calculate total dough weight
const totalDoughWeight = ballWeight * ballCount;
// Poolish calculations
const flourNeededForPoolish = poolishAmount / (1 + poolishHydration / 100);
const waterNeededForPoolish = poolishAmount - flourNeededForPoolish;
// Final dough flour and water calculations after accounting for poolish
const targetFlourWeight = totalDoughWeight / (1 + hydration / 100);
const targetWaterWeight = totalDoughWeight - targetFlourWeight;
const finalFlour = targetFlourWeight - flourNeededForPoolish;
const finalWater = targetWaterWeight - waterNeededForPoolish;
// Calculate salt based on final dough weight
const saltAmount = (totalDoughWeight * saltPercentage) / 100;
return (
<div style={styles.container}>
<h3 style={styles.title}>Advanced Pizza Dough Calculator</h3>
<label style={styles.label}>
Desired Hydration (%)
<input
type="number"
value={hydration}
onChange={(e) => setHydration(Number(e.target.value))}
style={styles.input}
/>
</label>
<label style={styles.label}>
Dough Ball Weight (g)
<input
type="number"
value={ballWeight}
onChange={(e) => setBallWeight(Number(e.target.value))}
style={styles.input}
/>
</label>
<label style={styles.label}>
Number of Dough Balls
<input
type="number"
value={ballCount}
onChange={(e) => setBallCount(Number(e.target.value))}
style={styles.input}
/>
</label>
<label style={styles.label}>
Poolish Amount (g)
<input
type="number"
value={poolishAmount}
onChange={(e) => setPoolishAmount(Number(e.target.value))}
style={styles.input}
/>
</label>
<label style={styles.label}>
Poolish Hydration (%)
<input
type="number"
value={poolishHydration}
onChange={(e) => setPoolishHydration(Number(e.target.value))}
style={styles.input}
/>
</label>
<label style={styles.label}>
Salt Percentage (% of Total Dough Weight)
<input
type="number"
value={saltPercentage}
onChange={(e) => setSaltPercentage(Number(e.target.value))}
style={styles.input}
/>
</label>
<div style={styles.results}>
<h4 style={styles.resultTitle}>Results:</h4>
<p style={styles.resultText}>Total Dough Weight: <strong>{totalDoughWeight.toFixed(2)} g</strong></p>
<p style={styles.resultText}>Flour Needed (Final Dough): <strong>{finalFlour.toFixed(2)} g</strong></p>
<p style={styles.resultText}>Water Needed (Final Dough): <strong>{finalWater.toFixed(2)} g</strong></p>
<p style={styles.resultText}>Poolish Flour: <strong>{flourNeededForPoolish.toFixed(2)} g</strong></p>
<p style={styles.resultText}>Poolish Water: <strong>{waterNeededForPoolish.toFixed(2)} g</strong></p>
<p style={styles.resultText}>Salt Amount: <strong>{saltAmount.toFixed(2)} g</strong></p>
</div>
</div>
);
};
const styles = {
container: {
padding: '2rem',
borderRadius: '12px',
boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',
background: 'linear-gradient(135deg, #f8f9fa, #e9ecef)',
fontFamily: 'Arial, sans-serif',
maxWidth: '500px',
margin: '0 auto',
textAlign: 'center' as const,
},
title: {
fontSize: '1.5rem',
fontWeight: 'bold' as const,
color: '#343a40',
marginBottom: '1rem',
},
label: {
display: 'flex',
flexDirection: 'column' as const,
alignItems: 'center',
fontSize: '1rem',
margin: '0.5rem 0',
color: '#495057',
},
input: {
marginTop: '0.3rem',
padding: '0.5rem',
fontSize: '1rem',
borderRadius: '8px',
border: '1px solid #ced4da',
width: '100%',
maxWidth: '200px',
boxShadow: 'inset 0 2px 5px rgba(0, 0, 0, 0.1)',
},
results: {
marginTop: '1.5rem',
padding: '1rem',
background: '#f1f3f5',
borderRadius: '10px',
},
resultTitle: {
fontSize: '1.25rem',
color: '#212529',
marginBottom: '0.5rem',
},
resultText: {
fontSize: '1rem',
color: '#495057',
},
};
export default AdvancedDoughCalculator;
and then we use it in the .mdx
file like so:
import DoughHydrationCalculator from "@site/src/components/DoughHydrationCalculator";
# Dough Hydration Calculator
Use this calculator to determine the hydration level of your bread dough.
<DoughHydrationCalculator />
Easy!
Ok, I better stop playing with React now and gt back to the day job :P