<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sauce on Recipe Book</title><link>https://recipes.uuard.com/categories/sauce/</link><description>Recent content in Sauce on Recipe Book</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://recipes.uuard.com/categories/sauce/index.xml" rel="self" type="application/rss+xml"/><item><title>Alkaline Soy Meat Marinade</title><link>https://recipes.uuard.com/docs/recipes/alkaline_soy_meat_marinade/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/alkaline_soy_meat_marinade/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.38000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light&lt;/td&gt;
 &lt;td&gt;6.38&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.10000000"
 
 &gt;
 &lt;td&gt;Baking Soda&lt;/td&gt;
 &lt;td&gt;1.10&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;107.48&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine.&lt;/li&gt;
&lt;li&gt;Mix until dissolved.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Brine chicken breast filets 24 hr.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Apricot Glaze</title><link>https://recipes.uuard.com/docs/recipes/apricot_glaze/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/apricot_glaze/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Apricot Jam&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="apricot_jam"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Apricot Jam&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="100.00000000"
 
 &gt;
 &lt;td&gt;Corn Syrup&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="68.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;68.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="32.00000000"
 
 &gt;
 &lt;td&gt;Lemon Juice&lt;/td&gt;
 &lt;td&gt;32.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="4.10000000"
 
 &gt;
 &lt;td&gt;Gelatin, Granulated&lt;/td&gt;
 &lt;td&gt;4.10&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;304.10&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Bloom gelatin in cold water, then melt.&lt;/li&gt;
&lt;li&gt;Combine syrup, lemon juice, jam in saucepan and boil.&lt;/li&gt;
&lt;li&gt;Blend in melted gelatin.&lt;/li&gt;
&lt;li&gt;Cool glaze to 75 °F, strain and use immediately.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Beer Cheese</title><link>https://recipes.uuard.com/docs/recipes/beer_cheese/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/beer_cheese/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Cheese Blend (White Cheddar, Sharp, Parmesan)&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="cheese_blend_white_cheddar_sharp_parmesan"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Cheese Blend (White Cheddar, Sharp, Parmesan)&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="100.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Beer&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="13.00000000"
 
 &gt;
 &lt;td&gt;Fat&lt;/td&gt;
 &lt;td&gt;13.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="12.50000000"
 
 &gt;
 &lt;td&gt;Nonfat Milk Powder&lt;/td&gt;
 &lt;td&gt;12.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.20000000"
 
 &gt;
 &lt;td&gt;Corn Starch&lt;/td&gt;
 &lt;td&gt;2.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.00000000"
 
 &gt;
 &lt;td&gt;Sodium Citrate&lt;/td&gt;
 &lt;td&gt;2.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.13000000"
 
 &gt;
 &lt;td&gt;Onion Powder&lt;/td&gt;
 &lt;td&gt;0.13&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.13000000"
 
 &gt;
 &lt;td&gt;Garlic Powder&lt;/td&gt;
 &lt;td&gt;0.13&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.13000000"
 
 &gt;
 &lt;td&gt;Black Pepper, Ground&lt;/td&gt;
 &lt;td&gt;0.13&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;281.09&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine, dissolve cold! water, beer, milk powder, corn starch, sodium citrate.&lt;/li&gt;
&lt;li&gt;Heat to simmer (205+ °F).&lt;/li&gt;
&lt;li&gt;Remove from heat.&lt;/li&gt;
&lt;li&gt;Mix in cheese, in small pieces, one at a time.&lt;/li&gt;
&lt;li&gt;Add oil, whisk smooth.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Xanthan gum for room temp dip.&lt;/li&gt;
&lt;li&gt;Corn starch for thin queso dip.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Benihana Yum Yum Sauce</title><link>https://recipes.uuard.com/docs/recipes/benihana_yum_yum_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/benihana_yum_yum_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="57.00000000"
 
 &gt;
 &lt;td&gt;Heavy Cream&lt;/td&gt;
 &lt;td&gt;57.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="25.00000000"
 
 &gt;
 &lt;td&gt;Butter Flavored Shortening&lt;/td&gt;
 &lt;td&gt;25.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="11.00000000"
 
 &gt;
 &lt;td&gt;Ketchup&lt;/td&gt;
 &lt;td&gt;11.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="9.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;9.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.66000000"
 
 &gt;
 &lt;td&gt;Paprika&lt;/td&gt;
 &lt;td&gt;0.66&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.50000000"
 
 &gt;
 &lt;td&gt;Garlic Powder&lt;/td&gt;
 &lt;td&gt;0.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.33000000"
 
 &gt;
 &lt;td&gt;Black Pepper, Ground&lt;/td&gt;
 &lt;td&gt;0.33&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;204.49&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine mayonnaise, whipping cream, ketchup.&lt;/li&gt;
&lt;li&gt;Combine spices.&lt;/li&gt;
&lt;li&gt;Melt shortening in bowl.&lt;/li&gt;
&lt;li&gt;Add all to shortening bowl.&lt;/li&gt;
&lt;li&gt;Whisk until smooth.&lt;/li&gt;
&lt;li&gt;Refridgerate overnight.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Buttercream</title><link>https://recipes.uuard.com/docs/recipes/buttercream/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/buttercream/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Confectioners&amp;#39; Sugar&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="confectioners_sugar"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Confectioners&amp;#39; Sugar&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="40.00000000"
 
 &gt;
 &lt;td&gt;Butter&lt;/td&gt;
 &lt;td&gt;40.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="20.00000000"
 
 &gt;
 &lt;td&gt;Shortening&lt;/td&gt;
 &lt;td&gt;20.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="7.50000000"
 
 &gt;
 &lt;td&gt;Egg, Whole&lt;/td&gt;
 &lt;td&gt;7.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.60000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;0.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.40000000"
 
 &gt;
 &lt;td&gt;Lemon Juice&lt;/td&gt;
 &lt;td&gt;0.40&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;168.50&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Using paddle attachment, cream together butter, shortening, sugar until well-blended.&lt;/li&gt;
&lt;li&gt;Add liquids, blend on medium.&lt;/li&gt;
&lt;li&gt;Blend in more liquid for softer buttercream.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Caramel Sauce</title><link>https://recipes.uuard.com/docs/recipes/caramel_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/caramel_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Sugar&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="sugar"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="38.60000000"
 
 &gt;
 &lt;td&gt;Butter&lt;/td&gt;
 &lt;td&gt;38.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="36.00000000"
 
 &gt;
 &lt;td&gt;Heavy Cream&lt;/td&gt;
 &lt;td&gt;36.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="26.80000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;26.80&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="18.60000000"
 
 &gt;
 &lt;td&gt;Corn Syrup&lt;/td&gt;
 &lt;td&gt;18.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="4.54000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;4.54&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.50000000"
 
 &gt;
 &lt;td&gt;Kosher Salt&lt;/td&gt;
 &lt;td&gt;2.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;227.04&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;In saucepan, combine water, sugar, corn syrup.&lt;/li&gt;
