<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Side on Recipe Book</title><link>https://recipes.uuard.com/categories/side/</link><description>Recent content in Side on Recipe Book</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://recipes.uuard.com/categories/side/index.xml" rel="self" type="application/rss+xml"/><item><title>Caramelized Onion</title><link>https://recipes.uuard.com/docs/recipes/caramelized_onion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/caramelized_onion/</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;Onion, Raw&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="onion_raw"
 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;Onion, Raw&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;Water&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;Oil&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="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.50000000"
 
 &gt;
 &lt;td&gt;Sugar&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.30000000"
 
 &gt;
 &lt;td&gt;Baking Soda&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.25000000"
 
 &gt;
 &lt;td&gt;Black Pepper, Ground&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;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;115.80&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;Slice onions to consistent thickness.&lt;/li&gt;
&lt;li&gt;Combine all ingredients.&lt;/li&gt;
&lt;li&gt;Add to rice cooker: use rice cooker function.&lt;/li&gt;
&lt;li&gt;Allow onions to cook until cooking function completes.&lt;/li&gt;
&lt;li&gt;Finish caramelization using slow cooker function or cooking in a pan, stirring often.&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;Onions are mostly water (about 90%). Before caramelization can occur, much of this water must evaporate so that the onions can reach a temperature where sugar browning reactions occur.&lt;/li&gt;
&lt;li&gt;Rice cooker function automates the long process of cooking off the water in the onions. Once the contents of the rice cooker reach &amp;gt; 212 °F, the rice cooker finishes and the onions are ready to start the caramelization process.&lt;/li&gt;
&lt;li&gt;Baking soda raises pH, which lowers the activation energy for Maillard reactions, so onions brown faster. &lt;strong&gt;This also turns the onions into a mushy jam consistency&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Chipotle Pinto Beans</title><link>https://recipes.uuard.com/docs/recipes/chipotle_pinto_beans/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/chipotle_pinto_beans/</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;Pinto Beans, Dry, Uncooked&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="pinto_beans_dry_uncooked"
 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;Pinto Beans, Dry, Uncooked&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="4.50000000"
 
 &gt;
 &lt;td&gt;Oil&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;tr
 data-row-pct="4.00000000"
 
 &gt;
 &lt;td&gt;Chipotle Pepper Adobo&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="3.33000000"
 
 &gt;
 &lt;td&gt;Lemon Juice&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;tr
 data-row-pct="3.33000000"
 
 &gt;
 &lt;td&gt;Lime Juice&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;tr
 data-row-pct="2.00000000"
 
 &gt;
 &lt;td&gt;Onion, Mince Dry&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="2.00000000"
 
 &gt;
 &lt;td&gt;Salt&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="0.80000000"
 
 &gt;
 &lt;td&gt;Cumin&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;Garlic, Dehydrated, Minced&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.75000000"
 
 &gt;
 &lt;td&gt;Black Pepper, Ground&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.40000000"
 
 &gt;
 &lt;td&gt;Oregano/Marjoram&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;146.86&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;Cook and drain beans.&lt;/li&gt;
&lt;li&gt;Combine all beans in blender.&lt;/li&gt;
&lt;li&gt;Blend until smooth.&lt;/li&gt;
&lt;li&gt;Stir in mixture into drained, cooked beans.&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>Cilantro Lime Rice</title><link>https://recipes.uuard.com/docs/recipes/cilantro_lime_rice/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/cilantro_lime_rice/</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;Rice&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="rice"
 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;Rice&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="125.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;125.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;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="4.25000000"
 
 &gt;
 &lt;td&gt;Lemon Juice&lt;/td&gt;
 &lt;td&gt;4.25&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="4.25000000"
 
 &gt;
 &lt;td&gt;Lime Juice&lt;/td&gt;
 &lt;td&gt;4.25&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.25000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;2.25&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.75000000"
 
 &gt;
 &lt;td&gt;Cilantro, Chopped&lt;/td&gt;
 &lt;td&gt;1.75&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;245.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;Rinse rice cold water.&lt;/li&gt;
&lt;li&gt;Cook rice.&lt;/li&gt;
&lt;li&gt;Combine salt, cilantro, lemon &amp;amp; lime juice.&lt;/li&gt;
&lt;li&gt;Stir until salt dissolves.&lt;/li&gt;
&lt;li&gt;Pour seasoning liquid on rice, 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;
&lt;ul&gt;
&lt;li&gt;substitute coriander at 33% of cilantro&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Crab Rangoon</title><link>https://recipes.uuard.com/docs/recipes/crab_rangoon/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/crab_rangoon/</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="18.00000000"
 
 &gt;
 &lt;td&gt;Imitation Crab, Minced&lt;/td&gt;
 &lt;td&gt;18.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;Scallion, Minced&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="2.30000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light&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;tr
 data-row-pct="1.70000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;1.70&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.62000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;0.62&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;Msg&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.45000000"
 
 &gt;
 &lt;td&gt;White Pepper&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.20000000"
 
 &gt;
 &lt;td&gt;Sesame Oil&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.18000000"
 
 &gt;
 &lt;td&gt;Garlic Powder&lt;/td&gt;
 &lt;td&gt;0.18&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;134.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;Mix all into room temp cream cheese.&lt;/li&gt;
