Поле - рецепты

Поле - рецепты

Поле, открытый исходный код

Контент InstantCMS 2.X

Поле «Рецепты» — это комплексное решение для публикации кулинарных рецептов на вашем сайте. Оно позволяет создавать подробные инструкции с пошаговыми описаниями, списками ингредиентов с возможностью настройки порций, таймером и расчетом пищевой ценности. Автоматически формирует удобный для чтения и печати макет. Поддерживает загрузку изображений для каждого шага, добавление советов и заметок. Идеально подходит для кулинарных блогов, сайтов о еде или любого проекта, где нужно красиво и структурированно представлять рецепты. Поле легко настраивается и органично встраивается в существующие материалы InstantCMS.

0
Radu Radu 19 дней назад #

На демо сайте, по демоданным не могу авторизоваться. Можно ли переделать поле под другое… инструкции например?

+1
Pechora.Dev 🐻 Pechora.Dev 🐻 19 дней назад #

Поясните пожалуйста. Переделать можно во что угодно. Для создания инструкций вполне подойдет мое другое поле — repeater

0
DeusSpa DeusSpa 7 дней назад #

Вроде как всё красиво, НО что значит галочка на ингредиенте? Что собственно она делает?

Вычеркивает инцидент или активирует типа у меня это есть?

Далее шаги с временем и таймер. Что собственно оно поможет?

Допустим почитал я и пошел готовить, я должен бегать и смотреть на таймер?

Может надо доработать!? 

Шаги: например краснеют если прошли в это время таймер даёт сигнал, что пора переходить к следующему шагу. При это на экране должен быть виден таймер и шаг который сейчас активен. То есть своего рода двигаться по шагам.

Таймер: Должен издавать звуки шага приготовления, издавать звук окончания приготовления как делает это духовка, что пора доставать своё искусство кулинарии. Имхо

Идеально для современного — озвучить шаги голосом «Пора переходить к шагу 2» 

0
Pechora.Dev 🐻 Pechora.Dev 🐻 5 дней назад #

Поле делалось по аналогии с известным кулинарным сайтом. У них так. И здесь так. Увы, это не мобильное приложение, чтобы сделать все то, о чем вы сделали замечания. 

0
DeusSpa DeusSpa 5 дней назад #

1) Галочкам дать понятие — что всё таки оно означает вычёркивание. Думаю это не сложно. (на данный момент галочка а что делает...)

2) Почему же нельзя, не обязательно мобильное приложение. Всё делает на JS спокойно

0
DeusSpa DeusSpa 5 дней назад #

И так пошагово:

Расширить существующее 

  1. const recipe = {
  2. steps: [
  3. {
  4. description: 'Нарезать овощи',
  5. duration: 180 // секунд
  6. },
  7. {
  8. description: 'Обжарить на сковороде',
  9. duration: 300
  10. }
  11. // ...другие шаги
  12. ],
  13. totalTime: 480 // общее время (сумма durations)
  14. };
  15.  

Интерфейс таймера (HTML + CSS):

дисплей текущего шага;
обратный отсчёт в формате мм: сс;
кнопки «Старт/Пауза», «Следующий шаг», «Сбросить»;
индикатор прогресса (полоска или круговой прогресс).

