Сайты

Сайт-визитка за вечер

Next.js + Cursor Agent: лендинг с формой и деплоем.

Вернуться в примеры

Визитка — одна страница: кто вы, чем занимаетесь и куда написать. Для первого вечера в Cursor этого хватает. Файлов мало, ошибка видна в браузере, и не нужно придумывать базу, роли и оплату.

Ниже маршрут, которым собирается такая страница с агентом: узкий первый запрос, проверка diff, потом одна правка формы. Готовый вид — на скрине. Имя на макете вымышленное, его меняете на своё.

Макет визитки в браузере

Что лежит на странице

Герой: род занятий, имя и одно предложение. Под ним три коротких факта, не абзац «о компании». Дальше форма: имя, почта, сообщение и кнопка. Пока нет своего сервера, отправка пишет данные в консоль браузера. Так видно, что поля доезжают, и почта не уходит в чужой CRM.

Счётчики, чаты и виджеты «оставьте заявку» на этом шаге не ставьте. Их легко добавить позже, когда страница уже открывается локально и вы сами понимаете, какой скрипт подключили.

Папка и первый запрос

Новый проект — пустая папка, не домашний каталог и не рабочий стол. В Cursor откройте её через File → Open Folder. Если открыть всё сразу, агент начнёт читать чужие файлы и править не тот проект.

Первое сообщение должно помещаться в один экран. Рабочий текст такой:

Первый запрос агенту

Плохой вариант короче, но хуже: «сделай сайт-агентство с админкой и блогом». Агент раздует структуру, а diff вы не успеете прочитать.

После ответа откройте localhost сами. Фразу «я проверил» не считайте проверкой. Если страница белая — вставьте агенту текст ошибки из терминала, а не «не работает».

Как выглядит код главной

Один файл app/page.tsx и один app/globals.css. Герой и список фактов живут в разметке. Форма — рядом отдельным компонентом, чтобы следующий запрос не переписывал всю страницу.

Код главной страницы

На что смотреть в diff, прежде чем оставить правку:

  • в layout нет аналитики, пикселей и чужих скриптов;
  • стили не разъехались по пяти CSS-модулям;
  • тексты на русском, если вы просили русский;
  • у кнопки формы type="submit", это не просто div.

В следующем сообщении файлы указывайте через @: @app/page.tsx и @app/globals.css. Тогда агент не создаст второй page где-нибудь в src.

Форма: проверка почты

Вторая задача — одна. Не «улучши дизайн и добавь SEO». Текст: «в форме проверь email, ошибку покажи под полем, данные пока только в console.log».

Проверка почты в форме

includes("@") — учебная проверка, не замена нормальному разбору адреса. Для визитки её достаточно: пустое поле и слово без собаки не попадают в консоль. Сообщение об ошибке — обычный абзац под полем, не alert.

Когда это стабильно, console.log можно заменить на свой route app/api/contact/route.ts, который дописывает строку в файл на сервере. Чужой бот и таблицу на этом шаге не подключайте: токен окажется в чате агента.

Если агент уехал в сторону

Откатите лишнее и сузьте задачу. Рабочие формулировки:

  • «верни форму в app/page.tsx, отдельный пакет для валидации не ставь»;
  • «не добавляй базу и Prisma»;
  • «кнопка под полями, ошибка — текст под полем, не модальное окно».

Если на такую правку diff больше пары файлов — не принимайте пачкой. Оставьте то, что просили, остальное отклоните.

Какие файлы нормальны

После первого запроса достаточно package.json, app/layout.tsx, app/page.tsx, app/globals.css и компонента формы. node_modules появится сам после npm install. Не оставляйте второй фреймворк, Storybook и папку pages, если просили App Router.

Имя, факты и подпись кнопки меняйте сами или отдельным запросом: «замени имя и три факта, вёрстку не трогай». Так агент не перепишет форму заодно.

Сборка и выкладка

Страница должна открываться локально и после обновления браузера. Затем в терминале проекта: npm run build.

Зелёная сборка — повод выкладывать, не раньше. На VPS маршрут тот же, что в гайде деплой Next.js на Beget: процесс, nginx, сертификат. В rules заранее запишите запрет на аналитику и чужие ключи — коротко, как в правилах и агентах.

Если Cursor ещё не стоит, начните с как начать работу, а визитку откройте следующим вечером.

Мы используем файлы cookie для того, чтобы предоставить пользователям больше возможностей при посещении сайта. Оставаясь на сайте, Вы соглашаетесь на обработку файлов cookie. Подробнее об условиях использования.