Change CSS framework from PicoCSS to Bootstrap 5.3

This commit is contained in:
2025-11-27 14:46:51 +08:00
parent e51768622f
commit 39cda7814f
245 changed files with 678223 additions and 2750 deletions
+293 -108
View File
@@ -3,118 +3,303 @@
include 'views/layouts/header.php';
?>
<h1>Панель управления</h1>
<div class="grid" style="margin-bottom: 2rem;">
<article style="text-align: center;">
<h2>📚 Книги</h2>
<div style="font-size: 2rem; font-weight: bold; color: var(--primary);">
<?= $total_books ?>
<div class="container">
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h2">Панель управления</h1>
<div class="btn-group">
<a href="<?= SITE_URL ?>/books/create" class="btn btn-primary">
<i class="bi bi-plus-circle"></i> Новая книга
</a>
<a href="<?= SITE_URL ?>/series/create" class="btn btn-outline-primary">
<i class="bi bi-collection"></i> Новая серия
</a>
</div>
<small>Всего книг</small>
</article>
<article style="text-align: center;">
<h2>📑 Главы</h2>
<div style="font-size: 2rem; font-weight: bold; color: var(--success);">
<?= $total_chapters ?>
</div>
<small>Всего глав</small>
</article>
<article style="text-align: center;">
<h2>📝 Слова</h2>
<div style="font-size: 2rem; font-weight: bold; color: var(--warning);">
<?= number_format($total_words) ?>
</div>
<small>Всего слов</small>
</article>
<article style="text-align: center;">
<h2>🌐 Публикации</h2>
<div style="font-size: 2rem; font-weight: bold; color: var(--info);">
<?= $published_books_count ?>
</div>
<small>Опубликовано книг</small>
</article>
</div>
<div class="grid">
<div>
<h2>Недавние книги</h2>
<?php if (!empty($recent_books)): ?>
<?php foreach ($recent_books as $book): ?>
<article style="margin-bottom: 1em; padding-top: 0.5em;">
<h3 style="margin-bottom: 0.5rem; margin-top: 0.5em;">
<a href="<?= SITE_URL ?>/books/<?= $book['id'] ?>/edit">
<?= e($book['title']) ?>
</a>
</h3>
<?php if ($book['genre']): ?>
<p style="margin: 0; color: var(--muted-color); font-size:small;"><em><?= e($book['genre']) ?></em></p>
<?php endif; ?>
<?php if ($book['description']): ?>
<p style="margin: 0; color: var(--muted-color);"><?= e($book['description']) ?></p>
<?php endif; ?>
<footer>
<small>
Глав: <?= $book['chapter_count'] ?? 0 ?> |
Слов: <?= $book['total_words'] ?? 0 ?> |
Статус: <?= $book['published'] ? '✅ Опубликована' : '📝 Черновик' ?>
</small>
</footer>
</article>
<?php endforeach; ?>
<?php if (count($recent_books) < count($books)): ?>
<div style="text-align: center; margin-top: 1rem;">
<a href="<?= SITE_URL ?>/books" class="button">Все книги</a>
</div>
<?php endif; ?>
<?php else: ?>
<article>
<p>У вас пока нет книг.</p>
<a href="<?= SITE_URL ?>/books/create" class="button">Создать первую книгу</a>
</article>
<?php endif; ?>
</div>
<div>
<h2>Мои серии</h2>
<?php if (!empty($series)): ?>
<?php foreach ($series as $ser): ?>
<article>
<h3 style="margin-bottom: 0.5rem;">
<a href="<?= SITE_URL ?>/series/<?= $ser['id'] ?>/edit">
<?= e($ser['title']) ?>
</a>
</h3>
<?php if ($ser['description']): ?>
<p><?= e(mb_strimwidth($ser['description'], 0, 100, '...')) ?></p>
<?php endif; ?>
<footer>
<small>
Книг: <?= $ser['book_count'] ?> |
Слов: <?= $ser['total_words'] ?>
</small>
</footer>
</article>
<?php endforeach; ?>
<div style="text-align: center; margin-top: 1rem;">
<a href="<?= SITE_URL ?>/series" class="button">Все серии</a>
<!-- Статистика -->
<div class="row g-4 mb-5">
<div class="col-xl-3 col-md-6">
<div class="card border-0 bg-primary bg-opacity-10">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h3 class="card-title text-primary"><?= $total_books ?></h3>
<p class="card-text text-muted mb-0">Всего книг</p>
</div>
<div class="flex-shrink-0">
<i class="bi bi-journal-bookmark fs-1 text-primary"></i>
</div>
</div>
</div>
</div>
<?php else: ?>
<article>
<p>У вас пока нет серий.</p>
<a href="<?= SITE_URL ?>/series/create" class="button">Создать первую серию</a>
</article>
<?php endif; ?>
</div>
<h2 style="margin-top: 2rem;">Быстрые действия</h2>
<div class="button-group">
<a href="<?= SITE_URL ?>/books/create" class="button">📖 Новая книга</a>
<a href="<?= SITE_URL ?>/series/create" class="button secondary">📚 Новая серия</a>
<div class="col-xl-3 col-md-6">
<div class="card border-0 bg-success bg-opacity-10">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h3 class="card-title text-success"><?= $total_chapters ?></h3>
<p class="card-text text-muted mb-0">Всего глав</p>
</div>
<div class="flex-shrink-0">
<i class="bi bi-file-text fs-1 text-success"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6">
<div class="card border-0 bg-warning bg-opacity-10">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h3 class="card-title text-warning"><?= number_format($total_words) ?></h3>
<p class="card-text text-muted mb-0">Всего слов</p>
</div>
<div class="flex-shrink-0">
<i class="bi bi-fonts fs-1 text-warning"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6">
<div class="card border-0 bg-info bg-opacity-10">
<div class="card-body">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h3 class="card-title text-info"><?= $published_books_count ?></h3>
<p class="card-text text-muted mb-0">Опубликовано книг</p>
</div>
<div class="flex-shrink-0">
<i class="bi bi-globe fs-1 text-info"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row g-4">
<!-- Недавние книги -->
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header bg-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">Недавние книги</h5>
<a href="<?= SITE_URL ?>/books" class="btn btn-sm btn-outline-primary">Все книги</a>
</div>
<div class="card-body">
<?php if (!empty($recent_books)): ?>
<div class="list-group list-group-flush">
<?php foreach ($recent_books as $book): ?>
<div class="list-group-item px-0">
<div class="d-flex justify-content-between align-items-start mb-2">
<h6 class="mb-1">
<a href="<?= SITE_URL ?>/books/<?= $book['id'] ?>/edit" class="text-decoration-none">
<?= e($book['title']) ?>
</a>
</h6>
<span class="badge <?= $book['published'] ? 'bg-success' : 'bg-warning' ?>">
<?= $book['published'] ? 'Опубликована' : 'Черновик' ?>
</span>
</div>
<?php if ($book['genre']): ?>
<p class="text-muted small mb-1"><em><?= e($book['genre']) ?></em></p>
<?php endif; ?>
<?php if ($book['description']): ?>
<p class="text-muted small mb-2"><?= e($book['description']) ?></p>
<?php endif; ?>
<div class="d-flex justify-content-between align-items-center">
<small class="text-muted">
Глав: <?= $book['chapter_count'] ?? 0 ?> |
Слов: <?= $book['total_words'] ?? 0 ?>
</small>
<div class="btn-group btn-group-sm">
<a href="<?= SITE_URL ?>/books/<?= $book['id'] ?>/edit" class="btn btn-outline-primary btn-sm">
<i class="bi bi-pencil"></i>
</a>
<a href="<?= SITE_URL ?>/books/<?= $book['id'] ?>/chapters" class="btn btn-outline-secondary btn-sm">
<i class="bi bi-file-text"></i>
</a>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php if (count($recent_books) < $total_books): ?>
<div class="text-center mt-3">
<a href="<?= SITE_URL ?>/books" class="btn btn-outline-primary">Все книги</a>
</div>
<?php endif; ?>
<?php else: ?>
<div class="text-center py-4">
<i class="bi bi-journal-bookmark fs-1 text-muted"></i>
<p class="text-muted mt-2">У вас пока нет книг</p>
<a href="<?= SITE_URL ?>/books/create" class="btn btn-primary">Создать первую книгу</a>
</div>
<?php endif; ?>
</div>
</div>
</div>
<!-- Мои серии и быстрые действия -->
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header bg-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">Мои серии</h5>
<a href="<?= SITE_URL ?>/series" class="btn btn-sm btn-outline-primary">Все серии</a>
</div>
<div class="card-body">
<?php if (!empty($series)): ?>
<div class="list-group list-group-flush">
<?php foreach ($series as $ser): ?>
<div class="list-group-item px-0">
<div class="d-flex justify-content-between align-items-start mb-2">
<h6 class="mb-1">
<a href="<?= SITE_URL ?>/series/<?= $ser['id'] ?>/edit" class="text-decoration-none">
<?= e($ser['title']) ?>
</a>
</h6>
<span class="badge bg-primary"><?= $ser['book_count'] ?> книг</span>
</div>
<?php if ($ser['description']): ?>
<p class="text-muted small mb-2"><?= e(mb_strimwidth($ser['description'], 0, 100, '...')) ?></p>
<?php endif; ?>
<div class="d-flex justify-content-between align-items-center">
<small class="text-muted">
Книг: <?= $ser['book_count'] ?> |
Слов: <?= $ser['total_words'] ?>
</small>
<div class="btn-group btn-group-sm">
<a href="<?= SITE_URL ?>/series/<?= $ser['id'] ?>/edit" class="btn btn-outline-primary btn-sm">
<i class="bi bi-pencil"></i>
</a>
<a href="<?= SITE_URL ?>/series/<?= $ser['id'] ?>/view" class="btn btn-outline-success btn-sm" target="_blank">
<i class="bi bi-eye"></i>
</a>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php else: ?>
<div class="text-center py-4">
<i class="bi bi-collection fs-1 text-muted"></i>
<p class="text-muted mt-2">У вас пока нет серий</p>
<a href="<?= SITE_URL ?>/series/create" class="btn btn-primary">Создать первую серию</a>
</div>
<?php endif; ?>
</div>
</div>
</div>
<div class="row g-4">
<!-- Быстрые действия -->
<div class="card mt-4">
<div class="card-header bg-white">
<h5 class="card-title mb-0">Быстрые действия</h5>
</div>
<div class="card-body">
<div class="row g-2">
<div class="col-md-6">
<a href="<?= SITE_URL ?>/books/create" class="btn btn-outline-primary w-100 d-flex align-items-center justify-content-center py-3">
<i class="bi bi-journal-plus fs-4 me-2"></i>
<div>
<div>Новая книга</div>
<small class="text-muted">Создать книгу</small>
</div>
</a>
</div>
<div class="col-md-6">
<a href="<?= SITE_URL ?>/series/create" class="btn btn-outline-secondary w-100 d-flex align-items-center justify-content-center py-3">
<i class="bi bi-collection fs-4 me-2"></i>
<div>
<div>Новая серия</div>
<small class="text-muted">Создать серию</small>
</div>
</a>
</div>
<div class="col-md-6">
<a href="<?= SITE_URL ?>/books" class="btn btn-outline-success w-100 d-flex align-items-center justify-content-center py-3">
<i class="bi bi-journal-bookmark fs-4 me-2"></i>
<div>
<div>Все книги</div>
<small class="text-muted">Управление</small>
</div>
</a>
</div>
<div class="col-md-6">
<a href="<?= SITE_URL ?>/profile" class="btn btn-outline-info w-100 d-flex align-items-center justify-content-center py-3">
<i class="bi bi-person fs-4 me-2"></i>
<div>
<div>Профиль</div>
<small class="text-muted">Настройки</small>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Дополнительная статистика -->
<div class="row mt-4">
<div class="col-12">
<div class="card">
<div class="card-header bg-white">
<h5 class="card-title mb-0">Прогресс писателя</h5>
</div>
<div class="card-body">
<div class="row text-center">
<div class="col-md-2 col-6 mb-3">
<div class="h4 text-primary mb-1"><?= $total_books ?></div>
<small class="text-muted">Книг</small>
</div>
<div class="col-md-2 col-6 mb-3">
<div class="h4 text-success mb-1"><?= $total_chapters ?></div>
<small class="text-muted">Глав</small>
</div>
<div class="col-md-2 col-6 mb-3">
<div class="h4 text-warning mb-1"><?= number_format($total_words) ?></div>
<small class="text-muted">Слов</small>
</div>
<div class="col-md-2 col-6 mb-3">
<div class="h4 text-info mb-1"><?= $published_books_count ?></div>
<small class="text-muted">Опубликовано</small>
</div>
<div class="col-md-2 col-6 mb-3">
<div class="h4 text-secondary mb-1"><?= $total_books > 0 ? round($total_words / $total_books) : 0 ?></div>
<small class="text-muted">Слов/книга</small>
</div>
<div class="col-md-2 col-6 mb-3">
<div class="h4 text-dark mb-1"><?= $total_chapters > 0 ? round($total_words / $total_chapters) : 0 ?></div>
<small class="text-muted">Слов/глава</small>
</div>
</div>
<?php if ($total_words > 0): ?>
<div class="mt-3">
<div class="d-flex justify-content-between mb-1">
<small>Прогресс этого месяца</small>
<small><?= number_format($total_words) ?> слов</small>
</div>
<div class="progress" style="height: 8px;">
<div class="progress-bar bg-success" style="width: <?= min(100, ($total_words / 50000) * 100) ?>%"></div>
</div>
<small class="text-muted">Цель: 50,000 слов в месяц</small>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>