&lt;li&gt;Mix well.&lt;/li&gt;
&lt;li&gt;Add medium heat.&lt;/li&gt;
&lt;li&gt;Stir until sugar dissolves and liquid is clear.&lt;/li&gt;
&lt;li&gt;Only swirl henceforth to prevent crystals.&lt;/li&gt;
&lt;li&gt;Once begin to color, swirl often to prevent local caramelization.&lt;/li&gt;
&lt;li&gt;Heat to ≈390 °F, dark golden, until first whisps of smoke.&lt;/li&gt;
&lt;li&gt;Halt cooking immediately, remove from heat.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;220 g sugar makes 2 c. caramel.&lt;/li&gt;
&lt;li&gt;Modifications:&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;original recipe 4.36% kosher salt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;changed to 2.5% (better).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Chick-fil-A Sauce</title><link>https://recipes.uuard.com/docs/recipes/chick_fil_a_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/chick_fil_a_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="62.00000000"
 
 &gt;
 &lt;td&gt;Hickory Smoke Bbq Sauce&lt;/td&gt;
 &lt;td&gt;62.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="17.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;17.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="9.50000000"
 
 &gt;
 &lt;td&gt;Yellow Mustard&lt;/td&gt;
 &lt;td&gt;9.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;188.50&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all with whisk.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Chili's Avocado Ranch</title><link>https://recipes.uuard.com/docs/recipes/chilis_avocado_ranch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/chilis_avocado_ranch/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Ranch&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="ranch"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Ranch&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Guacamole&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.70000000"
 
 &gt;
 &lt;td&gt;Lime Juice&lt;/td&gt;
 &lt;td&gt;6.70&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;156.70&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Blend.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 qt ranch.&lt;/li&gt;
&lt;li&gt;2 cup guacamole.&lt;/li&gt;
&lt;li&gt;1/4 cup. lime juice.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Chocolate Ganache</title><link>https://recipes.uuard.com/docs/recipes/chocolate_ganache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/chocolate_ganache/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Dark Chocolate&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="dark_chocolate"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Dark Chocolate&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="105.00000000"
 
 &gt;
 &lt;td&gt;Heavy Cream&lt;/td&gt;
 &lt;td&gt;105.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;205.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Heat heavy cream to 100 °F.&lt;/li&gt;
&lt;li&gt;Pour over chocolate chips, stirring.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Chow Mein Sauce</title><link>https://recipes.uuard.com/docs/recipes/chow_mein_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/chow_mein_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Oyster Sauce&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="oyster_sauce"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Oyster Sauce&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="52.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light&lt;/td&gt;
 &lt;td&gt;52.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="52.00000000"
 
 &gt;
 &lt;td&gt;Shaoxing Wine&lt;/td&gt;
 &lt;td&gt;52.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="52.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;52.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="35.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Dark&lt;/td&gt;
 &lt;td&gt;35.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="27.60000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;27.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="10.00000000"
 
 &gt;
 &lt;td&gt;Sesame Oil&lt;/td&gt;
 &lt;td&gt;10.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="10.00000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;10.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.50000000"
 
 &gt;
 &lt;td&gt;Msg&lt;/td&gt;
 &lt;td&gt;3.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;White Pepper&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;343.10&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;100 g sauce / 120 g dry noodle.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Cream Cheese Icing</title><link>https://recipes.uuard.com/docs/recipes/cream_cheese_icing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/cream_cheese_icing/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Confectioners&amp;#39; Sugar&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="confectioners_sugar"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Confectioners&amp;#39; Sugar&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="60.00000000"
 
 &gt;
 &lt;td&gt;Cream Cheese&lt;/td&gt;
 &lt;td&gt;60.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.60000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;0.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.40000000"
 
 &gt;
 &lt;td&gt;Lemon Juice&lt;/td&gt;
 &lt;td&gt;0.40&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;161.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Paddle cream cheese, sugar until well blended.&lt;/li&gt;
&lt;li&gt;Add liquids, blend on medium until light, fluffy.&lt;/li&gt;
&lt;li&gt;Blend in more liquid for softer buttercream.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Cuban Mustard Mayo</title><link>https://recipes.uuard.com/docs/recipes/cuban_mustard_mayo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/cuban_mustard_mayo/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="33.00000000"
 
 &gt;
 &lt;td&gt;Mustard&lt;/td&gt;
 &lt;td&gt;33.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;133.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Mix.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Can increase mustard to 50%, 33% is a minimum.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Domino's Garlic Oil Blend</title><link>https://recipes.uuard.com/docs/recipes/dominos_garlic_oil_blend/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/dominos_garlic_oil_blend/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Butter Flavored Shortening&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="butter_flavored_shortening"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Butter Flavored Shortening&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="8.00000000"
 
 &gt;
 &lt;td&gt;Butter Flavored Oil&lt;/td&gt;
 &lt;td&gt;8.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.60000000"
 
 &gt;
 &lt;td&gt;Parmesan Cheese&lt;/td&gt;
 &lt;td&gt;5.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.60000000"
 
 &gt;
 &lt;td&gt;Garlic, Dehydrated&lt;/td&gt;
 &lt;td&gt;5.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="4.65000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;4.65&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.20000000"
 
 &gt;
 &lt;td&gt;Lecithin&lt;/td&gt;
 &lt;td&gt;1.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.60000000"
 
 &gt;
 &lt;td&gt;Parsley&lt;/td&gt;
 &lt;td&gt;0.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.04000000"
 
 &gt;
 &lt;td&gt;Msg&lt;/td&gt;
 &lt;td&gt;0.04&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.02000000"
 
 &gt;
 &lt;td&gt;Citric Acid&lt;/td&gt;
 &lt;td&gt;0.02&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;125.71&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine and blend all except parsley.&lt;/li&gt;
&lt;li&gt;Add parsley.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;The combination of solid fat (shortening) and liquid fat (oil) is done to match the consistency of &lt;em&gt;Phase Original Liquid Butter Alternative&lt;/em&gt;. One may notice that, after a time, the liquid garlic oil cools and transitions to a semisolid on the pizza box, leaving behind a kind of grainy goop.&lt;/p&gt;</description></item><item><title>Domino's Pizza Sauce</title><link>https://recipes.uuard.com/docs/recipes/dominos_pizza_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/dominos_pizza_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Tomato Paste&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="tomato_paste"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Tomato Paste&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;3.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.70000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;2.70&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.60000000"
 
 &gt;
 &lt;td&gt;Spice Blend&lt;/td&gt;
 &lt;td&gt;1.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.40000000"
 
 &gt;
 &lt;td&gt;Garlic Powder&lt;/td&gt;
 &lt;td&gt;0.40&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;107.70&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Whisk to combine.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;h3 id="spice-blend"&gt;
 Spice Blend.
 
 &lt;a class="anchor" href="#spice-blend"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Spice&lt;/th&gt;
 &lt;th&gt;Volume Ratio&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Oregano&lt;/td&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Marjoram&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Parsley&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Basil&lt;/td&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tarragon&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="freezer-modification"&gt;
 Freezer Modification.
 
 &lt;a class="anchor" href="#freezer-modification"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;On its own this sauce does not freeze well.&lt;/p&gt;</description></item><item><title>General Tso's Sauce</title><link>https://recipes.uuard.com/docs/recipes/general_tso_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/general_tso_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="64.00000000"
 
 &gt;
 &lt;td&gt;Brown Sugar&lt;/td&gt;
 &lt;td&gt;64.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light, Low Sodium&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="25.00000000"
 
 &gt;
 &lt;td&gt;Shaoxing Wine&lt;/td&gt;
 &lt;td&gt;25.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="25.00000000"
 
 &gt;
 &lt;td&gt;Vinegar 5%&lt;/td&gt;
 &lt;td&gt;25.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="25.00000000"
 
 &gt;
 &lt;td&gt;Rice Vinegar&lt;/td&gt;
 &lt;td&gt;25.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="20.00000000"
 
 &gt;
 &lt;td&gt;Garlic, Minced&lt;/td&gt;
 &lt;td&gt;20.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="20.00000000"
 
 &gt;
 &lt;td&gt;Ginger, Minced&lt;/td&gt;
 &lt;td&gt;20.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="17.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Dark&lt;/td&gt;
 &lt;td&gt;17.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.00000000"
 
 &gt;
 &lt;td&gt;Corn Starch&lt;/td&gt;
 &lt;td&gt;15.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.00000000"
 
 &gt;
 &lt;td&gt;Scallion&lt;/td&gt;
 &lt;td&gt;15.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.00000000"
 
 &gt;
 &lt;td&gt;Sesame Oil&lt;/td&gt;
 &lt;td&gt;5.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.00000000"
 
 &gt;
 &lt;td&gt;Chicken Base&lt;/td&gt;
 &lt;td&gt;3.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;384.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Saute garlic, ginger.&lt;/li&gt;