&lt;li&gt;Refrigerate.&lt;/li&gt;
&lt;li&gt;Form into balls.&lt;/li&gt;
&lt;li&gt;Freeze balls.&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;225 g cream cheese.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Egg Noodle</title><link>https://recipes.uuard.com/docs/recipes/egg_noodle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/egg_noodle/</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;Bread Flour&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="flour_bread"
 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;Bread Flour&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;Egg, Whole&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="12.50000000"
 
 &gt;
 &lt;td&gt;Water&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.00000000"
 
 &gt;
 &lt;td&gt;Salt&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;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;164.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;h2 id="notes"&gt;
 Notes
 
 &lt;a class="anchor" href="#notes"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;</description></item><item><title>Fried Rice</title><link>https://recipes.uuard.com/docs/recipes/fried_rice/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/fried_rice/</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;Rice, Cooked&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="rice_cooked"
 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;Rice, Cooked&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;Mixed Vegetables&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;Egg, Whole&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;Bacon&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;Onion&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="15.00000000"
 
 &gt;
 &lt;td&gt;Green Onion&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="6.00000000"
 
 &gt;
 &lt;td&gt;Oyster Sauce&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;Shaoxing Wine&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="5.00000000"
 
 &gt;
 &lt;td&gt;Soy Sauce, Light&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="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.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.75000000"
 
 &gt;
 &lt;td&gt;Garlic, Dehydrated, Minced&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.08000000"
 
 &gt;
 &lt;td&gt;White Pepper&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;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;309.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;Heat 1½ tbsp oil (wok) or 2 tbsp oil (skillet) over high heat until smoking.&lt;/li&gt;
&lt;li&gt;Add onion, garlic, bacon; cook ≈1½ min until bacon light golden.&lt;/li&gt;
&lt;li&gt;Add frozen vegetables; cook ≈2 min until thawed and moisture evaporates.&lt;/li&gt;
&lt;li&gt;Add rice and sauce; cook ≈1½ min until liquid evaporates.&lt;/li&gt;
&lt;li&gt;Push rice aside; add ½ tbsp oil to empty space; add egg; scramble fully.&lt;/li&gt;
&lt;li&gt;Add green onion; mix egg into rice; remove from heat; serve 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>Guacamole</title><link>https://recipes.uuard.com/docs/recipes/guacamole/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/guacamole/</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;Avocado&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="avocado"
 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;Avocado&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="2.15000000"
 
 &gt;
 &lt;td&gt;Lime Juice&lt;/td&gt;
 &lt;td&gt;2.15&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.20000000"
 
 &gt;
 &lt;td&gt;Ascorbic Acid&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.13000000"
 
 &gt;
 &lt;td&gt;Chili 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.11000000"
 
 &gt;
 &lt;td&gt;Cumin&lt;/td&gt;
 &lt;td&gt;0.11&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.11000000"
 
 &gt;
 &lt;td&gt;Garlic Powder&lt;/td&gt;
 &lt;td&gt;0.11&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.11000000"
 
 &gt;
 &lt;td&gt;Onion Powder&lt;/td&gt;
 &lt;td&gt;0.11&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;103.81&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;li&gt;Mash to desired texture.&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>Mashed Potato</title><link>https://recipes.uuard.com/docs/recipes/mashed_potato/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/mashed_potato/</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;Russet Potato&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="potato_russet"
 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;Russet Potato&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="22.00000000"
 
 &gt;
 &lt;td&gt;Liquid&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="8.00000000"
 
 &gt;
 &lt;td&gt;Fat&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;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;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;131.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;Peel potato.&lt;/li&gt;
&lt;li&gt;Cut potato into cubes.&lt;/li&gt;
&lt;li&gt;Simmer until soft.&lt;/li&gt;
&lt;li&gt;Combine all.&lt;/li&gt;
&lt;li&gt;Mash.&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;Liquid, i.e. milk, water, etc.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mexican Rice</title><link>https://recipes.uuard.com/docs/recipes/mexican_rice/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/mexican_rice/</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;Rice&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="rice"
 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;Rice&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="140.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;140.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;Oil&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.50000000"
 
 &gt;
 &lt;td&gt;Tomato Bouillon&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="3.00000000"
 
 &gt;
 &lt;td&gt;Onion Powder&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.30000000"
 
 &gt;
 &lt;td&gt;Sugar&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;tr
 data-row-pct="1.30000000"
 
 &gt;
 &lt;td&gt;Garlic Powder&lt;/td&gt;
 &lt;td&gt;1.30&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.90000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;0.90&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;257.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;Add rice, water, oil to rice cooker; cook&lt;/li&gt;
