<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cookie on Recipe Book</title><link>https://recipes.uuard.com/tags/cookie/</link><description>Recent content in Cookie on Recipe Book</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://recipes.uuard.com/tags/cookie/index.xml" rel="self" type="application/rss+xml"/><item><title>Chocolate Biscotti</title><link>https://recipes.uuard.com/docs/recipes/chocolate_biscotti/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/chocolate_biscotti/</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;All-Purpose 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_all_purpose"
 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;All-Purpose 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="82.00000000"
 
 &gt;
 &lt;td&gt;Egg, Whole&lt;/td&gt;
 &lt;td&gt;82.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="78.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;78.00&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="70.00000000"
 
 &gt;
 &lt;td&gt;Chocolate Chunks, Chopped&lt;/td&gt;
 &lt;td&gt;70.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;Cocoa Powder&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="2.50000000"
 
 &gt;
 &lt;td&gt;Baking Soda&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="2.10000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&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;Espresso Powder&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.80000000"
 
 &gt;
 &lt;td&gt;Salt&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.70000000"
 
 &gt;
 &lt;td&gt;Almond Extract&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;353.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;Line sheet pan with parchment paper.&lt;/li&gt;
&lt;li&gt;Sift flour, baking soda, cocoa powder.&lt;/li&gt;
&lt;li&gt;Whip eggs, sugar, vanilla, almond extract and salt high until thick and light, ≈5 min.&lt;/li&gt;
&lt;li&gt;Mix in sifted dry at low speed until just incorporated.&lt;/li&gt;
&lt;li&gt;Fold in chocolate and (almonds).&lt;/li&gt;
&lt;li&gt;Form dough into strip on sheet pan.&lt;/li&gt;
&lt;li&gt;Bake 300 °F 50 min.&lt;/li&gt;
&lt;li&gt;Remove to cool 10 min.&lt;/li&gt;
&lt;li&gt;Cut slices 1/2 in.&lt;/li&gt;
&lt;li&gt;Bake 12 min at 275 °F.&lt;/li&gt;
&lt;li&gt;Flip.&lt;/li&gt;
&lt;li&gt;Bake 12 min at 275 °F.&lt;/li&gt;
&lt;li&gt;Cooling rack, cool completely.&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;1100 g dough / 1/4 sheet pan.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Chocolate Chip Cookie</title><link>https://recipes.uuard.com/docs/recipes/chocolate_chip_cookie/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/chocolate_chip_cookie/</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="110.53000000"
 
 &gt;
 &lt;td&gt;Chocolate Chip&lt;/td&gt;
 &lt;td&gt;110.53&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="70.79000000"
 
 &gt;
 &lt;td&gt;Butter&lt;/td&gt;
 &lt;td&gt;70.79&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="52.63000000"
 
 &gt;
 &lt;td&gt;Brown Sugar&lt;/td&gt;
 &lt;td&gt;52.63&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="44.21000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;44.21&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="31.58000000"
 
 &gt;
 &lt;td&gt;Egg, Whole&lt;/td&gt;
 &lt;td&gt;31.58&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.68000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;1.68&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.58000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;1.58&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="1.11000000"
 
 &gt;
 &lt;td&gt;Baking Soda&lt;/td&gt;
 &lt;td&gt;1.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;414.11&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;Cream butter, sugar.&lt;/li&gt;
&lt;li&gt;Gradually add eggs.&lt;/li&gt;
&lt;li&gt;Add vanilla.&lt;/li&gt;
&lt;li&gt;Combine bread flour, baking soda.&lt;/li&gt;
&lt;li&gt;Mix to 50% incorporation.&lt;/li&gt;
&lt;li&gt;Add chocolate chips.&lt;/li&gt;
&lt;li&gt;Mix until just incorporated.&lt;/li&gt;
&lt;li&gt;Roll into 17 in log.&lt;/li&gt;
&lt;li&gt;Wrap in parchment, refrigerate.&lt;/li&gt;
&lt;li&gt;Cut to 100 g portions.&lt;/li&gt;
&lt;li&gt;Place on parchment sheet pans.&lt;/li&gt;
&lt;li&gt;Bake 380 °F 10-12 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;</description></item><item><title>Ginger Molasses Cookie</title><link>https://recipes.uuard.com/docs/recipes/ginger_molasses_cookie/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/ginger_molasses_cookie/</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="71.32000000"
 
 &gt;
 &lt;td&gt;Brown Sugar&lt;/td&gt;
 &lt;td&gt;71.32&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="44.67000000"
 
 &gt;
 &lt;td&gt;Butter&lt;/td&gt;
 &lt;td&gt;44.67&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="26.65000000"
 
 &gt;
 &lt;td&gt;Molasses&lt;/td&gt;
 &lt;td&gt;26.65&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="7.84000000"
 
 &gt;
 &lt;td&gt;Egg, Whole&lt;/td&gt;
 &lt;td&gt;7.84&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="2.51000000"
 
 &gt;
 &lt;td&gt;Baking Soda&lt;/td&gt;
 &lt;td&gt;2.51&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.94000000"
 
 &gt;
 &lt;td&gt;Cinnamon&lt;/td&gt;
 &lt;td&gt;0.94&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.94000000"
 
 &gt;
 &lt;td&gt;Ginger&lt;/td&gt;
 &lt;td&gt;0.94&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.63000000"
 
 &gt;
 &lt;td&gt;Cloves&lt;/td&gt;
 &lt;td&gt;0.63&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.47000000"
 
 &gt;
 &lt;td&gt;Nutmeg&lt;/td&gt;
 &lt;td&gt;0.47&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.31000000"
 
 &gt;
 &lt;td&gt;Allspice&lt;/td&gt;
 &lt;td&gt;0.31&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.38&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;Cream the butter and sugar until well combined.&lt;/li&gt;