&lt;li&gt;Combine all in sauce pot.&lt;/li&gt;
&lt;li&gt;Bring to boil, stirring vigorously until thickened slightly.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Gravy</title><link>https://recipes.uuard.com/docs/recipes/gravy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/gravy/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="10.00000000"
 
 &gt;
 &lt;td&gt;Fat&lt;/td&gt;
 &lt;td&gt;10.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.70000000"
 
 &gt;
 &lt;td&gt;All-Purpose Flour&lt;/td&gt;
 &lt;td&gt;6.70&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.20000000"
 
 &gt;
 &lt;td&gt;Beef Base&lt;/td&gt;
 &lt;td&gt;3.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.20000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;0.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;120.10&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Blend base and flour.&lt;/li&gt;
&lt;li&gt;Gradually add small amount cold water until smooth.&lt;/li&gt;
&lt;li&gt;Add boiling water, stirring until smooth.&lt;/li&gt;
&lt;li&gt;Bring to low boil.&lt;/li&gt;
&lt;li&gt;Add oil to pan.&lt;/li&gt;
&lt;li&gt;Add flour to pan.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Halal Guys White Sauce V1</title><link>https://recipes.uuard.com/docs/recipes/halal_guys_white_sauce_v1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/halal_guys_white_sauce_v1/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.67000000"
 
 &gt;
 &lt;td&gt;Vinegar 5%&lt;/td&gt;
 &lt;td&gt;6.67&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;6.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="4.00000000"
 
 &gt;
 &lt;td&gt;Lemon Juice&lt;/td&gt;
 &lt;td&gt;4.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.40000000"
 
 &gt;
 &lt;td&gt;Black Pepper, Ground&lt;/td&gt;
 &lt;td&gt;1.40&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;118.07&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Mix.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Halal Guys White Sauce V2</title><link>https://recipes.uuard.com/docs/recipes/halal_guys_white_sauce_v2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/halal_guys_white_sauce_v2/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="25.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;25.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="14.00000000"
 
 &gt;
 &lt;td&gt;Lemon Juice&lt;/td&gt;
 &lt;td&gt;14.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.20000000"
 
 &gt;
 &lt;td&gt;Black Pepper, Ground&lt;/td&gt;
 &lt;td&gt;0.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.15000000"
 
 &gt;
 &lt;td&gt;Cardamom&lt;/td&gt;
 &lt;td&gt;0.15&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.12000000"
 
 &gt;
 &lt;td&gt;Xanthan Gum&lt;/td&gt;
 &lt;td&gt;0.12&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;139.47&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Mix.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Hot Fudge V1</title><link>https://recipes.uuard.com/docs/recipes/hot_fudge_v1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/hot_fudge_v1/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Sugar&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="sugar"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="151.00000000"
 
 &gt;
 &lt;td&gt;Semisweet Chocolate&lt;/td&gt;
 &lt;td&gt;151.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="116.00000000"
 
 &gt;
 &lt;td&gt;Heavy Cream&lt;/td&gt;
 &lt;td&gt;116.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="105.00000000"
 
 &gt;
 &lt;td&gt;Corn Syrup, Light&lt;/td&gt;
 &lt;td&gt;105.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="16.00000000"
 
 &gt;
 &lt;td&gt;Shortening&lt;/td&gt;
 &lt;td&gt;16.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;489.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all except vanilla, chocolate.&lt;/li&gt;
&lt;li&gt;Boil, remove from heat.&lt;/li&gt;
&lt;li&gt;Add chocolate, vanilla.&lt;/li&gt;
&lt;li&gt;Stir.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Hot Fudge V2</title><link>https://recipes.uuard.com/docs/recipes/hot_fudge_v2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/hot_fudge_v2/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="29.70"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="29.70000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;29.70&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="22.00000000"
 
 &gt;
 &lt;td&gt;Oil&lt;/td&gt;
 &lt;td&gt;22.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;15.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="12.75000000"
 
 &gt;
 &lt;td&gt;Dark Cocoa Powder&lt;/td&gt;
 &lt;td&gt;12.75&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="10.00000000"
 
 &gt;
 &lt;td&gt;Light Brown Sugar&lt;/td&gt;
 &lt;td&gt;10.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.00000000"
 
 &gt;
 &lt;td&gt;Bittersweet Chocolate&lt;/td&gt;
 &lt;td&gt;6.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.40000000"
 
 &gt;
 &lt;td&gt;Nonfat Milk Powder&lt;/td&gt;
 &lt;td&gt;3.40&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.50000000"
 
 &gt;
 &lt;td&gt;Liquid Soy Lecithin&lt;/td&gt;
 &lt;td&gt;0.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.25000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;0.25&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.15000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;0.15&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;99.75&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all except vanilla, chocolate, cocoa.&lt;/li&gt;
&lt;li&gt;Boil, remove from heat.&lt;/li&gt;
&lt;li&gt;Add chocolate, vanilla.&lt;/li&gt;
&lt;li&gt;Stir.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Jimmy John's Kickin' Ranch Sauce</title><link>https://recipes.uuard.com/docs/recipes/jimmy_johns_kickin_ranch_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/jimmy_johns_kickin_ranch_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="54.20000000"
 
 &gt;
 &lt;td&gt;Buttermilk&lt;/td&gt;
 &lt;td&gt;54.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="11.59000000"
 
 &gt;
 &lt;td&gt;Hot Cherry Peppers&lt;/td&gt;
 &lt;td&gt;11.59&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.80000000"
 
 &gt;
 &lt;td&gt;Hot Pepper Juice&lt;/td&gt;
 &lt;td&gt;5.80&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.20000000"
 
 &gt;
 &lt;td&gt;Ranch Seasoning&lt;/td&gt;
 &lt;td&gt;5.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.30000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;0.30&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.05000000"
 
 &gt;
 &lt;td&gt;Garlic Powder&lt;/td&gt;
 &lt;td&gt;0.05&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;177.14&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Blend peppers, juice, 1/2 buttermilk.&lt;/li&gt;
&lt;li&gt;Add ranch packet, garlic salt.&lt;/li&gt;
&lt;li&gt;Whisk with mayo, remaining buttermilk mix.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;UNTESTED.&lt;/li&gt;
&lt;li&gt;500 g makes 1 16 oz bottle? ( I don&amp;rsquo;t know).&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Lemon Curd</title><link>https://recipes.uuard.com/docs/recipes/lemon_curd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/lemon_curd/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Sugar&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="sugar"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Lemon Juice&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="48.89000000"
 
 &gt;
 &lt;td&gt;Egg Yolk&lt;/td&gt;
 &lt;td&gt;48.89&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="40.00000000"
 
 &gt;
 &lt;td&gt;Butter&lt;/td&gt;
 &lt;td&gt;40.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.33000000"
 
 &gt;
 &lt;td&gt;Lemon Zest&lt;/td&gt;
 &lt;td&gt;3.33&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;242.22&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine sugar, egg yolks, lemon juice, and lemon zest in a stainless steel bowl over a double boiler.&lt;/li&gt;
