Тихое цифровое пространство для моих стихов, слов и всего того, что хочется читать с чувствами.
Санина писанина — маленький веб-сайт для публикации и чтения стихотворений, созданный на React. Проект сочетает минималистичный редакционный стиль, типографику и полноценную систему управления контентом с авторизацией в Firebase.
Главная идея проекта проста:
интерфейс должен исчезать, чтобы текст оставался главным.
Санина писанина — это небольшой литературный веб-проект, предназначенный для публикации моих стихотворений и их комфортного чтения.
Читатель может открыть главную страницу, просматривать коллекцию произведений и переходить к отдельным стихотворениям.
Для автора предусмотрена отдельная административная часть, позволяющая управлять публикациями без необходимости вручную изменять исходный код.
- 📖 удобный интерфейс для чтения стихотворений
- 🔐 авторизация администратора
- ➕ добавление новых стихотворений
- ✏️ редактирование существующих
- 🗑️ удаление публикаций
- 🛡️ защищённые административные маршруты
- 🚫 страница 404
- 📱 адаптивный интерфейс
- 🔥 интеграция с Firebase
- ⚡ быстрая разработка и сборка через Vite
- 🧭 маршрутизация через React Router
Проект развёрнут на Vercel.
https://github.com/sunmeat/poetry-blog
| Технология | Назначение |
|---|---|
| ⚛️ React | Создание пользовательского интерфейса |
| 🧭 React Router | Клиентская маршрутизация |
| 🔥 Firebase | Авторизация и хранение данных |
| ⚡ Vite | Разработка и production-сборка |
| 🟨 JavaScript / JSX | Основная логика приложения |
| 🎨 CSS | Стилизация и адаптивность |
| ☁️ Vercel | Развёртывание приложения |
Проект организован вокруг страниц и переиспользуемых компонентов.
Упрощённая структура:
src/
├── components/
│ ├── Header/
│ ├── Footer/
│ └── ProtectedRoute/
│
├── pages/
│ ├── Home/
│ ├── PoemPage/
│ ├── Admin/
│ │ ├── AdminLogin
│ │ ├── AdminDashboard
│ │ └── PoemForm
│ └── NotFound/
│
├── App.jsx
└── ...
Общие элементы интерфейса — например, шапка, подвал и защита административных маршрутов — вынесены в отдельные компоненты.
| Маршрут | Назначение | Доступ |
|---|---|---|
/ |
Главная страница и коллекция стихотворений | 🌍 Все |
/poem/:id |
Страница отдельного стихотворения | 🌍 Все |
/admin |
Вход администратора | 🌍 Все |
/admin/dashboard |
Панель управления | 🔐 Администратор |
/admin/new |
Создание стихотворения | 🔐 Администратор |
/admin/edit/:id |
Редактирование стихотворения | 🔐 Администратор |
* |
Страница 404 | 🌍 Все |
Административные страницы защищены специальным компонентом ProtectedRoute.
В проекте реализована небольшая CMS для управления стихотворениями.
После авторизации администратор получает возможность управлять коллекцией:
Создать
↓
Опубликовать
↓
Просмотреть
↓
Изменить
↓
Обновить
↓
Удалить
Это позволяет полностью отделить управление содержимым от публичной части сайта.
- страницу авторизации
- панель управления
- создание стихотворения
- редактирование стихотворения
- удаление публикаций
- защищённые маршруты
- переходы между административными страницами
Firebase используется в качестве backend-сервиса приложения.
В репозитории предусмотрены:
.env.example
firestore.rules
Конфигурация Firebase должна передаваться через переменные окружения.
Создайте локальный файл .env на основе примера:
cp .env.example .envПосле этого заполните необходимые параметры Firebase.
⚠️ Никогда не добавляйте настоящий.envс секретами в Git-репозиторий.
Перед началом убедитесь, что у вас установлены:
- Node.js
- npm
- проект Firebase, если требуется полноценная работа с базой данных и авторизацией
git clone https://github.com/sunmeat/poetry-blog.git
cd poetry-blognpm installcp .env.example .envЗаполните .env своими параметрами Firebase.
npm run devПосле запуска Vite предоставит локальный адрес приложения.
npm run buildnpm run previewnpm run lintЗапускает локальный сервер разработки Vite.
Создаёт оптимизированную production-версию приложения.
Запускает локальный сервер для просмотра production-сборки.
Проверяет исходный код с помощью ESLint.
Проект специально не выглядит как обычная CRUD-система.
Здесь нет ощущения:
«Перед вами очередная админка с карточками, кнопками и таблицами».
Вместо этого дизайн строится вокруг литературного восприятия:
пространство · типографика · ритм · тишина
Главная цель — создать ощущение цифрового литературного журнала, а не стандартного веб-приложения.
- Текст — главный элемент
- Типографика создаёт настроение
- Навигация остаётся незаметной
- Интерфейс не конкурирует с содержанием
- Административная часть находится за кулисами
- Адаптивность является частью дизайна, а не дополнительной функцией
React позволяет разделить приложение на независимые и переиспользуемые компоненты.
Например:
Header
Footer
ProtectedRoute
│
├── Главная
├── Стихотворение
└── Административная часть
Такой подход упрощает дальнейшее развитие проекта и позволяет добавлять новые возможности без превращения приложения в монолитный компонент.
Упрощённая структура репозитория:
poetry-blog/
│
├── public/
│
├── src/
│ ├── components/
│ │ ├── Footer/
│ │ ├── Header/
│ │ └── ProtectedRoute/
│ │
│ ├── pages/
│ │ ├── Admin/
│ │ ├── Home/
│ │ ├── NotFound/
│ │ └── PoemPage/
│ │
│ └── App.jsx
│
├── .env.example
├── .gitignore
├── firestore.rules
├── index.html
├── package.json
├── package-lock.json
├── vercel.json
└── vite.config.js
Проект подготовлен для развёртывания на Vercel.
При развёртывании собственной копии необходимо добавить необходимые переменные окружения в настройках проекта Vercel.
Проект использует клиентское React-приложение и Firebase.
Рекомендуется соблюдать следующие правила:
- не коммитить
.env - не публиковать приватные ключи и секреты
- хранить правила Firestore в репозитории
- защищать административные маршруты
- не считать клиентскую защиту маршрутов единственным механизмом безопасности
- реальные права доступа обязательно контролировать через правила Firebase
Идеи для дальнейшего развития проекта:
- 🔎 поиск по стихотворениям
- 🏷️ категории и теги
- 👤 страницы других авторов
- 📝 черновики
- 📅 даты публикаций
- ✍️ полноценный Markdown / Rich Text редактор
- 📖 информация о времени чтения
- 🔗 социальные ссылки
- 🌐 Open Graph-разметка
- 🚀 улучшение SEO
- 🗺️ генерация sitemap
- 📡 RSS-лента
- 🌙 дополнительные режимы чтения
- ⌨️ навигация с клавиатуры
- 🧪 автоматические тесты
- ⚙️ CI/CD
Для визуальной презентации проекта можно добавить скриншоты в отдельную директорию:
docs/
└── screenshots/
├── home.png
├── poem.png
├── admin-login.png
└── dashboard.png
После этого изображения можно разместить прямо в README:
Если вы хотите внести изменения в проект:
git checkout -b feature/my-improvementПосле внесения изменений рекомендуется проверить проект:
npm run lint
npm run buildЗатем:
git add .
git commit -m "feat: улучшение интерфейса"
git push origin feature/my-improvementПосле этого можно создать Pull Request.
Исходный код в этом репозитории распространяется под лицензией MIT.
Стихи, тексты и другой авторский контент, опубликованный на сайте (включая данные, хранящиеся в Firestore), являются © автора и не подпадают под действие лицензии MIT — все права на контент защищены, если не указано иное.
@sunmeat
Разработчик программного обеспечения и преподаватель.
- GitHub: https://github.com/sunmeat
- Репозиторий: https://github.com/sunmeat/poetry-blog
- Сайт: https://pisanina.vercel.app/
React · Firebase · Vite · Vercel
Сделано с любовью к коду и ещё большей любовью к рифме и ритму.
Некоторые вещи созданы для того, чтобы их читали медленно.