From 22cf93404a5ffb8f6a895f4bea50a8c807a3680e Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Mon, 4 Aug 2025 20:20:45 -0400 Subject: [PATCH 01/32] reformatted most recipes for consistency (WIP) --- source/beef-stroganoff.md | 48 ++++++++++++++++++++ source/chipotle-black-beans.md | 57 +++++++++++++++++++++++ source/eggroll-in-a-bowl.md | 41 +++++++++++++++++ source/granola.md | 35 +++++++++++++++ source/pad-thai.md | 82 ++++++++++++++++++++++++++++++++++ source/rice-pudding.md | 37 +++++++++++++++ 6 files changed, 300 insertions(+) create mode 100644 source/beef-stroganoff.md create mode 100644 source/chipotle-black-beans.md create mode 100644 source/eggroll-in-a-bowl.md create mode 100644 source/granola.md create mode 100644 source/pad-thai.md create mode 100644 source/rice-pudding.md diff --git a/source/beef-stroganoff.md b/source/beef-stroganoff.md new file mode 100644 index 0000000..73553ba --- /dev/null +++ b/source/beef-stroganoff.md @@ -0,0 +1,48 @@ +# Stroganoff + +Prep Time: 10 minutes +Cook Time: 35 minutes +Total Time: 45 minutes +Servings: 4 + +### Ingredients + +- **3 tablespoons** extra-virgin olive oil, divided +- **8 oz** crimini mushrooms, sliced +- **1/2 cup** diced onion +- **2 cloves** garlic, minced +- **1 lb** ground beef or turkey +- **2 teaspoons** paprika +- **3-4 cups** low sodium beef broth +- **8 oz** dry rotini +- **1/2 cup** sour cream +- fresh parsley for serving + +### Instructions + +1. Heat 1 tablespoon of the **oil** over medium heat in a pot or large skillet. + Add the **mushrooms** and cook until they are tender, about 5 minutes. + Season with salt and pepper, then remove from the pot into a bowl and set aside. + +2. Heat the remaining 2 tablespoons of **oil** in the same pot. + Add the **onion**, season with salt and pepper, + and cook until translucent, about 4-5 minutes. + +3. Stir in the **garlic** and cook until fragrant, 30-60 seconds. + +4. Add the **ground meat** and continue to cook, + breaking up the meat with a spoon as it cooks, + until it is browned and cooked through, about 5 minutes. + +5. Add the **paprika**, **broth**, and **pasta**. + Bring to a light boil then cover the pot. + +6. Continue to cook, stirring often, until the pasta is al dente, 17-20 minutes. + If at this point the dish has more liquid than preferred, + leave the lid off of the pan for the last 5 minutes to allow some to evaporate. + +7. Remove the pot from the heat + and stir in the **mushrooms** and **sour cream**. + +8. Serve with **fresh parsley**. + diff --git a/source/chipotle-black-beans.md b/source/chipotle-black-beans.md new file mode 100644 index 0000000..4607243 --- /dev/null +++ b/source/chipotle-black-beans.md @@ -0,0 +1,57 @@ +# Chipotle Black Beans + +Prep Time: 5 minutes +Cook Time: 35 minutes +Total Time: 40 minutes +Servings: 6 + +Makes 3 cups + +### Ingredients + +- **2 tablespoons** water or vegetable broth +- **1/2** medium Spanish yellow onion, diced +- **3 cloves** garlic, minced +- **3 cups** water or unsalted vegetable broth +- **1 cup** dried black beans +- **2 teaspoons** cumin powder +- **1 teaspoon** Spanish paprika +- **1 teaspoon** chipotle powder +- **1 tablespoon** lime juice + +### Instructions + +Set the Instant Pot to Sauté. Add the 2 tablespoons **water or vegetable broth**, **onion** and **garlic**. +Sauté for 5 minutes, stirring occasionally, or until the onions are soft and translucent + +Next add the **water or vegetable broth**, **dried black beans** and **all spices**. + +Press Stop to reset the Instant Pot, then press the Bean/Chili button (or Manual/Pressure Cook) and set the time to 35 minutes. +The Instant Pot will start to build pressure and after pressurized, it will cook for 35 minutes. +After cooking, it will need to sit for awhile to release pressure (about 15 minutes). + +When the pressure is released, remove the lid. +The beans will be sitting in some liquid; +taste to make sure they are cooked through and to your desired spiciness. +If desired, add a little more chipotle powder and/or lime juice and stir.  + +Use a handheld strainer to remove the beans. +Save the liquid for adding to recipes if desired. + +Store these beans +in an airtight container in the fridge for 4-5 days.  + +### Notes + +If using soaked beans, reduce cooking time by 10-15 minutes. + +These beans will keep 4-5 days in an airtight container in the fridge. + +You can also double the ingredients in this recipe. Cook the same time -- 35 minutes. + +If the beans are not cooked to your liking at the end of the 35 minutes, +you can cook for additional 5 minutes on the same settings.  + +I save the liquid from the beans to use in certain recipes as it contains a lot of flavor. +I use a few spoonfuls of the liquid in burrito bowls, tofu scrambles, etc.    + diff --git a/source/eggroll-in-a-bowl.md b/source/eggroll-in-a-bowl.md new file mode 100644 index 0000000..20273bb --- /dev/null +++ b/source/eggroll-in-a-bowl.md @@ -0,0 +1,41 @@ +# Eggroll in a Bowl + +Servings: 4 + +## Ingredients + +* **1 lb** ground pork or turkey +* **1 tablespoon** sesame oil +* **1 tablespoon** minced garlic +* **1 tablespoon** minced ginger +* **8 oz** mushrooms, minced +* **?** white or yellow onion +* **1/4 cup** low-sodium soy sauce +* **1 tablespoon** fish sauce +* **12-16 oz** cole slaw mix (1 package) +* **2 tablspoons** rice wine vinegar +* **1 tablespoon** hoisin sauce +* **1 tablespoon** sriracha or gochujang + +## Directions + +1. Heat the **oil** in a large pot at medium high. + Add the **ground meat** and cook until browned. + +2. Add the **garlic**, **ginger**, **mushrooms**, and **onion**. + Saute ~~briefly~~. + +3. Add the **soy sauce** and **fish sauce**. + Mix to combine. + +4. Pour the **cole slaw mix** on top, but do not stir. + Cover and cook on medium low heat for 10 minutes + +5. Stir and deglaze with the **vinegar**. + If cabbage isn't cooked all the way cover again for a few minutes. + +6. Remove from heat. + Stir in the **hoisin sauce** and **sriracha or gochujang**. + +7. Serve with wonton strips or over rice. + diff --git a/source/granola.md b/source/granola.md new file mode 100644 index 0000000..7ee719f --- /dev/null +++ b/source/granola.md @@ -0,0 +1,35 @@ +# Granola + +## Ingredients + +- **2 cups** old-fashioned rolled oats +- **3/4 cup** raw nuts and/or seeds +- **1/2 tsp** fine-grain sea salt or standard table salt +- **1/4 tsp** ground cinnamon +- **1/4 cup** melted coconut oil or olive oil +- **1/4 cup** maple syrup or honey +- **1/2 tsp** vanilla extract +- **1/4 cup** coconut flakes +- **1/3 cup** dried fruit, chopped if large + +## Instructions + +1. Preheat oven to 350°F and line a large, rimmed baking sheet with parchment paper. +2. In a large mixing bowl, combine the **oats**, **nuts and/or seeds**, **salt**, and **cinnamon**. + Stir to blend. +3. Pour in the **oil**, **maple syrup or honey**, and **vanilla**. + Mix well, until every oat is lightly coated. + Pour the granola onto the prepared pan + and use a large spoon to spread it into an even layer. +4. Bake for 10 minutes, add **coconut flakes** and stir. + Press the stirred granola into the pan with a spatula to create a more even layer. +5. Bake 10-12 minutes, or until lightly golden. + The granola will further crisp up as it cools. +6. Let the granola cool completely, undisturbed (at least 45 minutes). + Top with the **dried fruit**. + +## Notes + +Store the granola in an airtight container at room temperature for 1 to 2 weeks, +or in a sealed freezer bag in the freezer for up to 3 months. + diff --git a/source/pad-thai.md b/source/pad-thai.md new file mode 100644 index 0000000..75e97b2 --- /dev/null +++ b/source/pad-thai.md @@ -0,0 +1,82 @@ +# Pad Thai + +* *Prep:* 9 minutes +* *Cook:* 6 minutes +* *Total:* 15 minutes +* *Servings:* 3 servings + +## Ingredients + +### For the Stir-Fry + +* 4 ounces dry brown rice noodles +* 2 teaspoons sesame oil, extra virgin olive oil, or canola oil +* 8 ounces medium/large shrimp, peeled and deveined + (you can use either fresh shrimp or thawed frozen shrimp--- + If using thawed, lightly pat the shrimp dry prior to cooking) +* 2 cloves garlic, minced +* 2 large eggs %% TODO: add equivalent measure of egg substitute %% +* 1/2 cup bean sprouts +* 1/2 cup grated carrots +* 2 large (or 3 small) green onions, finely chopped +* 1/4 cup peanuts, finely chopped +* 1/4 cup fresh cilantro, chopped +* 1 lime, quartered + +For a meat-free option, substitute the shrimp 1:1 with sliced mushrooms. + +If you cannot find fresh bean sprouts, +you can substitute with rinsed, canned bean sprouts +or another fresh vegetable. +Note that canned bean sprouts have a more fermented taste. + +### For the Sauce + +* 2 tablespoons fish sauce +* 1-1/2 tablespoons rice vinegar +* 1 tablespoon low-sodium soy sauce +* 2 tablespoons water +* 1-3 tablespoons honey +* 1-3 teaspoons ground chile sauce (sambal oelek) or chili garlic sauce + +For a sweeter pad thai, add additional honey +(or even a little brown sugar). +For spicier, add additional chili paste. + +## Instructions + +1. Cook the rice noodles until soft, but not mushy. + Drain and rinse under cool water. + +2. In a small bowl, whisk together the sauce ingredients. + +3. Heat the oil in a large non-stick skillet or wok over medium-high heat. + Add the shrimp and saute about 2 minutes, + or just until the shrimp begins to turn pink. + +4. Add the garlic and noodles. + Stir continuously to coat the noodles and shrimp with the garlic, + then push the ingredients over to one side of the pan. + +5. Crack the eggs into the empty side of the pan + and break apart the yolk with the spatula. + Let cook for 30 seconds, until just beginning to set. + +6. Add the sauce and stir everything to combine. + +7. Add the bean sprouts, carrots, and chopped green onions + and let cook about 1 minute, + or until the bean sprouts are crisp-tender. + +8. Sprinkle on the peanuts and cilantro. + Serve immediately with lime wedges. + +### Notes + +* Keep leftovers in an airtight container + in the refrigerator for up to 4 days. + +* To reheat: Warm gently in the microwave + with a splash of water or chicken broth + to keep the noodles from drying out. + diff --git a/source/rice-pudding.md b/source/rice-pudding.md new file mode 100644 index 0000000..d06c971 --- /dev/null +++ b/source/rice-pudding.md @@ -0,0 +1,37 @@ +# Rice Pudding + +Servings: 4 + +## Ingredients + +- **1 cup** dry brown rice +- **1-1/4** cup water +- **1 teaspoon** salt +- **1 teaspoon** cinnamon +- **2 cups** almond milk +- **2 eggs** or **1/2 cup** egg substitute +- **3/4 cup** sugar +- **1-1/2** teaspoon vanilla + +## Instructions + +1. To the Instant Pot, add white rice, water, salt, and cinnamon. + Stir to combine. + +2. Lock the lid, set the valve to seal, and manually set the pressure for 14 minutes. + Allow time for the Instant Pot to come to pressure before it starts counting down & cooking.  + +3. While the rice is cooking, in a small bowl, + whisk together milk, eggs, sugar, and vanilla.  + +4. When the Instant Pot chimes, quick release the pressure + by turning the valve from sealing to venting.  + +5. Slowly add the milk mixture to the rice in the Instant Pot, + stirring quickly so that the eggs don't scramble.  + +6. Set the Instant Pot to sauté + and continue to mix until rice thickens, 5-10 minutes. + +7. Optionally serve with walnuts and/or raisins. Garnish with additional cinnamon. + From ba03f8d1a38b8c0d235bfa932c364770c05bf802 Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Mon, 25 Aug 2025 17:19:53 -0400 Subject: [PATCH 02/32] fix formatting --- source/{beef-stroganoff.md => stroganoff.md} | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) rename source/{beef-stroganoff.md => stroganoff.md} (89%) diff --git a/source/beef-stroganoff.md b/source/stroganoff.md similarity index 89% rename from source/beef-stroganoff.md rename to source/stroganoff.md index 73553ba..ea17004 100644 --- a/source/beef-stroganoff.md +++ b/source/stroganoff.md @@ -1,18 +1,13 @@ # Stroganoff -Prep Time: 10 minutes -Cook Time: 35 minutes -Total Time: 45 minutes -Servings: 4 - ### Ingredients -- **3 tablespoons** extra-virgin olive oil, divided +- **3 tbsp** extra-virgin olive oil, divided - **8 oz** crimini mushrooms, sliced - **1/2 cup** diced onion - **2 cloves** garlic, minced - **1 lb** ground beef or turkey -- **2 teaspoons** paprika +- **2 tsp** paprika - **3-4 cups** low sodium beef broth - **8 oz** dry rotini - **1/2 cup** sour cream From 2fd17c108e395b2b0bccc50e53676477b81ae9d9 Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Wed, 27 Aug 2025 16:06:57 -0400 Subject: [PATCH 03/32] fix formatting --- source/chipotle-black-beans.md | 31 +++++++++++-------------------- source/eggroll-in-a-bowl.md | 14 +++++++------- source/granola.md | 4 ++-- source/pad-thai.md | 34 +++++++++++++++++----------------- 4 files changed, 37 insertions(+), 46 deletions(-) diff --git a/source/chipotle-black-beans.md b/source/chipotle-black-beans.md index 4607243..b1c3da2 100644 --- a/source/chipotle-black-beans.md +++ b/source/chipotle-black-beans.md @@ -1,23 +1,16 @@ # Chipotle Black Beans -Prep Time: 5 minutes -Cook Time: 35 minutes -Total Time: 40 minutes -Servings: 6 - -Makes 3 cups - ### Ingredients -- **2 tablespoons** water or vegetable broth +- **2 tbsp** water or vegetable broth - **1/2** medium Spanish yellow onion, diced - **3 cloves** garlic, minced - **3 cups** water or unsalted vegetable broth - **1 cup** dried black beans -- **2 teaspoons** cumin powder -- **1 teaspoon** Spanish paprika -- **1 teaspoon** chipotle powder -- **1 tablespoon** lime juice +- **2 tsp** cumin powder +- **1 tsp** Spanish paprika +- **1 tsp** chipotle powder +- **1 tbsp** lime juice ### Instructions @@ -43,15 +36,13 @@ in an airtight container in the fridge for 4-5 days.  ### Notes -If using soaked beans, reduce cooking time by 10-15 minutes. +* Makes 3 cups -These beans will keep 4-5 days in an airtight container in the fridge. +* If using soaked beans, reduce cooking time by 10-15 minutes. -You can also double the ingredients in this recipe. Cook the same time -- 35 minutes. +* You can also double the ingredients in this recipe. Cook the same time. -If the beans are not cooked to your liking at the end of the 35 minutes, -you can cook for additional 5 minutes on the same settings.  - -I save the liquid from the beans to use in certain recipes as it contains a lot of flavor. -I use a few spoonfuls of the liquid in burrito bowls, tofu scrambles, etc.    +* If the beans are not cooked to your liking at the end of the 35 minutes, + you can cook for additional 5 minutes on the same settings.  +* Store in the fridge in an airtight container for up to 4-5 days. \ No newline at end of file diff --git a/source/eggroll-in-a-bowl.md b/source/eggroll-in-a-bowl.md index 20273bb..d9196d3 100644 --- a/source/eggroll-in-a-bowl.md +++ b/source/eggroll-in-a-bowl.md @@ -5,17 +5,17 @@ Servings: 4 ## Ingredients * **1 lb** ground pork or turkey -* **1 tablespoon** sesame oil -* **1 tablespoon** minced garlic -* **1 tablespoon** minced ginger +* **1 tbsp** sesame oil +* **1 tbsp** minced garlic +* **1 tbsp** minced ginger * **8 oz** mushrooms, minced * **?** white or yellow onion * **1/4 cup** low-sodium soy sauce -* **1 tablespoon** fish sauce +* **1 tbsp** fish sauce * **12-16 oz** cole slaw mix (1 package) -* **2 tablspoons** rice wine vinegar -* **1 tablespoon** hoisin sauce -* **1 tablespoon** sriracha or gochujang +* **2 tbsp** rice wine vinegar +* **1 tbsp** hoisin sauce +* **1 tbsp** sriracha or gochujang ## Directions diff --git a/source/granola.md b/source/granola.md index 7ee719f..f7cb8b6 100644 --- a/source/granola.md +++ b/source/granola.md @@ -30,6 +30,6 @@ ## Notes -Store the granola in an airtight container at room temperature for 1 to 2 weeks, -or in a sealed freezer bag in the freezer for up to 3 months. +* Store in an airtight container at room temperature for 1 to 2 weeks, + or in a sealed freezer bag in the freezer for up to 3 months. diff --git a/source/pad-thai.md b/source/pad-thai.md index 75e97b2..72034b1 100644 --- a/source/pad-thai.md +++ b/source/pad-thai.md @@ -9,19 +9,19 @@ ### For the Stir-Fry -* 4 ounces dry brown rice noodles -* 2 teaspoons sesame oil, extra virgin olive oil, or canola oil -* 8 ounces medium/large shrimp, peeled and deveined +* **4 oz** dry brown rice noodles +* **2 tsp** sesame oil, extra virgin olive oil, or canola oil +* **8 oz** medium/large shrimp, peeled and deveined (you can use either fresh shrimp or thawed frozen shrimp--- If using thawed, lightly pat the shrimp dry prior to cooking) -* 2 cloves garlic, minced -* 2 large eggs %% TODO: add equivalent measure of egg substitute %% -* 1/2 cup bean sprouts -* 1/2 cup grated carrots -* 2 large (or 3 small) green onions, finely chopped -* 1/4 cup peanuts, finely chopped -* 1/4 cup fresh cilantro, chopped -* 1 lime, quartered +* **2** cloves garlic, minced +* **2** large eggs or **1/2 cup** egg substitute +* **1/2 cup** bean sprouts +* **1/2 cup** grated carrots +* **2** large (or **3** small) green onions, finely chopped +* **1/4 cup** peanuts, finely chopped +* **1/4 cup** fresh cilantro, chopped +* **1** lime, quartered For a meat-free option, substitute the shrimp 1:1 with sliced mushrooms. @@ -32,12 +32,12 @@ Note that canned bean sprouts have a more fermented taste. ### For the Sauce -* 2 tablespoons fish sauce -* 1-1/2 tablespoons rice vinegar -* 1 tablespoon low-sodium soy sauce -* 2 tablespoons water -* 1-3 tablespoons honey -* 1-3 teaspoons ground chile sauce (sambal oelek) or chili garlic sauce +* **2 tbsp** fish sauce +* **1-1/2** tbsp rice vinegar +* **1 tbsp** low-sodium soy sauce +* **2 tbsp** water +* **1-3 tbsp** honey +* **1-3 tsp** ground chile sauce (sambal oelek) or chili garlic sauce For a sweeter pad thai, add additional honey (or even a little brown sugar). From 0a9ab15fbf8e615295903497b95fd07e963ceacb Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Mon, 1 Sep 2025 16:38:28 -0400 Subject: [PATCH 04/32] revise granola recipe --- source/granola.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/source/granola.md b/source/granola.md index f7cb8b6..f69e353 100644 --- a/source/granola.md +++ b/source/granola.md @@ -2,15 +2,14 @@ ## Ingredients -- **2 cups** old-fashioned rolled oats -- **3/4 cup** raw nuts and/or seeds -- **1/2 tsp** fine-grain sea salt or standard table salt -- **1/4 tsp** ground cinnamon -- **1/4 cup** melted coconut oil or olive oil -- **1/4 cup** maple syrup or honey -- **1/2 tsp** vanilla extract -- **1/4 cup** coconut flakes -- **1/3 cup** dried fruit, chopped if large +- **2 cups** old-fashioned rolled oats +- **3/4 cup** raw nuts and/or seeds +- **1/2 tsp** fine-grain sea salt or standard table salt +- **1/4 tsp** ground cinnamon +- **1/4 cup** melted coconut oil or olive oil +- **1/4 cup** maple syrup or honey +- **1/2 tsp** vanilla extract +- **1/4 cup** coconut flakes ## Instructions @@ -26,10 +25,17 @@ 5. Bake 10-12 minutes, or until lightly golden. The granola will further crisp up as it cools. 6. Let the granola cool completely, undisturbed (at least 45 minutes). - Top with the **dried fruit**. ## Notes * Store in an airtight container at room temperature for 1 to 2 weeks, or in a sealed freezer bag in the freezer for up to 3 months. +* Use olive oil for a slightly savory granola, + or coconut oil for a more neutral flavor. + +* Use maple syrup for a sweet, distinctly maple-flavored granola + with few or no clumps. + + Use honey for a more neutral flavored, clumpy granola. + From 945d5404ee75741c9777d020bfabae7e532cd224 Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Sat, 20 Sep 2025 12:46:14 -0400 Subject: [PATCH 05/32] added new recipes, fixed formatting. --- source/chipotle-black-beans.md | 30 ++++++++++++--------------- source/eggroll-in-a-bowl.md | 6 ++---- source/french-toast.md | 37 ++++++++++++++++++++++++++++++++++ source/granola.md | 5 +++++ source/pad-thai.md | 31 ++++++++++++++-------------- source/rice-pudding.md | 15 ++++++-------- source/stroganoff.md | 26 +++++++++++++----------- source/tuna-salad.md | 25 +++++++++++++++++++++++ 8 files changed, 117 insertions(+), 58 deletions(-) create mode 100644 source/french-toast.md create mode 100644 source/tuna-salad.md diff --git a/source/chipotle-black-beans.md b/source/chipotle-black-beans.md index b1c3da2..dd68088 100644 --- a/source/chipotle-black-beans.md +++ b/source/chipotle-black-beans.md @@ -14,25 +14,21 @@ ### Instructions -Set the Instant Pot to Sauté. Add the 2 tablespoons **water or vegetable broth**, **onion** and **garlic**. -Sauté for 5 minutes, stirring occasionally, or until the onions are soft and translucent +1. Set the Instant Pot to Sauté. + Add the 2 tablespoons **water or vegetable broth**, **onion** and **garlic**. + Sauté for 5 minutes, stirring occasionally, or until the onions are soft and translucent -Next add the **water or vegetable broth**, **dried black beans** and **all spices**. - -Press Stop to reset the Instant Pot, then press the Bean/Chili button (or Manual/Pressure Cook) and set the time to 35 minutes. -The Instant Pot will start to build pressure and after pressurized, it will cook for 35 minutes. -After cooking, it will need to sit for awhile to release pressure (about 15 minutes). +2. Add the **water or vegetable broth**, **dried black beans** and **all spices**. + Press Stop to reset the Instant Pot, + then press the Bean/Chili button (or Manual/Pressure Cook) and set the time to 35 minutes. + +3. When the Instant Pot chimes, press Stop and allow the pressure to bleed off. -When the pressure is released, remove the lid. -The beans will be sitting in some liquid; -taste to make sure they are cooked through and to your desired spiciness. -If desired, add a little more chipotle powder and/or lime juice and stir.  +4. When the pressure is released, remove the lid. + Add **lime juice** and stir, adding more **chipotle powder** to taste. -Use a handheld strainer to remove the beans. -Save the liquid for adding to recipes if desired. - -Store these beans -in an airtight container in the fridge for 4-5 days.  +5. Use a handheld strainer to remove the beans. + Save the liquid for adding to other recipes if desired. ### Notes @@ -40,7 +36,7 @@ in an airtight container in the fridge for 4-5 days.  * If using soaked beans, reduce cooking time by 10-15 minutes. -* You can also double the ingredients in this recipe. Cook the same time. +* You can double the ingredients in this recipe. Cook for the same time. * If the beans are not cooked to your liking at the end of the 35 minutes, you can cook for additional 5 minutes on the same settings.  diff --git a/source/eggroll-in-a-bowl.md b/source/eggroll-in-a-bowl.md index d9196d3..3fcb206 100644 --- a/source/eggroll-in-a-bowl.md +++ b/source/eggroll-in-a-bowl.md @@ -1,15 +1,13 @@ # Eggroll in a Bowl -Servings: 4 - ## Ingredients * **1 lb** ground pork or turkey * **1 tbsp** sesame oil * **1 tbsp** minced garlic * **1 tbsp** minced ginger -* **8 oz** mushrooms, minced -* **?** white or yellow onion +* **8 oz** mushrooms, finely diced +* **1/2** white or yellow onion, diced * **1/4 cup** low-sodium soy sauce * **1 tbsp** fish sauce * **12-16 oz** cole slaw mix (1 package) diff --git a/source/french-toast.md b/source/french-toast.md new file mode 100644 index 0000000..bfe314c --- /dev/null +++ b/source/french-toast.md @@ -0,0 +1,37 @@ +# French Toast + +## Ingredients + +- **4** large eggs or **1 cup** egg substitute +- **2/3 cup** milk +- **1/4 cup** all-purpose flour +- **1/4 cup** granulated sugar +- **1/4 tsp** salt +- **1 tsp** ground cinnamon +- **1 tsp** vanilla extract +- **8** thick slices bread + +## Instructions + +1. Whisk together the eggs, milk, flour, sugar, salt, cinnamon, and vanilla. + +2. Dip bread slices into the batter, dredging them well on both sides, and place on greased skillet over medium heat. + +3. Cook until the bottom of the bread starts to turn golden brown. + Flip and cook on the other side the same. + +4. Remove to a plate. Serve warm with syrup and a sprinkle of powdered sugar. + +## Notes + +- Bread that is slightly stale is preferable. + +- Any kind of milk, even dairy-free, will work. + Higher fat milk will yield creamier batter. + +- The batter can be made 1-2 days ahead of cooking. + +- To freeze, allow french toast cool completely + before storing in a freezer-safe bag or container for up to 3 months. + + Rewarm on a skillet, in the toaster, or for a few seconds in the microwave. diff --git a/source/granola.md b/source/granola.md index f69e353..e566483 100644 --- a/source/granola.md +++ b/source/granola.md @@ -14,16 +14,21 @@ ## Instructions 1. Preheat oven to 350°F and line a large, rimmed baking sheet with parchment paper. + 2. In a large mixing bowl, combine the **oats**, **nuts and/or seeds**, **salt**, and **cinnamon**. Stir to blend. + 3. Pour in the **oil**, **maple syrup or honey**, and **vanilla**. Mix well, until every oat is lightly coated. Pour the granola onto the prepared pan and use a large spoon to spread it into an even layer. + 4. Bake for 10 minutes, add **coconut flakes** and stir. Press the stirred granola into the pan with a spatula to create a more even layer. + 5. Bake 10-12 minutes, or until lightly golden. The granola will further crisp up as it cools. + 6. Let the granola cool completely, undisturbed (at least 45 minutes). ## Notes diff --git a/source/pad-thai.md b/source/pad-thai.md index 72034b1..71d43ad 100644 --- a/source/pad-thai.md +++ b/source/pad-thai.md @@ -1,10 +1,5 @@ # Pad Thai -* *Prep:* 9 minutes -* *Cook:* 6 minutes -* *Total:* 15 minutes -* *Servings:* 3 servings - ## Ingredients ### For the Stir-Fry @@ -12,8 +7,6 @@ * **4 oz** dry brown rice noodles * **2 tsp** sesame oil, extra virgin olive oil, or canola oil * **8 oz** medium/large shrimp, peeled and deveined - (you can use either fresh shrimp or thawed frozen shrimp--- - If using thawed, lightly pat the shrimp dry prior to cooking) * **2** cloves garlic, minced * **2** large eggs or **1/2 cup** egg substitute * **1/2 cup** bean sprouts @@ -23,12 +16,17 @@ * **1/4 cup** fresh cilantro, chopped * **1** lime, quartered -For a meat-free option, substitute the shrimp 1:1 with sliced mushrooms. +#### Notes -If you cannot find fresh bean sprouts, -you can substitute with rinsed, canned bean sprouts -or another fresh vegetable. -Note that canned bean sprouts have a more fermented taste. +* Use either fresh shrimp or thawed frozen shrimp. + If using thawed, lightly pat the shrimp dry prior to cooking. + +* For a meat-free option, substitute the shrimp 1:1 with sliced mushrooms. + +* If you cannot find fresh bean sprouts, + you can substitute with rinsed, canned bean sprouts + or another fresh vegetable. + Note that canned bean sprouts have a more fermented taste. ### For the Sauce @@ -39,9 +37,10 @@ Note that canned bean sprouts have a more fermented taste. * **1-3 tbsp** honey * **1-3 tsp** ground chile sauce (sambal oelek) or chili garlic sauce -For a sweeter pad thai, add additional honey -(or even a little brown sugar). -For spicier, add additional chili paste. +#### Notes + +* For a sweeter pad thai, add additional honey or a little brown sugar. + For spicier, add additional chili paste. ## Instructions @@ -76,7 +75,7 @@ For spicier, add additional chili paste. * Keep leftovers in an airtight container in the refrigerator for up to 4 days. -* To reheat: Warm gently in the microwave +* To reheat: Warm in the microwave with a splash of water or chicken broth to keep the noodles from drying out. diff --git a/source/rice-pudding.md b/source/rice-pudding.md index d06c971..40501a5 100644 --- a/source/rice-pudding.md +++ b/source/rice-pudding.md @@ -1,17 +1,15 @@ # Rice Pudding -Servings: 4 - ## Ingredients -- **1 cup** dry brown rice +- **1 cup** dry rice - **1-1/4** cup water -- **1 teaspoon** salt -- **1 teaspoon** cinnamon -- **2 cups** almond milk +- **1 tsp** salt +- **1 tsp** cinnamon +- **2 cups** milk - **2 eggs** or **1/2 cup** egg substitute - **3/4 cup** sugar -- **1-1/2** teaspoon vanilla +- **1-1/2 tsp** vanilla ## Instructions @@ -24,8 +22,7 @@ Servings: 4 3. While the rice is cooking, in a small bowl, whisk together milk, eggs, sugar, and vanilla.  -4. When the Instant Pot chimes, quick release the pressure - by turning the valve from sealing to venting.  +4. When the Instant Pot chimes, quick release the pressure.  5. Slowly add the milk mixture to the rice in the Instant Pot, stirring quickly so that the eggs don't scramble.  diff --git a/source/stroganoff.md b/source/stroganoff.md index ea17004..9a65b80 100644 --- a/source/stroganoff.md +++ b/source/stroganoff.md @@ -15,29 +15,31 @@ ### Instructions -1. Heat 1 tablespoon of the **oil** over medium heat in a pot or large skillet. - Add the **mushrooms** and cook until they are tender, about 5 minutes. - Season with salt and pepper, then remove from the pot into a bowl and set aside. - -2. Heat the remaining 2 tablespoons of **oil** in the same pot. +1. Heat 2 tablespoons of **oil** over medium heat in a large pot. Add the **onion**, season with salt and pepper, and cook until translucent, about 4-5 minutes. -3. Stir in the **garlic** and cook until fragrant, 30-60 seconds. +2. Stir in the **garlic** and cook until fragrant, 30-60 seconds. -4. Add the **ground meat** and continue to cook, +3. Add the **ground meat** and continue to cook, breaking up the meat with a spoon as it cooks, until it is browned and cooked through, about 5 minutes. -5. Add the **paprika**, **broth**, and **pasta**. +4. Add the **paprika**, **broth**, and **pasta**. Bring to a light boil then cover the pot. + Continue to cook, stirring often, until the pasta is al dente, about 17-20 minutes. -6. Continue to cook, stirring often, until the pasta is al dente, 17-20 minutes. - If at this point the dish has more liquid than preferred, - leave the lid off of the pan for the last 5 minutes to allow some to evaporate. +5. While the pasta cooks, + heat 1 tablespoon of the **oil** over medium heat in a medium skillet. + Add the **mushrooms** and cook until they are tender, about 5 minutes. + Season with salt and pepper, remove from the heat, and set aside. + +6. Around 5 minutes before the pasta has finished cooking, check the consistency. + If the dish has more liquid than preferred, + remove the lid for the remaining time to allow some to evaporate. 7. Remove the pot from the heat - and stir in the **mushrooms** and **sour cream**. + and stir in the **mushrooms** and **sour cream**. 8. Serve with **fresh parsley**. diff --git a/source/tuna-salad.md b/source/tuna-salad.md new file mode 100644 index 0000000..b0749fd --- /dev/null +++ b/source/tuna-salad.md @@ -0,0 +1,25 @@ +# Tuna Salad + +## Ingredients + +- **20 oz** tuna packed in water, drained (**4** 5-oz cans) +- **1 cup** mayonnaise +- **1/3 cup** celery finely chopped (about 1 rib) +- **2 tbsp** red onion, minced (about 2 small slices) +- **2 tbsp** sweet pickle or dill relish +- **1 tbsp** lemon juice +- **1** clove garlic, minced +- **1/2 tsp** table salt +- **1/4 tsp** black pepper, ground + +## Instructions + +1. In a medium mixing bowl, combine all ingredients. + +2. Serve immediately or cover and chill until serving. + +## Notes + +- Makes 3 cups. + +- Store leftovers in an airtight container in the refrigerator for up to 4 days. From 1730487c46c2e41f80ee8bc6cdf12fe3412e1b9f Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Mon, 6 Oct 2025 17:35:28 -0400 Subject: [PATCH 06/32] added goulash recipe --- source/goulash.md | 43 ++++++++++++++++++++++++++++++++++++++++++ source/rice-pudding.md | 6 +++--- 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 source/goulash.md diff --git a/source/goulash.md b/source/goulash.md new file mode 100644 index 0000000..c99eb29 --- /dev/null +++ b/source/goulash.md @@ -0,0 +1,43 @@ +# Goulash + +## Ingredients + +* 1 tbsp olive oil +* 1 yellow onion, diced +* 4 cloves garlic, minced +* 2 bell peppers, diced +* 1 lb ground beef or turkey +* 1/2 cup red wine (Cabernet Sauvignon) +* 28 oz canned diced tomatoes (do not drain) +* 15 oz canned tomato sauce +* 2 tbsp soy sauce +* 2 whole bay leaves +* 1/2 tsp dried oregano +* 1/2 tsp dried basil +* 1/4 tsp crushed red pepper +* 1/2 cup water +* 8 oz elbow macaroni +* ? tsp table salt + +## Instructions + +1. Heat the **olive oil** in a large soup pot over medium heat. + Add the **onion** and **garlic** and sauté until the onions are translucent. + +2. Add the **bell peppers** and continue to sauté for about two minutes more. + +3. Add the **ground meat** and continue to sauté until the beef is cooked through. + +4. Deglaze with the **red wine**. + Add the **diced tomatoes**, **tomato sauce**, **soy sauce**, **bay leaves**, + **oregano**, **basil**, **crushed red pepper**, and **water**. + Stir to combine, then cover and allow the sauce to come to a boil. + Once boiling, turn down the heat to low and simmer for 30 minutes, stirring occasionally. + +5. Add the pasta and stir to combine. + Re-cover and simmer, stirring occasionally, until the pasta is tender (about 10-12 minutes). + +6. Remove from heat. + Add salt and more to taste. + Remove the bay leaves before serving. + diff --git a/source/rice-pudding.md b/source/rice-pudding.md index d06c971..529d68c 100644 --- a/source/rice-pudding.md +++ b/source/rice-pudding.md @@ -6,12 +6,12 @@ Servings: 4 - **1 cup** dry brown rice - **1-1/4** cup water -- **1 teaspoon** salt -- **1 teaspoon** cinnamon +- **1 tsp** salt +- **1 tsp** cinnamon - **2 cups** almond milk - **2 eggs** or **1/2 cup** egg substitute - **3/4 cup** sugar -- **1-1/2** teaspoon vanilla +- **1-1/2** tsp vanilla ## Instructions From 036ae0b82c3af1094b1b709f25d27b85302144e5 Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Sat, 18 Oct 2025 16:17:34 -0400 Subject: [PATCH 07/32] added ./out to .gitignore, added README.md and new recipes. --- source/chili.md | 47 +++++++++++++++ source/chipotle-black-beans.md | 14 ++--- source/conversions.md | 101 +++++++++++++++++++++++++++++++++ source/eggroll-in-a-bowl.md | 17 +++--- source/french-toast.md | 6 +- source/goulash.md | 23 ++++---- source/granola.md | 6 +- source/pad-thai.md | 20 +++---- source/red-beans-and-rice.md | 57 +++++++++++++++++++ source/rice-pudding.md | 6 +- source/stroganoff.md | 4 +- source/tuna-salad.md | 16 +++--- 12 files changed, 261 insertions(+), 56 deletions(-) create mode 100644 source/chili.md create mode 100644 source/conversions.md create mode 100644 source/red-beans-and-rice.md diff --git a/source/chili.md b/source/chili.md new file mode 100644 index 0000000..52eda81 --- /dev/null +++ b/source/chili.md @@ -0,0 +1,47 @@ +# Chili + +## Ingredients + +- **2 tbsp.** olive oil +- **1** yellow onion, diced +- **2 cloves** garlic, minced +- **1 lb** ground beef or turkey +- **3/4 cup** dry kidney beans, soaked overnight and drained +- **3/4 cup** dry black beans, soaked overnight and drained +- **1 15oz can** diced or crushed tomatoes, not drained +- **6 oz** canned tomato paste +- **1 cup** water + +### Chili Seasoning + +- **1 tbsp.** chili powder +- **1 tsp.** ground cumin +- **1/4 tsp.** cayenne powder +- **1/4 tsp.** garlic powder +- **1/2 tsp.** onion powder +- **1/2 tbsp.** brown sugar +- **1 tsp.** salt +- **1/2 tsp.** black pepper + +## Instructions + +1. Heat the **oil** over medium heat in a large pot. + Add the **onion**, season with salt and pepper, + and cook until translucent, about 4-5 minutes. + +2. Stir in the **garlic** and cook until fragrant, 30-60 seconds. + +3. Add the **ground meat** and continue to cook, + breaking up the meat with a spoon as it cooks, + until it is browned and cooked through, about 5 minutes. + +4. Add the **beans**, **tomatoes**, **tomato paste**, **water**, and **chili seasoning**. + Stir to combine. + +5. Cover and simmer over low heat for at least 30 minutes, stirring occasionally. + +6. Serve hot with preferred toppings. + +## Notes + +- Makes 6 cups. diff --git a/source/chipotle-black-beans.md b/source/chipotle-black-beans.md index dd68088..5079782 100644 --- a/source/chipotle-black-beans.md +++ b/source/chipotle-black-beans.md @@ -2,15 +2,15 @@ ### Ingredients -- **2 tbsp** water or vegetable broth +- **2 tbsp.** water or vegetable broth - **1/2** medium Spanish yellow onion, diced - **3 cloves** garlic, minced - **3 cups** water or unsalted vegetable broth - **1 cup** dried black beans -- **2 tsp** cumin powder -- **1 tsp** Spanish paprika -- **1 tsp** chipotle powder -- **1 tbsp** lime juice +- **2 tsp.** cumin powder +- **1 tsp.** Spanish paprika +- **1 tsp.** chipotle powder +- **1 tbsp.** lime juice ### Instructions @@ -23,10 +23,10 @@ then press the Bean/Chili button (or Manual/Pressure Cook) and set the time to 35 minutes. 3. When the Instant Pot chimes, press Stop and allow the pressure to bleed off. - + 4. When the pressure is released, remove the lid. Add **lime juice** and stir, adding more **chipotle powder** to taste. - + 5. Use a handheld strainer to remove the beans. Save the liquid for adding to other recipes if desired. diff --git a/source/conversions.md b/source/conversions.md new file mode 100644 index 0000000..1eb6535 --- /dev/null +++ b/source/conversions.md @@ -0,0 +1,101 @@ +# Conversions + +## General Units + +- 1 yard (yd) = 0.9144 m +- 1 meter (m) ≈ 1.094 yd ≈ 3.281 ft ≈ 39.37 in + +- 1 m3 = $\frac{1}{0.9144^3}$ yd3 ≈ 1.308 yd3 +- 1 m3 ≈ 4,226.753 cups + +- 1 pound (lb) = 0.45359237 kg +- 1 kilogram (kg) ≈ 2.2046226 lb ≈ 35.273962 oz + +## Kitchen Units + +- 1 cup = 16 tbsp. + +- 1 tsp. +- 1 tbsp. = 0.5 fl oz +- 1 cup = 8 fl oz + +- 1 pt. = 2 cups +- 1 qt. = 4 cups +- 1 gal = 16 cups + +- 1 gal = 231 in3 +- 1 cup = 14.4375 in3 + +## Substitutions + +- **1 tsp.** minced garlic ≈ **1** clove garlic, minced +- **1/4 cup** egg substitute ≈ **1** large egg, scrambled +- **3/4 cup** dry beans, soaked ≈ **15 oz** canned beans, drained + +3.80958825 + +## Weight $\leftrightarrow$ Volume + +Densities of foodstuffs are commonly reported in kg/m3. +To get to a useful unit of measure: + +$$ +\frac{1\ \text{kg}}{1\ \text{m}^3} \times +\frac{16\ \text{oz}}{0.45359237\ \text{kg}} \times +\frac{1\ \text{m}^3}{4226.753\ \text{cups}} \approx +\frac{0.0083454\ \text{oz}}{1\ \text{cup}} +$$ + +$$ +1\ \text{kg}\ \text{m}^{-3} \approx 0.0083454\ \text{oz}\ \text{cup}^{-1} +$$ + +The density of dry kidney beans is 750 kg/m3, +approximately 6.26 oz/cup. + +140 g/cup +5.079451 oz/cup + +> [!cite] [Can I Substitute Dried Beans for Canned?](https://www.seriouseats.com/is-there-a-ratio-for-converting-between-dried) +> The most common can size for beans is about 15 ounces, +> which, once drained, contains approximately 1.5 cups or 9 ounces of beans... +> So for a recipe that calls for one 15-ounce can of beans, +> you can cook 3/4 cup (4.5 ounces) of the dried version and be in the ballpark. +> Conversely, if a recipe calls for 1 cup of dried beans, +> you'll need to buy two 15-ounce cans +> to have the 2+ cups worth of cooked beans the recipe will eventually yield. + +(1) 15 oz can beans, drained = 9 oz cooked beans + +cooked beans ≅ dry beans, soaked overnight and drained + +16 oz dry beans = 37-52 oz cooked beans + +Cooked weight and volume of 16 oz (1 lb) of dry beans: + +| Type | Weight (oz) | Volume (cups) | +| :-------------- | ----------: | ------------: | +| Pinto | 37 | 6.5 | +| Black | 37 | 7.0 | +| Red Kidney | 39 | 6.5 | +| Cannellini | 40 | 6.5 | +| Black-Eyed Peas | 45 | 6.5 | +| Chickpeas | 52 | 7.0 | + +Equivalent dry weight and volume per 15 oz can: + +| Type | Weight (oz) | Weight (g) | Volume @ 140 g/cup* (cups) | +| :-------------- | ----------: | ---------: | -------------------------: | +| Pinto | 3.9 | 110 | 0.79 | +| Black | 3.9 | 110 | 0.79 | +| Red Kidney | 3.7 | 105 | 0.75 | +| Cannellini | 3.6 | 102 | 0.73 | +| Black-Eyed Peas | 3.2 | 91 | 0.65 | +| Chickpeas | 2.8 | 79 | 0.56 | + +\*per Publix pinto beans serving size + +$$ +\frac{9\ \text{oz cooked beans}}{1\ \text{15 oz can beans}} \times +\frac{16\ \text{oz dry beans}}{37-52\ \text{oz cooked beans}} +$$ diff --git a/source/eggroll-in-a-bowl.md b/source/eggroll-in-a-bowl.md index 3fcb206..3a312af 100644 --- a/source/eggroll-in-a-bowl.md +++ b/source/eggroll-in-a-bowl.md @@ -2,18 +2,18 @@ ## Ingredients -* **1 lb** ground pork or turkey -* **1 tbsp** sesame oil -* **1 tbsp** minced garlic -* **1 tbsp** minced ginger +* **1 lb** ground pork, beef, or turkey +* **1 tbsp.** sesame oil +* **1 tbsp.** minced garlic +* **1 tbsp.** minced ginger * **8 oz** mushrooms, finely diced * **1/2** white or yellow onion, diced * **1/4 cup** low-sodium soy sauce -* **1 tbsp** fish sauce +* **1 tbsp.** fish sauce * **12-16 oz** cole slaw mix (1 package) -* **2 tbsp** rice wine vinegar -* **1 tbsp** hoisin sauce -* **1 tbsp** sriracha or gochujang +* **2 tbsp.** rice wine vinegar +* **1 tbsp.** hoisin sauce +* **1 tbsp.** sriracha or gochujang ## Directions @@ -36,4 +36,3 @@ Stir in the **hoisin sauce** and **sriracha or gochujang**. 7. Serve with wonton strips or over rice. - diff --git a/source/french-toast.md b/source/french-toast.md index bfe314c..9479d9a 100644 --- a/source/french-toast.md +++ b/source/french-toast.md @@ -6,9 +6,9 @@ - **2/3 cup** milk - **1/4 cup** all-purpose flour - **1/4 cup** granulated sugar -- **1/4 tsp** salt -- **1 tsp** ground cinnamon -- **1 tsp** vanilla extract +- **1/4 tsp.** salt +- **1 tsp.** ground cinnamon +- **1 tsp.** vanilla extract - **8** thick slices bread ## Instructions diff --git a/source/goulash.md b/source/goulash.md index c99eb29..0311ecc 100644 --- a/source/goulash.md +++ b/source/goulash.md @@ -2,7 +2,7 @@ ## Ingredients -* 1 tbsp olive oil +* 1 tbsp. olive oil * 1 yellow onion, diced * 4 cloves garlic, minced * 2 bell peppers, diced @@ -10,16 +10,19 @@ * 1/2 cup red wine (Cabernet Sauvignon) * 28 oz canned diced tomatoes (do not drain) * 15 oz canned tomato sauce -* 2 tbsp soy sauce -* 2 whole bay leaves -* 1/2 tsp dried oregano -* 1/2 tsp dried basil -* 1/4 tsp crushed red pepper +* 2 tbsp. soy sauce * 1/2 cup water * 8 oz elbow macaroni -* ? tsp table salt +* ? tsp. table salt -## Instructions +### Spices + +* 2 whole bay leaves +* 1/2 tsp. dried oregano +* 1/2 tsp. dried basil +* 1/4 tsp. crushed red pepper + +## Instructions 1. Heat the **olive oil** in a large soup pot over medium heat. Add the **onion** and **garlic** and sauté until the onions are translucent. @@ -29,8 +32,7 @@ 3. Add the **ground meat** and continue to sauté until the beef is cooked through. 4. Deglaze with the **red wine**. - Add the **diced tomatoes**, **tomato sauce**, **soy sauce**, **bay leaves**, - **oregano**, **basil**, **crushed red pepper**, and **water**. + Add the **diced tomatoes**, **tomato sauce**, **soy sauce**, **spices**, and **water**. Stir to combine, then cover and allow the sauce to come to a boil. Once boiling, turn down the heat to low and simmer for 30 minutes, stirring occasionally. @@ -40,4 +42,3 @@ 6. Remove from heat. Add salt and more to taste. Remove the bay leaves before serving. - diff --git a/source/granola.md b/source/granola.md index e566483..f2d8675 100644 --- a/source/granola.md +++ b/source/granola.md @@ -4,11 +4,11 @@ - **2 cups** old-fashioned rolled oats - **3/4 cup** raw nuts and/or seeds -- **1/2 tsp** fine-grain sea salt or standard table salt -- **1/4 tsp** ground cinnamon +- **1/2 tsp.** fine-grain sea salt or standard table salt +- **1/4 tsp.** ground cinnamon - **1/4 cup** melted coconut oil or olive oil - **1/4 cup** maple syrup or honey -- **1/2 tsp** vanilla extract +- **1/2 tsp.** vanilla extract - **1/4 cup** coconut flakes ## Instructions diff --git a/source/pad-thai.md b/source/pad-thai.md index 71d43ad..69b727d 100644 --- a/source/pad-thai.md +++ b/source/pad-thai.md @@ -1,11 +1,11 @@ # Pad Thai ## Ingredients - + ### For the Stir-Fry * **4 oz** dry brown rice noodles -* **2 tsp** sesame oil, extra virgin olive oil, or canola oil +* **2 tsp.** sesame oil, extra virgin olive oil, or canola oil * **8 oz** medium/large shrimp, peeled and deveined * **2** cloves garlic, minced * **2** large eggs or **1/2 cup** egg substitute @@ -30,12 +30,12 @@ ### For the Sauce -* **2 tbsp** fish sauce -* **1-1/2** tbsp rice vinegar -* **1 tbsp** low-sodium soy sauce -* **2 tbsp** water -* **1-3 tbsp** honey -* **1-3 tsp** ground chile sauce (sambal oelek) or chili garlic sauce +* **2 tbsp.** fish sauce +* **1-1/2** tbsp. rice vinegar +* **1 tbsp.** low-sodium soy sauce +* **2 tbsp.** water +* **1-3 tbsp.** honey +* **1-3 tsp.** ground chile sauce (sambal oelek) or chili garlic sauce #### Notes @@ -43,7 +43,7 @@ For spicier, add additional chili paste. ## Instructions - + 1. Cook the rice noodles until soft, but not mushy. Drain and rinse under cool water. @@ -76,6 +76,6 @@ in the refrigerator for up to 4 days. * To reheat: Warm in the microwave - with a splash of water or chicken broth + with a splash of water or chicken broth to keep the noodles from drying out. diff --git a/source/red-beans-and-rice.md b/source/red-beans-and-rice.md new file mode 100644 index 0000000..4bb8245 --- /dev/null +++ b/source/red-beans-and-rice.md @@ -0,0 +1,57 @@ +# Red Beans and Rice + +## Ingredients + +- **1 lb** dry red beans, soaked overnight, drained, and rinsed +- **2 tbsp.** cooking oil +- **12-16** oz Andouille sausage, sliced into rounds +- **1** yellow onion, diced +- **1** green bell pepper, diced +- **3 ribs** celery, diced +- **4 cloves** garlic, minced +- **6 cups** water +- **1/4 cup** chopped parsley +- **1 tbsp.** salt + +### Spices + +- **2 tsp.** smoked paprika +- **1 tsp.** dried oregano +- **1 tsp.** dried thyme +- **1/2 tsp.** garlic powder +- **1/2 tsp.** onion powder +- **1/4 tsp.** cayenne pepper +- **1/4 tsp.** freshly cracked black pepper +- **2** bay leaves + +## Instructions + +1. Heat the **oil** in a large pot over medium heat. + Add the **sausage** and cook until browned. + Remove the sausage to a bowl and refrigerate. + +1. Add the **onion**, **bell pepper**, **celery**, and **garlic** to the pot. + Sauté over medium heat until the onions are soft. + +1. Add the **spices**. Stir and continue to sauté for another minute. + +1. Add the **beans** and **water**. Cover and bring to a boil. + +1. Once boiling, turn the heat down to medium-low and boil for one hour, stirring occasionally. + +1. Smash the beans against the side of the pot with the back of a spoon. + Continue smashing the beans while simmering uncovered for 30 minutes. + +1. Once the red beans have thickened, + add the sausage back to the pot along with the **parsley**. + Stir to combine. + +1. Serve hot with rice. + +## Notes + +- Makes 9 cups. + +- Because the rice is cooked separately, and (assuming leftovers) in multiple batches, + I've omitted it from this recipe. + I like 1/2 cup (dry) per serving. diff --git a/source/rice-pudding.md b/source/rice-pudding.md index 40501a5..f92c367 100644 --- a/source/rice-pudding.md +++ b/source/rice-pudding.md @@ -4,12 +4,12 @@ - **1 cup** dry rice - **1-1/4** cup water -- **1 tsp** salt -- **1 tsp** cinnamon +- **1 tsp.** salt +- **1 tsp.** cinnamon - **2 cups** milk - **2 eggs** or **1/2 cup** egg substitute - **3/4 cup** sugar -- **1-1/2 tsp** vanilla +- **1-1/2 tsp.** vanilla ## Instructions diff --git a/source/stroganoff.md b/source/stroganoff.md index 9a65b80..d318389 100644 --- a/source/stroganoff.md +++ b/source/stroganoff.md @@ -2,12 +2,12 @@ ### Ingredients -- **3 tbsp** extra-virgin olive oil, divided +- **3 tbsp.** extra-virgin olive oil, divided - **8 oz** crimini mushrooms, sliced - **1/2 cup** diced onion - **2 cloves** garlic, minced - **1 lb** ground beef or turkey -- **2 tsp** paprika +- **2 tsp.** paprika - **3-4 cups** low sodium beef broth - **8 oz** dry rotini - **1/2 cup** sour cream diff --git a/source/tuna-salad.md b/source/tuna-salad.md index b0749fd..ca597f2 100644 --- a/source/tuna-salad.md +++ b/source/tuna-salad.md @@ -1,18 +1,18 @@ # Tuna Salad -## Ingredients +## Ingredients - **20 oz** tuna packed in water, drained (**4** 5-oz cans) - **1 cup** mayonnaise -- **1/3 cup** celery finely chopped (about 1 rib) -- **2 tbsp** red onion, minced (about 2 small slices) -- **2 tbsp** sweet pickle or dill relish -- **1 tbsp** lemon juice +- **1** rib celery, finely chopped (about 1/3 cup) +- **2 tbsp.** red onion, minced (about 2 small slices) +- **2 tbsp.** sweet pickle or dill relish +- **1 tbsp.** lemon juice - **1** clove garlic, minced -- **1/2 tsp** table salt -- **1/4 tsp** black pepper, ground +- **1/2 tsp.** table salt +- **1/4 tsp.** black pepper, ground -## Instructions +## Instructions 1. In a medium mixing bowl, combine all ingredients. From cc9705ae96374f2bc10fddad8c8674444017998f Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Sun, 9 Nov 2025 12:04:39 -0500 Subject: [PATCH 08/32] Fixed formatting, added standalone build option --- source/chili.md | 3 +++ source/chipotle-black-beans.md | 11 +++++++---- source/cover.md | 11 +++++++++++ source/eggroll-in-a-bowl.md | 3 +++ source/french-toast.md | 3 +++ source/goulash.md | 35 ++++++++++++++++++---------------- source/granola.md | 2 ++ source/pad-thai.md | 21 +++++++++++--------- source/red-beans-and-rice.md | 4 ++++ source/rice-pudding.md | 10 ++++++---- source/stroganoff.md | 6 ++++-- source/tuna-salad.md | 3 +++ 12 files changed, 77 insertions(+), 35 deletions(-) create mode 100644 source/cover.md diff --git a/source/chili.md b/source/chili.md index 52eda81..ade205e 100644 --- a/source/chili.md +++ b/source/chili.md @@ -45,3 +45,6 @@ ## Notes - Makes 6 cups. + +
+
\ No newline at end of file diff --git a/source/chipotle-black-beans.md b/source/chipotle-black-beans.md index 5079782..4c35a29 100644 --- a/source/chipotle-black-beans.md +++ b/source/chipotle-black-beans.md @@ -1,6 +1,6 @@ # Chipotle Black Beans -### Ingredients +## Ingredients - **2 tbsp.** water or vegetable broth - **1/2** medium Spanish yellow onion, diced @@ -12,7 +12,7 @@ - **1 tsp.** chipotle powder - **1 tbsp.** lime juice -### Instructions +## Instructions 1. Set the Instant Pot to Sauté. Add the 2 tablespoons **water or vegetable broth**, **onion** and **garlic**. @@ -30,7 +30,7 @@ 5. Use a handheld strainer to remove the beans. Save the liquid for adding to other recipes if desired. -### Notes +## Notes * Makes 3 cups @@ -41,4 +41,7 @@ * If the beans are not cooked to your liking at the end of the 35 minutes, you can cook for additional 5 minutes on the same settings.  -* Store in the fridge in an airtight container for up to 4-5 days. \ No newline at end of file +* Store in the fridge in an airtight container for up to 4-5 days. + +
+
\ No newline at end of file diff --git a/source/cover.md b/source/cover.md new file mode 100644 index 0000000..720848a --- /dev/null +++ b/source/cover.md @@ -0,0 +1,11 @@ +--- +title: Recipes for People Who Don't Own Plates, Apparently +author: Polybius +font: + - Helvetica + - Arial + - Freesans + - clean + - sans-serif +--- +
\ No newline at end of file diff --git a/source/eggroll-in-a-bowl.md b/source/eggroll-in-a-bowl.md index 3a312af..aa73c32 100644 --- a/source/eggroll-in-a-bowl.md +++ b/source/eggroll-in-a-bowl.md @@ -36,3 +36,6 @@ Stir in the **hoisin sauce** and **sriracha or gochujang**. 7. Serve with wonton strips or over rice. + +
+
\ No newline at end of file diff --git a/source/french-toast.md b/source/french-toast.md index 9479d9a..aec7c24 100644 --- a/source/french-toast.md +++ b/source/french-toast.md @@ -35,3 +35,6 @@ before storing in a freezer-safe bag or container for up to 3 months. Rewarm on a skillet, in the toaster, or for a few seconds in the microwave. + +
+
\ No newline at end of file diff --git a/source/goulash.md b/source/goulash.md index 0311ecc..2646292 100644 --- a/source/goulash.md +++ b/source/goulash.md @@ -2,25 +2,25 @@ ## Ingredients -* 1 tbsp. olive oil -* 1 yellow onion, diced -* 4 cloves garlic, minced -* 2 bell peppers, diced -* 1 lb ground beef or turkey -* 1/2 cup red wine (Cabernet Sauvignon) -* 28 oz canned diced tomatoes (do not drain) -* 15 oz canned tomato sauce -* 2 tbsp. soy sauce -* 1/2 cup water -* 8 oz elbow macaroni -* ? tsp. table salt +* **1 tbsp.** olive oil +* **1** yellow onion, diced +* **4** cloves garlic, minced +* **2** bell peppers, diced +* **1 lb** ground beef or turkey +* **1/2 cup** red wine (Cabernet Sauvignon) +* **28 oz** canned diced tomatoes (do not drain) +* **15 oz** canned tomato sauce +* **2 tbsp.** soy sauce +* **1/2 cup** water +* **8 oz** elbow macaroni +* **? tsp.** table salt ### Spices -* 2 whole bay leaves -* 1/2 tsp. dried oregano -* 1/2 tsp. dried basil -* 1/4 tsp. crushed red pepper +* **2** whole bay leaves +* **1/2 tsp.** dried oregano +* **1/2 tsp.** dried basil +* **1/4 tsp.** crushed red pepper ## Instructions @@ -42,3 +42,6 @@ 6. Remove from heat. Add salt and more to taste. Remove the bay leaves before serving. + +
+
\ No newline at end of file diff --git a/source/granola.md b/source/granola.md index f2d8675..5f24871 100644 --- a/source/granola.md +++ b/source/granola.md @@ -44,3 +44,5 @@ Use honey for a more neutral flavored, clumpy granola. +
+
\ No newline at end of file diff --git a/source/pad-thai.md b/source/pad-thai.md index 69b727d..2ba3aad 100644 --- a/source/pad-thai.md +++ b/source/pad-thai.md @@ -42,35 +42,37 @@ * For a sweeter pad thai, add additional honey or a little brown sugar. For spicier, add additional chili paste. +
+ ## Instructions -1. Cook the rice noodles until soft, but not mushy. +1. Cook the **noodles** until soft, but not mushy. Drain and rinse under cool water. -2. In a small bowl, whisk together the sauce ingredients. +2. In a small bowl, whisk together the **sauce**. 3. Heat the oil in a large non-stick skillet or wok over medium-high heat. - Add the shrimp and saute about 2 minutes, + Add the **shrimp** and saute about 2 minutes, or just until the shrimp begins to turn pink. -4. Add the garlic and noodles. +4. Add the **garlic** and **noodles**. Stir continuously to coat the noodles and shrimp with the garlic, then push the ingredients over to one side of the pan. -5. Crack the eggs into the empty side of the pan +5. Crack the **eggs** into the empty side of the pan and break apart the yolk with the spatula. Let cook for 30 seconds, until just beginning to set. 6. Add the sauce and stir everything to combine. -7. Add the bean sprouts, carrots, and chopped green onions +7. Add the **bean sprouts**, **carrots**, and **green onions** and let cook about 1 minute, or until the bean sprouts are crisp-tender. -8. Sprinkle on the peanuts and cilantro. - Serve immediately with lime wedges. +8. Sprinkle on the **peanuts** and **cilantro**. + Serve immediately with the **lime wedges**. -### Notes +## Notes * Keep leftovers in an airtight container in the refrigerator for up to 4 days. @@ -79,3 +81,4 @@ with a splash of water or chicken broth to keep the noodles from drying out. +
\ No newline at end of file diff --git a/source/red-beans-and-rice.md b/source/red-beans-and-rice.md index 4bb8245..2851a0b 100644 --- a/source/red-beans-and-rice.md +++ b/source/red-beans-and-rice.md @@ -24,6 +24,8 @@ - **1/4 tsp.** freshly cracked black pepper - **2** bay leaves +
+ ## Instructions 1. Heat the **oil** in a large pot over medium heat. @@ -55,3 +57,5 @@ - Because the rice is cooked separately, and (assuming leftovers) in multiple batches, I've omitted it from this recipe. I like 1/2 cup (dry) per serving. + +
\ No newline at end of file diff --git a/source/rice-pudding.md b/source/rice-pudding.md index f92c367..ce83c1d 100644 --- a/source/rice-pudding.md +++ b/source/rice-pudding.md @@ -13,14 +13,14 @@ ## Instructions -1. To the Instant Pot, add white rice, water, salt, and cinnamon. +1. To the Instant Pot, add the **rice**, **water**, **salt**, and **cinnamon**. Stir to combine. 2. Lock the lid, set the valve to seal, and manually set the pressure for 14 minutes. Allow time for the Instant Pot to come to pressure before it starts counting down & cooking.  -3. While the rice is cooking, in a small bowl, - whisk together milk, eggs, sugar, and vanilla.  +3. While the rice is cooking, + in a small bowl, whisk together the **milk**, **eggs**, **sugar**, and **vanilla**.  4. When the Instant Pot chimes, quick release the pressure.  @@ -28,7 +28,9 @@ stirring quickly so that the eggs don't scramble.  6. Set the Instant Pot to sauté - and continue to mix until rice thickens, 5-10 minutes. + and continue to mix until rice thickens, about 5-10 minutes. 7. Optionally serve with walnuts and/or raisins. Garnish with additional cinnamon. +
+
\ No newline at end of file diff --git a/source/stroganoff.md b/source/stroganoff.md index d318389..d55910a 100644 --- a/source/stroganoff.md +++ b/source/stroganoff.md @@ -1,6 +1,6 @@ # Stroganoff -### Ingredients +## Ingredients - **3 tbsp.** extra-virgin olive oil, divided - **8 oz** crimini mushrooms, sliced @@ -13,7 +13,7 @@ - **1/2 cup** sour cream - fresh parsley for serving -### Instructions +## Instructions 1. Heat 2 tablespoons of **oil** over medium heat in a large pot. Add the **onion**, season with salt and pepper, @@ -43,3 +43,5 @@ 8. Serve with **fresh parsley**. +
+
\ No newline at end of file diff --git a/source/tuna-salad.md b/source/tuna-salad.md index ca597f2..4045e7e 100644 --- a/source/tuna-salad.md +++ b/source/tuna-salad.md @@ -23,3 +23,6 @@ - Makes 3 cups. - Store leftovers in an airtight container in the refrigerator for up to 4 days. + +
+
\ No newline at end of file From 86ae99339c7a8c60fec633f3051d9b86ce5f1531 Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Fri, 19 Dec 2025 16:26:17 -0500 Subject: [PATCH 09/32] added risotto recipe --- source/red-beans-and-rice.md | 2 +- source/risotto.html | 8328 ++++++++++++++++++++++++++++++++++ source/risotto.md | 45 + 3 files changed, 8374 insertions(+), 1 deletion(-) create mode 100644 source/risotto.html create mode 100644 source/risotto.md diff --git a/source/red-beans-and-rice.md b/source/red-beans-and-rice.md index 2851a0b..b1fe8c2 100644 --- a/source/red-beans-and-rice.md +++ b/source/red-beans-and-rice.md @@ -4,7 +4,7 @@ - **1 lb** dry red beans, soaked overnight, drained, and rinsed - **2 tbsp.** cooking oil -- **12-16** oz Andouille sausage, sliced into rounds +- **12--16** oz Andouille sausage, sliced into rounds - **1** yellow onion, diced - **1** green bell pepper, diced - **3 ribs** celery, diced diff --git a/source/risotto.html b/source/risotto.html new file mode 100644 index 0000000..d92ab5b --- /dev/null +++ b/source/risotto.html @@ -0,0 +1,8328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +The Best Risotto Recipe | Food Network Kitchen | Food Network + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + +
+
+ +
+ +
+
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +
+
+ + + + + + + + +
+
+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+
+
+
+ + + + Food Network Kitchen Step by Steps + + + + +
+
+
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + Recipe courtesy of Food Network Kitchen + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + +
+ + +