&lt;li&gt;Stir occasionally until the mixture thickens to a ketchup-like consistency.&lt;/li&gt;
&lt;li&gt;Remove from heat and strain into a clean container.&lt;/li&gt;
&lt;li&gt;Add butter at 90°F (32°C) to 95°F (35°C) and blend with an immersion blender.&lt;/li&gt;
&lt;li&gt;Cover to the surface and refrigerate.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Lo Mein Sauce</title><link>https://recipes.uuard.com/docs/recipes/lo_mein_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/lo_mein_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="65.00000000"
 
 &gt;
 &lt;td&gt;Oyster Sauce&lt;/td&gt;
 &lt;td&gt;65.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="16.00000000"
 
 &gt;
 &lt;td&gt;Corn Starch&lt;/td&gt;
 &lt;td&gt;16.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="13.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;13.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="10.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Dark&lt;/td&gt;
 &lt;td&gt;10.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="10.00000000"
 
 &gt;
 &lt;td&gt;Sesame Oil&lt;/td&gt;
 &lt;td&gt;10.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.00000000"
 
 &gt;
 &lt;td&gt;Chicken Base&lt;/td&gt;
 &lt;td&gt;6.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;White Pepper&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;271.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all in sauce pot.&lt;/li&gt;
&lt;li&gt;Bring to boil, stirring vigorously until thickened.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add salt only if using &lt;em&gt;low sodium&lt;/em&gt; soy sauce.&lt;/li&gt;
&lt;li&gt;ALT: Omit corn starch, rinse noodles, add to a pan, boil off liquid on noodles&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mac &amp; Cheese Sauce</title><link>https://recipes.uuard.com/docs/recipes/mac_cheese_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/mac_cheese_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Cheddar Cheese&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="cheddar_cheese"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Cheddar Cheese&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="93.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;93.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.00000000"
 
 &gt;
 &lt;td&gt;Sodium Citrate&lt;/td&gt;
 &lt;td&gt;3.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;196.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Dissolve sodium citrate, water.&lt;/li&gt;
&lt;li&gt;Bring to simmer.&lt;/li&gt;
&lt;li&gt;Add shredded cheese slowly, whisk constantly.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;use 105% dry noodle by weight of cheddar cheese&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mexicali Dip</title><link>https://recipes.uuard.com/docs/recipes/mexicali_dip/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/mexicali_dip/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Cream Cheese&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="cream_cheese"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Cream Cheese&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="60.00000000"
 
 &gt;
 &lt;td&gt;Sour Cream&lt;/td&gt;
 &lt;td&gt;60.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="40.00000000"
 
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;40.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="28.00000000"
 
 &gt;
 &lt;td&gt;Monterey Jack Cheese&lt;/td&gt;
 &lt;td&gt;28.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="13.00000000"
 
 &gt;
 &lt;td&gt;Jalapeno Peppers, Pickled&lt;/td&gt;
 &lt;td&gt;13.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="12.00000000"
 
 &gt;
 &lt;td&gt;Chipotle Pepper Sauce, Tobasco&lt;/td&gt;
 &lt;td&gt;12.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.60000000"
 
 &gt;
 &lt;td&gt;Paprika&lt;/td&gt;
 &lt;td&gt;0.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.30000000"
 
 &gt;
 &lt;td&gt;Onion, Dehydrated, Powder&lt;/td&gt;
 &lt;td&gt;0.30&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;254.90&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Mexican White Sauce</title><link>https://recipes.uuard.com/docs/recipes/mexican_white_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/mexican_white_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Cream Cheese&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="cream_cheese"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Cream Cheese&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="425.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;425.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Cream&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="44.00000000"
 
 &gt;
 &lt;td&gt;Oil&lt;/td&gt;
 &lt;td&gt;44.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="34.00000000"
 
 &gt;
 &lt;td&gt;All-Purpose Flour&lt;/td&gt;
 &lt;td&gt;34.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="25.00000000"
 
 &gt;
 &lt;td&gt;Jalapeno, Diced&lt;/td&gt;
 &lt;td&gt;25.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="9.00000000"
 
 &gt;
 &lt;td&gt;Hot Sauce&lt;/td&gt;
 &lt;td&gt;9.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.75000000"
 
 &gt;
 &lt;td&gt;Chicken Base&lt;/td&gt;
 &lt;td&gt;5.75&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.70000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;0.70&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;693.45&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Dissolve chicken base in water.&lt;/li&gt;
&lt;li&gt;Melt oil.&lt;/li&gt;
&lt;li&gt;Add flour to oil.&lt;/li&gt;
&lt;li&gt;Heat until flour cooks.&lt;/li&gt;
&lt;li&gt;Whisk in chicken stock, heat until smooth.&lt;/li&gt;
&lt;li&gt;Add hot mixture to cream cheese.&lt;/li&gt;
&lt;li&gt;Melt and whisk smooth.&lt;/li&gt;
&lt;li&gt;Add back to pot.&lt;/li&gt;
&lt;li&gt;Mix in remaining ingredients.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Orange Chicken Sauce</title><link>https://recipes.uuard.com/docs/recipes/orange_chicken_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/orange_chicken_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="100.00000000"
 
 &gt;
 &lt;td&gt;Orange Juice&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Vinegar 5%&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="40.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;40.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="40.00000000"
 
 &gt;
 &lt;td&gt;Brown Sugar&lt;/td&gt;
 &lt;td&gt;40.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="32.00000000"
 
 &gt;
 &lt;td&gt;Oyster Sauce&lt;/td&gt;
 &lt;td&gt;32.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="13.30000000"
 
 &gt;
 &lt;td&gt;Corn Starch&lt;/td&gt;
 &lt;td&gt;13.30&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="8.30000000"
 
 &gt;
 &lt;td&gt;Orange Extract&lt;/td&gt;
 &lt;td&gt;8.30&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="8.30000000"
 
 &gt;
 &lt;td&gt;Sambal Oelek&lt;/td&gt;
 &lt;td&gt;8.30&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="4.20000000"
 
 &gt;
 &lt;td&gt;Garlic, Minced&lt;/td&gt;
 &lt;td&gt;4.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="4.20000000"
 
 &gt;
 &lt;td&gt;Ginger, Grated&lt;/td&gt;
 &lt;td&gt;4.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="4.20000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Dark&lt;/td&gt;
 &lt;td&gt;4.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.50000000"
 
 &gt;
 &lt;td&gt;Chicken Base&lt;/td&gt;
 &lt;td&gt;2.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.60000000"
 
 &gt;
 &lt;td&gt;Msg&lt;/td&gt;
 &lt;td&gt;1.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;White Pepper&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;459.60&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all in sauce pot.&lt;/li&gt;
&lt;li&gt;Whisk until combined, dissolved.&lt;/li&gt;
&lt;li&gt;Heat oil.&lt;/li&gt;
&lt;li&gt;Add garlic, ginger, sambal.&lt;/li&gt;
&lt;li&gt;Cook &amp;lt; 60 sec.&lt;/li&gt;
&lt;li&gt;Cooking wine to deglaze.&lt;/li&gt;
&lt;li&gt;Add sauce mixture to this pan.&lt;/li&gt;
&lt;li&gt;Stir in cornstarch slurry.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>P. F. Chang's Dark Sauce</title><link>https://recipes.uuard.com/docs/recipes/p_f_changs_dark_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/p_f_changs_dark_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="150.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light, Low Sodium&lt;/td&gt;
 &lt;td&gt;150.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="85.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;85.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Michiu Wine&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="33.00000000"
 
 &gt;
 &lt;td&gt;Oyster Sauce&lt;/td&gt;
 &lt;td&gt;33.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="25.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Dark&lt;/td&gt;
 &lt;td&gt;25.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="4.50000000"
 
 &gt;
 &lt;td&gt;Chicken Base&lt;/td&gt;
 &lt;td&gt;4.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;447.50&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Dissolve sugar, chicken base in water.&lt;/li&gt;
