Add BackPRO News theme and update database schema for article tracking

- Introduced a new WordPress theme "BackPRO News" with a lightweight magazine-style design.
- Added columns for tracking retry attempts and timestamps for unpublished/generated articles in the articles table.
- Included remote service metadata fields in the sites table for better management.
- Created log files for image replacements, installer actions, OpenAI article generation, and publishing processes.
- Implemented a dashboard template for site management, including permalink settings and theme installation options.
This commit is contained in:
2026-02-17 20:08:02 +01:00
parent b653cea252
commit 4d5e220b3c
41 changed files with 4229 additions and 239 deletions

View File

@@ -0,0 +1,28 @@
<?php
if (!defined('ABSPATH')) { exit; }
get_header();
?>
<div class="bp-page-head">
<h1><?php the_archive_title(); ?></h1>
<div class="bp-meta"><?php echo esc_html((string) get_the_archive_description()); ?></div>
</div>
<?php if (have_posts()): ?>
<?php while (have_posts()): the_post(); ?>
<article class="bp-article-card">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="bp-meta"><?php echo esc_html(get_the_date('Y-m-d')); ?></div>
<p class="bp-excerpt"><?php echo esc_html(wp_trim_words(get_the_excerpt(), 35)); ?></p>
</article>
<?php endwhile; ?>
<?php else: ?>
<div class="bp-article-card"><p>Brak wpisow.</p></div>
<?php endif; ?>
<div class="bp-pagination">
<?php echo wp_kses_post(paginate_links(['type' => 'plain'])); ?>
</div>
<?php get_footer(); ?>

View File

@@ -0,0 +1,16 @@
<?php if (!defined('ABSPATH')) { exit; } ?>
</div>
</main>
<footer class="bp-footer">
<div class="bp-shell">
<div>
<?php echo esc_html(get_bloginfo('name')); ?> &copy; <?php echo esc_html(date('Y')); ?>
</div>
</div>
</footer>
<?php wp_footer(); ?>
</body>
</html>

View File

@@ -0,0 +1,94 @@
<?php
if (!defined('ABSPATH')) { exit; }
get_header();
$parents = backpro_news_parent_categories();
?>
<?php if (!empty($parents)): ?>
<div class="bp-grid">
<?php foreach ($parents as $cat): ?>
<?php
$query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 5,
'cat' => (int) $cat->term_id,
'ignore_sticky_posts' => true,
]);
if (!$query->have_posts()) {
wp_reset_postdata();
continue;
}
$query->the_post();
$lead_id = get_the_ID();
$leadCats = get_the_category();
$leadLabel = !empty($leadCats) ? $leadCats[0]->name : $cat->name;
?>
<section class="bp-section">
<div class="bp-section-head">
<h2><?php echo esc_html($cat->name); ?></h2>
<a href="<?php echo esc_url(get_category_link($cat)); ?>">Wiecej</a>
</div>
<div class="bp-section-body">
<article>
<?php if (has_post_thumbnail()): ?>
<a class="bp-lead-media" href="<?php the_permalink(); ?>" aria-label="<?php the_title_attribute(); ?>">
<?php the_post_thumbnail('large', ['class' => 'bp-lead-image']); ?>
<span class="bp-mini-label"><?php echo esc_html($leadLabel); ?></span>
</a>
<?php endif; ?>
<h3 class="bp-lead-title">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h3>
<p class="bp-lead-excerpt">
<?php echo esc_html(wp_trim_words(get_the_excerpt(), 28)); ?>
</p>
</article>
<ul class="bp-mini-grid">
<?php while ($query->have_posts()): $query->the_post(); ?>
<?php if ((int) get_the_ID() === (int) $lead_id) { continue; } ?>
<?php
$cardCats = get_the_category();
$cardLabel = !empty($cardCats) ? $cardCats[0]->name : $cat->name;
?>
<li class="bp-mini-card">
<a class="bp-mini-media" href="<?php the_permalink(); ?>" aria-label="<?php the_title_attribute(); ?>">
<?php if (has_post_thumbnail()): ?>
<?php the_post_thumbnail('medium_large', ['class' => 'bp-mini-image']); ?>
<?php else: ?>
<span class="bp-mini-image bp-mini-placeholder"></span>
<?php endif; ?>
<span class="bp-mini-label"><?php echo esc_html($cardLabel); ?></span>
</a>
<a class="bp-mini-title" href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endwhile; ?>
</ul>
</div>
</section>
<?php wp_reset_postdata(); ?>
<?php endforeach; ?>
</div>
<?php else: ?>
<div class="bp-section">
<div class="bp-section-head">
<h2>Najnowsze wpisy</h2>
</div>
<div class="bp-section-body" style="grid-template-columns:1fr;">
<ul class="bp-list">
<?php
$fallback = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 10,
'ignore_sticky_posts' => true,
]);
while ($fallback->have_posts()): $fallback->the_post();
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; wp_reset_postdata(); ?>
</ul>
</div>
</div>
<?php endif; ?>
<?php get_footer(); ?>