javascript

  1. class RecipeTimer {
  2. constructor(recipe) {
  3. this.recipe = recipe;
  4. this.currentStep = 0;
  5. this.timerId = null;
  6. this.isRunning = false;
  7. this.remainingTime = this.recipe.steps[0].duration;
  8. }
  9.  
  10. start() {
  11. if (this.isRunning) return;
  12. this.isRunning = true;
  13. this.updateDisplay();
  14. this.timerId = setInterval(() => {
  15. this.tick();
  16. }, 1000);
  17. }
  18.  
  19. pause() {
  20. clearInterval(this.timer Id);
  21. this.isRunning = false;
  22. }
  23.  
  24. nextStep() {
  25. this.pause();
  26. this.currentStep++;
  27. if (this.currentStep >= this.recipe.steps.length) {
  28. this.showCompletion();
  29. return;
  30. }
  31. this.remainingTime = this.recipe.steps[this.currentStep].duration;
  32. this.updateDisplay();
  33. }
  34.  
  35. tick() {
  36. if (this.remainingTime <= 0) {
  37. this.notifyStepEnd();
  38. this.nextStep();
  39. } else {
  40. this.remainingTime--;
  41. this.updateDisplay();
  42. }
  43. }
  44.  
  45. updateDisplay() {
  46. const minutes = Math.floor(this.remainingTime / 60);
  47. const seconds = this.remainingTime % 60;
  48. document.getElementById('timer').textContent =
  49. `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
  50.  
  51. document.getElementById('step-description').textContent =
  52. this.recipe.steps[this.currentStep].description;
  53. }
  54.  
  55. notifyStepEnd() {
  56. // Звуковое оповещение
  57. const audio = new Audio('/sound/beep.mp3');
  58. audio.play();
  59.  
  60. // Браузерное уведомление (если разрешено)
  61. if (Notification.permission === 'granted') {
  62. new Notification('Время следующего шага!');
  63. }
  64.  
  65. // Визуальный эффект
  66. document.body.classList.add('flash');
  67. setTimeout(() => {
  68. document.body.classList.remove('flash');
  69. }, 500);
  70. }
  71.  
  72. showCompletion() {
  73. alert('Рецепт готов!');
  74. this.reset();
  75. }
  76.  
  77. reset() {
  78. this.pause();
  79. this.currentStep = 0;
  80. this.remainingTime = this.recipe.steps[0].duration;
  81. this.updateDisplay();
  82. }
  83. }
  84.  

html

  1. <div class="recipe-player">
  2. <div id="step-description" class="step">Шаг 1: Нарезать овощи</div>
  3. <div id="timer" class="timer">03:00</div>
  4. <div class="controls">
  5. <button onclick="timer.start()">Старт</button>
  6. <button onclick="timer.pause()">Пауза</button>
  7. <button onclick="timer.nextStep()">Следующий шаг</button>
  8. <button onclick="timer.reset()">Сброс</button>
  9. </div>
  10. <div class="progress"></div>
  11. </div>
  12.  

css

  1. .flash {
  2. animation: flash 0.5s ease-in-out;
  3. }
  4.  
  5. @keyframes flash {
  6. 0% { background-color: #fff; }
  7. 50% { background-color: #ffeb3b; }
  8. 100% { background-color: #fff; }
  9. }
  10.  
  11. .timer {
  12. font-size: 2rem;
  13. font-weight: bold;
  14. margin: 1rem 0;
  15. }

Прогресс:

  1. updateProgress() {
  2. const total = this.recipe.totalTime;
  3. const elapsed = total - this.remainingTime;
  4. const percent = (elapsed / total) * 100;
  5. document.querySelector('.progress').style.width = `${percent}%`;
  6. }
  7.  

Инцилизация RecipeTimer при загрузке страницы:

  1. const timer = new RecipeTimer(recipeData);

как то так… тут можно по принципу прихода сообщения сделать как в чате звукового оповещения.

попробуйте

0
Pechora.Dev 🐻 Pechora.Dev 🐻 5 дней назад #

Обязательно попробую. Если Вы вдруг соберетесь его купить, то внесу соответствующий функционал по вашим пожеланиям. Сейчас к сожалению тем, кто покупал данную версию — необходимо лишь это. 

0
DeusSpa DeusSpa 5 дней назад #

Это ваше решение.

Внести изменения думаю для разработчика не составит труда.

Другие которые купили — Уверен будут рады данной функции — она улучшает весь процесс и не делает его просто книгой рецептов.

По поводу покупки — пока не знаю куда применить. Меня привлекло внимание, анализировал и подсказал. Реализовал.

+1
Pechora.Dev 🐻 Pechora.Dev 🐻 5 дней назад #

Внести изменения не составит труда, вы верно заметили. Но на данный момент реализация такова. Записал ваши предложения, возможно, если будет свободное время, внесу изменения. 

🍪Мы используем файлы cookie для работы сайта. Читать подробнее.