&lt;li&gt;Heat if necessary.&lt;/li&gt;
&lt;li&gt;Whisk in dry.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;60 ml water to 455g rice.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>P. F. Chang's Honey Sauce</title><link>https://recipes.uuard.com/docs/recipes/p_f_changs_honey_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/p_f_changs_honey_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Shaoxing Wine&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="shaoxing_wine"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Shaoxing Wine&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="80.80000000"
 
 &gt;
 &lt;td&gt;Vinegar 5%&lt;/td&gt;
 &lt;td&gt;80.80&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="73.80000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;73.80&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="28.30000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;28.30&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="19.20000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light&lt;/td&gt;
 &lt;td&gt;19.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.00000000"
 
 &gt;
 &lt;td&gt;Corn Starch&lt;/td&gt;
 &lt;td&gt;15.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="11.00000000"
 
 &gt;
 &lt;td&gt;Oil&lt;/td&gt;
 &lt;td&gt;11.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.80000000"
 
 &gt;
 &lt;td&gt;Garlic, Minced&lt;/td&gt;
 &lt;td&gt;3.80&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.30000000"
 
 &gt;
 &lt;td&gt;Dried Chilis&lt;/td&gt;
 &lt;td&gt;2.30&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;334.20&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Heat oil in pot, medium heat.&lt;/li&gt;
&lt;li&gt;Add chilis, saute until dark.&lt;/li&gt;
&lt;li&gt;Add garlic. saute briefly, &amp;lt; 60 sec.&lt;/li&gt;
&lt;li&gt;Add remaining except vinegar.&lt;/li&gt;
&lt;li&gt;Whisk to dissolve and combine.&lt;/li&gt;
&lt;li&gt;Turn off heat, leave for ≈10 min.&lt;/li&gt;
&lt;li&gt;Add vinegar, whisk to incorporated.&lt;/li&gt;
&lt;li&gt;Strain out garlic and chilis.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;150 ml honey sauce + 1 tbsp water + 1 tbsp cornstarch.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>P. F. Chang's Kung Pao Sauce</title><link>https://recipes.uuard.com/docs/recipes/p_f_changs_kung_pao_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/p_f_changs_kung_pao_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="325.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light, Low Sodium&lt;/td&gt;
 &lt;td&gt;325.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="130.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;130.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="75.00000000"
 
 &gt;
 &lt;td&gt;Shaoxing Wine&lt;/td&gt;
 &lt;td&gt;75.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="75.00000000"
 
 &gt;
 &lt;td&gt;Vinegar 5%&lt;/td&gt;
 &lt;td&gt;75.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="58.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Dark&lt;/td&gt;
 &lt;td&gt;58.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="11.00000000"
 
 &gt;
 &lt;td&gt;Oyster Sauce&lt;/td&gt;
 &lt;td&gt;11.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.50000000"
 
 &gt;
 &lt;td&gt;Chicken Base&lt;/td&gt;
 &lt;td&gt;3.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;777.50&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Mix everything.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>P. F. Chang's Mongolian Beef Sauce</title><link>https://recipes.uuard.com/docs/recipes/p_f_changs_mongolian_beef_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/p_f_changs_mongolian_beef_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="165.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;165.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="150.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light, Low Sodium&lt;/td&gt;
 &lt;td&gt;150.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Shaoxing Wine&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="33.00000000"
 
 &gt;
 &lt;td&gt;Oyster Sauce&lt;/td&gt;
 &lt;td&gt;33.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="25.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Dark&lt;/td&gt;
 &lt;td&gt;25.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.00000000"
 
 &gt;
 &lt;td&gt;Chicken Base&lt;/td&gt;
 &lt;td&gt;6.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.00000000"
 
 &gt;
 &lt;td&gt;Sesame Oil&lt;/td&gt;
 &lt;td&gt;5.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;534.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all in sauce pot.&lt;/li&gt;
&lt;li&gt;Bring to boil, stirring vigorously.&lt;/li&gt;
&lt;li&gt;Until thickened slightly.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Chicken base is chicken bullion powder OR refrigerated paste.&lt;/li&gt;
&lt;li&gt;This is basically a sweetened PF CHANG DARK SAUCE.&lt;/li&gt;
&lt;li&gt;Recipe:&lt;/li&gt;
&lt;li&gt;55ML PF CHANG DARK SAUCE, 12.5 g sugar.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>P. F. Chang's Spicy Chicken Sauce</title><link>https://recipes.uuard.com/docs/recipes/p_f_changs_spicy_chicken_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/p_f_changs_spicy_chicken_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="45.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;45.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="37.00000000"
 
 &gt;
 &lt;td&gt;Vinegar 5%&lt;/td&gt;
 &lt;td&gt;37.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="8.00000000"
 
 &gt;
 &lt;td&gt;Chili Crisp&lt;/td&gt;
 &lt;td&gt;8.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.00000000"
 
 &gt;
 &lt;td&gt;Corn Starch&lt;/td&gt;
 &lt;td&gt;6.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.50000000"
 
 &gt;
 &lt;td&gt;Oyster Sauce&lt;/td&gt;
 &lt;td&gt;5.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.00000000"
 
 &gt;
 &lt;td&gt;Chicken Base&lt;/td&gt;
 &lt;td&gt;3.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.00000000"
 
 &gt;
 &lt;td&gt;Sesame Oil&lt;/td&gt;
 &lt;td&gt;2.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;White Pepper&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;207.50&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all in sauce pot.&lt;/li&gt;
&lt;li&gt;Bring to boil, stirring vigorously until thickened.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Chili crisp sediment is meant to be Huy Fong ground fresh chili paste.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>P. F. Chang's Umami Sauce</title><link>https://recipes.uuard.com/docs/recipes/p_f_changs_umami_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/p_f_changs_umami_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Oyster Sauce&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="oyster_sauce"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Oyster Sauce&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="79.00000000"
 
 &gt;
 &lt;td&gt;Michiu Wine&lt;/td&gt;
 &lt;td&gt;79.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="79.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Dark&lt;/td&gt;
 &lt;td&gt;79.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="66.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;66.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.20000000"
 
 &gt;
 &lt;td&gt;White Pepper&lt;/td&gt;
 &lt;td&gt;3.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;327.20&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Add all to bowl.&lt;/li&gt;
&lt;li&gt;Whisk until dissolved.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use mushroom dark soy&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Papa Johns Garlic Dipping Sauce</title><link>https://recipes.uuard.com/docs/recipes/papa_johns_garlic_dipping_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/papa_johns_garlic_dipping_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Butter Flavored Shortening&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="butter_flavored_shortening"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Butter Flavored Shortening&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="69.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;69.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.10000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;2.10&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;Garlic, Dehydrated&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;Lecithin, Liquid Soy&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;173.10&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Heat oil to liquid state.&lt;/li&gt;
&lt;li&gt;Disperse lecithin in oil.&lt;/li&gt;
&lt;li&gt;Add all to blender.&lt;/li&gt;
&lt;li&gt;Blend til emulsified.&lt;/li&gt;
&lt;li&gt;Allow to cool.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;216 g is good for 8 oz deli container.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Pesto</title><link>https://recipes.uuard.com/docs/recipes/pesto/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/pesto/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Basil&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="basil"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Basil&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="25.77000000"
 
 &gt;
 &lt;td&gt;Walnut&lt;/td&gt;
 &lt;td&gt;25.77&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="22.68000000"
 
 &gt;
 &lt;td&gt;Parmesan Cheese&lt;/td&gt;
 &lt;td&gt;22.68&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="21.31000000"
 
 &gt;
 &lt;td&gt;Olive Oil&lt;/td&gt;
 &lt;td&gt;21.31&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="8.93000000"
 
 &gt;
 &lt;td&gt;Lemon Juice&lt;/td&gt;
 &lt;td&gt;8.93&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.41000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;2.41&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.41000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;2.41&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;183.51&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Pick fresh basil, rinse, and lightly dry.&lt;/li&gt;