View File

@@ -0,0 +1,36 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
function backpro_news_setup(): void
{
add_theme_support('title-tag');
add_theme_support('post-thumbnails');
add_theme_support('html5', ['search-form', 'comment-form', 'comment-list', 'gallery', 'caption']);
}
add_action('after_setup_theme', 'backpro_news_setup');
function backpro_news_enqueue_assets(): void
{
wp_enqueue_style(
'backpro-news-style',
get_stylesheet_uri(),
[],
wp_get_theme()->get('Version')
);
}
add_action('wp_enqueue_scripts', 'backpro_news_enqueue_assets');
function backpro_news_parent_categories(): array
{
return get_categories([
'taxonomy' => 'category',
'hide_empty' => true,
'parent' => 0,
'orderby' => 'name',
'order' => 'ASC',
]);
}

View File

@@ -0,0 +1,29 @@
<?php if (!defined('ABSPATH')) { exit; } ?>
<!doctype html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo('charset'); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<header class="bp-header">
<div class="bp-shell bp-header-inner">
<a class="bp-brand" href="<?php echo esc_url(home_url('/')); ?>">
<?php echo esc_html(get_bloginfo('name')); ?>
</a>
<nav class="bp-nav" aria-label="Main categories">
<?php foreach (backpro_news_parent_categories() as $cat): ?>
<a href="<?php echo esc_url(get_category_link($cat)); ?>">
<?php echo esc_html($cat->name); ?>
</a>
<?php endforeach; ?>
</nav>
</div>
</header>
<main class="bp-main">
<div class="bp-shell">

View File

@@ -0,0 +1,34 @@
<?php
if (!defined('ABSPATH')) { exit; }
get_header();
?>
<div class="bp-page-head">
<h1><?php echo esc_html(get_bloginfo('name')); ?></h1>
<div class="bp-meta"><?php echo esc_html(get_bloginfo('description')); ?></div>
</div>
<?php if (have_posts()): ?>
<?php while (have_posts()): the_post(); ?>
<article class="bp-article-card">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="bp-meta">
<?php echo esc_html(get_the_date('Y-m-d')); ?> | <?php the_category(', '); ?>
</div>
<p class="bp-excerpt"><?php echo esc_html(wp_trim_words(get_the_excerpt(), 35)); ?></p>
</article>
<?php endwhile; ?>
<div class="bp-pagination">
<?php echo wp_kses_post(paginate_links([
'type' => 'plain',
])); ?>
</div>
<?php else: ?>
<div class="bp-article-card">
<p>Brak wpisow.</p>
</div>
<?php endif; ?>
<?php get_footer(); ?>

View File

