Compare commits
24
Commits
14434bc2ac
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b69a110b97 | ||
|
|
ce6fffaa57 | ||
|
|
9294399517 | ||
|
|
18a338c2ce | ||
|
|
3af0f18d55 | ||
|
|
7fd1fb20c4 | ||
|
|
15ab9d1947 | ||
|
|
5da459132b | ||
|
|
6738576501 | ||
|
|
35ca6223cb | ||
|
|
b9d3426213 | ||
|
|
c4eae6b45f | ||
|
|
de4d5ac595 | ||
|
|
cd382c5c7b | ||
|
|
70b75f8426 | ||
|
|
e1a5403936 | ||
|
|
2aa9b37d4e | ||
|
|
b32c26cb04 | ||
|
|
3edfa05f46 | ||
|
|
37676a3ccb | ||
|
|
39cda7814f | ||
|
|
e51768622f | ||
|
|
d850f54666 | ||
|
|
07b69b7616 |
@@ -0,0 +1,6 @@
|
||||
*.log
|
||||
.env
|
||||
config/config.php
|
||||
*.lock
|
||||
uploads/*
|
||||
vendor/composer
|
||||
@@ -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).
|
||||
|
||||
|
||||
|
||||
|
||||
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+6
File diff suppressed because one or more lines are too long
Vendored
+7
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
Vendored
+12
File diff suppressed because one or more lines are too long
@@ -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
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
@@ -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 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
Reference in New Issue
Block a user