feat(imggen): генерация картинок ИИ (FLUX.1) — ассистент, флэшкарты, редактор уроков

Бэкенд /api/imggen (status/generate, CF Workers AI, cooldown+дневной лимит).
Переиспользуемый модал LS.imagePromptModal (js/imggen.js).
Квантик: режим «Нарисовать» в чате (inline).
Флэшкарты: кнопка «ИИ» в блоке картинки карточки.
Редактор уроков: кнопка «Сгенерировать» в блоке изображения.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-12 10:41:59 +03:00
parent db2fccef56
commit d6faf6b22c
8 changed files with 206 additions and 5 deletions
+16
View File
@@ -1004,6 +1004,7 @@
</div>
<script src="/js/api.js"></script>
<script src="/js/imggen.js"></script>
<script src="/js/sidebar.js"></script>
<script src="/js/svg-sanitize.js"></script>
<script src="/js/svg-draw.js"></script>
@@ -1602,6 +1603,9 @@
<button class="img-upload-btn" onclick="document.getElementById('img-file-${bid}').click()">
<i data-lucide="upload" style="width:14px;height:14px"></i> Загрузить файл
</button>
<button class="img-upload-btn" onclick="genBlockImage('${bid}')" title="Сгенерировать изображение с ИИ">
<i data-lucide="sparkles" style="width:14px;height:14px"></i> Сгенерировать
</button>
<span class="img-upload-progress" id="img-status-${bid}"></span>
</div>
<div class="block-row">
@@ -3033,6 +3037,18 @@
}
}
function genBlockImage(bid) {
if (!LS.imagePromptModal) { LS.toast('Модуль генерации не загружен'); return; }
LS.imagePromptModal({
title: 'Изображение для урока',
onUse: function (url) {
updateBlockData(bid, 'url', url);
rerenderBlock(bid);
markDirty();
}
});
}
/* ══════════════════════════════════════════════════════════════════
FEATURE: Code syntax highlighting
══════════════════════════════════════════════════════════════════ */