Разбор · Сайт кондитерской · Самара
«ТОРТ по любви»
Сайт свадебных тортов на заказ для кондитерской из Самары. Человек смотрит работы, начинки и цены и оставляет заявку на торт или дегустацию — заявка сохраняется на хостинге и приходит в Telegram.
- Клиент
- Кондитерская «ТОРТ по любви», Самара
- Сроки
- 22 августа — 16 сентября 2026,
37 коммитов - Стек
- HTML, CSS, JS без сборщика · PHP · Telegram Bot API · GitHub Actions
Первый экран, ширина 1440px.
Телефон, 393px.
Заявка на телефоне.
01
Для кого и зачем
Кондитер печёт свадебные торты по индивидуальному эскизу. Сайту нужно показать настоящие работы и начинки, прямо назвать цены и довести человека до заявки — с датой свадьбы, местом, числом гостей, начинкой и фото-референсами, чтобы всё это не приходилось выспрашивать в переписке.
В сентябре появилось ещё одно требование: персональные данные клиентов должны храниться в России. Поэтому сайт переехал с GitHub Pages на домен asiyatort.ru и российский хостинг, а заявки стал принимать собственный обработчик на PHP.
02
Что сделано
- Первый экран«Торт, который стоит увидеть прежде, чем съесть», кнопки «Заказать торт» и «Записаться на дегустацию»
- Знакомство с кондитеромистория мастера её словами и портрет
- Кредокороткое обещание про свадебный торт как финал торжества
- Наши работынастоящие торты вместо шаблонных карточек
- Как проходит заказчетыре шага от первого сообщения до торта на площадке, эскиз входит в стоимость
- Начинкисемь вкусов
- Ценыторты по весу с учётом декора, дегустация и доставка, кнопки «В корзину»
- Торты на годовщинуотдельное предложение не только к свадьбе
- Заявкавкладки «Заказать торт», «Дегустация» и «Доставка»
- Отзывы и галереякадры со свадеб и отзывы в одной кладке
- ВёрсткаHTML, CSS и JS без сборщика. Цвета и шрифты — в одном файле токенов (tokens.css): Cormorant Garamond, Jost и рукописный Marck Script для «по любви».
- ЗаявкиДве формы — на торт и на дегустацию — с фото-референсами и скрытым полем-ловушкой от спама. Обработчик на хостинге пересылает их в Telegram.
- Отдельные страницыОформление заказа из корзины, публичная оферта и политика обработки персональных данных.
- ПоискЦены в статичном HTML, разметка schema.org (Bakery, OfferCatalog, WebSite), robots.txt, sitemap.xml, canonical и og-теги; сайт подтверждён в Яндекс Вебмастере.
03
Решения, на которые стоит посмотреть
-
Заявка не теряется, даже если Telegram не ответил
Заявка сначала записывается и только потом отправляется в Telegram. Если отправка сорвалась, имя и телефон клиента уже сохранены, а следующая заявка заодно пробует дослать недоставленные. Ответ сайта различает три исхода: доставлено; не доставлено, но сохранено; не сохранено — и только в последнем случае человеку предлагается запасной путь через сообщество ВКонтакте.
Сначала это делал воркер Cloudflare. После переезда на российский хостинг ту же схему повторяет обработчик на PHP: запись на диск, потом Telegram, потом досылка.
-
От онлайн-оплаты отказались в пользу заявки
Сначала на сайте были корзина и оплата по схеме ЮKassa в демо-режиме. Сумму считал сервер по своему каталогу, а браузер передавал только товары и количество — подменить цену в запросе было нельзя.
Потом от оплаты на сайте отказались: расчёт идёт переводом на карту или наличными. Кнопка «Оплатить» и клиентский код платежа убраны, корзина теперь отправляет обычную заявку тем же путём, что и формы на главной, а e-mail перестал быть обязательным — он был нужен только для чека.
-
Мобильная вёрстка: поломки, которых не видно на компьютере
Блоки вылезали за правый край на 32px на всех ширинах: при выносе токенов в отдельный файл пропал общий сброс box-sizing, а overflow-x: clip прятал вылет так, что проверка «есть ли горизонтальная прокрутка» молчала. Нашлось по скриншоту — переключатель форм был обрезан справа.
Там же: текст в полях ввода поднят с 15,5 до 16px, потому что на меньшем размере iOS Safari увеличивает страницу при фокусе. У кнопок, вкладок и ссылок в подвале появилась минимальная зона нажатия 44px.
-
Галочка согласия не ставилась на ширине 393px
Форма молча не отправлялась: галочка согласия не вставала. Причина — прошлая правка зон нажатия. Ссылка на политику стояла внутри подписи, её зона была раздута до 30px при высоте строки 17px и наезжала на соседние строки — Chromium притягивал касание к ссылке. На 360 и 375px всё работало, это зависело от переноса строк.
Ссылку вынесли из предложения на отдельную строку со своей зоной 44px, подпись целиком принадлежит галочке. Проверено касаниями в шесть точек подписи на каждой ширине.
-
Редактор сайта — в том же Telegram-боте
Бот, который приносит заявки, умеет менять содержимое сайта через меню на кнопках: 40 текстовых полей, 6 ссылок и 14 мест под фото — контакты, названия и цены, отзывы, подписи разделов. Доступ только у владельца.
Исходные тексты остаются в HTML, бот хранит только правки поверх них, и страница подставляет их при загрузке. Поэтому недоступный сервер не оставляет пустых мест, а поисковики видят настоящий текст. После переезда правки по-прежнему хранятся на прежнем сервере, но данные из форм туда больше не уходят.
-
Фотографии со свадеб: из 19,1 МБ в 2,4 МБ
Четырнадцать исходных снимков весили 19,1 МБ, один PNG — 5,8 МБ. Скрипт на PowerShell готовит из каждого две копии: 800px для плиток и 1600px для просмотра во весь экран, разворачивает кадры по EXIF и записывает размеры в манифест. В сетку браузер по srcset берёт только лёгкие копии, а width и height заранее резервируют место — плитки не прыгают при загрузке.
-
Переезд на свой домен и выкладка без ручной загрузки
Сайт переехал на asiyatort.ru и хостинг REG.RU. После пуша в main GitHub Actions выкладывает файлы по FTPS — пароль не идёт открытым текстом, доступы лежат в секретах репозитория, а сама выкладка включается переменной DEPLOY_ENABLED. Исходники прежнего сервера, служебные скрипты и демо-оплата на хостинг не попадают.
После переезда нашлась ещё одна деталь: PHP видит несколько файлов только под именем refs[], а форма отправляла refs, и фото-референсы не доходили. Теперь обработчик понимает оба варианта и отмечает в заявке фото, которые не загрузились.
04
Как проверить
- Пройти путь от первого экрана до заявки asiyatort.ru ↗
- Посмотреть формы и вкладки заявки раздел «Начнём» ↗
- Оферта и политика обработки персональных данных политика ↗
- Все решения с объяснениями — в описаниях коммитов история ↗
Связь со мной