<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Крем-Суп on Рецепты</title><link>https://recipes.dmlab.work/tags/%D0%BA%D1%80%D0%B5%D0%BC-%D1%81%D1%83%D0%BF/</link><description>Recent content in Крем-Суп on Рецепты</description><generator>Hugo -- 0.155.3</generator><language>ru-ru</language><lastBuildDate>Sun, 08 Sep 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://recipes.dmlab.work/tags/%D0%BA%D1%80%D0%B5%D0%BC-%D1%81%D1%83%D0%BF/index.xml" rel="self" type="application/rss+xml"/><item><title>Грибной крем-суп с шампиньонами и белыми грибами</title><link>https://recipes.dmlab.work/recipes/mushroom-cream-soup/</link><pubDate>Sun, 08 Sep 2024 00:00:00 +0000</pubDate><guid>https://recipes.dmlab.work/recipes/mushroom-cream-soup/</guid><description>&lt;p&gt;Ароматный и насыщенный грибной крем-суп, сочетающий в себе нежность свежих шампиньонов и глубокий вкус белых грибов. Лёгкие чесночные нотки добавляют пикантности, не перебивая благородный грибной аромат. Идеальное блюдо для прохладных осенних дней, когда особенно хочется согреться чем-то домашним и вкусным.&lt;/p&gt;
&lt;h2 id="необходимое-оборудование"&gt;Необходимое оборудование&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Погружной блендер мощностью от 600 Вт&lt;/li&gt;
&lt;li&gt;Кастрюля с толстым дном объемом 4-5 литров&lt;/li&gt;
&lt;li&gt;Сковорода с антипригарным покрытием 28 см&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="подготовка"&gt;Подготовка&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Белые грибы разморозить (или использовать не размораживая)&lt;/li&gt;
&lt;li&gt;Все овощи довести до комнатной температуры 20°C&lt;/li&gt;
&lt;li&gt;Сливки довести до температуры 18-20°C (достать из холодильника за 1 час)&lt;/li&gt;
&lt;li&gt;Картофель нарезать пластинами толщиной 2-3 мм&lt;/li&gt;
&lt;li&gt;Лук нарезать перьями (полукольцами)&lt;/li&gt;
&lt;li&gt;Чеснок очистить и мелко нарубить или пропустить через пресс&lt;/li&gt;
&lt;li&gt;Шампиньоны нарезать на четверти&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="ингредиенты"&gt;Ингредиенты&lt;/h2&gt;
&lt;div class="nutritional-info"&gt;
&lt;h4&gt;Пищевая ценность на 100г:&lt;/h4&gt;
&lt;div class="nutritional-grid"&gt;
&lt;div class="nutritional-item"&gt;
&lt;span class="nutritional-label"&gt;Калории:&lt;/span&gt;
&lt;span class="nutritional-value"&gt;106 ккал&lt;/span&gt;
&lt;/div&gt;
&lt;div class="nutritional-item"&gt;
&lt;span class="nutritional-label"&gt;Белки:&lt;/span&gt;
&lt;span class="nutritional-value"&gt;4.9 г&lt;/span&gt;
&lt;/div&gt;
&lt;div class="nutritional-item"&gt;
&lt;span class="nutritional-label"&gt;Жиры:&lt;/span&gt;
&lt;span class="nutritional-value"&gt;8 г&lt;/span&gt;
&lt;/div&gt;
&lt;div class="nutritional-item"&gt;
&lt;span class="nutritional-label"&gt;Углеводы:&lt;/span&gt;
&lt;span class="nutritional-value"&gt;6.3 г&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="recipe-calculator"&gt;
&lt;div class="servings-control"&gt;
&lt;label&gt;Количество порций:&lt;/label&gt;
&lt;button class="btn-servings" onclick="changeServings(-1)"&gt;−&lt;/button&gt;
&lt;input type="number" id="servings" value="10" min="1" onchange="recalculate()"&gt;
&lt;button class="btn-servings" onclick="changeServings(1)"&gt;+&lt;/button&gt;
&lt;button class="btn-print" onclick="printIngredients()"&gt;🖨️ Печать состава&lt;/button&gt;
&lt;/div&gt;
&lt;ul class="ingredients-list"&gt;
&lt;li class="ingredient-item"&gt;
&lt;span class="ingredient-amount" data-original="1200"&gt;1200&lt;/span&gt;
&lt;span class="ingredient-unit"&gt;г&lt;/span&gt;
&lt;span class="ingredient-name"&gt;Шампиньоны свежие (очищенные, комнатной температуры 20°C)&lt;/span&gt;
&lt;/li&gt;
&lt;li class="ingredient-item"&gt;
&lt;span class="ingredient-amount" data-original="800"&gt;800&lt;/span&gt;
&lt;span class="ingredient-unit"&gt;г&lt;/span&gt;
&lt;span class="ingredient-name"&gt;Картофель столовый (очищенный, нарезанный пластинами)&lt;/span&gt;
&lt;/li&gt;
&lt;li class="ingredient-item"&gt;
&lt;span class="ingredient-amount" data-original="350"&gt;350&lt;/span&gt;
&lt;span class="ingredient-unit"&gt;г&lt;/span&gt;
&lt;span class="ingredient-name"&gt;Лук репчатый (очищенный, нарезанный перьями)&lt;/span&gt;
&lt;/li&gt;
&lt;li class="ingredient-item"&gt;
&lt;span class="ingredient-amount" data-original="400"&gt;400&lt;/span&gt;
&lt;span class="ingredient-unit"&gt;г&lt;/span&gt;
&lt;span class="ingredient-name"&gt;Грибы белые замороженные&lt;/span&gt;
&lt;/li&gt;
&lt;li class="ingredient-item"&gt;
&lt;span class="ingredient-amount" data-original="1000"&gt;1000&lt;/span&gt;
&lt;span class="ingredient-unit"&gt;мл&lt;/span&gt;
&lt;span class="ingredient-name"&gt;Сливки 20% жирности (комнатной температуры 20°C)&lt;/span&gt;
&lt;/li&gt;
&lt;li class="ingredient-item"&gt;
&lt;span class="ingredient-amount" data-original="60"&gt;60&lt;/span&gt;
&lt;span class="ingredient-unit"&gt;мл&lt;/span&gt;
&lt;span class="ingredient-name"&gt;Масло растительное рафинированное&lt;/span&gt;
&lt;/li&gt;
&lt;li class="ingredient-item"&gt;
&lt;span class="ingredient-amount" data-original="32"&gt;32&lt;/span&gt;
&lt;span class="ingredient-unit"&gt;г&lt;/span&gt;
&lt;span class="ingredient-name"&gt;Чеснок свежий (очищенный)&lt;/span&gt;
&lt;/li&gt;
&lt;li class="ingredient-item"&gt;
&lt;span class="ingredient-amount" data-original="1500"&gt;1500&lt;/span&gt;
&lt;span class="ingredient-unit"&gt;мл&lt;/span&gt;
&lt;span class="ingredient-name"&gt;Вода питьевая&lt;/span&gt;
&lt;/li&gt;
&lt;li class="ingredient-item"&gt;
&lt;span class="ingredient-amount" data-original="22"&gt;22&lt;/span&gt;
&lt;span class="ingredient-unit"&gt;г&lt;/span&gt;
&lt;span class="ingredient-name"&gt;Соль поваренная пищевая&lt;/span&gt;
&lt;/li&gt;
&lt;li class="ingredient-item"&gt;
&lt;span class="ingredient-amount" data-original="3"&gt;3&lt;/span&gt;
&lt;span class="ingredient-unit"&gt;г&lt;/span&gt;
&lt;span class="ingredient-name"&gt;Перец черный молотый&lt;/span&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="output-info"&gt;
&lt;div class="output-item"&gt;
&lt;strong&gt;Общий вес сырых ингредиентов:&lt;/strong&gt;
&lt;span id="totalWeight"&gt;&lt;/span&gt; г
&lt;/div&gt;
&lt;div class="output-item"&gt;
&lt;strong&gt;Выход готового блюда:&lt;/strong&gt;
&lt;span id="yieldWeight" data-yield-ratio="0.85"&gt;&lt;/span&gt; г
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.recipe-calculator {
margin: 20px 0;
padding: 20px;
background: var(--code-bg);
border-radius: 8px;
}
.servings-control {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 20px;
}
.servings-control label {
font-weight: 600;
}
#servings {
width: 60px;
text-align: center;
padding: 5px;
border: 1px solid var(--border);
border-radius: 4px;
}
.btn-servings {
width: 30px;
height: 30px;
border: 1px solid var(--border);
background: var(--theme);
color: var(--primary);
border-radius: 4px;
cursor: pointer;
font-size: 18px;
line-height: 1;
}
.btn-servings:hover {
background: var(--primary);
color: var(--theme);
}
.ingredients-list {
list-style: none;
padding: 0;
margin: 0;
}
.ingredient-item {
padding: 8px 0;
border-bottom: 1px solid var(--border);
display: flex;
gap: 8px;
}
.ingredient-item:last-child {
border-bottom: none;
}
.ingredient-amount {
font-weight: 600;
min-width: 50px;
}
.ingredient-unit {
color: var(--secondary);
min-width: 40px;
}
.output-info {
margin-top: 20px;
padding: 15px;
background: var(--theme);
border: 1px solid var(--border);
border-radius: 4px;
}
.output-item {
margin-bottom: 8px;
}
.output-item:last-child {
margin-bottom: 0;
}
.nutritional-info {
margin: 0 0 20px 0;
padding: 15px;
background: var(--code-bg);
border-radius: 8px;
}
.nutritional-info h4 {
margin: 0 0 15px 0;
font-size: 16px;
color: var(--primary);
}
.nutritional-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
}
@media (min-width: 600px) {
.nutritional-grid {
grid-template-columns: repeat(4, 1fr);
}
}
.nutritional-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 10px;
background: var(--code-bg);
border-radius: 6px;
text-align: center;
}
.nutritional-label {
font-size: 12px;
color: var(--secondary);
margin-bottom: 4px;
}
.nutritional-value {
font-size: 16px;
font-weight: 600;
color: var(--primary);
}
.btn-print {
padding: 8px 16px;
background: var(--primary);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
margin-left: 10px;
transition: background 0.2s ease;
}
.btn-print:hover {
background: var(--secondary);
}
.btn-print:disabled {
background: #ccc;
cursor: not-allowed;
}
&lt;/style&gt;
&lt;script&gt;
class NimbotPrinter {
constructor() {
this.device = null;
this.server = null;
this.service = null;
this.characteristic = null;
this.isConnected = false;
}
async connect() {
try {
this.device = await navigator.bluetooth.requestDevice({
filters: [
{ namePrefix: 'NIIMBOT' },
{ namePrefix: 'D11' },
{ namePrefix: 'B21' },
{ namePrefix: 'B1' }
],
optionalServices: ['49535343-fe7d-4ae5-8fa9-9fafd205e455']
});
this.server = await this.device.gatt.connect();
this.service = await this.server.getPrimaryService('49535343-fe7d-4ae5-8fa9-9fafd205e455');
this.characteristic = await this.service.getCharacteristic('49535343-8841-43f4-a8d4-ecbe34729bb3');
this.isConnected = true;
return true;
} catch (error) {
throw error;
}
}
disconnect() {
if (this.device &amp;&amp; this.device.gatt.connected) {
this.device.gatt.disconnect();
}
this.isConnected = false;
}
async printText(text) {
if (!this.isConnected) throw new Error('Принтер не подключен');
const encoder = new TextEncoder();
const data = encoder.encode(text + '\n\n');
const chunkSize = 20;
for (let i = 0; i &lt; data.length; i += chunkSize) {
const chunk = data.slice(i, i + chunkSize);
await this.characteristic.writeValue(chunk);
await new Promise(resolve =&gt; setTimeout(resolve, 10));
}
}
static isSupported() {
return 'bluetooth' in navigator;
}
}
const originalServings = 10 ;
document.addEventListener('DOMContentLoaded', function() {
recalculate();
});
function recalculate() {
const newServings = document.getElementById('servings').value;
const ratio = newServings / originalServings;
let totalWeight = 0;
document.querySelectorAll('.ingredient-amount').forEach(el =&gt; {
const original = parseFloat(el.dataset.original);
if (!isNaN(original)) {
const newAmount = original * ratio;
totalWeight += newAmount;
if (newAmount &lt; 10) {
el.textContent = (Math.round(newAmount * 10) / 10).toString().replace('.', ',');
} else {
el.textContent = Math.round(newAmount);
}
}
});
document.querySelectorAll('.dynamic-amount').forEach(el =&gt; {
const original = parseFloat(el.dataset.original);
const showUnit = el.dataset.showUnit === 'true';
const unit = el.dataset.unit || '';
const addText = el.dataset.addText || '';
if (!isNaN(original)) {
const newAmount = original * ratio;
let displayText = '';
if (newAmount &lt; 10) {
displayText = (Math.round(newAmount * 10) / 10).toString().replace('.', ',');
} else {
displayText = Math.round(newAmount).toString();
}
if (showUnit &amp;&amp; unit) {
displayText += ' ' + unit;
}
if (addText) {
displayText += ' ' + addText;
}
el.textContent = displayText;
}
});
const totalWeightEl = document.getElementById('totalWeight');
if (totalWeightEl) {
totalWeightEl.textContent = Math.round(totalWeight);
}
const yieldWeightEl = document.getElementById('yieldWeight');
if (yieldWeightEl) {
const yieldRatio = parseFloat(yieldWeightEl.dataset.yieldRatio) || 1.0;
const newYield = totalWeight * yieldRatio;
yieldWeightEl.textContent = Math.round(newYield);
}
}
function changeServings(delta) {
const input = document.getElementById('servings');
input.value = Math.max(1, parseInt(input.value) + delta);
recalculate();
}
async function printIngredients() {
const printBtn = document.querySelector('.btn-print');
printBtn.disabled = true;
printBtn.textContent = '⏳ Подготовка...';
try {
if (!NimbotPrinter.isSupported()) {
throw new Error('Web Bluetooth API не поддерживается браузером');
}
const recipeTitle = document.querySelector('h1')?.textContent || 'Рецепт';
const servings = document.getElementById('servings').value;
const ingredients = collectIngredients();
const totalWeight = document.getElementById('totalWeight')?.textContent || '0';
const yieldWeight = document.getElementById('yieldWeight')?.textContent || '0';
const printText = formatIngredientsForPrint(recipeTitle, servings, ingredients, totalWeight, yieldWeight);
const printer = new NimbotPrinter();
try {
printBtn.textContent = '📡 Поиск принтера...';
await printer.connect();
printBtn.textContent = '🖨️ Печать...';
await printer.printText(printText, { fontSize: 12, alignment: 'left' });
printer.disconnect();
printBtn.textContent = '✅ Напечатано';
setTimeout(() =&gt; {
printBtn.textContent = '🖨️ Печать состава';
printBtn.disabled = false;
}, 2000);
} catch (printerError) {
console.warn('Реальная печать не удалась:', printerError);
printBtn.textContent = '📄 Предпросмотр';
showPrintDialog(printText);
setTimeout(() =&gt; {
printBtn.textContent = '🖨️ Печать состава';
printBtn.disabled = false;
}, 1000);
}
} catch (error) {
console.error('Ошибка печати:', error);
alert('Не удалось напечатать: ' + error.message);
printBtn.textContent = '🖨️ Печать состава';
printBtn.disabled = false;
}
}
function collectIngredients() {
const ingredients = [];
document.querySelectorAll('.ingredient-item').forEach(item =&gt; {
const amount = item.querySelector('.ingredient-amount')?.textContent;
const unit = item.querySelector('.ingredient-unit')?.textContent;
const name = item.querySelector('.ingredient-name')?.textContent;
if (amount &amp;&amp; name) {
ingredients.push({ amount, unit: unit || '', name });
}
});
return ingredients;
}
function formatIngredientsForPrint(title, servings, ingredients, totalWeight, yieldWeight) {
let text = `${title}\n`;
text += `Порций: ${servings}\n`;
text += '─'.repeat(20) + '\n';
ingredients.forEach(ing =&gt; {
text += `${ing.amount} ${ing.unit} ${ing.name}\n`;
});
text += '─'.repeat(20) + '\n';
text += `Общий вес: ${totalWeight}г\n`;
text += `Готового: ${yieldWeight}г\n`;
return text;
}
async function simulatePrint(text) {
return new Promise(resolve =&gt; setTimeout(resolve, 1500));
}
function showPrintDialog(text) {
const modal = document.createElement('div');
modal.style.cssText = `
position: fixed; top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0,0,0,0.8); display: flex; align-items: center;
justify-content: center; z-index: 1000;
`;
const dialog = document.createElement('div');
dialog.style.cssText = `
background: white; padding: 20px; border-radius: 8px;
max-width: 400px; font-family: monospace; line-height: 1.4;
`;
dialog.innerHTML = `
&lt;h3&gt;Предпросмотр печати&lt;/h3&gt;
&lt;pre style="white-space: pre-wrap; background: #f5f5f5; padding: 10px; border-radius: 4px;"&gt;${text}&lt;/pre&gt;
&lt;button onclick="this.parentElement.parentElement.remove()" style="
background: var(--primary); color: white; border: none;
padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px;
"&gt;Закрыть&lt;/button&gt;
`;
modal.appendChild(dialog);
document.body.appendChild(modal);
}
&lt;/script&gt;
&lt;h2 id="технология-приготовления"&gt;Технология приготовления&lt;/h2&gt;
&lt;h3 id="этап-1-подготовка-овощной-основы"&gt;Этап 1: Подготовка овощной основы&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Время:&lt;/strong&gt; 17 минут
&lt;strong&gt;Температура:&lt;/strong&gt; 180-190°C на поверхности сковороды&lt;/p&gt;</description></item></channel></rss>