Compare commits

...
24 Commits
Author SHA1 Message Date
mirivlad b69a110b97 fix editor for short_story and chapters 2026-05-01 21:53:43 +03:00
mirivlad ce6fffaa57 many fixes in design and add shirt story type for creation book 2026-05-01 20:51:42 +03:00
mirivlad 9294399517 fix txt export (paragraph problems) 2025-12-06 22:29:20 +03:00
mirivlad 18a338c2ce fix delete chapter in chapter list 2025-12-06 22:09:22 +03:00
mirivlad 3af0f18d55 Merge branch 'main' of https://git.mirv.top/mirivlad/web_writer 2025-11-29 15:24:37 +03:00
mirivlad 7fd1fb20c4 add fullscreen for editor 2025-11-29 15:24:11 +03:00
mirivlad 15ab9d1947 fix 2025-11-28 17:20:33 +08:00
mirivlad 5da459132b fix 2025-11-28 17:10:23 +08:00
mirivlad 6738576501 fix2 2025-11-28 17:08:10 +08:00
mirivlad 35ca6223cb fix 2025-11-28 17:07:08 +08:00
mirivlad b9d3426213 Add screenshots 2025-11-28 17:02:59 +08:00
mirivlad c4eae6b45f fix Readme 2025-11-28 16:48:35 +08:00
mirivlad de4d5ac595 Clear unneeded bootsrap themes files. Change Readme 2025-11-28 16:47:47 +08:00
mirivlad cd382c5c7b Add pagination in users administration. 2025-11-28 04:09:35 +08:00
mirivlad 70b75f8426 Add sorting for chapters in book. 2025-11-28 03:47:39 +08:00
mirivlad e1a5403936 fix formatting and add buttons for formating dialogs in selected text 2025-11-28 03:36:46 +08:00
mirivlad 2aa9b37d4e Add autoformater for book dialogues 2025-11-28 02:32:24 +08:00
mirivlad b32c26cb04 Also one small fix for public view 2025-11-27 15:05:40 +08:00
mirivlad 3edfa05f46 Fix public view for book 2025-11-27 15:04:25 +08:00
mirivlad 37676a3ccb Change info for autosave 2025-11-27 14:52:01 +08:00
mirivlad 39cda7814f Change CSS framework from PicoCSS to Bootstrap 5.3 2025-11-27 14:46:51 +08:00
mirivlad e51768622f Fix public access to private book view 2025-11-27 09:27:40 +08:00
mirivlad d850f54666 remove trash files 2025-11-27 08:57:57 +08:00
mirivlad 07b69b7616 remove ckeditor 2025-11-27 08:54:22 +08:00
316 changed files with 4769 additions and 14481 deletions
+6
View File
@@ -0,0 +1,6 @@
*.log
.env
config/config.php
*.lock
uploads/*
vendor/composer
-7434
View File
File diff suppressed because one or more lines are too long
+79 -15
View File
@@ -8,34 +8,97 @@
## 🚀 Возможности
- **Книги и серии:** создавайте серии и добавляйте книги с главами.
- **Редактор книг:** Markdown, автосохранение текста, интерактивное содержание.
- **Книги и серии:** создавайте серии и добавляйте книги с главами.
- **Сортировка книг и глав:** сортируйте книги в сериях, и главы в книгах в том порядке в каком вам нравится.
- **Редактор книг:**
- WYSIWYG редактор Quill.js
- Автосохранение текста
- Автоматическое форматирование книжных диалогов.
- **Темы оформления:** выберите в настройке тему которая вам больше по душе.
- **Предпросмотр книг:**
- **Автор:** видит все черновики и опубликованные главы.
- **Публичный доступ:** только опубликованные главы по ссылке с `shared_token`.
- **Обложки и аватары:** добавляйте изображения к книгам и профилям.
- **Экспорт:** PDF, DOCX, HTML, TXT.
- **Интерактивное содержание** в просмотре и экспорте книг
- **Администрирование пользователей:**
- Управление аккаунтами, активация/деактивация.
- При удалении пользователя удаляются все его книги.
- **Публичные ссылки:** делитесь `shared_token` для просмотра опубликованных глав.
- **Публичные ссылки:**
- Делитесь книгой по `shared_token`. Хотите чтобы её никто больше не увидел? Перегенерируйте токен!
- Давайте ссылку на свою страницу автора, где будет список опубликованных вами книг.
---
## ⚙️ Требования
## ✨ Скриншоты
**Панель управления и смена темы**
<a href="/mirivlad/web_writer/raw/branch/main/assets/images/screens/5.jpg" target="_blank"><img src="assets/images/screens/5.jpg" alt="Панель управления" height="200" /></a>
<a href="/mirivlad/web_writer/raw/branch/main/assets/images/screens/3.jpg" target="_blank"><img src="assets/images/screens/3.jpg" alt="Смена темы" height="200" /></a>
<a href="/mirivlad/web_writer/raw/branch/main/assets/images/screens/2.jpg" target="_blank"><img src="assets/images/screens/2.jpg" alt="Панель управления после смены темы" height="200" /></a>
**Редактор текста**
<a href="/mirivlad/web_writer/raw/branch/main/assets/images/screens/10.jpg" target="_blank"><img src="assets/images/screens/10.jpg" alt="Редактор текста Quill" height="200" /></a>
**Управление главами книги**
<a href="/mirivlad/web_writer/raw/branch/main/assets/images/screens/9.jpg" target="_blank"><img src="assets/images/screens/9.jpg" alt="Управление главами книги" height="200" /></a>
**Управление сериями книг**
<a href="/mirivlad/web_writer/raw/branch/main/assets/images/screens/6.jpg" target="_blank"><img src="assets/images/screens/6.jpg" alt="Управление сериями книг" height="200" /></a>
**Просмотр книги**
<a href="/mirivlad/web_writer/raw/branch/main/assets/images/screens/11.jpg" target="_blank"><img src="assets/images/screens/11.jpg" alt="Просмотр книги" height="200" /></a>
---
## ⚙️ Требования и используемые технологии
- **PHP:** 8.0 и выше
- **MySQL** с InnoDB и внешними ключами
- **PHP расширения:** `mbstring`, `json`, `PDO`
- Веб-сервер с правами на запись в папки `config/` и `uploads/`
- **Веб-сервер** (Nginx/Apache) с правами на запись в папки `config/` и `uploads/`
> Все библиотеки уже включены в `vendor/`. Composer не нужен.
- Самописный MVC на PHP + MySQL - максимальная простота и скорость
- Bootstrap5 и темы для него для UI
- Javascript - Quill.js (редактор текста), Sortable.js - для Drag'n'Drop сортировки. Стандартный bundle Bootstrap5. Всё остальное - самописный JS
- TCPDF и PhpWord - для экспорта книг
---
## 📁 Структура проекта
```
web_writer/
├── controllers/ # Контроллеры приложения
│ ├── AuthController.php
│ ├── BookController.php
│ ├── ChapterController.php
│ └── ...
├── models/ # Модели данных
│ ├── User.php
│ ├── Book.php
│ ├── Chapter.php
│ └── ...
├── views/ # Шаблоны представлений
├── assets/ # Статические файлы
│ ├── css/
│ ├── js/
│ └── bs # Темы для Bootstrap
├── uploads/ # Загружаемые файлы
│ ├── covers/ # Обложки книг
│ └── avatars/ # Аватары пользователей
├── vendor/ # Внешние библиотеки
├── config/ # Конфигурационные файлы
└── index.php # Точка входа
```
## 🛠 Установка
1. Скопируйте файлы на веб-сервер.
1. Скопируйте файлы на веб-сервер или склонируйте репозиторий.
2. Проверьте доступность папок `config/` и `uploads/` для записи.
3. Перейдите в браузере на `install.php` и следуйте шагам:
@@ -52,7 +115,7 @@
4. После успешной установки файл `config/config.php` будет сгенерирован автоматически.
5. Перейдите на главную страницу приложения (`index.php`) и войдите под админом.
6. **Не забудьте удалить или переместить файл install.php!!!**
6. **Не забудьте удалить или переместить файл install.php!!!** (не обязательно, но желательно)
---
@@ -61,10 +124,7 @@
Файл `config/config.php` содержит:
- Подключение к базе данных: `DB_HOST`, `DB_USER`, `DB_PASS`, `DB_NAME`
- Пути к файлам:
- `UPLOAD_PATH` — корневая папка загрузок
- `COVERS_PATH` / `COVERS_URL` — обложки книг
- `AVATARS_PATH` / `AVATARS_URL` — аватары пользователей
- Константы для системных путей
- Адрес сайта: `SITE_URL`
- Имя приложения: `APP_NAME` = "Web Writer"
@@ -72,11 +132,12 @@
## 🛠 Дальнейшее развитие
- Планирую вынести работу с сущностями (книги, главы, серии, пользователи) в контроллеры.
- Создать единую точку входа для приложения.
- Возможно, добавится поддержка комментариев для публичных книг и рейтинг. Но это не точно :)
---
## ❗ Поддержка
Все ошибки и предложения шлите в issue
@@ -85,4 +146,7 @@
## 📜 Лицензия
Приложение распространяется под лицензией [AGPLv3](https://www.gnu.org/licenses/agpl-3.0.html).
Приложение распространяется под лицензией [AGPLv3](https://www.gnu.org/licenses/agpl-3.0.html).
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+12
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,5 +1,5 @@
/*!
* Quill Editor v2.0.3
* Quill Editor v2.0.2
* https://quilljs.com
* Copyright (c) 2017-2024, Slab
* Copyright (c) 2014, Jason Chen
-41
View File
@@ -1,41 +0,0 @@
/* Увеличиваем специфичность для кнопок Quill */
.ql-toolbar .ql-picker-label,
.ql-toolbar button,
.ql-toolbar [role="button"] {
all: unset; /* Сбрасываем все стили Pico (background, border, padding и т.д.) */
display: inline-block; /* Восстанавливаем базовые стили Quill */
cursor: pointer;
padding: 0; /* Quill кнопки не имеют padding */
margin: 0;
border: none;
background: none;
color: inherit; /* Наследуем цвет от Quill */
font-size: inherit;
line-height: inherit;
text-decoration: none; /* Убираем подчёркивание, если это <a> */
}
/* Восстанавливаем hover/active стили Quill (если они сломались) */
.ql-toolbar button:hover,
.ql-toolbar [role="button"]:hover {
color: #06c; /* Пример из Quill snow theme; адаптируйте */
background: none; /* Без фона */
}
.ql-toolbar button.ql-active,
.ql-toolbar [role="button"].ql-active {
color: #06c;
background: none;
}
/* Для иконок (SVG в Quill) */
.ql-toolbar .ql-icon {
fill: currentColor; /* Убедимся, что иконки наследуют цвет */
}
/* Если Quill использует <span> для кнопок */
.ql-toolbar .ql-picker-item,
.ql-toolbar .ql-picker-options [role="button"] {
all: unset;
cursor: pointer;
}
+21 -880
View File
@@ -1,907 +1,48 @@
/* ===== БАЗОВЫЕ СТИЛИ ===== */
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
margin-bottom: 1rem;
color: var(--color);
font-weight: var(--font-weight);
font-size: var(--font-size);
font-family: var(--font-family);
}
article{
margin-top: 0em;
}
article > header {
margin-top: calc(var(--block-spacing-vertical) * -1);
margin-bottom: calc(var(--block-spacing-vertical)-1);
border-bottom: var(--border-width) solid var(--card-border-color);
border-top-right-radius: var(--border-radius);
border-top-left-radius: var(--border-radius);
padding-bottom: 0.5em;
}
article > footer {
margin-top: calc(var(--block-spacing-vertical)-1);
margin-bottom: calc(var(--block-spacing-vertical) * -1);
border-top: var(--border-width) solid var(--card-border-color);
border-bottom-right-radius: var(--border-radius);
border-bottom-left-radius: var(--border-radius);
padding-top: 0.5em;
}
/* Центрирование контейнера */
main.container {
margin: 1rem auto;
padding: 1rem 0;
max-width: 100%;
}
/* Центрируем основной контент */
.container {
width: 60%;
margin-right: 10rem;
margin-left: 10rem;
}
/* Для больших экранов - ограничиваем ширину */
@media (min-width: 768px) {
.container {
max-width: 1200px;
padding: 0 1rem;
}
}
/* ===== КОМПОНЕНТЫ ===== */
/* Уведомления */
.alert {
padding: 1rem;
margin: 1rem 0;
border-radius: 5px;
}
.alert-error {
background: #ffebee;
color: #c62828;
border: 1px solid #ffcdd2;
}
.alert-success {
background: #e8f5e8;
color: #2e7d32;
border: 1px solid #c8e6c9;
}
.alert-info {
background: #d1ecf1;
color: #0c5460;
border: 1px solid #bee5eb;
}
.alert-warning {
background: #fff3cd;
color: #856404;
border: 1px solid #ffeaa7;
}
/* Кнопки */
.button-group {
display: flex;
gap: 5px;
margin-bottom: 1rem;
}
.button-group button,
.button-group a[role="button"] {
flex: 1;
padding: 0.5rem;
height: 38px;
display: flex;
align-items: center;
justify-content: center;
text-decoration: none;
box-sizing: border-box;
}
.compact-button {
padding: 3px 8px;
font-size: 0.85rem;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 4px;
cursor: pointer;
height: 28px;
box-sizing: border-box;
line-height: 1;
}
.action-button {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.75rem 1.5rem;
font-size: 0.9rem;
text-decoration: none;
border-radius: 4px;
cursor: pointer;
height: 44px;
min-width: 140px;
white-space: nowrap;
transition: opacity 0.3s ease;
text-align: center;
}
/* Цвета кнопок */
.button-group .delete-btn,
.action-button.delete {
background: #ff4444;
border-color: #ff4444;
color: white;
}
.button-group .delete-btn:hover,
.action-button.delete:hover {
background: #dd3333;
border-color: #dd3333;
}
.green-btn {
background: #449944;
border-color: #449944;
color: white;
}
.green-btn:hover {
background: #44bb44;
border-color: #44bb44;
}
.primary-btn {
background: var(--primary);
border-color: var(--primary);
color: var(--primary-inverse);
}
.secondary-btn {
background: var(--secondary);
border-color: var(--secondary);
color: var(--secondary-inverse);
}
.red-btn {
background: #ff4444;
border-color: #ff4444;
color: white;
}
.red-btn:hover {
background: #dd3333;
border-color: #dd3333;
color: white;
}
/* ===== КНИГИ И КОНТЕНТ ===== */
.book-content {
line-height: 1.7;
font-family: Georgia, serif;
max-width: 100%;
}
.book-content h1 {
font-size: 2em;
margin: 2rem 0 1rem;
border-bottom: 2px solid #eee;
padding-bottom: 0.5rem;
}
.book-content h2 {
font-size: 1.6em;
margin: 1.5rem 0 1rem;
border-bottom: 1px solid #eee;
padding-bottom: 0.3rem;
}
.book-content h3 {
font-size: 1.3em;
margin: 1.2rem 0 0.8rem;
}
.book-content p {
margin-bottom: 1rem;
text-align: justify;
}
.book-content blockquote {
border-left: 4px solid #007bff;
padding-left: 1.5rem;
margin: 1rem 0;
color: #555;
font-style: italic;
background: #f8f9fa;
padding: 1rem;
border-radius: 0 5px 5px 0;
}
.book-content code {
background: #f5f5f5;
padding: 2px 6px;
border-radius: 3px;
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
font-size: 0.9em;
}
.book-content pre {
background: #2d2d2d;
color: #f8f8f2;
padding: 1rem;
border-radius: 5px;
overflow-x: auto;
}
.book-content pre code {
background: none;
padding: 0;
}
.book-content ul, .book-content ol {
margin-bottom: 1rem;
padding-left: 2rem;
}
.book-content table {
width: 100%;
border-collapse: collapse;
margin-bottom: 1rem;
}
.book-content th, .book-content td {
border: 1px solid #ddd;
padding: 10px 12px;
}
/* Центрируем таблицы в книжном контенте */
.book-content table {
margin-left: auto;
margin-right: auto;
}
/* ===== МЕДИА ===== */
.book-cover {
transition: transform 0.3s ease;
display: block;
margin: 0 auto;
}
.book-cover:hover {
transform: scale(1.05);
}
.cover-placeholder {
width: 120px;
height: 160px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 2rem;
margin: 0 auto 1rem;
}
.avatar-container {
text-align: center;
margin-bottom: 1.5rem;
}
.avatar {
width: 150px;
height: 150px;
border-radius: 50%;
border: 3px solid #007bff;
object-fit: cover;
display: block;
margin: 0 auto;
}
.avatar-placeholder {
width: 150px;
height: 150px;
border-radius: 50%;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 3rem;
margin: 0 auto;
}
/* Центрируем статистику */
.author-stats {
display: flex;
justify-content: center;
gap: 2rem;
flex-wrap: wrap;
margin: 1rem 0;
}
.stat-item {
text-align: center;
}
/* ===== QUILL РЕДАКТОР ===== */
.writer-editor-container {
margin: 10px 0;
width: 100%;
}
.writer-editor-container .ql-editor {
min-height: 400px;
font-family: 'Georgia', serif;
line-height: 1.6;
}
/* ===== DASHBOARD ===== */
.dashboard-buttons {
display: flex;
gap: 10px;
margin-top: 1rem;
justify-content: center;
}
.dashboard-button {
text-align: center;
padding: 0.75rem 0.5rem;
text-decoration: none;
border-radius: 4px;
font-size: 0.9rem;
/* Дополнительные стили для тем */
.theme-switcher {
transition: all 0.3s ease;
min-height: 44px;
display: flex;
align-items: center;
justify-content: center;
}
.dashboard-item {
transition: transform 0.2s ease, box-shadow 0.2s ease;
border: 1px solid #e0e0e0;
padding: 1rem;
text-align: center;
}
.dashboard-item:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
/* Центрируем welcome сообщение */
.welcome-message {
text-align: center;
padding: 3rem;
background: #f9f9f9;
border-radius: 8px;
margin: 2rem auto;
max-width: 800px;
}
.welcome-buttons {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
margin-top: 1.5rem;
}
/* ===== АДАПТИВНОСТЬ ===== */
@media (max-width: 768px) {
.container {
padding: 0 0.5rem;
}
.button-group {
flex-direction: column;
}
.dashboard-buttons {
flex-direction: column;
align-items: center;
}
.book-content {
font-size: 16px;
padding: 0 0.5rem;
}
.book-content h1 {
font-size: 1.6em;
}
.book-content h2 {
font-size: 1.4em;
}
.avatar, .avatar-placeholder {
width: 120px;
height: 120px;
}
.action-button {
min-width: 120px;
padding: 0.6rem 1rem;
}
.welcome-message {
padding: 2rem 1rem;
margin: 1rem 0.5rem;
}
}
@media (max-width: 480px) {
.book-content h1 {
font-size: 1.4em;
}
.avatar, .avatar-placeholder {
width: 100px;
height: 100px;
}
.action-button {
width: 100%;
min-width: auto;
}
.author-stats {
flex-direction: column;
gap: 1rem;
}
}
/* Стили для управления сериями */
.books-list {
border: 1px solid #e0e0e0;
border-radius: 4px;
background: #fafafa;
}
.book-item {
display: flex;
align-items: center;
padding: 12px;
border-bottom: 1px solid #e0e0e0;
background: white;
.theme-option {
transition: all 0.2s ease;
border-radius: 4px;
}
.book-item:last-child {
border-bottom: none;
}
.book-item:hover {
background: #f8f9fa;
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.book-item.sortable-ghost {
opacity: 0.6;
background: #e3f2fd;
}
.book-item.sortable-chosen {
background: #e3f2fd;
box-shadow: 0 4px 8px rgba(0,0,0,0.15);
}
.book-drag-handle {
padding: 0 12px;
color: #666;
font-size: 1.2rem;
cursor: move;
user-select: none;
}
.book-drag-handle:hover {
color: #007bff;
}
.book-info {
flex: 1;
padding: 0 12px;
}
.book-info strong {
display: block;
margin-bottom: 4px;
color: #333;
}
.book-info small {
color: #666;
font-size: 0.8rem;
}
.book-actions {
display: flex;
gap: 8px;
.theme-option:hover {
transform: translateX(5px);
}
/* Адаптивность для мобильных */
@media (max-width: 768px) {
.book-item {
flex-direction: column;
align-items: flex-start;
gap: 10px;
}
.book-drag-handle {
align-self: flex-start;
}
.book-actions {
align-self: stretch;
justify-content: space-between;
}
.book-actions .compact-button {
flex: 1;
text-align: center;
.theme-preview {
width: 16px;
height: 16px;
}
}
.series-grid {
display: grid;
gap: 1.5rem;
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
}
.series-card {
background: white;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 1.5rem;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.series-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0,0,0,0.1);
border-color: #007bff;
}
.series-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 4px;
height: 100%;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.series-header {
margin-bottom: 1rem;
}
.series-title {
font-size: 1.3rem;
font-weight: bold;
margin-bottom: 0.5rem;
color: #333;
}
.series-title a {
text-decoration: none;
color: inherit;
}
.series-title a:hover {
color: #007bff;
}
.series-meta {
color: #666;
font-size: 0.9rem;
}
.series-description {
color: #555;
line-height: 1.5;
margin-bottom: 1.5rem;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.series-stats-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.5rem;
margin-bottom: 1.5rem;
text-align: center;
}
.series-stat {
padding: 0.5rem;
}
.series-stat-number {
font-size: 1.4rem;
font-weight: bold;
color: #6f42c1;
display: block;
}
.series-stat-label {
font-size: 0.8rem;
color: #666;
display: block;
}
.series-actions {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
}
/* Пустое состояние */
.series-empty-state {
text-align: center;
padding: 3rem 2rem;
background: #f8f9fa;
border-radius: 8px;
border: 2px dashed #dee2e6;
}
.series-empty-icon {
font-size: 3rem;
margin-bottom: 1rem;
opacity: 0.5;
}
/* Адаптивность для серий */
/* editor styles */
@media (max-width: 768px) {
.series-grid {
grid-template-columns: 1fr;
.writer-editor-container .ql-container {
font-size: 16px !important; /* Предотвращает масштабирование в iOS */
}
.series-stats-grid {
grid-template-columns: repeat(3, 1fr);
.writer-editor-container .ql-toolbar {
padding: 8px !important;
}
.series-actions {
flex-direction: column;
}
.series-actions .compact-button {
width: 100%;
text-align: center;
.writer-editor-container .ql-toolbar .ql-formats {
margin-right: 8px !important;
}
}
@media (max-width: 480px) {
.series-card {
padding: 1rem;
}
.series-stats-grid {
grid-template-columns: 1fr;
gap: 0.25rem;
}
.series-stat {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.25rem 0;
}
.series-stat-number {
font-size: 1.1rem;
}
}
/* ===== СТИЛИ ДЛЯ СПИСКА КНИГ ===== */
.books-grid {
display: grid;
gap: 1.5rem;
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
}
.book-card {
background: white;
border: 1px solid #e0e0e0;
border-radius: 8px;
overflow: hidden;
/* Стили для полноэкранного режима */
.ql-toolbar.ql-snow {
transition: all 0.3s ease;
position: relative;
}
.book-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0,0,0,0.1);
border-color: #007bff;
}
.book-cover-container {
position: relative;
height: 200px;
overflow: hidden;
background: #f8f9fa;
}
.book-cover {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s ease;
}
.book-card:hover .book-cover {
transform: scale(1.05);
}
.cover-placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 3rem;
}
.book-status {
position: absolute;
top: 10px;
right: 10px;
background: rgba(255, 255, 255, 0.9);
border-radius: 50%;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.8rem;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
.book-status.published {
background: rgba(40, 167, 69, 0.9);
color: white;
}
.book-info {
padding: 1.5rem;
}
.book-title {
margin: 0 0 0.5rem 0;
font-size: 1.2rem;
line-height: 1.3;
}
.book-title a {
text-decoration: none;
color: inherit;
}
.book-title a:hover {
color: #007bff;
}
.book-genre {
margin: 0 0 0.5rem 0;
color: #666;
font-style: italic;
font-size: 0.9rem;
}
.book-description {
margin: 0 0 1rem 0;
color: #555;
line-height: 1.4;
font-size: 0.9rem;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.book-stats {
display: flex;
gap: 1rem;
margin-bottom: 1rem;
padding: 0.75rem;
background: #f8f9fa;
border-radius: 4px;
font-size: 0.85rem;
}
.stat-item {
text-align: center;
flex: 1;
}
.stat-item strong {
display: block;
font-size: 1.1rem;
color: #6f42c1;
}
.book-actions {
display:grid;
gap: 0.5rem;
flex-wrap: nowrap;
}
.book-actions .compact-button {
flex: 1;
min-width: 0;
text-align: center;
white-space: nowrap;
}
/* Пустое состояние */
.books-empty-state {
text-align: center;
padding: 3rem 2rem;
background: #f8f9fa;
border-radius: 8px;
border: 2px dashed #dee2e6;
}
.books-empty-icon {
font-size: 4rem;
margin-bottom: 1rem;
opacity: 0.5;
}
/* Футер со статистикой */
.books-stats-footer {
margin-top: 2rem;
padding: 1rem;
background: #f8f9fa;
border-radius: 5px;
text-align: center;
color: #666;
}
/* Адаптивность */
@media (max-width: 768px) {
.books-grid {
grid-template-columns: 1fr;
}
.book-stats {
flex-direction: column;
gap: 0.5rem;
}
.book-actions {
flex-direction: column;
}
.book-actions .compact-button {
width: 100%;
}
}
@media (max-width: 480px) {
.book-info {
padding: 1rem;
}
.book-cover-container {
height: 160px;
}
.cover-placeholder {
font-size: 2rem;
}
.writer-editor-container.fullscreen {
transition: all 0.3s ease;
}
.ql-editor p {
display: block !important;
text-indent: 2em;
}
-23
View File
@@ -1,23 +0,0 @@
# CKEditor 5 Sample Project
## Setup instructions
### 1. Fill the required information
Make sure to fill in the required information, as the editor requires a license to start. If you don't have an account, you can [create a free account](https://portal.ckeditor.com/checkout?plan=free) to access all premium features for a 14-day trial.
### 2. Run the web server
Run local HTTP server (like `nginx`, `caddy` or `serve`) that will serve the files that you created. It's required, as we are using type="module" in our scripts.
### 3. Start the project
Open `index.html`.
## Integrate with your project
The editor files are in two folders: `ckeditor5` and `ckeditor5-premium-features` (if you use premium features). You need to copy them to your project's assets, and then import with a similar way as the sample `index.html` does.
---
For more information, please refer to the official [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/getting-started/index.html).
@@ -1,55 +0,0 @@
Software License Agreement
==========================
**CKEditor&nbsp;5** (https://github.com/ckeditor/ckeditor5)<br>
Copyright (c) 2003–2025, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved.
Licensed under a dual-license model, this software is available under:
* the [GNU General Public License Version 2 or later](https://www.gnu.org/licenses/gpl.html) (see COPYING.GPL),
* or commercial license terms from CKSource Holding sp. z o.o.
For more information, see: [https://ckeditor.com/legal/ckeditor-licensing-options](https://ckeditor.com/legal/ckeditor-licensing-options).
If you are using CKEditor under commercial terms, you are free to remove the COPYING.GPL file with the full copy of a GPL license.
Sources of Intellectual Property Included in CKEditor
-----------------------------------------------------
Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission.
The following libraries are included in CKEditor under the [MIT license](https://opensource.org/licenses/MIT):
* @types/color-convert - Copyright (c) DefinitelyTyped.
* blurhash - Copyright (c) Wolt Enterprises.
* color-convert - Copyright (c) 2011–2016 Heather Arthur <fayearthur@gmail.com>, copyright (c) 2016–2021 Josh Junon <josh@junon.me>.
* color-parse - Copyright (c) 2015 Dmitry Ivanov.
* emojibase-data - Copyright (c) 2017-2019 Miles Johnson.
* es-toolkit - Copyright (c) 2024 Viva Republica, Inc.
* fuzzysort - Copyright (c) 2018 Stephen Kamenar.
* is-emoji-supported - Copyright (c) 2016-2020 Koala Interactive, Inc.
* vanilla-colorful - Copyright (c) 2020 Serhii Kulykov <iamkulykov@gmail.com>.
* Regular Expression for URL validation - Copyright (c) 2010-2018 Diego Perini.
* @types/hast - Copyright (c) Microsoft Corporation.
* hast-util-to-html - Copyright (c) Titus Wormer <tituswormer@gmail.com>
* hast-util-to-mdast - Copyright (c) Titus Wormer <tituswormer@gmail.com> and Copyright (c) Seth Vincent <sethvincent@gmail.com>
* hastscript - Copyright (c) Titus Wormer <tituswormer@gmail.com>
* rehype-remark - Copyright (c) Titus Wormer <tituswormer@gmail.com>
* remark-breaks - Copyright (c) 2017 Titus Wormer <tituswormer@gmail.com>
* remark-gfm - Copyright (c) Titus Wormer <tituswormer@gmail.com>
* remark-parse - Copyright (c) 2014 Titus Wormer <tituswormer@gmail.com>
* remark-rehype - Copyright (c) Titus Wormer <tituswormer@gmail.com>
* remark-stringify - Copyright (c) 2014 Titus Wormer <tituswormer@gmail.com>
* unified - Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>
* unist-util-visit - Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>
The following libraries are included in CKEditor under the [ISC license](https://opensource.org/license/isc-license-txt):
* hast-util-from-dom - Copyright (c) Keith McKnight <keith@mcknig.ht>
* rehype-dom-parse - Copyright (c) 2018 Keith McKnight <keith@mcknig.ht>
* rehype-dom-stringify - Copyright (c) 2018 Keith McKnight <keith@mcknig.ht>
Trademarks
----------
**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-8
View File
@@ -1,8 +0,0 @@
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
import type { Translations } from '@ckeditor/ckeditor5-utils';
declare const translations: Translations;
export default translations;

Some files were not shown because too many files have changed in this diff Show More