&lt;li&gt;season with 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>Refried Beans</title><link>https://recipes.uuard.com/docs/recipes/refried_beans/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/refried_beans/</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;Cooked Pinto Beans, Drained&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="cooked_pinto_beans_drained"
 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;Cooked Pinto Beans, Drained&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;Water&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="6.50000000"
 
 &gt;
 &lt;td&gt;Lard&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="1.50000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.50&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;Lime Juice&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.10000000"
 
 &gt;
 &lt;td&gt;Cumin&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;tr
 data-row-pct="0.10000000"
 
 &gt;
 &lt;td&gt;Oregano&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;169.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;Cook beans.&lt;/li&gt;
&lt;li&gt;Combine all in blender.&lt;/li&gt;
&lt;li&gt;Blend until very 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;1 lb dry pinto -&amp;gt; ≈1 kg cooked.&lt;/li&gt;
&lt;li&gt;6 c. water/lb. dry beans.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Roasted Sweet Potato and Carrot</title><link>https://recipes.uuard.com/docs/recipes/roasted_sweet_potato_carrot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/roasted_sweet_potato_carrot/</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;Vegetables&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="vegetables"
 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;Vegetables&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="5.00000000"
 
 &gt;
 &lt;td&gt;Sugar&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;Olive Oil&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.50000000"
 
 &gt;
 &lt;td&gt;Balsamic Vinegar&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="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;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;110.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;Peel, chop vegetables into 1cm^3 volume.&lt;/li&gt;
&lt;li&gt;Soak in 5% salt solution, 4 hr.&lt;/li&gt;
&lt;li&gt;Drain, dry.&lt;/li&gt;
&lt;li&gt;Coat in mixture.&lt;/li&gt;
&lt;li&gt;Roast at 400 °F for 1 hr+, stir occasionally.&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>Sushi Rice</title><link>https://recipes.uuard.com/docs/recipes/sushi_rice/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/sushi_rice/</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;Rice&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="rice"
 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;Rice&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;Water&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="16.50000000"
 
 &gt;
 &lt;td&gt;Rice Vinegar&lt;/td&gt;
 &lt;td&gt;16.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;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="3.40000000"
 
 &gt;
 &lt;td&gt;Salt&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.00000000"
 
 &gt;
 &lt;td&gt;Msg&lt;/td&gt;
 &lt;td&gt;0.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;279.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;Cook rice in rice cooker.&lt;/li&gt;
&lt;li&gt;Mix, dissolve salt, msg, sugar into rice vinegar.&lt;/li&gt;
&lt;li&gt;Add seasoning liquid to cooked rice.&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>Sweet Potato Hummus</title><link>https://recipes.uuard.com/docs/recipes/sweet_potato_hummus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/sweet_potato_hummus/</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;Sweet Potato, Cooked&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="sweet_potato_cooked"
 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;Sweet Potato, Cooked&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;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="8.50000000"
 
 &gt;
 &lt;td&gt;Tahini&lt;/td&gt;
 &lt;td&gt;8.50&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;Lemon Juice&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.75000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.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;Garlic Powder&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.25000000"
 
 &gt;
 &lt;td&gt;Cumin&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;Za&amp;#39;atar&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.10000000"
 
 &gt;
 &lt;td&gt;Chipotle Pepper&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;129.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;Combine ingredients in blender.&lt;/li&gt;
&lt;li&gt;Blend until 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>Taco Bell Refried Beans</title><link>https://recipes.uuard.com/docs/recipes/taco_bell_refried_beans/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/taco_bell_refried_beans/</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;Cooked Pinto Beans, Drained&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="cooked_pinto_beans_drained"
 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;Cooked Pinto Beans, Drained&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="30.00000000"
 
 &gt;
 &lt;td&gt;Water&lt;/td&gt;
 &lt;td&gt;30.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="18.00000000"
 
 &gt;
 &lt;td&gt;Lard&lt;/td&gt;
 &lt;td&gt;18.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="0.80000000"
 
 &gt;
 &lt;td&gt;Lime Juice&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.10000000"
 
 &gt;
 &lt;td&gt;Cumin&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;tr
 data-row-pct="0.10000000"
 
 &gt;
 &lt;td&gt;Oregano&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;154.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;Cook beans&lt;/li&gt;
&lt;li&gt;Mash with 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;
&lt;ul&gt;
&lt;li&gt;1 lb dry pinto -&amp;gt; ≈1 kg cooked.&lt;/li&gt;
&lt;li&gt;6 c. water/lb. dry beans.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>