&lt;li&gt;Add the eggs and then the molasses.&lt;/li&gt;
&lt;li&gt;Add the dry ingredients and mix until well incorporated.&lt;/li&gt;
&lt;li&gt;Scale into 2 lb 3 oz (1000 g) pieces and roll into 17 in (43 cm) logs (sheet pan width).&lt;/li&gt;
&lt;li&gt;Wrap each log in parchment, and refrigerate until ready to bake.&lt;/li&gt;
&lt;li&gt;Cut to the desired size [2 oz (50 g) to 4 oz (100 g)], place on parchment-lined sheet pans, and bake at 350 °F in a convection oven for 12 to 15 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;</description></item><item><title>Oat Chocolate Cookie</title><link>https://recipes.uuard.com/docs/recipes/oat_chocolate_cookie/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/oat_chocolate_cookie/</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;Oats&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="oats"
 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;Oats&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="118.00000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;118.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;Peanut Butter&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="45.00000000"
 
 &gt;
 &lt;td&gt;Milk&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="22.00000000"
 
 &gt;
 &lt;td&gt;Butter&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.50000000"
 
 &gt;
 &lt;td&gt;Cocoa Powder&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="6.00000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&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;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;366.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 the butter, sugar, milk, and cocoa powder together in a medium saucepan over medium heat.&lt;/li&gt;
&lt;li&gt;Whisk constantly until the butter melts. whisking occasionally, bring to a boil.&lt;/li&gt;
&lt;li&gt;Once boiling, stop whisking and allow to boil for 1 min.&lt;/li&gt;
&lt;li&gt;Remove from heat, then immediately stir in the peanut butter and vanilla extract until completely combined.&lt;/li&gt;
&lt;li&gt;Stir in the oats and salt.&lt;/li&gt;
&lt;li&gt;Allow mixture to sit for 5 min. This allows the oats to soak up some moisture.&lt;/li&gt;
&lt;li&gt;During the 5 min, line two baking sheets with parchment paper or silicone baking mats. and make sure there is enough room in your refrigerator for the baking sheets.&lt;/li&gt;
&lt;li&gt;Using a 1 tbsp cookie scoop, drop a tablespoon of dough onto the lined baking sheets. if desired, slightly flatten down with the back of a spoon. repeat with the rest of the dough.&lt;/li&gt;
&lt;li&gt;Refrigerate the cookies for 30-60 min to set.&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>Oatmeal Raisin Cookie</title><link>https://recipes.uuard.com/docs/recipes/oatmeal_raisin_cookie/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/oatmeal_raisin_cookie/</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="145.00000000"
 
 &gt;
 &lt;td&gt;Brown Sugar&lt;/td&gt;
 &lt;td&gt;145.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;Oats&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="72.50000000"
 
 &gt;
 &lt;td&gt;Raisins&lt;/td&gt;
 &lt;td&gt;72.50&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="68.75000000"
 
 &gt;
 &lt;td&gt;Butter&lt;/td&gt;
 &lt;td&gt;68.75&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="32.50000000"
 
 &gt;
 &lt;td&gt;Egg, Whole&lt;/td&gt;
 &lt;td&gt;32.50&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;Vanilla Extract&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.50000000"
 
 &gt;
 &lt;td&gt;Baking Powder&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.75000000"
 
 &gt;
 &lt;td&gt;Baking Soda&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="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;513.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>Peanut Butter Cookie</title><link>https://recipes.uuard.com/docs/recipes/peanut_butter_cookie/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/peanut_butter_cookie/</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="68.75000000"
 
 &gt;
 &lt;td&gt;Peanut Butter&lt;/td&gt;
 &lt;td&gt;68.75&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="60.71000000"
 
 &gt;
 &lt;td&gt;Butter&lt;/td&gt;
 &lt;td&gt;60.71&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="53.57000000"
 
 &gt;
 &lt;td&gt;Sugar&lt;/td&gt;
 &lt;td&gt;53.57&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="52.68000000"
 
 &gt;
 &lt;td&gt;Brown Sugar&lt;/td&gt;
 &lt;td&gt;52.68&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="26.79000000"
 
 &gt;
 &lt;td&gt;Egg, Whole&lt;/td&gt;
 &lt;td&gt;26.79&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="3.93000000"
 
 &gt;
 &lt;td&gt;Baking Powder&lt;/td&gt;
 &lt;td&gt;3.93&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.89000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;0.89&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.71000000"
 
 &gt;
 &lt;td&gt;Salt&lt;/td&gt;
 &lt;td&gt;0.71&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;368.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 the dry ingredients and reserve.&lt;/li&gt;