&lt;li&gt;Shred fresh parmesan.&lt;/li&gt;
&lt;li&gt;Add walnuts, parmesan, lemon juice, olive oil, salt, sugar, and basil to food processor.&lt;/li&gt;
&lt;li&gt;Pulse until pieces are small and mixture is smooth.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Pineapple Salsa</title><link>https://recipes.uuard.com/docs/recipes/pineapple_salsa/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/pineapple_salsa/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Tomato, Crushed, in Juice&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="tomato_crushed_in_juice"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Tomato, Crushed, in Juice&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="42.00000000"
 
 &gt;
 &lt;td&gt;Pineapple, Crushed, in Juice&lt;/td&gt;
 &lt;td&gt;42.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="12.00000000"
 
 &gt;
 &lt;td&gt;Tomato Paste&lt;/td&gt;
 &lt;td&gt;12.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.67000000"
 
 &gt;
 &lt;td&gt;Jalapeno, Pickled, Diced&lt;/td&gt;
 &lt;td&gt;6.67&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.50000000"
 
 &gt;
 &lt;td&gt;Vinegar 5%&lt;/td&gt;
 &lt;td&gt;6.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="4.20000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;4.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.10000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.10&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.55000000"
 
 &gt;
 &lt;td&gt;Onion Flake&lt;/td&gt;
 &lt;td&gt;0.55&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.20000000"
 
 &gt;
 &lt;td&gt;Chipotle Powder&lt;/td&gt;
 &lt;td&gt;0.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;173.22&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Pizza Sauce</title><link>https://recipes.uuard.com/docs/recipes/pizza_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/pizza_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Tomato Puree&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="tomato_puree"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Tomato Puree&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.75000000"
 
 &gt;
 &lt;td&gt;Oil&lt;/td&gt;
 &lt;td&gt;3.75&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.75000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;0.75&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.25000000"
 
 &gt;
 &lt;td&gt;Msg&lt;/td&gt;
 &lt;td&gt;0.25&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.25000000"
 
 &gt;
 &lt;td&gt;Oregano&lt;/td&gt;
 &lt;td&gt;0.25&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.25000000"
 
 &gt;
 &lt;td&gt;Basil&lt;/td&gt;
 &lt;td&gt;0.25&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.25000000"
 
 &gt;
 &lt;td&gt;Garlic, Dehydrated, Minced&lt;/td&gt;
 &lt;td&gt;0.25&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.20000000"
 
 &gt;
 &lt;td&gt;Black Pepper, Ground&lt;/td&gt;
 &lt;td&gt;0.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.12000000"
 
 &gt;
 &lt;td&gt;Onion, Dehydrated, Mince&lt;/td&gt;
 &lt;td&gt;0.12&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.08000000"
 
 &gt;
 &lt;td&gt;Xanthan Gum&lt;/td&gt;
 &lt;td&gt;0.08&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.01000000"
 
 &gt;
 &lt;td&gt;Cayenne&lt;/td&gt;
 &lt;td&gt;0.01&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;106.91&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Blend&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 vu = 1/8 tsp.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Group&lt;/th&gt;
 &lt;th&gt;VU&lt;/th&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Herbs &amp;amp; spices (dried &amp;amp; crushed)&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Earthy component&lt;/td&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;Oregano&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Earthy component&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;Marjoram&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Earthy component&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;Parsley&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Sweet component&lt;/td&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;Basil&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Sweet component&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;Tarragon&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Sweet component&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;Fennel seed&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Savory component&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;Rosemary&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Savory component&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;Thyme&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Spicy component&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;Paprika&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Spicy component&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;Black pepper&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Pumpkin Ganache</title><link>https://recipes.uuard.com/docs/recipes/pumpkin_ganache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/pumpkin_ganache/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Pumpkin Puree&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="pumpkin_puree"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Pumpkin Puree&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="54.00000000"
 
 &gt;
 &lt;td&gt;White Chocolate&lt;/td&gt;
 &lt;td&gt;54.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="27.50000000"
 
 &gt;
 &lt;td&gt;Heavy Cream&lt;/td&gt;
 &lt;td&gt;27.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.70000000"
 
 &gt;
 &lt;td&gt;Glucose&lt;/td&gt;
 &lt;td&gt;15.70&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="8.63000000"
 
 &gt;
 &lt;td&gt;Butter&lt;/td&gt;
 &lt;td&gt;8.63&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.55000000"
 
 &gt;
 &lt;td&gt;Cinnamon&lt;/td&gt;
 &lt;td&gt;0.55&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.45000000"
 
 &gt;
 &lt;td&gt;Kosher Salt&lt;/td&gt;
 &lt;td&gt;0.45&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.30000000"
 
 &gt;
 &lt;td&gt;Cardamom&lt;/td&gt;
 &lt;td&gt;0.30&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.12000000"
 
 &gt;
 &lt;td&gt;Allspice&lt;/td&gt;
 &lt;td&gt;0.12&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.12000000"
 
 &gt;
 &lt;td&gt;Ginger&lt;/td&gt;
 &lt;td&gt;0.12&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.02000000"
 
 &gt;
 &lt;td&gt;Clove&lt;/td&gt;
 &lt;td&gt;0.02&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;207.39&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Spread pumpkin over parchment-lined half size baking sheet.&lt;/li&gt;
&lt;li&gt;Roast 1 hr at 325 °F until pumpkin reduced by 40%.&lt;/li&gt;
&lt;li&gt;Add chocolate chips to a mixing bowl.&lt;/li&gt;
&lt;li&gt;Combine cream, glucose, butter in pot.&lt;/li&gt;
&lt;li&gt;Bring to the boil.&lt;/li&gt;
&lt;li&gt;Pour over white chocolate.&lt;/li&gt;
&lt;li&gt;Let sit for 1 min.&lt;/li&gt;
&lt;li&gt;Add roasted pumpkin, spices, salt to mixture.&lt;/li&gt;
&lt;li&gt;Stir, immersion blend until totally smooth.&lt;/li&gt;
&lt;li&gt;Pour into shells warm.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;29 oz can = 822.136 g&lt;/li&gt;
&lt;li&gt;822 g -&amp;gt; 500 g ≈40% reduction&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Raising Cane's Sauce</title><link>https://recipes.uuard.com/docs/recipes/raising_canes_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/raising_canes_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="70.67000000"
 
 &gt;
 &lt;td&gt;Ketchup&lt;/td&gt;
 &lt;td&gt;70.67&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="10.67000000"
 
 &gt;
 &lt;td&gt;Worschestershire Sauce&lt;/td&gt;
 &lt;td&gt;10.67&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.47000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.47&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.83000000"
 
 &gt;
 &lt;td&gt;Black Pepper, Ground&lt;/td&gt;
 &lt;td&gt;0.83&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.26000000"
 
 &gt;
 &lt;td&gt;Garlic Powder&lt;/td&gt;
 &lt;td&gt;0.26&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.03000000"
 
 &gt;
 &lt;td&gt;Citric Acid&lt;/td&gt;
 &lt;td&gt;0.03&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;183.93&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;UNTESTED RECIPE.&lt;/li&gt;