@@ -0,0 +1,23 @@
<?php
if (!defined('ABSPATH')) { exit; }
get_header();
?>
<div class="bp-page-head">
<h1>Wyniki wyszukiwania</h1>
<div class="bp-meta"><?php echo esc_html(get_search_query()); ?></div>
</div>
<?php if (have_posts()): ?>
<?php while (have_posts()): the_post(); ?>
<article class="bp-article-card">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<p class="bp-excerpt"><?php echo esc_html(wp_trim_words(get_the_excerpt(), 30)); ?></p>
</article>
<?php endwhile; ?>
<?php else: ?>
<div class="bp-article-card"><p>Brak wynikow.</p></div>
<?php endif; ?>
<?php get_footer(); ?>

View File

@@ -0,0 +1,128 @@
<?php
if (!defined('ABSPATH')) { exit; }
get_header();
?>
<?php if (have_posts()): while (have_posts()): the_post(); ?>
<?php
$post_id = get_the_ID();
$post_categories = get_the_category();
$primary_category = !empty($post_categories) ? $post_categories[0] : null;
$clean_content = wp_strip_all_tags((string) get_post_field('post_content', $post_id));
$word_count = str_word_count($clean_content);
$reading_minutes = max(1, (int) ceil($word_count / 220));
$excerpt = get_the_excerpt();
$related_args = [
'post_type' => 'post',
'posts_per_page' => 4,
'post__not_in' => [$post_id],
'ignore_sticky_posts' => true,
];
if ($primary_category instanceof WP_Term) {
$related_args['cat'] = (int) $primary_category->term_id;
}
$related_query = new WP_Query($related_args);
$latest_query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 5,
'post__not_in' => [$post_id],
'ignore_sticky_posts' => true,
]);
?>
<div class="bp-single-layout">
<article class="bp-single-article">
<header class="bp-single-head">
<?php if (!empty($post_categories)): ?>
<div class="bp-single-cats">
<?php foreach ($post_categories as $cat): ?>
<a href="<?php echo esc_url(get_category_link($cat)); ?>"><?php echo esc_html($cat->name); ?></a>
<?php endforeach; ?>
</div>
<?php endif; ?>
<h1 class="bp-single-title"><?php the_title(); ?></h1>
<div class="bp-single-meta-row">
<span><?php echo esc_html(get_the_date('Y-m-d')); ?></span>
<span><?php echo esc_html(get_the_author()); ?></span>
<span><?php echo esc_html($reading_minutes . ' min czytania'); ?></span>
</div>
<?php if (!empty($excerpt)): ?>
<p class="bp-single-lead"><?php echo esc_html($excerpt); ?></p>
<?php endif; ?>
</header>
<?php if (has_post_thumbnail()): ?>
<figure class="bp-single-hero">
<?php the_post_thumbnail('full', ['class' => 'bp-single-hero-image']); ?>
<?php if ($primary_category instanceof WP_Term): ?>
<span class="bp-mini-label"><?php echo esc_html($primary_category->name); ?></span>
<?php endif; ?>
</figure>
<?php endif; ?>
<div class="bp-single-content">
<?php the_content(); ?>
</div>
</article>
<aside class="bp-single-sidebar" aria-label="Dodatkowe sekcje artykulu">
<section class="bp-side-box">
<h3>Powiazane wpisy</h3>
<?php if ($related_query->have_posts()): ?>
<ul class="bp-side-list">
<?php while ($related_query->have_posts()): $related_query->the_post(); ?>
<li class="bp-side-item">
<a class="bp-side-thumb" href="<?php the_permalink(); ?>" aria-label="<?php the_title_attribute(); ?>">
<?php if (has_post_thumbnail()): ?>
<?php the_post_thumbnail('thumbnail', ['class' => 'bp-side-thumb-image']); ?>
<?php else: ?>
<span class="bp-side-thumb-image bp-mini-placeholder"></span>
<?php endif; ?>
</a>
<div class="bp-side-copy">
<a class="bp-side-title" href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<div class="bp-side-date"><?php echo esc_html(get_the_date('Y-m-d')); ?></div>
</div>
</li>
<?php endwhile; ?>
</ul>
<?php else: ?>
<p class="bp-side-empty">Brak powiazanych wpisow.</p>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
</section>
<section class="bp-side-box">
<h3>Najnowsze wpisy</h3>
<?php if ($latest_query->have_posts()): ?>
<ul class="bp-side-list">
<?php while ($latest_query->have_posts()): $latest_query->the_post(); ?>
<li class="bp-side-item">
<a class="bp-side-thumb" href="<?php the_permalink(); ?>" aria-label="<?php the_title_attribute(); ?>">
<?php if (has_post_thumbnail()): ?>
<?php the_post_thumbnail('thumbnail', ['class' => 'bp-side-thumb-image']); ?>
<?php else: ?>
<span class="bp-side-thumb-image bp-mini-placeholder"></span>
<?php endif; ?>
</a>
<div class="bp-side-copy">
<a class="bp-side-title" href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<div class="bp-side-date"><?php echo esc_html(get_the_date('Y-m-d')); ?></div>
</div>
</li>
<?php endwhile; ?>
</ul>
<?php else: ?>
<p class="bp-side-empty">Brak wpisow.</p>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
</section>
</aside>
</div>
<?php endwhile; endif; ?>
<?php get_footer(); ?>