&lt;li&gt;Cream the butter and sugars.&lt;/li&gt;
&lt;li&gt;Add the eggs and vanilla, then the peanut butter.&lt;/li&gt;
&lt;li&gt;Add the dry ingredients and mix until well incorporated.&lt;/li&gt;
&lt;li&gt;Scale into 1000 g pieces and roll into 17 in logs (sheet pan width).&lt;/li&gt;
&lt;li&gt;Wrap each log in parchment, and refrigerate until ready to bake.&lt;/li&gt;
&lt;li&gt;Cut to the desired size [2 oz (50 g) to 4 oz (100 g)], place on parchment-lined sheet pans, and bake at 350 °F (177 °C) in a convection oven for 12 to 15 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;</description></item><item><title>Pistachio Shortbread Cookie</title><link>https://recipes.uuard.com/docs/recipes/pistachio_shortbread_cookie/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/pistachio_shortbread_cookie/</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;All-Purpose 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_all_purpose"
 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;All-Purpose 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="79.00000000"
 
 &gt;
 &lt;td&gt;Butter&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="46.00000000"
 
 &gt;
 &lt;td&gt;Pistachio Nuts&lt;/td&gt;
 &lt;td&gt;46.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;Sugar&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="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="0.88000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&lt;/td&gt;
 &lt;td&gt;0.88&lt;/td&gt;
 &lt;td data-weight-cell&gt;0.00&lt;/td&gt;
 &lt;/tr&gt;&lt;tr
 data-row-pct="0.88000000"
 
 &gt;
 &lt;td&gt;Almond Extract&lt;/td&gt;
 &lt;td&gt;0.88&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;265.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;Pulse flour, sugar, salt, pistachios, and extracts in food processor until pistachios are finely ground.&lt;/li&gt;
&lt;li&gt;Scatter cold butter chunks in food processor.&lt;/li&gt;
&lt;li&gt;Pulse mixture until ingredients form into dough and stick together.&lt;/li&gt;
&lt;li&gt;Form dough into log on plastic wrap (2 in by 10 in).&lt;/li&gt;
&lt;li&gt;Refrigerate for 2 hr.&lt;/li&gt;
&lt;li&gt;Preheat oven to 325 °F and line baking sheet with parchment.&lt;/li&gt;
&lt;li&gt;Cut dough log into 1/2 in cookies.&lt;/li&gt;
&lt;li&gt;Brush top of each cookie with water and sprinkle with turbinado.&lt;/li&gt;
&lt;li&gt;Bake for 15-18 min until golden brown.&lt;/li&gt;
&lt;li&gt;Let cookies cool on baking sheet for 5 min, then transfer to wire rack to cool completely.&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>Spritz Cookie</title><link>https://recipes.uuard.com/docs/recipes/spritz_cookie/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://recipes.uuard.com/docs/recipes/spritz_cookie/</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;All-Purpose 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_all_purpose"
 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;All-Purpose 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="73.00000000"
 
 &gt;
 &lt;td&gt;Shortening&lt;/td&gt;
 &lt;td&gt;73.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;Sugar&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="20.00000000"
 
 &gt;
 &lt;td&gt;Egg, Whole&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="1.50000000"
 
 &gt;
 &lt;td&gt;Vanilla Extract&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.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.75000000"
 
 &gt;
 &lt;td&gt;Almond Extract&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;Baking 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;/tbody&gt;
 &lt;tfoot&gt;
 &lt;tr&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;th&gt;254.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;Cream shortening, adding sugar in gradually.&lt;/li&gt;
&lt;li&gt;Add egg, dry mix, extract.&lt;/li&gt;
&lt;li&gt;Mix well.&lt;/li&gt;
&lt;li&gt;Fill cookie press.&lt;/li&gt;
&lt;li&gt;Form cookies on cookie sheet.&lt;/li&gt;
&lt;li&gt;Bake 6 min at 400 °F.&lt;/li&gt;
&lt;li&gt;Place the fat, sugar, salt, and spices in the mixing bowl.&lt;/li&gt;
&lt;li&gt;With the paddle attachment, cream these ingredients at low speed.&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;Scale ingredients accurately. have all ingredients at room temperature.&lt;/li&gt;
&lt;li&gt;Partway through mixing, stop the machine and scrape down the bowl to ensure even mixing.&lt;/li&gt;
&lt;li&gt;For light cookies, cream until the mix is light and fluffy, in order to incorporate more air for leavening. for denser cookies, blend to a smooth paste, but do not cream until light.&lt;/li&gt;
&lt;li&gt;Sift in the flour and leavening. mix until just combined. do not overmix, or gluten will develop.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>