&lt;li&gt;Uncertain about citric acid, maybe needs less, untested.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ranch Dressing</title><link>https://recipes.uuard.com/docs/recipes/ranch_dressing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/ranch_dressing/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="115.00000000"
 
 &gt;
 &lt;td&gt;Milk&lt;/td&gt;
 &lt;td&gt;115.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="13.60000000"
 
 &gt;
 &lt;td&gt;Ranch Powder&lt;/td&gt;
 &lt;td&gt;13.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;228.60&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Mix&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If using real whole milk, ok.&lt;/li&gt;
&lt;li&gt;If using reconstituted milk, use something like ≈75% milk for same consistency.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Reese's Peanut Butter Cup Filling</title><link>https://recipes.uuard.com/docs/recipes/reeces_peanut_butter_cup_filling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/reeces_peanut_butter_cup_filling/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Peanut Butter&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="peanut_butter"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Peanut Butter&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="37.60000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;37.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.10000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;0.10&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;137.70&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Rich's Classic White Icing</title><link>https://recipes.uuard.com/docs/recipes/richs_classic_white_icing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/richs_classic_white_icing/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Sugar&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="sugar"
 value="80.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="80.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;80.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;15.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.00000000"
 
 &gt;
 &lt;td&gt;Corn Syrup&lt;/td&gt;
 &lt;td&gt;5.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.06500000"
 
 &gt;
 &lt;td&gt;Agar&lt;/td&gt;
 &lt;td&gt;0.07&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.03000000"
 
 &gt;
 &lt;td&gt;Citric Acid&lt;/td&gt;
 &lt;td&gt;0.03&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;100.09&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Approximate yield is 100 g.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Rich's Maple Icing</title><link>https://recipes.uuard.com/docs/recipes/richs_maple_icing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/richs_maple_icing/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Confectioners&amp;#39; Sugar&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="confectioners_sugar"
 value="68.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="68.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Confectioners&amp;#39; Sugar&lt;/td&gt;
 &lt;td&gt;68.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="11.50000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;11.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="10.00000000"
 
 &gt;
 &lt;td&gt;Corn Syrup&lt;/td&gt;
 &lt;td&gt;10.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="7.50000000"
 
 &gt;
 &lt;td&gt;Shortening&lt;/td&gt;
 &lt;td&gt;7.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.60000000"
 
 &gt;
 &lt;td&gt;Maple Extract&lt;/td&gt;
 &lt;td&gt;0.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.33000000"
 
 &gt;
 &lt;td&gt;Lecithin&lt;/td&gt;
 &lt;td&gt;0.33&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.20000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;0.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.05350000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;0.05&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;98.18&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Approximate yield is 100 g.&lt;/li&gt;
&lt;li&gt;Maple extract range in source is 0.5% to 1.0%.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Shake Shack ShackSauce</title><link>https://recipes.uuard.com/docs/recipes/shake_shack_shacksauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/shake_shack_shacksauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.00000000"
 
 &gt;
 &lt;td&gt;Mustard, Dijon&lt;/td&gt;
 &lt;td&gt;15.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.00000000"
 
 &gt;
 &lt;td&gt;Ketchup&lt;/td&gt;
 &lt;td&gt;15.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.00000000"
 
 &gt;
 &lt;td&gt;Pickle Juice&lt;/td&gt;
 &lt;td&gt;5.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.20000000"
 
 &gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;0.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;135.20&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Whisk until homogeneous.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Shakespeare's Pizza Sauce</title><link>https://recipes.uuard.com/docs/recipes/shakespeares_pizza_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/shakespeares_pizza_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Tomato Puree&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="tomato_puree"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Tomato Puree&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="6.51000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;6.51&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.50000000"
 
 &gt;
 &lt;td&gt;Oil&lt;/td&gt;
 &lt;td&gt;2.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.96000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.96&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.27000000"
 
 &gt;
 &lt;td&gt;Garlic&lt;/td&gt;
 &lt;td&gt;0.27&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.25000000"
 
 &gt;
 &lt;td&gt;Oregano&lt;/td&gt;
 &lt;td&gt;0.25&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.20000000"
 
 &gt;
 &lt;td&gt;Black Pepper, Ground&lt;/td&gt;
 &lt;td&gt;0.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.17000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;0.17&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.08000000"
 
 &gt;
 &lt;td&gt;Onion&lt;/td&gt;
 &lt;td&gt;0.08&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.01000000"
 
 &gt;
 &lt;td&gt;Cayenne&lt;/td&gt;
 &lt;td&gt;0.01&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;111.95&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Southeast Asian Vinaigrette</title><link>https://recipes.uuard.com/docs/recipes/sea_vinaigrette/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/sea_vinaigrette/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Oil&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="oil"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Oil&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="110.00000000"
 
 &gt;
 &lt;td&gt;Orange Juice&lt;/td&gt;
 &lt;td&gt;110.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="75.00000000"
 
 &gt;
 &lt;td&gt;Peanut Butter&lt;/td&gt;
 &lt;td&gt;75.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="37.00000000"
 
 &gt;
 &lt;td&gt;Apple Cider Vinegar&lt;/td&gt;
 &lt;td&gt;37.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.00000000"
 
 &gt;
 &lt;td&gt;Honey&lt;/td&gt;
 &lt;td&gt;15.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="5.00000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;5.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;Pepper&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;343.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Blender.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Srirancha</title><link>https://recipes.uuard.com/docs/recipes/srirancha/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/srirancha/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="115.00000000"
 
 &gt;
 &lt;td&gt;Milk&lt;/td&gt;
 &lt;td&gt;115.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.00000000"
 
 &gt;
 &lt;td&gt;Sriracha&lt;/td&gt;
 &lt;td&gt;15.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="13.60000000"
 
 &gt;
 &lt;td&gt;Ranch Powder&lt;/td&gt;
 &lt;td&gt;13.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;243.60&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;454g makes 1 large squeeze bottle.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Milk %&lt;/th&gt;
 &lt;th&gt;Consistency&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;115%&lt;/td&gt;
 &lt;td&gt;Runny&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;80%&lt;/td&gt;
 &lt;td&gt;Thick&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Sweet &amp; Sour Sauce</title><link>https://recipes.uuard.com/docs/recipes/sweet_sour_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/sweet_sour_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Water&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="water"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="80.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;80.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Vinegar 5%&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="7.00000000"
 
 &gt;
 &lt;td&gt;Corn Starch&lt;/td&gt;
 &lt;td&gt;7.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.20000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.83000000"
 
 &gt;
 &lt;td&gt;Msg&lt;/td&gt;
 &lt;td&gt;0.83&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;239.03&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Combine all in sauce pot.&lt;/li&gt;
&lt;li&gt;Whisk and bring to boil until thick.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;add red food coloring: 1 drops / 70 g total&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Texas Roadhouse Honey Butter</title><link>https://recipes.uuard.com/docs/recipes/texas_roadhouse_honey_butter/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/texas_roadhouse_honey_butter/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Butter&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="butter"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Butter&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="20.00000000"
 
 &gt;
 &lt;td&gt;Honey&lt;/td&gt;
 &lt;td&gt;20.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.10000000"
 
 &gt;
 &lt;td&gt;Cinnamon&lt;/td&gt;
 &lt;td&gt;0.10&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;120.10&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Whip butter low, 5 min.&lt;/li&gt;