View File

@@ -0,0 +1,604 @@
/*
Theme Name: BackPRO News
Theme URI: https://backpro.projectpro.pl/
Author: BackPRO
Author URI: https://backpro.projectpro.pl/
Description: Lightweight magazine-style blog theme for BackPRO with auto category sections on homepage.
Version: 1.0.0
Requires at least: 6.0
Tested up to: 6.6
Requires PHP: 7.4
Text Domain: backpro-news
*/
:root {
--bp-bg: #f5f7fb;
--bp-surface: #ffffff;
--bp-text: #152033;
--bp-muted: #63708a;
--bp-accent: #0c6cf2;
--bp-border: #dce2ec;
--bp-radius: 14px;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif;
color: var(--bp-text);
background: linear-gradient(180deg, #f7f8fc 0%, var(--bp-bg) 100%);
}
a {
color: inherit;
text-decoration: none;
}
.bp-shell {
max-width: 1220px;
margin: 0 auto;
padding: 0 20px;
}
.bp-header {
background: var(--bp-surface);
border-bottom: 1px solid var(--bp-border);
position: sticky;
top: 0;
z-index: 20;
}
.bp-header-inner {
display: flex;
align-items: center;
justify-content: space-between;
min-height: 78px;
gap: 16px;
}
.bp-brand {
font-size: 28px;
font-weight: 800;
letter-spacing: 0.3px;
color: var(--bp-accent);
}
.bp-nav {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.bp-nav a {
padding: 8px 12px;
border-radius: 999px;
color: var(--bp-muted);
font-weight: 600;
font-size: 14px;
}
.bp-nav a:hover {
background: #ecf3ff;
color: var(--bp-accent);
}
.bp-main {
padding: 26px 0 46px;
}
.bp-grid {
display: grid;
gap: 20px;
grid-template-columns: 1fr;
}
.bp-section {
background: var(--bp-surface);
border: 1px solid var(--bp-border);
border-radius: var(--bp-radius);
overflow: hidden;
}
.bp-section-head {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
padding: 14px 16px;
border-bottom: 1px solid var(--bp-border);
}
.bp-section-head h2 {
margin: 0;
font-size: 20px;
line-height: 1.2;
}
.bp-section-head a {
font-size: 13px;
color: var(--bp-accent);
font-weight: 600;
}
.bp-section-body {
padding: 16px;
display: grid;
gap: 14px;
grid-template-columns: 1.2fr 1fr;
}
.bp-lead-title {
margin: 0 0 8px;
font-size: 24px;
line-height: 1.25;
}
.bp-lead-media {
display: block;
margin-bottom: 12px;
position: relative;
overflow: hidden;
border-radius: 10px;
}
.bp-lead-image {
width: 100%;
height: auto;
display: block;
border-radius: 10px;
border: 1px solid var(--bp-border);
aspect-ratio: 16 / 9;
object-fit: cover;
background: #e9eef7;
}
.bp-lead-excerpt {
margin: 0;
color: var(--bp-muted);
font-size: 15px;
line-height: 1.5;
}
.bp-list {
margin: 0;
padding: 0;
list-style: none;
display: grid;
gap: 12px;
}
.bp-list a {
display: block;
padding: 10px 0;
border-bottom: 1px dashed var(--bp-border);
font-weight: 600;
}
.bp-list li:last-child a {
border-bottom: 0;
}
.bp-mini-grid {
margin: 0;
padding: 0;
list-style: none;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
align-content: start;
align-items: start;
grid-auto-rows: max-content;
}
.bp-mini-card {
min-width: 0;
align-self: start;
}
.bp-mini-media {
display: block;
position: relative;
aspect-ratio: 1 / 1;
overflow: hidden;
border: 1px solid var(--bp-border);
background: #e9eef7;
}
.bp-mini-image {
width: 100%;
height: 100%;
display: block;
border-radius: 0;
border: 0;
object-fit: cover;
aspect-ratio: auto;
}
.bp-mini-placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg, #e6ebf5 0%, #d9e2f1 100%);
}
.bp-mini-label {
position: absolute;
left: 8px;
bottom: 8px;
background: #1c2330;
color: #fff;
font-size: 12px;
line-height: 1;
font-weight: 700;
padding: 4px 7px;
}
.bp-mini-title {
display: block;
margin-top: 8px;
font-size: 14px;
line-height: 1.35;
font-weight: 500;
}
.bp-page-head {
margin-bottom: 20px;
}
.bp-page-head h1 {
margin: 0 0 6px;
font-size: 34px;
}
.bp-meta {
color: var(--bp-muted);
font-size: 14px;
}
.bp-article-card {
background: var(--bp-surface);
border: 1px solid var(--bp-border);
border-radius: var(--bp-radius);
padding: 22px;
margin-bottom: 14px;
}
.bp-article-card h2 {
margin: 0 0 8px;
font-size: 28px;
line-height: 1.2;
}
.bp-excerpt {
margin: 10px 0 0;
color: var(--bp-muted);
}
.bp-single-layout {
display: grid;
grid-template-columns: minmax(0, 1.75fr) minmax(280px, 0.85fr);
gap: 18px;
align-items: start;
}
.bp-single-article {
background: var(--bp-surface);
border: 1px solid var(--bp-border);
border-radius: var(--bp-radius);
overflow: hidden;
}
.bp-single-head {
padding: 22px 22px 14px;
border-bottom: 1px solid var(--bp-border);
}
.bp-single-cats {
display: flex;
gap: 8px;
flex-wrap: wrap;
margin-bottom: 10px;
}
.bp-single-cats a {
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.4px;
color: var(--bp-accent);
}
.bp-single-title {
margin: 0;
font-size: 42px;
line-height: 1.1;
}
.bp-single-meta-row {
margin-top: 14px;
display: flex;
flex-wrap: wrap;
gap: 14px;
color: var(--bp-muted);
font-size: 13px;
font-weight: 600;
}
.bp-single-meta-row span {
position: relative;
}
.bp-single-meta-row span:not(:last-child)::after {
content: "";
display: inline-block;
width: 4px;
height: 4px;
border-radius: 50%;
margin-left: 14px;
vertical-align: middle;
background: #9da8bc;
}
.bp-single-lead {
margin: 16px 0 0;
color: #33445f;
font-size: 19px;
line-height: 1.55;
}
.bp-single-hero {
margin: 0;
position: relative;
border-bottom: 1px solid var(--bp-border);
}
.bp-single-hero-image {
width: 100%;
height: auto;
display: block;
aspect-ratio: 16 / 9;
object-fit: cover;
background: #e9eef7;
}
.bp-single-content {
padding: 24px 22px 26px;
font-size: 19px;
line-height: 1.75;
}
.bp-single-content > *:first-child {
margin-top: 0;
}
.bp-single-content > *:last-child {
margin-bottom: 0;
}
.bp-single-content h2,
.bp-single-content h3,
.bp-single-content h4 {
margin: 32px 0 12px;
line-height: 1.25;
}
.bp-single-content h2 {
font-size: 31px;
}
.bp-single-content h3 {
font-size: 25px;
}
.bp-single-content p {
margin: 0 0 18px;
}
.bp-single-content ul,
.bp-single-content ol {
margin: 0 0 20px;
padding-left: 24px;
}
.bp-single-content li {
margin-bottom: 8px;
}
.bp-single-content blockquote {
margin: 28px 0;
padding: 18px 20px;
border-left: 4px solid var(--bp-accent);
background: #f0f5ff;
color: #1e2b42;
font-size: 21px;
line-height: 1.5;
}
.bp-single-content img {
max-width: 100%;
height: auto;
border-radius: 10px;
}
.bp-single-sidebar {
display: grid;
gap: 14px;
align-content: start;
}
.bp-side-box {
background: var(--bp-surface);
border: 1px solid var(--bp-border);
border-radius: var(--bp-radius);
padding: 14px;
}
.bp-side-box h3 {
margin: 0 0 12px;
font-size: 18px;
line-height: 1.25;
}
.bp-side-list {
margin: 0;
padding: 0;
list-style: none;
display: grid;
gap: 11px;
}
.bp-side-item {
display: grid;
grid-template-columns: 88px 1fr;
gap: 10px;
align-items: start;
}
.bp-side-thumb {
display: block;
border: 1px solid var(--bp-border);
overflow: hidden;
aspect-ratio: 1 / 1;
background: #e9eef7;
}
.bp-side-thumb-image {
width: 100%;
height: 100%;
display: block;
object-fit: cover;
}
.bp-side-copy {
min-width: 0;
}
.bp-side-title {
display: block;
font-size: 14px;
line-height: 1.35;
font-weight: 600;
}
.bp-side-date {
margin-top: 4px;
font-size: 12px;
color: var(--bp-muted);
}
.bp-side-plain {
margin: 0;
padding: 0;
list-style: none;
}
.bp-side-plain li {
padding: 10px 0;
border-top: 1px dashed var(--bp-border);
}
.bp-side-plain li:first-child {
border-top: 0;
padding-top: 0;
}
.bp-side-plain a {
display: block;
font-size: 14px;
line-height: 1.4;
font-weight: 600;
}
.bp-side-plain span {
display: block;
margin-top: 4px;
color: var(--bp-muted);
font-size: 12px;
}
.bp-side-empty {
margin: 0;
color: var(--bp-muted);
font-size: 14px;
}
.bp-pagination {
margin-top: 20px;
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.bp-pagination .page-numbers {
display: inline-block;
padding: 8px 12px;
border: 1px solid var(--bp-border);
border-radius: 8px;
background: var(--bp-surface);
color: var(--bp-muted);
}
.bp-pagination .current {
color: #fff;
background: var(--bp-accent);
border-color: var(--bp-accent);
}
.bp-footer {
border-top: 1px solid var(--bp-border);
padding: 28px 0;
color: var(--bp-muted);
font-size: 14px;
}
@media (max-width: 900px) {
.bp-section-body {
grid-template-columns: 1fr;
}
.bp-single-layout {
grid-template-columns: 1fr;
}
.bp-mini-grid {
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.bp-page-head h1 {
font-size: 30px;
}
.bp-single-title {
font-size: 33px;
}
.bp-single-content {
font-size: 18px;
}
}
@media (max-width: 520px) {
.bp-mini-grid {
grid-template-columns: 1fr;
}
.bp-single-head {
padding: 18px 16px 12px;
}
.bp-single-title {
font-size: 28px;
}
.bp-single-content {
padding: 18px 16px 20px;
font-size: 17px;
}
.bp-single-content blockquote {
font-size: 19px;
}
}