+ The Best Risotto +

+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ Getting reviews... +
+
+
+ + + +
+ + + + +
+ + +
+ + +
+ + + + +
+ + + + + +
    +
  • + Level: + Easy + +
  • +
+
    +
  • + Total: + 30 min + +
  • +
  • + Active: + 30 min +
  • +
+ + + + + + +
    +
  • + Yield: + 4 to 6 servings + +
  • +
  • +
    + + + + + + + + +
    + +
  • +
+
+ + +
+ + +
+ + + + + + + + + +
+
+ With relatively few ingredients (none of them being cream), the success of a classic creamy risotto depends largely on technique. We've tested all the methods and narrowed it down to a few easy-to-follow steps that will help you achieve perfectly cooked Italian-style rice every time. This basic recipe is delicious on its own and makes a wonderful base to add your favorite vegetables or protein. +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+ + + + +
+ + + + +
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + +
+
+ +

+ + Ingredients + + +

+ +
+
+ +
+ + +

+ +

+ + + + + + + + +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ + +
+ + +
+ +
+
+ +
+ + + + + + + + +
+
+ +

+ + Directions + + +

+ +
+
+ + + + + + + + + + + + +
+ + + + +
+ + + + + + +
    + + +
  1. + Warm the chicken stock in a medium saucepan over medium-low heat, cover and keep warm while you make the risotto. +
  2. + +
  3. + Heat the olive oil in another medium saucepan over medium heat until shimmering. Add the shallot, garlic, 1/2 teaspoon salt and about 10 grinds of black pepper and cook, stirring occasionally, until the vegetables are softened, 3 to 4 minutes. Add the bay leaves and 3 tablespoons butter, stirring until the butter has melted, about 1 minute. +
  4. + +
  5. + Add the rice and toast, stirring only once, until it smells nutty and starts to turn light golden brown, 3 to 4 minutes. +
  6. + +
  7. + Pour in the wine and simmer, stirring occasionally, until it has evaporated completely, 2 to 3 minutes. +
  8. + +
  9. + Ladle one cup of the warm stock into the rice and cook, stirring gently without stopping, until the rice has absorbed the liquid, 2 to 3 minutes (you will know it's time to add more stock when you move the rice aside and no liquid pools in the center). +
  10. + +
  11. + Repeat this process, adding more stock a ladleful at a time, until the rice is al dente, 17 to 19 minutes. Discard the bay leaves. (You may have a little stock left over. If so, refrigerate in an airtight container for up to 1 week.) If you prefer your risotto on the saucier side, add more stock 1/4 cup at a time until the desired consistency is reached. +
  12. + +
  13. + Stir in the Parmesan, the remaining 2 tablespoons butter, 1 teaspoon salt and a few more grinds of black pepper and serve with more Parmesan, if desired. +
  14. + +
+ + + + +
+
+ + +
+
+

Cook’s Note

+
+

We prefer the flavor of homemade chicken stock in this recipe. If you don't have any, you can substitute quality low-sodium chicken broth, but it will affect the flavor somewhat. + +Arborio rice is a medium-grain Italian variety that is grown for making risotto.

+
+ + + + + + + +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ + + + + + + + + The Best Superfoods + 22 Photos + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ +
+ + + + + + + + + The Best Meatloaf + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ + + + +
+ +
+ + + + + + + + + The Best Cheesecake + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ + + + +
+ +
+ + + + + + + + + The Best Carbonara + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ + + + +
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ + +
+ +
+ +
+ + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ +
+ + +
+ + + + + + +
+ + + + + +
+
+ +

+ + 👩‍🍳 What's Cooking + + +

+ + +
+ + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + +
+ +
+ +
+
+
+ +
+
+
+
+
+ + +
+ + + + + + +
+ + + + + +
+
+ +

+ + Shop With Us + + +

+ + +
+ + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + +
+ +
+
+ + + + + + + + +
+
+
+ +
+ + +
+
+
+ +
+
+
+
+
+
+ + + + + +
+ +
+ +
+
+ +
+ + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/risotto.md b/source/risotto.md new file mode 100644 index 0000000..deb4a5c --- /dev/null +++ b/source/risotto.md @@ -0,0 +1,45 @@ +# Risotto + +## Ingredients + +* 7 cups chicken stock +* 2 tbsp. olive oil +* 1 large shallot, finely chopped (~1⁄4 cup) +* 2 cloves garlic, minced +* 1-1⁄2 tsp. kosher salt +* ? tsp. black pepper +* 2 bay leaves +* 5 tbsp. unsalted butter +* 2 cups arborio rice +* 1 cup dry white wine +* 3⁄4 cup freshly grated Parmesan, plus more for garnish + +## Directions + +1. Warm the chicken stock in a medium saucepan over medium-low heat, + cover and keep warm. + +2. Heat the olive oil in another medium saucepan. + Add the shallot, garlic, 1⁄2 teaspoon salt and ~10 grinds of black pepper + and cook, stirring occasionally, until the vegetables are softened, 3--4 minutes. + +3. Add the bay leaves and 3 tablespoons butter, + stirring until the butter has melted, ~1 minute. + +4. Add the rice and stir once. + Toast until the rice starts to turn light golden brown, 3--4 minutes. + +5. Pour in the wine and simmer, stirring occasionally, + until it has evaporated completely, 2--3 minutes. + +6. Ladle one cup of the warm stock into the rice + and cook, stirring gently without stopping, + until the rice has absorbed the liquid, 2--3 minutes. + +7. Repeat this process, adding more stock a ladleful at a time, + until the rice is al dente, 17--19 minutes. Discard the bay leaves. + +8. Stir in the Parmesan, the remaining 2 tablespoons butter, 1 teaspoon salt + and a few more grinds of black pepper. + +9. Serve hot, with more Parmesan, if desired. From b48de10ab8d1a961212aa53445024e9616636839 Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Wed, 24 Dec 2025 15:43:17 -0500 Subject: [PATCH 10/32] fixed formatting, added lint script --- source/chili.md | 6 +- source/conversions.md | 101 - source/goulash.md | 10 +- source/pad-thai.md | 6 +- source/red-beans-and-rice.md | 16 +- source/rice-pudding.md | 18 +- source/risotto.html | 8328 ---------------------------------- source/risotto.md | 65 +- source/stroganoff.md | 6 +- source/tuna-salad.md | 10 +- 10 files changed, 71 insertions(+), 8495 deletions(-) delete mode 100644 source/conversions.md delete mode 100644 source/risotto.html diff --git a/source/chili.md b/source/chili.md index ade205e..1da2e45 100644 --- a/source/chili.md +++ b/source/chili.md @@ -5,7 +5,7 @@ - **2 tbsp.** olive oil - **1** yellow onion, diced - **2 cloves** garlic, minced -- **1 lb** ground beef or turkey +- **1 lb** ground beef, turkey, or pork - **3/4 cup** dry kidney beans, soaked overnight and drained - **3/4 cup** dry black beans, soaked overnight and drained - **1 15oz can** diced or crushed tomatoes, not drained @@ -29,7 +29,7 @@ Add the **onion**, season with salt and pepper, and cook until translucent, about 4-5 minutes. -2. Stir in the **garlic** and cook until fragrant, 30-60 seconds. +2. Stir in the **garlic** and cook until fragrant, 30--60 seconds. 3. Add the **ground meat** and continue to cook, breaking up the meat with a spoon as it cooks, @@ -47,4 +47,4 @@ - Makes 6 cups.
-
\ No newline at end of file +
diff --git a/source/conversions.md b/source/conversions.md deleted file mode 100644 index 1eb6535..0000000 --- a/source/conversions.md +++ /dev/null @@ -1,101 +0,0 @@ -# Conversions - -## General Units - -- 1 yard (yd) = 0.9144 m -- 1 meter (m) ≈ 1.094 yd ≈ 3.281 ft ≈ 39.37 in - -- 1 m3 = $\frac{1}{0.9144^3}$ yd3 ≈ 1.308 yd3 -- 1 m3 ≈ 4,226.753 cups - -- 1 pound (lb) = 0.45359237 kg -- 1 kilogram (kg) ≈ 2.2046226 lb ≈ 35.273962 oz - -## Kitchen Units - -- 1 cup = 16 tbsp. - -- 1 tsp. -- 1 tbsp. = 0.5 fl oz -- 1 cup = 8 fl oz - -- 1 pt. = 2 cups -- 1 qt. = 4 cups -- 1 gal = 16 cups - -- 1 gal = 231 in3 -- 1 cup = 14.4375 in3 - -## Substitutions - -- **1 tsp.** minced garlic ≈ **1** clove garlic, minced -- **1/4 cup** egg substitute ≈ **1** large egg, scrambled -- **3/4 cup** dry beans, soaked ≈ **15 oz** canned beans, drained - -3.80958825 - -## Weight $\leftrightarrow$ Volume - -Densities of foodstuffs are commonly reported in kg/m3. -To get to a useful unit of measure: - -$$ -\frac{1\ \text{kg}}{1\ \text{m}^3} \times -\frac{16\ \text{oz}}{0.45359237\ \text{kg}} \times -\frac{1\ \text{m}^3}{4226.753\ \text{cups}} \approx -\frac{0.0083454\ \text{oz}}{1\ \text{cup}} -$$ - -$$ -1\ \text{kg}\ \text{m}^{-3} \approx 0.0083454\ \text{oz}\ \text{cup}^{-1} -$$ - -The density of dry kidney beans is 750 kg/m3, -approximately 6.26 oz/cup. - -140 g/cup -5.079451 oz/cup - -> [!cite] [Can I Substitute Dried Beans for Canned?](https://www.seriouseats.com/is-there-a-ratio-for-converting-between-dried) -> The most common can size for beans is about 15 ounces, -> which, once drained, contains approximately 1.5 cups or 9 ounces of beans... -> So for a recipe that calls for one 15-ounce can of beans, -> you can cook 3/4 cup (4.5 ounces) of the dried version and be in the ballpark. -> Conversely, if a recipe calls for 1 cup of dried beans, -> you'll need to buy two 15-ounce cans -> to have the 2+ cups worth of cooked beans the recipe will eventually yield. - -(1) 15 oz can beans, drained = 9 oz cooked beans - -cooked beans ≅ dry beans, soaked overnight and drained - -16 oz dry beans = 37-52 oz cooked beans - -Cooked weight and volume of 16 oz (1 lb) of dry beans: - -| Type | Weight (oz) | Volume (cups) | -| :-------------- | ----------: | ------------: | -| Pinto | 37 | 6.5 | -| Black | 37 | 7.0 | -| Red Kidney | 39 | 6.5 | -| Cannellini | 40 | 6.5 | -| Black-Eyed Peas | 45 | 6.5 | -| Chickpeas | 52 | 7.0 | - -Equivalent dry weight and volume per 15 oz can: - -| Type | Weight (oz) | Weight (g) | Volume @ 140 g/cup* (cups) | -| :-------------- | ----------: | ---------: | -------------------------: | -| Pinto | 3.9 | 110 | 0.79 | -| Black | 3.9 | 110 | 0.79 | -| Red Kidney | 3.7 | 105 | 0.75 | -| Cannellini | 3.6 | 102 | 0.73 | -| Black-Eyed Peas | 3.2 | 91 | 0.65 | -| Chickpeas | 2.8 | 79 | 0.56 | - -\*per Publix pinto beans serving size - -$$ -\frac{9\ \text{oz cooked beans}}{1\ \text{15 oz can beans}} \times -\frac{16\ \text{oz dry beans}}{37-52\ \text{oz cooked beans}} -$$ diff --git a/source/goulash.md b/source/goulash.md index 2646292..e519fdd 100644 --- a/source/goulash.md +++ b/source/goulash.md @@ -6,13 +6,13 @@ * **1** yellow onion, diced * **4** cloves garlic, minced * **2** bell peppers, diced -* **1 lb** ground beef or turkey +* **1 lb** ground beef, turkey, or pork * **1/2 cup** red wine (Cabernet Sauvignon) -* **28 oz** canned diced tomatoes (do not drain) -* **15 oz** canned tomato sauce +* **1 28oz can** canned diced tomatoes (do not drain) +* **1 15oz can** canned tomato sauce * **2 tbsp.** soy sauce * **1/2 cup** water -* **8 oz** elbow macaroni +* **8 oz** dry elbow macaroni * **? tsp.** table salt ### Spices @@ -44,4 +44,4 @@ Remove the bay leaves before serving.
-
\ No newline at end of file +
diff --git a/source/pad-thai.md b/source/pad-thai.md index 2ba3aad..96ba26c 100644 --- a/source/pad-thai.md +++ b/source/pad-thai.md @@ -6,8 +6,8 @@ * **4 oz** dry brown rice noodles * **2 tsp.** sesame oil, extra virgin olive oil, or canola oil -* **8 oz** medium/large shrimp, peeled and deveined -* **2** cloves garlic, minced +* **8 oz** medium or large shrimp, peeled and deveined +* **2 cloves** garlic, minced * **2** large eggs or **1/2 cup** egg substitute * **1/2 cup** bean sprouts * **1/2 cup** grated carrots @@ -81,4 +81,4 @@ with a splash of water or chicken broth to keep the noodles from drying out. -
\ No newline at end of file +
diff --git a/source/red-beans-and-rice.md b/source/red-beans-and-rice.md index b1fe8c2..1ecede4 100644 --- a/source/red-beans-and-rice.md +++ b/source/red-beans-and-rice.md @@ -32,23 +32,23 @@ Add the **sausage** and cook until browned. Remove the sausage to a bowl and refrigerate. -1. Add the **onion**, **bell pepper**, **celery**, and **garlic** to the pot. +2. Add the **onion**, **bell pepper**, **celery**, and **garlic** to the pot. Sauté over medium heat until the onions are soft. -1. Add the **spices**. Stir and continue to sauté for another minute. +3. Add the **spices**. Stir and continue to sauté for another minute. -1. Add the **beans** and **water**. Cover and bring to a boil. +4. Add the **beans** and **water**. Cover and bring to a boil. -1. Once boiling, turn the heat down to medium-low and boil for one hour, stirring occasionally. +5. Once boiling, turn the heat down to medium-low and boil for one hour, stirring occasionally. -1. Smash the beans against the side of the pot with the back of a spoon. +6. Smash the beans against the side of the pot with the back of a spoon. Continue smashing the beans while simmering uncovered for 30 minutes. -1. Once the red beans have thickened, +7. Once the red beans have thickened, add the sausage back to the pot along with the **parsley**. Stir to combine. -1. Serve hot with rice. +8. Serve hot with rice. ## Notes @@ -58,4 +58,4 @@ I've omitted it from this recipe. I like 1/2 cup (dry) per serving. -
\ No newline at end of file +
diff --git a/source/rice-pudding.md b/source/rice-pudding.md index ce83c1d..22a5a5a 100644 --- a/source/rice-pudding.md +++ b/source/rice-pudding.md @@ -3,13 +3,13 @@ ## Ingredients - **1 cup** dry rice -- **1-1/4** cup water +- **1-1/4 cup** water - **1 tsp.** salt -- **1 tsp.** cinnamon +- **1 tsp.** ground cinnamon - **2 cups** milk - **2 eggs** or **1/2 cup** egg substitute -- **3/4 cup** sugar -- **1-1/2 tsp.** vanilla +- **3/4 cup** granulated sugar +- **1-1/2 tsp.** vanilla extract ## Instructions @@ -17,15 +17,15 @@ Stir to combine. 2. Lock the lid, set the valve to seal, and manually set the pressure for 14 minutes. - Allow time for the Instant Pot to come to pressure before it starts counting down & cooking.  + Allow time for the Instant Pot to come to pressure before it starts counting down & cooking. 3. While the rice is cooking, - in a small bowl, whisk together the **milk**, **eggs**, **sugar**, and **vanilla**.  + in a small bowl, whisk together the **milk**, **eggs**, **sugar**, and **vanilla**. -4. When the Instant Pot chimes, quick release the pressure.  +4. When the Instant Pot chimes, quick release the pressure. 5. Slowly add the milk mixture to the rice in the Instant Pot, - stirring quickly so that the eggs don't scramble.  + stirring quickly so that the eggs don't scramble. 6. Set the Instant Pot to sauté and continue to mix until rice thickens, about 5-10 minutes. @@ -33,4 +33,4 @@ 7. Optionally serve with walnuts and/or raisins. Garnish with additional cinnamon.
-
\ No newline at end of file +
diff --git a/source/risotto.html b/source/risotto.html deleted file mode 100644 index d92ab5b..0000000 --- a/source/risotto.html +++ /dev/null @@ -1,8328 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -The Best Risotto Recipe | Food Network Kitchen | Food Network - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - -
-
- -
- -
-
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
- - -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - -
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- - - - -
-
- - - - - - - - -
-
- - - - -
- -
-
- - - - - - - - - - - - - - - - - - -
-
- - - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-
-
-
-
- - - - Food Network Kitchen Step by Steps - - - - -
-
-
-
- - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - Recipe courtesy of Food Network Kitchen - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - - - - - - -
- - -

- The Best Risotto -

-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- Getting reviews... -
-
-
- - - -
- - - - -
- - -
- - -
- - - - -
- - - - - -
    -
  • - Level: - Easy - -
  • -
-
    -
  • - Total: - 30 min - -
  • -
  • - Active: - 30 min -
  • -
- - - - - - -
    -
  • - Yield: - 4 to 6 servings - -
  • -
  • -
    - - - - - - - - -
    - -
  • -
-
- - -
- - -
- - - - - - - - - -
-
- With relatively few ingredients (none of them being cream), the success of a classic creamy risotto depends largely on technique. We've tested all the methods and narrowed it down to a few easy-to-follow steps that will help you achieve perfectly cooked Italian-style rice every time. This basic recipe is delicious on its own and makes a wonderful base to add your favorite vegetables or protein. -
-
- -
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
- - - - -
- - - - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
- -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - -
-
- -

- - Ingredients - - -

- -
-
- -
- - -

- -

- - - - - - - - -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- - -
- - -
- -
-
- -
- - - - - - - - -
-
- -

- - Directions - - -

- -
-
- - - - - - - - - - - - -
- - - - -
- - - - - - -
    - - -
  1. - Warm the chicken stock in a medium saucepan over medium-low heat, cover and keep warm while you make the risotto. -
  2. - -
  3. - Heat the olive oil in another medium saucepan over medium heat until shimmering. Add the shallot, garlic, 1/2 teaspoon salt and about 10 grinds of black pepper and cook, stirring occasionally, until the vegetables are softened, 3 to 4 minutes. Add the bay leaves and 3 tablespoons butter, stirring until the butter has melted, about 1 minute. -
  4. - -
  5. - Add the rice and toast, stirring only once, until it smells nutty and starts to turn light golden brown, 3 to 4 minutes. -
  6. - -
  7. - Pour in the wine and simmer, stirring occasionally, until it has evaporated completely, 2 to 3 minutes. -
  8. - -
  9. - Ladle one cup of the warm stock into the rice and cook, stirring gently without stopping, until the rice has absorbed the liquid, 2 to 3 minutes (you will know it's time to add more stock when you move the rice aside and no liquid pools in the center). -
  10. - -
  11. - Repeat this process, adding more stock a ladleful at a time, until the rice is al dente, 17 to 19 minutes. Discard the bay leaves. (You may have a little stock left over. If so, refrigerate in an airtight container for up to 1 week.) If you prefer your risotto on the saucier side, add more stock 1/4 cup at a time until the desired consistency is reached. -
  12. - -
  13. - Stir in the Parmesan, the remaining 2 tablespoons butter, 1 teaspoon salt and a few more grinds of black pepper and serve with more Parmesan, if desired. -
  14. - -
- - - - -
-
- - -
-
-

Cook’s Note

-
-

We prefer the flavor of homemade chicken stock in this recipe. If you don't have any, you can substitute quality low-sodium chicken broth, but it will affect the flavor somewhat. - -Arborio rice is a medium-grain Italian variety that is grown for making risotto.

-
- - - - - - - -
-
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- -
-
- - -
- -
- - - - - - - - - The Best Superfoods - 22 Photos - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - -
- -
- - - - - - - - - The Best Meatloaf - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
- - -
- - - - -
- -
- - - - - - - - - The Best Cheesecake - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
- - -
- - - - -
- -
- - - - - - - - - The Best Carbonara - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
- - -
- -
-
- - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
-
- - -
- -
- -
- - - - - -
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- -
- - -
- - - - - - -
- - - - - -
-
- -

- - 👩‍🍳 What's Cooking - - -

- - -
- - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - - - - - -
- -
- -
-
-
- -
-
-
-
-
- - -
- - - - - - -
- - - - - -
-
- -

- - Shop With Us - - -

- - -
- - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - -
- - - - - -
- - - - - -
- - - - - -
- - - -
- -
-
- - - - - - - - -
-
-
- -
- - -
-
-
- -
-
-
-
-
-
- - - - - -
- -
- -
-
- -
- - - -
- - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/risotto.md b/source/risotto.md index deb4a5c..c3ac851 100644 --- a/source/risotto.md +++ b/source/risotto.md @@ -2,44 +2,49 @@ ## Ingredients -* 7 cups chicken stock -* 2 tbsp. olive oil -* 1 large shallot, finely chopped (~1⁄4 cup) -* 2 cloves garlic, minced -* 1-1⁄2 tsp. kosher salt -* ? tsp. black pepper -* 2 bay leaves -* 5 tbsp. unsalted butter -* 2 cups arborio rice -* 1 cup dry white wine -* 3⁄4 cup freshly grated Parmesan, plus more for garnish +* **7 cups** chicken stock +* **2 tbsp.** olive oil +* **1/4** yellow onion or **1** large shallot, finely chopped (~1⁄4 cup) +* **2 cloves** garlic, minced +* **1 1⁄2 tsp.** kosher salt, divided +* **? tsp.** ground black pepper +* **2** bay leaves +* **5 tbsp.** unsalted butter +* **2 cups** arborio rice +* **1 cup** dry white wine (Pinot Grigio, Sauvignon Blanc) +* **3⁄4 cup** freshly grated Parmesan ## Directions -1. Warm the chicken stock in a medium saucepan over medium-low heat, - cover and keep warm. +1. Warm the **chicken stock** in a medium saucepan over medium-low heat. + Cover and keep warm. -2. Heat the olive oil in another medium saucepan. - Add the shallot, garlic, 1⁄2 teaspoon salt and ~10 grinds of black pepper - and cook, stirring occasionally, until the vegetables are softened, 3--4 minutes. +2. Heat the **oil** in another medium saucepan. + Add the **onion**, **garlic**, 1⁄2 teaspoon **salt**, and **black pepper**. + Sauté, stirring occasionally, until the vegetables are softened (3--4 minutes). -3. Add the bay leaves and 3 tablespoons butter, - stirring until the butter has melted, ~1 minute. +3. Add the **bay leaves** and 3 tablespoons **butter**. + Stir until the butter has melted (~1 minute). -4. Add the rice and stir once. - Toast until the rice starts to turn light golden brown, 3--4 minutes. +4. Add the **rice** and stir once. + Toast until the rice starts to turn light golden brown (3--4 minutes). -5. Pour in the wine and simmer, stirring occasionally, - until it has evaporated completely, 2--3 minutes. +5. Add the **wine**. + Simmer, stirring occasionally, + until the wine has evaporated completely (2--3 minutes). -6. Ladle one cup of the warm stock into the rice - and cook, stirring gently without stopping, - until the rice has absorbed the liquid, 2--3 minutes. +6. Ladle one cup of the warm **stock** into the rice. + Cook, stirring constantly but gently, + until the rice has absorbed the liquid (2--3 minutes). -7. Repeat this process, adding more stock a ladleful at a time, - until the rice is al dente, 17--19 minutes. Discard the bay leaves. +7. Repeat this process, adding more **stock** a ladleful at a time, + until the rice is al dente (17--19 minutes). -8. Stir in the Parmesan, the remaining 2 tablespoons butter, 1 teaspoon salt - and a few more grinds of black pepper. +8. Discard the **bay leaves**. + Stir in the **Parmesan**, the remaining 2 tablespoons **butter**, + 1 teaspoon **salt**, and more **black pepper** to taste. -9. Serve hot, with more Parmesan, if desired. +9. Serve hot, with more **Parmesan**, if desired. + +
+
diff --git a/source/stroganoff.md b/source/stroganoff.md index d55910a..eca8d6b 100644 --- a/source/stroganoff.md +++ b/source/stroganoff.md @@ -4,9 +4,9 @@ - **3 tbsp.** extra-virgin olive oil, divided - **8 oz** crimini mushrooms, sliced -- **1/2 cup** diced onion +- **1/2 cup** onion, diced - **2 cloves** garlic, minced -- **1 lb** ground beef or turkey +- **1 lb** ground beef, turkey, or pork - **2 tsp.** paprika - **3-4 cups** low sodium beef broth - **8 oz** dry rotini @@ -44,4 +44,4 @@ 8. Serve with **fresh parsley**.
-
\ No newline at end of file +
diff --git a/source/tuna-salad.md b/source/tuna-salad.md index 4045e7e..a97c680 100644 --- a/source/tuna-salad.md +++ b/source/tuna-salad.md @@ -2,15 +2,15 @@ ## Ingredients -- **20 oz** tuna packed in water, drained (**4** 5-oz cans) +- **4 5oz cans** tuna packed in water, drained - **1 cup** mayonnaise -- **1** rib celery, finely chopped (about 1/3 cup) +- **1 rib** celery, finely chopped (about 1/3 cup) - **2 tbsp.** red onion, minced (about 2 small slices) - **2 tbsp.** sweet pickle or dill relish - **1 tbsp.** lemon juice -- **1** clove garlic, minced +- **1 clove** garlic, minced - **1/2 tsp.** table salt -- **1/4 tsp.** black pepper, ground +- **1/4 tsp.** ground black pepper ## Instructions @@ -25,4 +25,4 @@ - Store leftovers in an airtight container in the refrigerator for up to 4 days.
-
\ No newline at end of file +
From b80ed66646abaa2039964b72f9520d661a302c25 Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Wed, 24 Dec 2025 16:19:46 -0500 Subject: [PATCH 11/32] fixed formatting --- source/chili.md | 14 +++++------ source/chipotle-black-beans.md | 18 ++++++------- source/cover.md | 2 +- source/eggroll-in-a-bowl.md | 26 +++++++++---------- source/french-toast.md | 15 +++++------ source/goulash.md | 34 ++++++++++++------------- source/granola.md | 25 +++++++++--------- source/pad-thai.md | 46 +++++++++++++++++----------------- source/red-beans-and-rice.md | 15 +++++------ source/rice-pudding.md | 10 ++++---- source/risotto.md | 30 +++++++++++----------- source/stroganoff.md | 12 ++++----- source/tuna-salad.md | 6 ++--- 13 files changed, 127 insertions(+), 126 deletions(-) diff --git a/source/chili.md b/source/chili.md index 1da2e45..2e7c6ce 100644 --- a/source/chili.md +++ b/source/chili.md @@ -6,8 +6,8 @@ - **1** yellow onion, diced - **2 cloves** garlic, minced - **1 lb** ground beef, turkey, or pork -- **3/4 cup** dry kidney beans, soaked overnight and drained -- **3/4 cup** dry black beans, soaked overnight and drained +- **3⁄4 cup** dry kidney beans, soaked overnight and drained +- **3⁄4 cup** dry black beans, soaked overnight and drained - **1 15oz can** diced or crushed tomatoes, not drained - **6 oz** canned tomato paste - **1 cup** water @@ -16,12 +16,12 @@ - **1 tbsp.** chili powder - **1 tsp.** ground cumin -- **1/4 tsp.** cayenne powder -- **1/4 tsp.** garlic powder -- **1/2 tsp.** onion powder -- **1/2 tbsp.** brown sugar +- **1⁄4 tsp.** cayenne powder +- **1⁄4 tsp.** garlic powder +- **1⁄2 tsp.** onion powder +- **1⁄2 tbsp.** brown sugar - **1 tsp.** salt -- **1/2 tsp.** black pepper +- **1⁄2 tsp.** black pepper ## Instructions diff --git a/source/chipotle-black-beans.md b/source/chipotle-black-beans.md index 4c35a29..1352c7f 100644 --- a/source/chipotle-black-beans.md +++ b/source/chipotle-black-beans.md @@ -3,7 +3,7 @@ ## Ingredients - **2 tbsp.** water or vegetable broth -- **1/2** medium Spanish yellow onion, diced +- **1⁄2** medium Spanish yellow onion, diced - **3 cloves** garlic, minced - **3 cups** water or unsalted vegetable broth - **1 cup** dried black beans @@ -15,7 +15,7 @@ ## Instructions 1. Set the Instant Pot to Sauté. - Add the 2 tablespoons **water or vegetable broth**, **onion** and **garlic**. + Add the 2 tbsp. **water or vegetable broth**, **onion** and **garlic**. Sauté for 5 minutes, stirring occasionally, or until the onions are soft and translucent 2. Add the **water or vegetable broth**, **dried black beans** and **all spices**. @@ -32,16 +32,16 @@ ## Notes -* Makes 3 cups +- Makes 3 cups -* If using soaked beans, reduce cooking time by 10-15 minutes. +- If using soaked beans, reduce cooking time by 10--15 minutes. -* You can double the ingredients in this recipe. Cook for the same time. +- You can double the ingredients in this recipe. Cook for the same time. -* If the beans are not cooked to your liking at the end of the 35 minutes, - you can cook for additional 5 minutes on the same settings.  +- If the beans are not cooked to your liking at the end of the 35 minutes, + you can cook for additional 5 minutes on the same settings. -* Store in the fridge in an airtight container for up to 4-5 days. +- Store in the fridge in an airtight container for up to 5 days.
-
\ No newline at end of file +
diff --git a/source/cover.md b/source/cover.md index 720848a..19eea6e 100644 --- a/source/cover.md +++ b/source/cover.md @@ -8,4 +8,4 @@ font: - clean - sans-serif --- -
\ No newline at end of file +
diff --git a/source/eggroll-in-a-bowl.md b/source/eggroll-in-a-bowl.md index aa73c32..4ba012a 100644 --- a/source/eggroll-in-a-bowl.md +++ b/source/eggroll-in-a-bowl.md @@ -2,18 +2,18 @@ ## Ingredients -* **1 lb** ground pork, beef, or turkey -* **1 tbsp.** sesame oil -* **1 tbsp.** minced garlic -* **1 tbsp.** minced ginger -* **8 oz** mushrooms, finely diced -* **1/2** white or yellow onion, diced -* **1/4 cup** low-sodium soy sauce -* **1 tbsp.** fish sauce -* **12-16 oz** cole slaw mix (1 package) -* **2 tbsp.** rice wine vinegar -* **1 tbsp.** hoisin sauce -* **1 tbsp.** sriracha or gochujang +- **1 lb** ground pork, beef, or turkey +- **1 tbsp.** sesame oil +- **1 tbsp.** minced garlic +- **1 tbsp.** minced ginger +- **8 oz** mushrooms, finely diced +- **1⁄2** white or yellow onion, diced +- **1⁄4 cup** low-sodium soy sauce +- **1 tbsp.** fish sauce +- **12--16 oz** cole slaw mix (1 package) +- **2 tbsp.** rice wine vinegar +- **1 tbsp.** hoisin sauce +- **1 tbsp.** sriracha or gochujang ## Directions @@ -38,4 +38,4 @@ 7. Serve with wonton strips or over rice.
-
\ No newline at end of file +
diff --git a/source/french-toast.md b/source/french-toast.md index aec7c24..1907a47 100644 --- a/source/french-toast.md +++ b/source/french-toast.md @@ -3,10 +3,10 @@ ## Ingredients - **4** large eggs or **1 cup** egg substitute -- **2/3 cup** milk -- **1/4 cup** all-purpose flour -- **1/4 cup** granulated sugar -- **1/4 tsp.** salt +- **2⁄3 cup** milk +- **1⁄4 cup** all-purpose flour +- **1⁄4 cup** granulated sugar +- **1⁄4 tsp.** salt - **1 tsp.** ground cinnamon - **1 tsp.** vanilla extract - **8** thick slices bread @@ -15,7 +15,8 @@ 1. Whisk together the eggs, milk, flour, sugar, salt, cinnamon, and vanilla. -2. Dip bread slices into the batter, dredging them well on both sides, and place on greased skillet over medium heat. +2. Dip bread slices into the batter, dredging them well on both sides. + Place on a greased skillet over medium heat. 3. Cook until the bottom of the bread starts to turn golden brown. Flip and cook on the other side the same. @@ -29,7 +30,7 @@ - Any kind of milk, even dairy-free, will work. Higher fat milk will yield creamier batter. -- The batter can be made 1-2 days ahead of cooking. +- The batter can be made up to 2 days ahead of cooking. - To freeze, allow french toast cool completely before storing in a freezer-safe bag or container for up to 3 months. @@ -37,4 +38,4 @@ Rewarm on a skillet, in the toaster, or for a few seconds in the microwave.
-
\ No newline at end of file +
diff --git a/source/goulash.md b/source/goulash.md index e519fdd..bf9122c 100644 --- a/source/goulash.md +++ b/source/goulash.md @@ -2,25 +2,25 @@ ## Ingredients -* **1 tbsp.** olive oil -* **1** yellow onion, diced -* **4** cloves garlic, minced -* **2** bell peppers, diced -* **1 lb** ground beef, turkey, or pork -* **1/2 cup** red wine (Cabernet Sauvignon) -* **1 28oz can** canned diced tomatoes (do not drain) -* **1 15oz can** canned tomato sauce -* **2 tbsp.** soy sauce -* **1/2 cup** water -* **8 oz** dry elbow macaroni -* **? tsp.** table salt +- **1 tbsp.** olive oil +- **1** yellow onion, diced +- **4** cloves garlic, minced +- **2** bell peppers, diced +- **1 lb** ground beef, turkey, or pork +- **1⁄2 cup** red wine (Cabernet Sauvignon) +- **1 28oz can** canned diced tomatoes (do not drain) +- **1 15oz can** canned tomato sauce +- **2 tbsp.** soy sauce +- **1⁄2 cup** water +- **8 oz** dry elbow macaroni +- **? tsp.** table salt ### Spices -* **2** whole bay leaves -* **1/2 tsp.** dried oregano -* **1/2 tsp.** dried basil -* **1/4 tsp.** crushed red pepper +- **2** whole bay leaves +- **1⁄2 tsp.** dried oregano +- **1⁄2 tsp.** dried basil +- **1⁄4 tsp.** crushed red pepper ## Instructions @@ -37,7 +37,7 @@ Once boiling, turn down the heat to low and simmer for 30 minutes, stirring occasionally. 5. Add the pasta and stir to combine. - Re-cover and simmer, stirring occasionally, until the pasta is tender (about 10-12 minutes). + Re-cover and simmer, stirring occasionally, until the pasta is tender (10--12 minutes). 6. Remove from heat. Add salt and more to taste. diff --git a/source/granola.md b/source/granola.md index 5f24871..d625340 100644 --- a/source/granola.md +++ b/source/granola.md @@ -3,13 +3,13 @@ ## Ingredients - **2 cups** old-fashioned rolled oats -- **3/4 cup** raw nuts and/or seeds -- **1/2 tsp.** fine-grain sea salt or standard table salt -- **1/4 tsp.** ground cinnamon -- **1/4 cup** melted coconut oil or olive oil -- **1/4 cup** maple syrup or honey -- **1/2 tsp.** vanilla extract -- **1/4 cup** coconut flakes +- **3⁄4 cup** raw nuts and/or seeds +- **1⁄2 tsp.** fine-grain sea salt or standard table salt +- **1⁄4 tsp.** ground cinnamon +- **1⁄4 cup** melted coconut oil or olive oil +- **1⁄4 cup** maple syrup or honey +- **1⁄2 tsp.** vanilla extract +- **1⁄4 cup** coconut flakes ## Instructions @@ -26,23 +26,22 @@ 4. Bake for 10 minutes, add **coconut flakes** and stir. Press the stirred granola into the pan with a spatula to create a more even layer. -5. Bake 10-12 minutes, or until lightly golden. - The granola will further crisp up as it cools. +5. Bake until lightly golden (10--12 minutes). 6. Let the granola cool completely, undisturbed (at least 45 minutes). ## Notes -* Store in an airtight container at room temperature for 1 to 2 weeks, +- Store in an airtight container at room temperature for up to 2 weeks, or in a sealed freezer bag in the freezer for up to 3 months. -* Use olive oil for a slightly savory granola, +- Use olive oil for a slightly savory granola, or coconut oil for a more neutral flavor. -* Use maple syrup for a sweet, distinctly maple-flavored granola +- Use maple syrup for a sweet, distinctly maple-flavored granola with few or no clumps. Use honey for a more neutral flavored, clumpy granola.
-
\ No newline at end of file +
diff --git a/source/pad-thai.md b/source/pad-thai.md index 96ba26c..03ea3d9 100644 --- a/source/pad-thai.md +++ b/source/pad-thai.md @@ -4,42 +4,42 @@ ### For the Stir-Fry -* **4 oz** dry brown rice noodles -* **2 tsp.** sesame oil, extra virgin olive oil, or canola oil -* **8 oz** medium or large shrimp, peeled and deveined -* **2 cloves** garlic, minced -* **2** large eggs or **1/2 cup** egg substitute -* **1/2 cup** bean sprouts -* **1/2 cup** grated carrots -* **2** large (or **3** small) green onions, finely chopped -* **1/4 cup** peanuts, finely chopped -* **1/4 cup** fresh cilantro, chopped -* **1** lime, quartered +- **4 oz** dry brown rice noodles +- **2 tsp.** sesame oil, extra virgin olive oil, or canola oil +- **8 oz** medium or large shrimp, peeled and deveined +- **2 cloves** garlic, minced +- **2** large eggs or **1⁄2 cup** egg substitute +- **1⁄2 cup** bean sprouts +- **1⁄2 cup** grated carrots +- **2** large (or **3** small) green onions, finely chopped +- **1⁄4 cup** peanuts, finely chopped +- **1⁄4 cup** fresh cilantro, chopped +- **1** lime, quartered #### Notes -* Use either fresh shrimp or thawed frozen shrimp. +- Use either fresh shrimp or thawed frozen shrimp. If using thawed, lightly pat the shrimp dry prior to cooking. -* For a meat-free option, substitute the shrimp 1:1 with sliced mushrooms. +- For a meat-free option, substitute the shrimp 1:1 with sliced mushrooms. -* If you cannot find fresh bean sprouts, +- If you cannot find fresh bean sprouts, you can substitute with rinsed, canned bean sprouts or another fresh vegetable. Note that canned bean sprouts have a more fermented taste. ### For the Sauce -* **2 tbsp.** fish sauce -* **1-1/2** tbsp. rice vinegar -* **1 tbsp.** low-sodium soy sauce -* **2 tbsp.** water -* **1-3 tbsp.** honey -* **1-3 tsp.** ground chile sauce (sambal oelek) or chili garlic sauce +- **2 tbsp.** fish sauce +- **1 1⁄2** tbsp. rice vinegar +- **1 tbsp.** low-sodium soy sauce +- **2 tbsp.** water +- **1-3 tbsp.** honey +- **1-3 tsp.** ground chile sauce (sambal oelek) or chili garlic sauce #### Notes -* For a sweeter pad thai, add additional honey or a little brown sugar. +- For a sweeter pad thai, add additional honey or a little brown sugar. For spicier, add additional chili paste.
@@ -74,10 +74,10 @@ ## Notes -* Keep leftovers in an airtight container +- Keep leftovers in an airtight container in the refrigerator for up to 4 days. -* To reheat: Warm in the microwave +- To reheat: Warm in the microwave with a splash of water or chicken broth to keep the noodles from drying out. diff --git a/source/red-beans-and-rice.md b/source/red-beans-and-rice.md index 1ecede4..258258b 100644 --- a/source/red-beans-and-rice.md +++ b/source/red-beans-and-rice.md @@ -10,7 +10,7 @@ - **3 ribs** celery, diced - **4 cloves** garlic, minced - **6 cups** water -- **1/4 cup** chopped parsley +- **1⁄4 cup** chopped parsley - **1 tbsp.** salt ### Spices @@ -18,10 +18,10 @@ - **2 tsp.** smoked paprika - **1 tsp.** dried oregano - **1 tsp.** dried thyme -- **1/2 tsp.** garlic powder -- **1/2 tsp.** onion powder -- **1/4 tsp.** cayenne pepper -- **1/4 tsp.** freshly cracked black pepper +- **1⁄2 tsp.** garlic powder +- **1⁄2 tsp.** onion powder +- **1⁄4 tsp.** cayenne pepper +- **1⁄4 tsp.** freshly cracked black pepper - **2** bay leaves
@@ -54,8 +54,9 @@ - Makes 9 cups. -- Because the rice is cooked separately, and (assuming leftovers) in multiple batches, +- Because the rice is cooked separately, + and (assuming leftovers) in multiple batches, I've omitted it from this recipe. - I like 1/2 cup (dry) per serving. + I like 1⁄2 cup (dry) per serving.
diff --git a/source/rice-pudding.md b/source/rice-pudding.md index 22a5a5a..3d390e6 100644 --- a/source/rice-pudding.md +++ b/source/rice-pudding.md @@ -3,13 +3,13 @@ ## Ingredients - **1 cup** dry rice -- **1-1/4 cup** water +- **1 1⁄4 cup** water - **1 tsp.** salt - **1 tsp.** ground cinnamon - **2 cups** milk -- **2 eggs** or **1/2 cup** egg substitute -- **3/4 cup** granulated sugar -- **1-1/2 tsp.** vanilla extract +- **2 eggs** or **1⁄2 cup** egg substitute +- **3⁄4 cup** granulated sugar +- **1 1⁄2 tsp.** vanilla extract ## Instructions @@ -28,7 +28,7 @@ stirring quickly so that the eggs don't scramble. 6. Set the Instant Pot to sauté - and continue to mix until rice thickens, about 5-10 minutes. + and continue to mix until rice thickens (5--10 minutes). 7. Optionally serve with walnuts and/or raisins. Garnish with additional cinnamon. diff --git a/source/risotto.md b/source/risotto.md index c3ac851..2a9c9ec 100644 --- a/source/risotto.md +++ b/source/risotto.md @@ -2,17 +2,17 @@ ## Ingredients -* **7 cups** chicken stock -* **2 tbsp.** olive oil -* **1/4** yellow onion or **1** large shallot, finely chopped (~1⁄4 cup) -* **2 cloves** garlic, minced -* **1 1⁄2 tsp.** kosher salt, divided -* **? tsp.** ground black pepper -* **2** bay leaves -* **5 tbsp.** unsalted butter -* **2 cups** arborio rice -* **1 cup** dry white wine (Pinot Grigio, Sauvignon Blanc) -* **3⁄4 cup** freshly grated Parmesan +- **7 cups** chicken stock +- **2 tbsp.** olive oil +- **1⁄4** yellow onion or **1** large shallot, finely chopped (~1⁄4 cup) +- **2 cloves** garlic, minced +- **1 1⁄2 tsp.** kosher salt, divided +- **? tsp.** ground black pepper +- **2** bay leaves +- **5 tbsp.** unsalted butter +- **2 cups** arborio rice +- **1 cup** dry white wine (Pinot Grigio, Sauvignon Blanc) +- **3⁄4 cup** freshly grated Parmesan ## Directions @@ -20,10 +20,10 @@ Cover and keep warm. 2. Heat the **oil** in another medium saucepan. - Add the **onion**, **garlic**, 1⁄2 teaspoon **salt**, and **black pepper**. + Add the **onion**, **garlic**, 1⁄2 tsp. **salt**, and **black pepper**. Sauté, stirring occasionally, until the vegetables are softened (3--4 minutes). -3. Add the **bay leaves** and 3 tablespoons **butter**. +3. Add the **bay leaves** and 3 tbsp. **butter**. Stir until the butter has melted (~1 minute). 4. Add the **rice** and stir once. @@ -41,8 +41,8 @@ until the rice is al dente (17--19 minutes). 8. Discard the **bay leaves**. - Stir in the **Parmesan**, the remaining 2 tablespoons **butter**, - 1 teaspoon **salt**, and more **black pepper** to taste. + Stir in the **Parmesan**, the remaining 2 tbsp. **butter**, + 1 tsp. **salt**, and more **black pepper** to taste. 9. Serve hot, with more **Parmesan**, if desired. diff --git a/source/stroganoff.md b/source/stroganoff.md index eca8d6b..cc1e9b1 100644 --- a/source/stroganoff.md +++ b/source/stroganoff.md @@ -4,22 +4,22 @@ - **3 tbsp.** extra-virgin olive oil, divided - **8 oz** crimini mushrooms, sliced -- **1/2 cup** onion, diced +- **1⁄2 cup** onion, diced - **2 cloves** garlic, minced - **1 lb** ground beef, turkey, or pork - **2 tsp.** paprika - **3-4 cups** low sodium beef broth - **8 oz** dry rotini -- **1/2 cup** sour cream +- **1⁄2 cup** sour cream - fresh parsley for serving ## Instructions -1. Heat 2 tablespoons of **oil** over medium heat in a large pot. +1. Heat 2 tbsp. of **oil** over medium heat in a large pot. Add the **onion**, season with salt and pepper, and cook until translucent, about 4-5 minutes. -2. Stir in the **garlic** and cook until fragrant, 30-60 seconds. +2. Stir in the **garlic** and cook until fragrant, 30--60 seconds. 3. Add the **ground meat** and continue to cook, breaking up the meat with a spoon as it cooks, @@ -27,10 +27,10 @@ 4. Add the **paprika**, **broth**, and **pasta**. Bring to a light boil then cover the pot. - Continue to cook, stirring often, until the pasta is al dente, about 17-20 minutes. + Continue to cook, stirring often, until the pasta is al dente, about 17--20 minutes. 5. While the pasta cooks, - heat 1 tablespoon of the **oil** over medium heat in a medium skillet. + heat 1 tbsp. of the **oil** over medium heat in a medium skillet. Add the **mushrooms** and cook until they are tender, about 5 minutes. Season with salt and pepper, remove from the heat, and set aside. diff --git a/source/tuna-salad.md b/source/tuna-salad.md index a97c680..a7263c8 100644 --- a/source/tuna-salad.md +++ b/source/tuna-salad.md @@ -4,13 +4,13 @@ - **4 5oz cans** tuna packed in water, drained - **1 cup** mayonnaise -- **1 rib** celery, finely chopped (about 1/3 cup) +- **1 rib** celery, finely chopped (about 1⁄3 cup) - **2 tbsp.** red onion, minced (about 2 small slices) - **2 tbsp.** sweet pickle or dill relish - **1 tbsp.** lemon juice - **1 clove** garlic, minced -- **1/2 tsp.** table salt -- **1/4 tsp.** ground black pepper +- **1⁄2 tsp.** table salt +- **1⁄4 tsp.** ground black pepper ## Instructions From 644c0c4d954d75835372ed2d727df581b0c60329 Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Wed, 31 Dec 2025 12:21:06 -0500 Subject: [PATCH 12/32] added mulled wine recipe --- source/mulled-wine.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 source/mulled-wine.md diff --git a/source/mulled-wine.md b/source/mulled-wine.md new file mode 100644 index 0000000..0a52068 --- /dev/null +++ b/source/mulled-wine.md @@ -0,0 +1,35 @@ +# Mulled Wine + +## Ingredients + +- **1 750ml bottle** dry red or white wine +- **1⁄4 cup** brandy, orange liqueur, or tawny port +- **1** orange, peeled and sliced into rounds +- **8** whole cloves +- **2** cinnamon sticks +- **2** star anise +- **2 tbsp.** honey or maple syrup, plus more to taste + +## Instructions + +1. Add **wine**, **brandy**, **orange slices**, and **spices**. + and 2 tbsp. **honey** to a large saucepan. + Stir briefly to combine. + +2. Cook on medium-high heat until barely simmering, stopping before the wine begins to bubble. + Reduce heat to low, cover, and let simmer for at least 15 minutes or up to 3 hours. + +3. Using a fine mesh strainer, remove and discard the orange slices and spices. + Add more **honey** to taste. + +4. Serve warm in mugs. Garnish with extra orange slices and spices. + +## Notes + +- Avoid using expensive wines for this recipe. + Their subtleties will be overwhelmed by the aromatics. + A mid-range bottle (or box) will do. + Look for Zinfandel, Merlot, Grenache, Cabernet Sauvignon, or Syrah. + +
+
From 0b1e03a80328ee058c3e56f6874384292130c759 Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Mon, 2 Mar 2026 09:41:52 -0500 Subject: [PATCH 13/32] vault backup: 2026-03-02 09:41:52 --- .obsidian/plugins/digitalgarden/main.js | 667 +- .obsidian/plugins/digitalgarden/manifest.json | 2 +- .../obsidian-excalidraw-plugin/main.js | 6 +- .../obsidian-excalidraw-plugin/manifest.json | 2 +- .../obsidian-excalidraw-plugin/styles.css | 2 +- .obsidian/plugins/obsidian-git/main.js | 552 +- .obsidian/plugins/obsidian-git/manifest.json | 2 +- .../plugins/obsidian-latex-suite/main.js | 15919 +--------------- .../obsidian-latex-suite/manifest.json | 4 +- .../plugins/obsidian-latex-suite/styles.css | 29 + .obsidian/plugins/obsidian-linter/data.json | 4 +- .obsidian/plugins/obsidian-linter/main.js | 362 +- .../plugins/obsidian-linter/manifest.json | 2 +- .../plugins/obsidian-tasks-plugin/main.js | 158 +- .../obsidian-tasks-plugin/manifest.json | 2 +- .../plugins/obsidian-tasks-plugin/styles.css | 2 +- .obsidian/plugins/quickadd/data.json | 2 +- .obsidian/plugins/quickadd/main.js | 100 +- .obsidian/plugins/quickadd/manifest.json | 2 +- .obsidian/plugins/quickadd/styles.css | 2 +- .obsidian/plugins/spellcheck-toggler/main.js | 3 +- .../plugins/spellcheck-toggler/manifest.json | 2 +- .obsidian/types.json | 3 +- 23 files changed, 1651 insertions(+), 16178 deletions(-) diff --git a/.obsidian/plugins/digitalgarden/main.js b/.obsidian/plugins/digitalgarden/main.js index f8e18e8..165b814 100644 --- a/.obsidian/plugins/digitalgarden/main.js +++ b/.obsidian/plugins/digitalgarden/main.js @@ -10732,6 +10732,48 @@ var import_obsidian2 = require("obsidian"); // src/repositoryConnection/RepositoryConnection.ts var import_js_logger = __toESM(require_logger()); + +// src/forestry/LimitReachedError.ts +var LimitReachedError = class extends Error { + constructor(errorType, responseData) { + var _a2; + const message = (_a2 = responseData.message) != null ? _a2 : "Usage limit reached"; + super(message); + this.name = "LimitReachedError"; + this.errorType = errorType; + this.buildsUsed = responseData.builds_used; + this.monthlyLimit = responseData.monthly_limit; + this.starterCreditsRemaining = responseData.starter_credits_remaining; + } +}; +function throwIfLimitError(error) { + if (error && typeof error === "object" && "status" in error && error.status === 403) { + const responseData = extractResponseData(error); + if (!responseData) return; + const errorType = responseData.error; + if (errorType === "build_limit_reached" || errorType === "storage_limit_exceeded") { + throw new LimitReachedError(errorType, responseData); + } + } +} +function extractResponseData(error) { + const err = error; + if (err.response && typeof err.response === "object") { + const response = err.response; + if (response.data && typeof response.data === "object") { + return response.data; + } + } + if (err.response && typeof err.response === "object") { + const resp = err.response; + if (resp.data && typeof resp.data === "object") { + return resp.data; + } + } + return null; +} + +// src/repositoryConnection/RepositoryConnection.ts var logger = import_js_logger.default.get("repository-connection"); var IMAGE_PATH_BASE = "src/site/"; var NOTE_PATH_BASE = "src/site/notes/"; @@ -10823,6 +10865,7 @@ var RepositoryConnection = class { ); return result; } catch (error) { + throwIfLimitError(error); logger.error(error); return false; } @@ -10875,6 +10918,7 @@ var RepositoryConnection = class { payload ); } catch (error) { + throwIfLimitError(error); logger.error(error); } }); @@ -10973,6 +11017,7 @@ var RepositoryConnection = class { sha: blob.data.sha }; } catch (error) { + throwIfLimitError(error); logger.error(error); } })); @@ -11002,6 +11047,7 @@ var RepositoryConnection = class { sha: blob.data.sha }; } catch (error) { + throwIfLimitError(error); logger.error(error); } })); @@ -12902,7 +12948,8 @@ var CanvasCompiler = class { node, baseStyle, colorClass, - file + file, + assets ); case "file": return yield this.buildFileNode( @@ -12927,7 +12974,7 @@ var CanvasCompiler = class { } }); } - buildTextNode(node, baseStyle, colorClass, file) { + buildTextNode(node, baseStyle, colorClass, file, assets) { return __async(this, null, function* () { var _a2; let processedText = node.text; @@ -12935,7 +12982,8 @@ var CanvasCompiler = class { try { processedText = yield this.textNodeProcessor.processTextNodeContent( file, - node.text + node.text, + assets ); } catch (e) { console.error("Error processing canvas text node:", e); @@ -12955,6 +13003,45 @@ var CanvasCompiler = class { } buildFileNode(node, baseStyle, colorClass, file, assets) { return __async(this, null, function* () { + const isPdf = /\.pdf$/i.test(node.file); + if (isPdf) { + const linkedFile = this.metadataCache.getFirstLinkpathDest( + (0, import_obsidian4.getLinkpath)(node.file), + file.getPath() + ); + if (linkedFile) { + try { + const pdfData = yield this.vault.readBinary(linkedFile); + const pdfBase64 = arrayBufferToBase64(pdfData); + const pdfPath2 = `/img/user/${linkedFile.path}`; + assets.push({ + path: pdfPath2, + content: pdfBase64, + localHash: generateBlobHashFromBase64(pdfBase64) + }); + return `
+
+
+ +
+
+
`; + } catch (e) { + console.error("Error reading canvas PDF:", e); + } + } + const resolvedPath = (linkedFile == null ? void 0 : linkedFile.path) || node.file; + const pdfPath = encodeURI(`/img/user/${resolvedPath}`); + return `
+
+
+ +
+
+
`; + } const isImage = /\.(png|jpg|jpeg|gif|webp|svg)$/i.test(node.file); if (isImage) { const linkedFile = this.metadataCache.getFirstLinkpathDest( @@ -19415,6 +19502,18 @@ var GardenPageCompiler = class { linkedFileName = headerSplit[0]; headerPath = headerSplit.length > 1 ? `#${headerSplit[1]}` : ""; } + if (linkedFileName === "" && headerPath !== "") { + const currentFilePath = file.getPath(); + const currentExtensionlessPath = currentFilePath.substring( + 0, + currentFilePath.lastIndexOf(".") + ); + convertedText = convertedText.replace( + linkMatch, + `[[${currentExtensionlessPath}${headerPath}\\|${linkDisplayName}]]` + ); + continue; + } const fullLinkedFilePath = (0, import_obsidian5.getLinkpath)(linkedFileName); if (fullLinkedFilePath === "") { continue; @@ -20122,7 +20221,7 @@ ${headerSection} * Process text content from canvas text nodes through the same pipeline as notes. * This enables wiki-links, transclusions, dataview, etc. in canvas text nodes. */ - processTextNodeContent(file, text2) { + processTextNodeContent(file, text2, assets) { return __async(this, null, function* () { const CANVAS_TEXT_COMPILE_STEPS = [ this.convertCustomFilters, @@ -20130,12 +20229,18 @@ ${headerSection} this.createTranscludedText(0), this.convertDataViews, this.convertLinksToFullPath, - this.removeObsidianComments + this.removeObsidianComments, + this.createSvgEmbeds ]; - return yield this.runCompilerSteps( + const compiledText = yield this.runCompilerSteps( file, CANVAS_TEXT_COMPILE_STEPS )(text2); + const [processedText, collectedAssets] = yield this.convertEmbeddedAssets(file)(compiledText); + if (assets) { + assets.push(...collectedAssets); + } + return processedText; }); } generateMarkdown(file) { @@ -20371,6 +20476,9 @@ var Publisher = class { yield this.uploadAssets(assets, remoteImageHashes); return true; } catch (error) { + if (error instanceof LimitReachedError) { + throw error; + } console.error(error); return false; } @@ -20416,6 +20524,9 @@ var Publisher = class { ); return true; } catch (error) { + if (error instanceof LimitReachedError) { + throw error; + } console.error(error); return false; } @@ -30017,6 +30128,22 @@ var ForestryApi = class { } }); } + getUserLimits() { + return __async(this, null, function* () { + try { + const response = yield this.client.get( + "user/limits" + ); + if (response.status !== 200) { + return null; + } + return response.data; + } catch (e) { + import_js_logger8.default.error(e); + return null; + } + }); + } }; // src/views/SettingsView/ForestrySettings.svelte @@ -30033,11 +30160,11 @@ function create_else_block5(ctx) { pending: create_pending_block, then: create_then_block, catch: create_catch_block, - value: 9, + value: 12, blocks: [, , ,] }; handle_promise(promise = /*getPageInfo*/ - ctx[5](), info); + ctx[7](), info); return { c() { await_block_anchor = empty(); @@ -30125,13 +30252,13 @@ function create_if_block6(ctx) { input, "input", /*input_input_handler*/ - ctx[8] + ctx[10] ), listen( button, "click", /*connect*/ - ctx[3] + ctx[5] ) ]; mounted = true; @@ -30191,7 +30318,7 @@ function create_catch_block(ctx) { button, "click", /*disconnect*/ - ctx[4] + ctx[6] ); mounted = true; } @@ -30218,7 +30345,7 @@ function create_then_block(ctx) { function select_block_type_1(ctx2, dirty) { if ( /*pageInfo*/ - ctx2[9] + ctx2[12] ) return 0; return 1; } @@ -30287,7 +30414,7 @@ function create_else_block_12(ctx) { button, "click", /*disconnect*/ - ctx[4] + ctx[6] ); mounted = true; } @@ -30313,7 +30440,7 @@ function create_if_block_15(ctx) { let t0; let t1_value = ( /*pageInfo*/ - ((_a2 = ctx[9].value.pageName) != null ? _a2 : "Unknown") + "" + ((_a2 = ctx[12].value.pageName) != null ? _a2 : "Unknown") + "" ); let t1; let t2; @@ -30326,11 +30453,25 @@ function create_if_block_15(ctx) { let a; let icon1; let t7; + let t8; + let if_block_anchor; let current; let mounted; let dispose; icon0 = new Icon_default({ props: { name: "check-circle" } }); icon1 = new Icon_default({ props: { name: "external-link" } }); + function select_block_type_2(ctx2, dirty) { + if ( + /*limitsLoading*/ + ctx2[4] + ) return create_if_block_25; + if ( + /*limits*/ + ctx2[3] + ) return create_if_block_33; + } + let current_block_type = select_block_type_2(ctx, -1); + let if_block = current_block_type && current_block_type(ctx); return { c() { div4 = element("div"); @@ -30351,6 +30492,9 @@ function create_if_block_15(ctx) { a = element("a"); create_component(icon1.$$.fragment); t7 = text(" Open Forestry.md Dashboard"); + t8 = space(); + if (if_block) if_block.c(); + if_block_anchor = empty(); attr(div0, "class", "setting-item-name"); set_style(div0, "display", "flex"); set_style(div0, "align-items", "center"); @@ -30384,18 +30528,32 @@ function create_if_block_15(ctx) { append(div5, a); mount_component(icon1, a, null); append(a, t7); + insert(target, t8, anchor); + if (if_block) if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); current = true; if (!mounted) { dispose = listen( button, "click", /*disconnect*/ - ctx[4] + ctx[6] ); mounted = true; } }, - p: noop, + p(ctx2, dirty) { + if (current_block_type === (current_block_type = select_block_type_2(ctx2, dirty)) && if_block) { + if_block.p(ctx2, dirty); + } else { + if (if_block) if_block.d(1); + if_block = current_block_type && current_block_type(ctx2); + if (if_block) { + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } + }, i(local) { if (current) return; transition_in(icon0.$$.fragment, local); @@ -30412,14 +30570,362 @@ function create_if_block_15(ctx) { detach(div4); detach(t6); detach(div5); + detach(t8); + detach(if_block_anchor); } destroy_component(icon0); destroy_component(icon1); + if (if_block) { + if_block.d(detaching); + } mounted = false; dispose(); } }; } +function create_if_block_33(ctx) { + let div5; + let div0; + let t0; + let t1_value = ( + /*limits*/ + ctx[3].plan + "" + ); + let t1; + let t2; + let t3; + let div4; + let div1; + let span0; + let t5; + let span1; + let t6_value = ( + /*limits*/ + ctx[3].builds.monthlyLimit - /*limits*/ + ctx[3].builds.monthlyRemaining + "" + ); + let t6; + let t7; + let t8_value = ( + /*limits*/ + ctx[3].builds.monthlyLimit + "" + ); + let t8; + let t9; + let t10; + let div2; + let span2; + let t12; + let span3; + let t13_value = ( + /*limits*/ + ctx[3].storage.usedFormatted + "" + ); + let t13; + let t14; + let t15_value = ( + /*limits*/ + ctx[3].storage.limitFormatted + "" + ); + let t15; + let t16; + let div3; + let span4; + let t18; + let span5; + let t19_value = ( + /*limits*/ + ctx[3].sites.current + "" + ); + let t19; + let t20; + let t21_value = ( + /*limits*/ + ctx[3].sites.limit + "" + ); + let t21; + let t22; + let if_block0 = ( + /*limits*/ + ctx[3].builds.starterCreditsRemaining > 0 && create_if_block_53(ctx) + ); + let if_block1 = ( + /*limits*/ + (ctx[3].builds.monthlyRemaining === 0 || /*limits*/ + ctx[3].storage.usedBytes >= /*limits*/ + ctx[3].storage.limitBytes) && create_if_block_43(ctx) + ); + return { + c() { + div5 = element("div"); + div0 = element("div"); + t0 = text("Usage \u2014 "); + t1 = text(t1_value); + t2 = text(" plan"); + t3 = space(); + div4 = element("div"); + div1 = element("div"); + span0 = element("span"); + span0.textContent = "Builds this month"; + t5 = space(); + span1 = element("span"); + t6 = text(t6_value); + t7 = text(" / "); + t8 = text(t8_value); + t9 = space(); + if (if_block0) if_block0.c(); + t10 = space(); + div2 = element("div"); + span2 = element("span"); + span2.textContent = "Storage"; + t12 = space(); + span3 = element("span"); + t13 = text(t13_value); + t14 = text(" / "); + t15 = text(t15_value); + t16 = space(); + div3 = element("div"); + span4 = element("span"); + span4.textContent = "Sites"; + t18 = space(); + span5 = element("span"); + t19 = text(t19_value); + t20 = text(" / "); + t21 = text(t21_value); + t22 = space(); + if (if_block1) if_block1.c(); + set_style(div0, "font-weight", "600"); + set_style(div0, "margin-bottom", "8px"); + set_style( + span1, + "color", + /*limits*/ + ctx[3].builds.monthlyRemaining === 0 ? "var(--text-error)" : "var(--text-normal)" + ); + set_style(div1, "display", "flex"); + set_style(div1, "justify-content", "space-between"); + set_style( + span3, + "color", + /*limits*/ + ctx[3].storage.usedBytes >= /*limits*/ + ctx[3].storage.limitBytes ? "var(--text-error)" : "var(--text-normal)" + ); + set_style(div2, "display", "flex"); + set_style(div2, "justify-content", "space-between"); + set_style(div3, "display", "flex"); + set_style(div3, "justify-content", "space-between"); + set_style(div4, "display", "flex"); + set_style(div4, "flex-direction", "column"); + set_style(div4, "gap", "6px"); + set_style(div4, "font-size", "0.9em"); + set_style(div4, "color", "var(--text-muted)"); + set_style(div5, "margin-top", "16px"); + set_style(div5, "padding", "12px"); + set_style(div5, "background", "var(--background-secondary)"); + set_style(div5, "border-radius", "8px"); + }, + m(target, anchor) { + insert(target, div5, anchor); + append(div5, div0); + append(div0, t0); + append(div0, t1); + append(div0, t2); + append(div5, t3); + append(div5, div4); + append(div4, div1); + append(div1, span0); + append(div1, t5); + append(div1, span1); + append(span1, t6); + append(span1, t7); + append(span1, t8); + append(div4, t9); + if (if_block0) if_block0.m(div4, null); + append(div4, t10); + append(div4, div2); + append(div2, span2); + append(div2, t12); + append(div2, span3); + append(span3, t13); + append(span3, t14); + append(span3, t15); + append(div4, t16); + append(div4, div3); + append(div3, span4); + append(div3, t18); + append(div3, span5); + append(span5, t19); + append(span5, t20); + append(span5, t21); + append(div5, t22); + if (if_block1) if_block1.m(div5, null); + }, + p(ctx2, dirty) { + if (dirty & /*limits*/ + 8 && t1_value !== (t1_value = /*limits*/ + ctx2[3].plan + "")) set_data(t1, t1_value); + if (dirty & /*limits*/ + 8 && t6_value !== (t6_value = /*limits*/ + ctx2[3].builds.monthlyLimit - /*limits*/ + ctx2[3].builds.monthlyRemaining + "")) set_data(t6, t6_value); + if (dirty & /*limits*/ + 8 && t8_value !== (t8_value = /*limits*/ + ctx2[3].builds.monthlyLimit + "")) set_data(t8, t8_value); + if (dirty & /*limits*/ + 8) { + set_style( + span1, + "color", + /*limits*/ + ctx2[3].builds.monthlyRemaining === 0 ? "var(--text-error)" : "var(--text-normal)" + ); + } + if ( + /*limits*/ + ctx2[3].builds.starterCreditsRemaining > 0 + ) { + if (if_block0) { + if_block0.p(ctx2, dirty); + } else { + if_block0 = create_if_block_53(ctx2); + if_block0.c(); + if_block0.m(div4, t10); + } + } else if (if_block0) { + if_block0.d(1); + if_block0 = null; + } + if (dirty & /*limits*/ + 8 && t13_value !== (t13_value = /*limits*/ + ctx2[3].storage.usedFormatted + "")) set_data(t13, t13_value); + if (dirty & /*limits*/ + 8 && t15_value !== (t15_value = /*limits*/ + ctx2[3].storage.limitFormatted + "")) set_data(t15, t15_value); + if (dirty & /*limits*/ + 8) { + set_style( + span3, + "color", + /*limits*/ + ctx2[3].storage.usedBytes >= /*limits*/ + ctx2[3].storage.limitBytes ? "var(--text-error)" : "var(--text-normal)" + ); + } + if (dirty & /*limits*/ + 8 && t19_value !== (t19_value = /*limits*/ + ctx2[3].sites.current + "")) set_data(t19, t19_value); + if (dirty & /*limits*/ + 8 && t21_value !== (t21_value = /*limits*/ + ctx2[3].sites.limit + "")) set_data(t21, t21_value); + if ( + /*limits*/ + ctx2[3].builds.monthlyRemaining === 0 || /*limits*/ + ctx2[3].storage.usedBytes >= /*limits*/ + ctx2[3].storage.limitBytes + ) { + if (if_block1) { + } else { + if_block1 = create_if_block_43(ctx2); + if_block1.c(); + if_block1.m(div5, null); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } + }, + d(detaching) { + if (detaching) { + detach(div5); + } + if (if_block0) if_block0.d(); + if (if_block1) if_block1.d(); + } + }; +} +function create_if_block_25(ctx) { + let div2; + return { + c() { + div2 = element("div"); + div2.innerHTML = `
Loading usage info...
`; + attr(div2, "class", "setting-item"); + set_style(div2, "margin-top", "12px"); + }, + m(target, anchor) { + insert(target, div2, anchor); + }, + p: noop, + d(detaching) { + if (detaching) { + detach(div2); + } + } + }; +} +function create_if_block_53(ctx) { + let div; + let span0; + let t1; + let span1; + let t2_value = ( + /*limits*/ + ctx[3].builds.starterCreditsRemaining + "" + ); + let t2; + return { + c() { + div = element("div"); + span0 = element("span"); + span0.textContent = "Starter credits remaining"; + t1 = space(); + span1 = element("span"); + t2 = text(t2_value); + set_style(div, "display", "flex"); + set_style(div, "justify-content", "space-between"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, span0); + append(div, t1); + append(div, span1); + append(span1, t2); + }, + p(ctx2, dirty) { + if (dirty & /*limits*/ + 8 && t2_value !== (t2_value = /*limits*/ + ctx2[3].builds.starterCreditsRemaining + "")) set_data(t2, t2_value); + }, + d(detaching) { + if (detaching) { + detach(div); + } + } + }; +} +function create_if_block_43(ctx) { + let div; + return { + c() { + div = element("div"); + div.innerHTML = `You've reached your usage limit. Upgrade your plan to continue publishing.`; + set_style(div, "margin-top", "8px"); + set_style(div, "padding", "8px"); + set_style(div, "background", "var(--background-modifier-error)"); + set_style(div, "border-radius", "4px"); + set_style(div, "font-size", "0.85em"); + }, + m(target, anchor) { + insert(target, div, anchor); + }, + d(detaching) { + if (detaching) { + detach(div); + } + } + }; +} function create_pending_block(ctx) { let div2; return { @@ -30576,6 +31082,8 @@ function instance8($$self, $$props, $$invalidate) { let { saveSettings } = $$props; let { onConnect } = $$props; let apiKey = settings.forestrySettings.apiKey; + let limits = null; + let limitsLoading = false; const connect = () => __awaiter(void 0, void 0, void 0, function* () { let pageInfo = yield getPageInfo(); if (!pageInfo) { @@ -30594,24 +31102,45 @@ function instance8($$self, $$props, $$invalidate) { $$invalidate(0, settings.forestrySettings.forestryPageName = "", settings); yield saveSettings(); $$invalidate(2, apiKey = ""); + $$invalidate(3, limits = null); }); const getPageInfo = () => __awaiter(void 0, void 0, void 0, function* () { let pageInfo = yield new ForestryApi(apiKey).getPageInfo(); return pageInfo; }); + const fetchLimits = () => __awaiter(void 0, void 0, void 0, function* () { + if (!settings.forestrySettings.apiKey) return; + $$invalidate(4, limitsLoading = true); + try { + $$invalidate(3, limits = yield new ForestryApi(settings.forestrySettings.apiKey).getUserLimits()); + } catch (_a2) { + $$invalidate(3, limits = null); + } + $$invalidate(4, limitsLoading = false); + }); function input_input_handler() { apiKey = this.value; $$invalidate(2, apiKey); } $$self.$$set = ($$props2) => { if ("settings" in $$props2) $$invalidate(0, settings = $$props2.settings); - if ("saveSettings" in $$props2) $$invalidate(6, saveSettings = $$props2.saveSettings); - if ("onConnect" in $$props2) $$invalidate(7, onConnect = $$props2.onConnect); + if ("saveSettings" in $$props2) $$invalidate(8, saveSettings = $$props2.saveSettings); + if ("onConnect" in $$props2) $$invalidate(9, onConnect = $$props2.onConnect); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & /*settings*/ + 1) { + $: if (settings.forestrySettings.apiKey) { + fetchLimits(); + } + } }; return [ settings, unique, apiKey, + limits, + limitsLoading, connect, disconnect, getPageInfo, @@ -30625,8 +31154,8 @@ var ForestrySettings = class extends SvelteComponent { super(); init(this, options, instance8, create_fragment8, safe_not_equal, { settings: 0, - saveSettings: 6, - onConnect: 7 + saveSettings: 8, + onConnect: 9 }); } }; @@ -30699,7 +31228,7 @@ var SettingView = class { const publishPlatformSettings = this.settingsRootElement.createEl( "div", { - cls: "connection-status" + cls: "publish-platform-settings" } ); this.initializePublishPlatformSettings(publishPlatformSettings); @@ -31313,13 +31842,31 @@ var SettingView = class { cb.setButtonText("Apply settings to site"); cb.setCta(); cb.onClick((_ev) => __async(this, null, function* () { - const octokit = new Octokit({ - auth: this.settings.githubToken - }); new import_obsidian15.Notice("Applying settings to site..."); yield this.saveSettingsAndUpdateEnv(); - yield this.addFavicon(octokit); - yield this.addLogo(octokit); + const connection = yield PublishPlatformConnectionFactory.createPublishPlatformConnection( + this.settings + ); + const octokit = connection.octoKit; + const owner = connection.userName; + const repo = connection.pageName; + try { + yield this.addFavicon(octokit, owner, repo); + } catch (error) { + import_js_logger9.default.error("Failed to update favicon", error); + new import_obsidian15.Notice( + "Failed to update favicon. Check the developer console for details." + ); + } + try { + yield this.addLogo(octokit, owner, repo); + } catch (error) { + import_js_logger9.default.error("Failed to update logo", error); + new import_obsidian15.Notice( + "Failed to update logo. Check the developer console for details." + ); + } + new import_obsidian15.Notice("Settings applied to site!"); })); }; new import_obsidian15.Setting(this.settingsRootElement).setName("Appearance").setDesc("Manage themes, sitename and styling on your site").addButton((cb) => { @@ -31724,7 +32271,7 @@ var SettingView = class { } return settings; } - addFavicon(octokit) { + addFavicon(octokit, owner, repo) { return __async(this, null, function* () { let base64SettingsFaviconContent = ""; if (this.settings.faviconPath) { @@ -31738,11 +32285,12 @@ var SettingView = class { const faviconContent = yield this.app.vault.readBinary(faviconFile); base64SettingsFaviconContent = arrayBufferToBase64(faviconContent); } else { - const defaultFavicon = yield octokit.request( + const baseConnection = PublishPlatformConnectionFactory.createBaseGardenConnection(); + const defaultFavicon = yield baseConnection.octoKit.request( "GET /repos/{owner}/{repo}/contents/{path}", { - owner: "oleeskild", - repo: "digitalgarden", + owner: baseConnection.userName, + repo: baseConnection.pageName, path: "src/site/favicon.svg" } ); @@ -31755,13 +32303,13 @@ var SettingView = class { currentFaviconOnSite = yield octokit.request( "GET /repos/{owner}/{repo}/contents/{path}", { - owner: this.settings.githubUserName, - repo: this.settings.githubRepo, + owner, + repo, path: "src/site/favicon.svg" } ); faviconsAreIdentical = // @ts-expect-error TODO: abstract octokit response - currentFaviconOnSite.data.content === base64SettingsFaviconContent; + currentFaviconOnSite.data.content.replace(/\n/g, "") === base64SettingsFaviconContent; if (faviconsAreIdentical) { import_js_logger9.default.info("Favicons are identical, skipping update"); return; @@ -31771,8 +32319,8 @@ var SettingView = class { } if (!faviconExists || !faviconsAreIdentical) { yield octokit.request("PUT /repos/{owner}/{repo}/contents/{path}", { - owner: this.settings.githubUserName, - repo: this.settings.githubRepo, + owner, + repo, path: "src/site/favicon.svg", message: `Update favicon.svg`, content: base64SettingsFaviconContent, @@ -31782,9 +32330,12 @@ var SettingView = class { } }); } - addLogo(octokit) { + addLogo(octokit, owner, repo) { return __async(this, null, function* () { var _a2; + import_js_logger9.default.info( + `addLogo called, logoPath setting: "${this.settings.logoPath}", owner: "${owner}", repo: "${repo}"` + ); const logoBasePath = "src/site/logo"; const logoExtensions = ["png", "jpg", "jpeg", "gif", "svg", "webp"]; for (const ext of logoExtensions) { @@ -31792,8 +32343,8 @@ var SettingView = class { const existingLogo = yield octokit.request( "GET /repos/{owner}/{repo}/contents/{path}", { - owner: this.settings.githubUserName, - repo: this.settings.githubRepo, + owner, + repo, path: `${logoBasePath}.${ext}` } ); @@ -31804,8 +32355,8 @@ var SettingView = class { yield octokit.request( "DELETE /repos/{owner}/{repo}/contents/{path}", { - owner: this.settings.githubUserName, - repo: this.settings.githubRepo, + owner, + repo, path: `${logoBasePath}.${ext}`, message: `Remove logo.${ext}`, // @ts-expect-error TODO: abstract octokit response @@ -31841,13 +32392,13 @@ var SettingView = class { currentLogoOnSite = yield octokit.request( "GET /repos/{owner}/{repo}/contents/{path}", { - owner: this.settings.githubUserName, - repo: this.settings.githubRepo, + owner, + repo, path: logoPath } ); logosAreIdentical = // @ts-expect-error TODO: abstract octokit response - currentLogoOnSite.data.content === base64LogoContent; + currentLogoOnSite.data.content.replace(/\n/g, "") === base64LogoContent; if (logosAreIdentical) { import_js_logger9.default.info("Logos are identical, skipping update"); return; @@ -31858,8 +32409,8 @@ var SettingView = class { if (!logoExists || !logosAreIdentical) { try { const requestPayload = __spreadValues({ - owner: this.settings.githubUserName, - repo: this.settings.githubRepo, + owner, + repo, path: logoPath, message: `Update logo.${logoExtension}`, content: base64LogoContent @@ -32550,6 +33101,10 @@ var DigitalGarden = class extends import_obsidian19.Plugin { } catch (e) { statusBarItem.remove(); this.isPublishing = false; + if (e instanceof LimitReachedError) { + this.showLimitNotice(e); + return; + } console.error(e); new import_obsidian19.Notice( "Unable to publish multiple notes, something went wrong." @@ -32666,9 +33221,15 @@ var DigitalGarden = class extends import_obsidian19.Plugin { const publishSuccessful = yield publisher.publish(publishFile); if (publishSuccessful) { new import_obsidian19.Notice(`Successfully published note to your garden.`); + } else { + new import_obsidian19.Notice("Unable to publish note, something went wrong."); } return publishSuccessful; } catch (e) { + if (e instanceof LimitReachedError) { + this.showLimitNotice(e); + return false; + } console.error(e); new import_obsidian19.Notice("Unable to publish note, something went wrong."); return false; @@ -32762,6 +33323,22 @@ var DigitalGarden = class extends import_obsidian19.Plugin { } }); } + showLimitNotice(error) { + var _a2, _b; + if (error.errorType === "build_limit_reached") { + const used = (_a2 = error.buildsUsed) != null ? _a2 : 0; + const limit = (_b = error.monthlyLimit) != null ? _b : 0; + new import_obsidian19.Notice( + `Publishing blocked: You've used all ${used}/${limit} builds this month. Upgrade to Pro for 1000 builds/month at dashboard.forestry.md/settings`, + 1e4 + ); + } else { + new import_obsidian19.Notice( + `Publishing blocked: Storage limit exceeded. Free up space or upgrade at dashboard.forestry.md/settings`, + 1e4 + ); + } + } openPublishModal() { const siteManager = new DigitalGardenSiteManager( this.app.metadataCache, diff --git a/.obsidian/plugins/digitalgarden/manifest.json b/.obsidian/plugins/digitalgarden/manifest.json index 5e4c28d..ff4a3d8 100644 --- a/.obsidian/plugins/digitalgarden/manifest.json +++ b/.obsidian/plugins/digitalgarden/manifest.json @@ -1,7 +1,7 @@ { "id": "digitalgarden", "name": "Digital Garden", - "version": "2.69.0", + "version": "2.72.0", "minAppVersion": "1.10.0", "description": "Publish your notes to the web for others to enjoy. For free.", "author": "Ole Eskild Steensen", diff --git a/.obsidian/plugins/obsidian-excalidraw-plugin/main.js b/.obsidian/plugins/obsidian-excalidraw-plugin/main.js index 39bc18d..53b983a 100644 --- a/.obsidian/plugins/obsidian-excalidraw-plugin/main.js +++ b/.obsidian/plugins/obsidian-excalidraw-plugin/main.js @@ -1,10 +1,10 @@ "use strict";var obsidian_module=require("obsidian"),view=require("@codemirror/view"),commands=require("@codemirror/commands"),lr=require("@lezer/lr"),language=require("@codemirror/language"),state=require("@codemirror/state");;const INITIAL_TIMESTAMP=Date.now();var LZString=function(){var r=String.fromCharCode,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",e={};function t(r,o){if(!e[r]){e[r]={};for(var n=0;n>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null==o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;e>=1}else{for(t=1,e=0;e>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e>=1;0==--l&&(l=Math.pow(2,h),h++),s[p]=f++,c=String(a)}if(""!==c){if(Object.prototype.hasOwnProperty.call(u,c)){if(c.charCodeAt(0)<256){for(e=0;e>=1}else{for(t=1,e=0;e>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e>=1;0==--l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;e>=1;for(;;){if(m<<=1,v==o-1){d.push(n(m));break}v++}return d.join("")},decompress:function(r){return null==r?"":""==r?null:i._decompress(r.length,32768,function(o){return r.charCodeAt(o)})},_decompress:function(o,n,e){var t,i,s,u,a,p,c,l=[],f=4,h=4,d=3,m="",v=[],g={val:e(0),position:n,index:1};for(t=0;t<3;t+=1)l[t]=t;for(s=0,a=Math.pow(2,2),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 2:return""}for(l[3]=c,i=c,v.push(c);;){if(g.index>o)return"";for(s=0,a=Math.pow(2,d),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(c=s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 2:return v.join("")}if(0==f&&(f=Math.pow(2,d),d++),l[c])m=l[c];else{if(c!==h)return null;m=i+i.charAt(0)}v.push(m),l[h++]=i+m.charAt(0),i=m,0==--f&&(f=Math.pow(2,d),d++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString}); let REACT_PACKAGES = `!function(){var e,t;e=this,t=function(e){function M(e){return null!==e&&"object"==typeof e&&"function"==typeof(e=te&&e[te]||e["@@iterator"])?e:null}function t(e,t,n){this.props=e,this.context=t,this.refs=oe,this.updater=n||ne}function n(){}function r(e,t,n){this.props=e,this.context=t,this.refs=oe,this.updater=n||ne}function o(e,t,n){var r,o={},u=null,a=null;if(null!=t)for(r in void 0!==t.ref&&(a=t.ref),void 0!==t.key&&(u=""+t.key),t)ae.call(t,r)&&!ie.hasOwnProperty(r)&&(o[r]=t[r]);var i=arguments.length-2;if(1===i)o.children=n;else if(1>>1,o=e[r];if(!(0>>1;rt)||e&&!q());){var r,o=R.callback;"function"==typeof o?(R.callback=null,P=R.priorityLevel,r=o(R.expirationTime<=t),t=v(),"function"==typeof r?R.callback=r:R===i(C)&&l(C),y(t)):l(C),R=i(C)}var u,a=null!==R||(null!==(u=i(E))&&_(d,u.startTime-t),!1);return a}finally{R=null,P=n,$=!1}}function q(){return!(v()-de")?l.replace("",n.displayName):l}while(1<=u&&0<=i);break}}}finally{xo=!1,Error.prepareStackTrace=t}return(n=n?n.displayName||n.name:"")?Q(n):""}function $(e){switch(e.tag){case 5:return Q(e.type);case 16:return Q("Lazy");case 13:return Q("Suspense");case 19:return Q("SuspenseList");case 0:case 2:case 15:return e=j(e.type,!1);case 11:return e=j(e.type.render,!1);case 1:return e=j(e.type,!0);default:return""}}function q(e){if(null!=e){if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case co:return"Fragment";case so:return"Portal";case po:return"Profiler";case fo:return"StrictMode";case yo:return"Suspense";case vo:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case ho:return(e.displayName||"Context")+".Consumer";case mo:return(e._context.displayName||"Context")+".Provider";case go:var n=e.render;return e=(e=e.displayName)?e:""!==(e=n.displayName||n.name||"")?"ForwardRef("+e+")":"ForwardRef";case bo:return null!==(n=e.displayName||null)?n:q(e.type)||"Memo";case ko:n=e._payload,e=e._init;try{return q(e(n))}catch(e){}}}return null}function K(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=n.render).displayName||e.name||"",n.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return q(n);case 8:return n===fo?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof n)return n.displayName||n.name||null;if("string"==typeof n)return n}return null}function Y(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function X(e){var n=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===n||"radio"===n)}function G(e){var n,t,r=X(e)?"checked":"value",l=Object.getOwnPropertyDescriptor(e.constructor.prototype,r),a=""+e[r];if(!e.hasOwnProperty(r)&&void 0!==l&&"function"==typeof l.get&&"function"==typeof l.set)return n=l.get,t=l.set,Object.defineProperty(e,r,{configurable:!0,get:function(){return n.call(this)},set:function(e){a=""+e,t.call(this,e)}}),Object.defineProperty(e,r,{enumerable:l.enumerable}),{getValue:function(){return a},setValue:function(e){a=""+e},stopTracking:function(){e._valueTracker=null,delete e[r]}}}function Z(e){e._valueTracker||(e._valueTracker=G(e))}function J(e){var n,t,r;return!(!e||(n=e._valueTracker)&&(t=n.getValue(),r="",(e=r=e?X(e)?e.checked?"true":"false":e.value:r)===t||(n.setValue(e),0)))}function ee(n){if(void 0===(n=n||("undefined"!=typeof document?document:void 0)))return null;try{return n.activeElement||n.body}catch(e){return n.body}}function ne(e,n){var t=n.checked;return g({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=t?t:e._wrapperState.initialChecked})}function te(e,n){var t=null==n.defaultValue?"":n.defaultValue,r=null!=n.checked?n.checked:n.defaultChecked,t=Y(null!=n.value?n.value:t);e._wrapperState={initialChecked:r,initialValue:t,controlled:"checkbox"===n.type||"radio"===n.type?null!=n.checked:null!=n.value}}function re(e,n){null!=(n=n.checked)&&B(e,"checked",n,!1)}function le(e,n){re(e,n);var t=Y(n.value),r=n.type;if(null!=t)"number"===r?(0===t&&""===e.value||e.value!=t)&&(e.value=""+t):e.value!==""+t&&(e.value=""+t);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");n.hasOwnProperty("value")?oe(e,n.type,t):n.hasOwnProperty("defaultValue")&&oe(e,n.type,Y(n.defaultValue)),null==n.checked&&null!=n.defaultChecked&&(e.defaultChecked=!!n.defaultChecked)}function ae(e,n,t){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var r=n.type;if(("submit"===r||"reset"===r)&&null==n.value)return;n=""+e._wrapperState.initialValue,t||n===e.value||(e.value=n),e.defaultValue=n}""!==(t=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==t&&(e.name=t)}function oe(e,n,t){"number"===n&&ee(e.ownerDocument)===e||(null==t?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+t&&(e.defaultValue=""+t))}function ue(e,n,t,r){if(e=e.options,n){n={};for(var l=0;l>>=0)?32:31-(iu(e)/su|0)|0}function Re(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function De(e,n){var t=e.pendingLanes;if(0===t)return 0;var r,l=0,a=e.suspendedLanes,o=e.pingedLanes,u=268435455&t;if(0!==u?0!==(r=u&~a)?l=Re(r):0!==(o&=u)&&(l=Re(o)):0!==(u=t&~a)?l=Re(u):0!==o&&(l=Re(o)),0===l)return 0;if(0!==n&&n!==l&&0==(n&a)&&((o=n&-n)<=(a=l&-l)||16===a&&0!=(4194240&o)))return n;if(0!=(4&l)&&(l|=16&t),0!==(n=e.entangledLanes))for(e=e.entanglements,n&=l;0>=r,a-=r,Xi=1<<32-uu(n)+a|t<u?(i=o,o=null):i=o.sibling;var s=y(n,o,t[u],r);if(null===s){null===o&&(o=i);break}f&&o&&null===s.alternate&&d(n,o),e=h(s,e,u),null===a?l=s:a.sibling=s,a=s,o=i}if(u===t.length)p(n,o);else if(null===o)for(;uu?(i=o,o=null):i=o.sibling;var c=y(n,o,s.value,r);if(null===c){null===o&&(o=i);break}f&&o&&null===c.alternate&&d(n,o),e=h(c,e,u),null===a?l=c:a.sibling=c,a=c,o=i}if(s.done)p(n,o);else if(null===o)for(;!s.done;u++,s=t.next())null!==(s=g(n,s.value,r))&&(e=h(s,e,u),null===a?l=s:a.sibling=s,a=s);else{for(o=m(n,o);!s.done;u++,s=t.next())null!==(s=v(o,n,u,s.value,r))&&(f&&null!==s.alternate&&o.delete(null===s.key?u:s.key),e=h(s,e,u),null===a?l=s:a.sibling=s,a=s);f&&o.forEach(function(e){return d(n,e)})}return E&&vt(n,u),l}function w(e,n,t,r){if("object"==typeof(t="object"==typeof t&&null!==t&&t.type===co&&null===t.key?t.props.children:t)&&null!==t){switch(t.$$typeof){case io:e:{for(var l=t.key,a=n;null!==a;){if(a.key===l){if((l=t.type)===co){if(7===a.tag){p(e,a.sibling),(n=o(a,t.props.children)).return=e,e=n;break e}}else if(a.elementType===l||"object"==typeof l&&null!==l&&l.$$typeof===ko&&Mt(l)===a.type){p(e,a.sibling),(n=o(a,t.props)).ref=Lt(e,a,t),n.return=e,e=n;break e}p(e,a);break}d(e,a),a=a.sibling}e=t.type===co?((n=za(t.props.children,e.mode,r,t.key)).return=e,n):((r=Na(t.type,t.key,t.props,null,e.mode,r)).ref=Lt(e,n,t),r.return=e,r)}return u(e);case so:e:{for(a=t.key;null!==n;){if(n.key===a){if(4===n.tag&&n.stateNode.containerInfo===t.containerInfo&&n.stateNode.implementation===t.implementation){p(e,n.sibling),(n=o(n,t.children||[])).return=e,e=n;break e}p(e,n);break}d(e,n),n=n.sibling}(n=La(t,e.mode,r)).return=e,e=n}return u(e);case ko:return w(e,n,(a=t._init)(t._payload),r)}if(Eo(t))return b(e,n,t,r);if(H(t))return k(e,n,t,r);Tt(e,t)}return"string"==typeof t&&""!==t||"number"==typeof t?(t=""+t,(n=null!==n&&6===n.tag?(p(e,n.sibling),o(n,t)):(p(e,n),_a(t,e.mode,r))).return=e,u(e=n)):p(e,n)}return w}function Rt(){os=as=ls=null}function Dt(e,n){n=rs.current,s(rs),e._currentValue=n}function Ot(e,n,t){for(;null!==e;){var r=e.alternate;if((e.childLanes&n)!==n?(e.childLanes|=n,null!==r&&(r.childLanes|=n)):null!==r&&(r.childLanes&n)!==n&&(r.childLanes|=n),e===t)break;e=e.return}}function It(e,n){(os=as=null)!==(e=(ls=e).dependencies)&&null!==e.firstContext&&(0!=(e.lanes&n)&&(_=!0),e.firstContext=null)}function Ut(e){var n=e._currentValue;if(os!==e)if(e={context:e,memoizedValue:n,next:null},null===as){if(null===ls)throw Error(S(308));as=e,ls.dependencies={lanes:0,firstContext:e}}else as=as.next=e;return n}function Vt(e){null===us?us=[e]:us.push(e)}function At(e,n,t,r){var l=n.interleaved;return null===l?(t.next=t,Vt(n)):(t.next=l.next,l.next=t),n.interleaved=t,Wt(e,r)}function Wt(e,n){e.lanes|=n;var t=e.alternate;for(null!==t&&(t.lanes|=n),e=(t=e).return;null!==e;)e.childLanes|=n,null!==(t=e.alternate)&&(t.childLanes|=n),e=(t=e).return;return 3===t.tag?t.stateNode:null}function Bt(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Ht(e,n){e=e.updateQueue,n.updateQueue===e&&(n.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Qt(e,n){return{eventTime:e,lane:n,tag:0,payload:null,callback:null,next:null}}function jt(e,n,t){var r,l=e.updateQueue;return null===l?null:(l=l.shared,(0!=(2&F)?(null===(r=l.pending)?n.next=n:(n.next=r.next,r.next=n),l.pending=n,is):(null===(r=l.interleaved)?(n.next=n,Vt(l)):(n.next=r.next,r.next=n),l.interleaved=n,Wt))(e,t))}function $t(e,n,t){var r;null!==(n=n.updateQueue)&&(n=n.shared,0!=(4194240&t))&&(r=n.lanes,r&=e.pendingLanes,He(e,n.lanes=t|=r))}function qt(e,n){var t=e.updateQueue,r=e.alternate;if(null!==r&&t===(r=r.updateQueue)){var l=null,a=null;if(null!==(t=t.firstBaseUpdate)){do{var o={eventTime:t.eventTime,lane:t.lane,tag:t.tag,payload:t.payload,callback:t.callback,next:null}}while(null===a?l=a=o:a=a.next=o,null!==(t=t.next));null===a?l=a=n:a=a.next=n}else l=a=n;t={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:a,shared:r.shared,effects:r.effects},e.updateQueue=t}else null===(e=t.lastBaseUpdate)?t.firstBaseUpdate=n:e.next=n,t.lastBaseUpdate=n}function Kt(e,n,t,r){var l,a,o=e.updateQueue,u=(ss=!1,o.firstBaseUpdate),i=o.lastBaseUpdate;if(null!==(f=o.shared.pending)&&(o.shared.pending=null,a=(l=f).next,(l.next=null)===i?u=a:i.next=a,i=l,null!==(c=e.alternate))&&(f=(c=c.updateQueue).lastBaseUpdate)!==i&&(null===f?c.firstBaseUpdate=a:f.next=a,c.lastBaseUpdate=l),null!==u){for(var s=o.baseState,i=0,c=a=l=null,f=u;;){var d=f.lane,p=f.eventTime;if((r&d)===d){null!==c&&(c=c.next={eventTime:p,lane:0,tag:f.tag,payload:f.payload,callback:f.callback,next:null});e:{var m=e,h=f,d=n,p=t;switch(h.tag){case 1:if("function"==typeof(m=h.payload)){s=m.call(p,s,d);break e}s=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(d="function"==typeof(m=h.payload)?m.call(p,s,d):m))break e;s=g({},s,d);break e;case 2:ss=!0}}null!==f.callback&&0!==f.lane&&(e.flags|=64,null===(d=o.effects)?o.effects=[f]:d.push(f))}else p={eventTime:p,lane:d,tag:f.tag,payload:f.payload,callback:f.callback,next:null},null===c?(a=c=p,l=s):c=c.next=p,i|=d;if(null===(f=f.next)){if(null===(f=o.shared.pending))break;f=(d=f).next,d.next=null,o.lastBaseUpdate=d,o.shared.pending=null}}if(null===c&&(l=s),o.baseState=l,o.firstBaseUpdate=a,o.lastBaseUpdate=c,null!==(n=o.shared.interleaved))for(o=n;i|=o.lane,(o=o.next)!==n;);else null===u&&(o.shared.lanes=0);Qs|=i,e.lanes=i,e.memoizedState=s}}function Yt(e,n,t){if(e=n.effects,(n.effects=null)!==e)for(n=0;n<\\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=o.createElement(t,{is:r.is}):(e=o.createElement(t),"select"===t&&(o=e,r.multiple?o.multiple=!0:r.size&&(o.size=r.size))):e=o.createElementNS(e,t),e[Li]=n,e[Ti]=r,Ls(e,n,!1,!1),n.stateNode=e;e:{switch(o=ye(t,r),t){case"dialog":c("cancel",e),c("close",e),a=r;break;case"iframe":case"object":case"embed":c("load",e),a=r;break;case"video":case"audio":for(a=0;aYs&&(n.flags|=128,wl(i,!(r=!0)),n.lanes=4194304)}else{if(!r)if(null!==(e=nr(o))){if(n.flags|=128,r=!0,null!==(t=e.updateQueue)&&(n.updateQueue=t,n.flags|=4),wl(i,!0),null===i.tail&&"hidden"===i.tailMode&&!o.alternate&&!E)return p(n),null}else 2*y()-i.renderingStartTime>Ys&&1073741824!==t&&(n.flags|=128,wl(i,!(r=!0)),n.lanes=4194304);i.isBackwards?(o.sibling=n.child,n.child=o):(null!==(t=i.last)?t.sibling=o:n.child=o,i.last=o)}if(null!==i.tail)return n=i.tail,i.rendering=n,i.tail=n.sibling,i.renderingStartTime=y(),n.sibling=null,t=C.current,f(C,r?1&t|2:1&t),n}return p(n),null;case 22:case 23:return O=Bs.current,s(Bs),r=null!==n.memoizedState,null!==e&&null!==e.memoizedState!==r&&(n.flags|=8192),r&&0!=(1&n.mode)?0!=(1073741824&O)&&(p(n),6&n.subtreeFlags)&&(n.flags|=8192):p(n),null;case 24:case 25:return null}throw Error(S(156,n.tag))}function xl(e,n,t){switch(wt(n),n.tag){case 1:return h(n.type)&&(s(b),s(v)),65536&(e=n.flags)?(n.flags=-65537&e|128,n):null;case 3:return Zt(),s(b),s(v),tr(),0!=(65536&(e=n.flags))&&0==(128&e)?(n.flags=-65537&e|128,n):null;case 5:return er(n),null;case 13:if(s(C),null!==(e=n.memoizedState)&&null!==e.dehydrated){if(null===n.alternate)throw Error(S(340));Pt()}return 65536&(e=n.flags)?(n.flags=-65537&e|128,n):null;case 19:return s(C),null;case 4:return Zt(),null;case 10:return Dt(n.type._context),null;case 22:case 23:return O=Bs.current,s(Bs),null;default:return null}}function El(n,t){var e=n.ref;if(null!==e)if("function"==typeof e)try{e(null)}catch(e){w(n,t,e)}else e.current=null}function Cl(n,t,e){try{e()}catch(e){w(n,t,e)}}function Nl(e,n){if(Ei=Su,Dn(e=Rn())){if("selectionStart"in e)var t={start:e.selectionStart,end:e.selectionEnd};else e:if((a=(t=(t=e.ownerDocument)&&t.defaultView||window).getSelection&&t.getSelection())&&0!==a.rangeCount){var t=a.anchorNode,r=a.anchorOffset,l=a.focusNode,a=a.focusOffset;try{t.nodeType,l.nodeType}catch(e){t=null;break e}var o,u=0,i=-1,s=-1,c=0,f=0,d=e,p=null;n:for(;;){for(;d!==t||0!==r&&3!==d.nodeType||(i=u+r),d!==l||0!==a&&3!==d.nodeType||(s=u+a),3===d.nodeType&&(u+=d.nodeValue.length),null!==(o=d.firstChild);)p=d,d=o;for(;;){if(d===e)break n;if(p===t&&++c===r&&(i=u),p===l&&++f===a&&(s=u),null!==(o=d.nextSibling))break;p=(d=p).parentNode}d=o}t=-1===i||-1===s?null:{start:i,end:s}}else t=null;t=t||{start:0,end:0}}else t=null;for(Su=!(Ci={focusedElem:e,selectionRange:t}),T=n;null!==T;)if(e=(n=T).child,0!=(1028&n.subtreeFlags)&&null!==e)e.return=n,T=e;else for(;null!==T;){n=T;try{var m,h,g,y,v=n.alternate;if(0!=(1024&n.flags))switch(n.tag){case 0:case 11:case 15:break;case 1:null!==v&&(m=v.memoizedProps,h=v.memoizedState,y=(g=n.stateNode).getSnapshotBeforeUpdate(n.elementType===n.type?m:Ar(n.type,m),h),g.__reactInternalSnapshotBeforeUpdate=y);break;case 3:var b=n.stateNode.containerInfo;1===b.nodeType?b.textContent="":9===b.nodeType&&b.documentElement&&b.removeChild(b.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(S(163))}}catch(e){w(n,n.return,e)}if(null!==(e=n.sibling)){e.return=n.return,T=e;break}T=n.return}return v=Os,Os=!1,v}function zl(e,n,t){var r=n.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var l,a=r=r.next;do{}while((a.tag&e)===e&&(l=a.destroy,(a.destroy=void 0)!==l)&&Cl(n,t,l),(a=a.next)!==r)}}function Pl(e,n){if(null!==(n=null!==(n=n.updateQueue)?n.lastEffect:null)){var t,r=n=n.next;do{}while((r.tag&e)===e&&(t=r.create,r.destroy=t()),(r=r.next)!==n)}}function _l(e){var n,t=e.ref;null!==t&&(n=e.stateNode,e.tag,e=n,"function"==typeof t?t(e):t.current=e)}function Ll(e){var n=e.alternate;null!==n&&(e.alternate=null,Ll(n)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&null!==(n=e.stateNode)&&(delete n[Li],delete n[Ti],delete n[Fi],delete n[Ri],delete n[Di]),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Tl(e){return 5===e.tag||3===e.tag||4===e.tag}function Ml(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||Tl(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e=(e.child.return=e).child}if(!(2&e.flags))return e.stateNode}}function Fl(e,n,t){var r=e.tag;if(5===r||6===r)e=e.stateNode,n?(8===t.nodeType?t.parentNode:t).insertBefore(e,n):(8===t.nodeType?(n=t.parentNode).insertBefore(e,t):(n=t).appendChild(e),null==(t=t._reactRootContainer)&&null===n.onclick&&(n.onclick=Jn));else if(4!==r&&null!==(e=e.child))for(Fl(e,n,t),e=e.sibling;null!==e;)Fl(e,n,t),e=e.sibling}function Rl(e,n,t){var r=e.tag;if(5===r||6===r)e=e.stateNode,n?t.insertBefore(e,n):t.appendChild(e);else if(4!==r&&null!==(e=e.child))for(Rl(e,n,t),e=e.sibling;null!==e;)Rl(e,n,t),e=e.sibling}function Dl(e,n,t){for(t=t.child;null!==t;)Ol(e,n,t),t=t.sibling}function Ol(e,n,t){if(ou&&"function"==typeof ou.onCommitFiberUnmount)try{ou.onCommitFiberUnmount(au,t)}catch(e){}switch(t.tag){case 5:L||El(t,n);case 6:var r=M,l=Is;M=null,Dl(e,n,t),Is=l,null!==(M=r)&&(Is?(e=M,t=t.stateNode,(8===e.nodeType?e.parentNode:e).removeChild(t)):M.removeChild(t.stateNode));break;case 18:null!==M&&(Is?(e=M,t=t.stateNode,8===e.nodeType?tt(e.parentNode,t):1===e.nodeType&&tt(e,t),Je(e)):tt(M,t.stateNode));break;case 4:r=M,l=Is,M=t.stateNode.containerInfo,Is=!0,Dl(e,n,t),M=r,Is=l;break;case 0:case 11:case 14:case 15:if(!L&&null!==(r=t.updateQueue)&&null!==(r=r.lastEffect)){l=r=r.next;do{var a=(o=l).destroy,o=o.tag}while(void 0===a||0==(2&o)&&0==(4&o)||Cl(t,n,a),(l=l.next)!==r)}Dl(e,n,t);break;case 1:if(!L&&(El(t,n),"function"==typeof(r=t.stateNode).componentWillUnmount))try{r.props=t.memoizedProps,r.state=t.memoizedState,r.componentWillUnmount()}catch(e){w(t,n,e)}Dl(e,n,t);break;case 21:Dl(e,n,t);break;case 22:1&t.mode?(L=(r=L)||null!==t.memoizedState,Dl(e,n,t),L=r):Dl(e,n,t);break;default:Dl(e,n,t)}}function Il(t){var r,e=t.updateQueue;null!==e&&((t.updateQueue=null)===(r=t.stateNode)&&(r=t.stateNode=new Ds),e.forEach(function(e){var n=ka.bind(null,t,e);r.has(e)||(r.add(e),e.then(n,n))}))}function Ul(e,n,t){if(null!==(t=n.deletions))for(var r=0;r