&lt;li&gt;Add honey, cinnamon.&lt;/li&gt;
&lt;li&gt;Whip medium 5 min.&lt;/li&gt;
&lt;li&gt;Whip high 5 min.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;UNTESTED.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Top Pot Chocolate Icing</title><link>https://recipes.uuard.com/docs/recipes/top_pot_chocolate_icing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/top_pot_chocolate_icing/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Confectioners&amp;#39; Sugar&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="confectioners_sugar"
 value="57.27"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="57.27000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Confectioners&amp;#39; Sugar&lt;/td&gt;
 &lt;td&gt;57.27&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="20.60000000"
 
 &gt;
 &lt;td&gt;Chocolate Chip&lt;/td&gt;
 &lt;td&gt;20.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="16.04000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;16.04&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.86000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;2.86&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.18000000"
 
 &gt;
 &lt;td&gt;Corn Syrup&lt;/td&gt;
 &lt;td&gt;2.18&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.40000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;0.40&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.36000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;0.36&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.29000000"
 
 &gt;
 &lt;td&gt;Agar&lt;/td&gt;
 &lt;td&gt;0.29&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;100.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Approximate yield is 100 g.&lt;/li&gt;
&lt;li&gt;600 g makes 12 donuts.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Turkish Herb Sauce</title><link>https://recipes.uuard.com/docs/recipes/turkish_herb_sauce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/turkish_herb_sauce/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Mayonnaise&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="mayonnaise"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Mayonnaise&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="50.00000000"
 
 &gt;
 &lt;td&gt;Yogurt&lt;/td&gt;
 &lt;td&gt;50.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="15.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;15.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="8.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;8.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.80000000"
 
 &gt;
 &lt;td&gt;Lemon Juice&lt;/td&gt;
 &lt;td&gt;3.80&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.00000000"
 
 &gt;
 &lt;td&gt;Garlic, Dehydrated, Minced&lt;/td&gt;
 &lt;td&gt;2.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.20000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.20&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.10000000"
 
 &gt;
 &lt;td&gt;Onion Powder&lt;/td&gt;
 &lt;td&gt;1.10&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.80000000"
 
 &gt;
 &lt;td&gt;Dill&lt;/td&gt;
 &lt;td&gt;0.80&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.75000000"
 
 &gt;
 &lt;td&gt;Mint&lt;/td&gt;
 &lt;td&gt;0.75&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.60000000"
 
 &gt;
 &lt;td&gt;Oregano&lt;/td&gt;
 &lt;td&gt;0.60&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.30000000"
 
 &gt;
 &lt;td&gt;Msg&lt;/td&gt;
 &lt;td&gt;0.30&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;183.55&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Mix.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;all herbs are dried&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Whipped Cream</title><link>https://recipes.uuard.com/docs/recipes/whipped_cream/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/whipped_cream/</guid><description>&lt;h2 id="ingredients"&gt;
 Ingredients
 
 &lt;a class="anchor" href="#ingredients"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div
 id="recipe-formula-0"
 class="recipe-formula-widget"
 data-basis-mode="single"
 &gt;&lt;div class="basis-inputs" aria-label="Basis ingredient weight"&gt;&lt;label&gt;
 &lt;span&gt;Heavy Cream&lt;/span&gt;
 &lt;span class="basis-input-field"&gt;
 &lt;input
 type="number"
 min="0"
 step="0.01"
 inputmode="decimal"
 data-basis-input="true"
 data-ingredient-id="heavy_cream"
 value="100.00"
 &gt;
 &lt;span class="basis-input-unit"&gt;g&lt;/span&gt;
 &lt;/span&gt;
 &lt;/label&gt;&lt;/div&gt;&lt;table class="bakers-percent-table"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Ingredient&lt;/th&gt;
 &lt;th&gt;Baker's %&lt;/th&gt;
 &lt;th&gt;Weight (g)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;&lt;tr
 data-row-pct="100.00000000"
 data-is-basis="true"
 &gt;
 &lt;td&gt;Heavy Cream&lt;/td&gt;
 &lt;td&gt;100.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="8.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;8.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.00000000"
 
 &gt;
 &lt;td&gt;Gelatin&lt;/td&gt;
 &lt;td&gt;1.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;109.00&lt;/th&gt;
 &lt;th data-total-weight&gt;0.00&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/tfoot&gt;
 &lt;/table&gt;
 &lt;/div&gt;

 &lt;script&gt;
 (() =&gt; {
 const root = document.getElementById("recipe-formula-0");
 if (!root) return;

 const basisInputs = root.querySelectorAll('input[data-basis-input="true"]');
 const rows = root.querySelectorAll("tr[data-row-pct]");
 const basisTotalEl = root.querySelector("[data-basis-total]");
 const basisTotalInput = root.querySelector('input[data-basis-total-input="true"]');
 const totalWeightEl = root.querySelector("[data-total-weight]");
 const basisMode = root.getAttribute("data-basis-mode");

 const parseNum = (value) =&gt; {
 const n = Number.parseFloat(value);
 return Number.isFinite(n) ? n : 0;
 };

 const update = () =&gt; {
 let basisTotal = 0;
 let totalWeight = 0;
 if (basisMode === "multi") {
 basisTotal = parseNum(basisTotalInput ? basisTotalInput.value : 0);
 } else {
 basisInputs.forEach((input) =&gt; {
 basisTotal += parseNum(input.value);
 });
 }

 if (basisTotalEl) {
 basisTotalEl.textContent = basisTotal.toFixed(2);
 }

 rows.forEach((row) =&gt; {
 const pct = parseNum(row.getAttribute("data-row-pct"));
 const weight = (pct / 100) * basisTotal;
 totalWeight += weight;
 const cell = row.querySelector("[data-weight-cell]");
 if (cell) cell.textContent = weight.toFixed(2);
 });

 if (totalWeightEl) {
 totalWeightEl.textContent = totalWeight.toFixed(2);
 }
 };

 if (basisMode === "multi") {
 if (basisTotalInput) {
 basisTotalInput.addEventListener("input", update);
 }
 } else {
 basisInputs.forEach((input) =&gt; input.addEventListener("input", update));
 }
 update();
 })();
 &lt;/script&gt;

 &lt;style&gt;
 .recipe-formula-widget .basis-inputs {
 margin: 0 0 0.75rem;
 display: grid;
 gap: 0.375rem;
 max-width: 28rem;
 }

 .recipe-formula-widget .basis-inputs label {
 display: inline-flex;
 align-items: center;
 gap: 0.75rem;
 color: var(--color-link);
 font-weight: 600;
 justify-self: start;
 }

 .recipe-formula-widget .basis-input-field {
 display: inline-flex;
 align-items: center;
 gap: 0.25rem;
 white-space: nowrap;
 }

 .recipe-formula-widget .basis-inputs input {
 width: 7rem;
 margin: 0;
 }

 .recipe-formula-widget .basis-input-unit {
 color: #6b7280;
 font-size: 0.875em;
 }

 .recipe-formula-widget table.bakers-percent-table tbody tr[data-is-basis="true"] td {
 font-weight: 600;
 color: var(--color-link);
 }
 &lt;/style&gt;
&lt;h2 id="process"&gt;
 Process
 
 &lt;a class="anchor" href="#process"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Whip 80% amount heavy cream mixture to soft peaks.&lt;/li&gt;
&lt;li&gt;Reserve this cold.&lt;/li&gt;
&lt;li&gt;Combine remaining 20% heavy cream with sugar, gelatin.&lt;/li&gt;
&lt;li&gt;Allow gelatin to bloom 6 min.&lt;/li&gt;
&lt;li&gt;Heat to 125 °F.&lt;/li&gt;
&lt;li&gt;Remove from heat&lt;/li&gt;
&lt;li&gt;Stream into cold whipped cream, whipping on medium speed.&lt;/li&gt;
&lt;li&gt;Finish incorporating with spatula.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;For cinnamon flavor, add 1.1% by weight of heavy cream.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>