v2.1.0 — Brand token adoption + homepage verdict sections

- Remap --color-brand-primary/--color-link-hover/--focus-shadow → teal tokens
- Hero search submit → lime-500/ink (CMO brief §6)
- Hero decorative shapes → teal/lime tints
- Hero wavy underline → teal
- front-page.php: verdict taxonomy explainer (5 states) + featured verdict cards
- inc/helpers.php: new brand copy defaults (hero title + subtitle)
This commit is contained in:
peptiderepo
2026-04-26 04:22:04 +00:00
parent 614ee2a2c3
commit 4188bba014
3 changed files with 3571 additions and 3176 deletions

View File

@@ -2,21 +2,77 @@
/**
* The front page template
*
* Layout: Hero → Research Modules → PRAutoBlogger posts → Peptide News feed.
* Newsletter signup is handled by footer.php (via template part) on the front page.
* Layout: Hero → Verdict Explainer → Featured Verdict Cards → Research Modules
* → PRAutoBlogger posts → Peptide News feed.
*
* @see template-parts/module-cards.php — research modules grid
* @see template-parts/newsletter-signup.php — included via footer.php on front page
* @see functions.php — helper functions for hero content
* Brand v2.0.0: Direction C "The Trusted Guide". Hero uses the 5-state verdict
* taxonomy as the central explainer hook. Three featured verdict cards pull from
* real monographs (semaglutide / BPC-157 / Melanotan-II) via post meta.
*
* @see template-parts/module-cards.php — research modules grid
* @see template-parts/verdict/badge.php — verdict badge component
* @see template-parts/verdict/card.php — full verdict card (monograph hero)
* @see inc/helpers.php — hero title / subtitle getters
* @see assets/css/brand.css — verdict token definitions
*
* @package peptide-starter
*/
get_header();
/**
* Verdict taxonomy data for the homepage explainer strip.
* Canonical order matches CMO brief §5.1 and the 5-state enum in verdict-meta.php.
*/
$verdict_taxonomy = array(
array(
'state' => 'established',
'glyph' => '✓',
'label' => 'Established',
'description' => 'Strong RCT evidence; widely prescribed or validated.',
),
array(
'state' => 'promising',
'glyph' => '◐',
'label' => 'Promising',
'description' => 'Meaningful human data accumulating; not yet RCT-strong.',
),
array(
'state' => 'investigational',
'glyph' => '?',
'label' => 'Investigational',
'description' => 'Mechanism plausible; human trials sparse.',
),
array(
'state' => 'insufficient',
'glyph' => '⊘',
'label' => 'Insufficient Evidence',
'description' => 'Not enough data to say anything responsible.',
),
array(
'state' => 'cautionary',
'glyph' => '⚠',
'label' => 'Cautionary',
'description' => 'Active safety signals or misuse patterns.',
),
);
/**
* Featured monograph post IDs. These are the three exemplar monographs
* loaded during brand sprint v2.0.0 (2026-04-26).
* Semaglutide=211 (established), BPC-157=36 (investigational), Melanotan-II=177 (cautionary).
*/
$featured_monograph_ids = array( 211, 36, 177 );
?>
<main id="main" class="site-main">
<!-- Hero Section -->
<!-- ═══════════════════════════════════════════════════════════════
HERO SECTION
H1: customizer hero_title (default: "Is this peptide right for you?")
Sub-head: customizer hero_subtitle (default: "What the research really says")
Search: PSA plugin shortcode or fallback form; lime submit button via brand.css
═══════════════════════════════════════════════════════════════ -->
<section class="hero-section">
<div class="hero-content">
<h1 class="hero-title">
@@ -60,13 +116,149 @@ get_header();
<a href="<?php echo esc_url( home_url( '/peptides' ) ); ?>" class="ps-btn ps-btn-primary">
<?php esc_html_e( 'Browse Peptides', 'peptide-starter' ); ?>
</a>
<a href="<?php echo esc_url( home_url( '/documentation' ) ); ?>" class="ps-btn ps-btn-secondary">
<?php esc_html_e( 'Documentation', 'peptide-starter' ); ?>
<a href="<?php echo esc_url( home_url( '/how-we-review-peptides' ) ); ?>" class="ps-btn ps-btn-secondary">
<?php esc_html_e( 'Our method', 'peptide-starter' ); ?>
</a>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════════
VERDICT TAXONOMY EXPLAINER
Five verdict states shown as badge + one-line description.
Educates first-time visitors on the brand's evaluation system.
Rule: color + glyph + label always rendered together (§5.1 CMO brief).
═══════════════════════════════════════════════════════════════ -->
<section class="hero-verdict-explainer" aria-label="<?php esc_attr_e( 'Our verdict system', 'peptide-starter' ); ?>">
<div class="ps-container">
<p class="hero-verdict-explainer__heading">
<?php esc_html_e( 'Every peptide gets a verdict. Here\'s what they mean.', 'peptide-starter' ); ?>
</p>
<div class="hero-verdict-explainer__grid">
<?php foreach ( $verdict_taxonomy as $v ) : ?>
<div class="hero-verdict-explainer__item">
<span
class="pr-verdict pr-verdict--<?php echo esc_attr( $v['state'] ); ?>"
role="img"
aria-label="<?php echo esc_attr( sprintf( __( 'Verdict: %s', 'peptide-starter' ), $v['label'] ) ); ?>"
>
<span class="pr-verdict__glyph" aria-hidden="true"><?php echo esc_html( $v['glyph'] ); ?></span>
<span class="pr-verdict__label"><?php echo esc_html( $v['label'] ); ?></span>
</span>
<p class="hero-verdict-explainer__desc"><?php echo esc_html( $v['description'] ); ?></p>
</div>
<?php endforeach; ?>
</div>
<p class="hero-verdict-explainer__cta-line">
<a href="<?php echo esc_url( home_url( '/how-we-review-peptides' ) ); ?>" class="ps-btn ps-btn-tertiary ps-btn-sm">
<?php esc_html_e( 'How we assign verdicts →', 'peptide-starter' ); ?>
</a>
</p>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════════
FEATURED VERDICT CARDS
Three exemplar monographs showing the verdict card in context.
Pulls from post meta set by verdict-meta.php (verdict_state,
verdict_text, signal_row_N_label, signal_row_N_glyph).
Post IDs: semaglutide=211, BPC-157=36, Melanotan-II=177.
═══════════════════════════════════════════════════════════════ -->
<?php
$featured_posts = get_posts(
array(
'post__in' => $featured_monograph_ids,
'post_type' => 'peptide',
'posts_per_page' => 3,
'orderby' => 'post__in',
'post_status' => 'publish',
)
);
if ( ! empty( $featured_posts ) ) :
?>
<section class="hero-featured-verdicts" aria-label="<?php esc_attr_e( 'Featured peptide verdicts', 'peptide-starter' ); ?>">
<div class="ps-container">
<h2 class="hero-featured-verdicts__title"><?php esc_html_e( 'Featured verdicts', 'peptide-starter' ); ?></h2>
<p class="hero-featured-verdicts__subtitle">
<?php esc_html_e( 'Real assessments from our database — see the system in action.', 'peptide-starter' ); ?>
</p>
<div class="hero-featured-verdicts__grid">
<?php foreach ( $featured_posts as $featured_post ) :
$post_id = $featured_post->ID;
$verdict_state = get_post_meta( $post_id, 'verdict_state', true );
$verdict_text = get_post_meta( $post_id, 'verdict_text', true );
$post_url = get_permalink( $post_id );
// Verdict state config (mirrors badge.php logic).
$verdict_config = array(
'established' => array( 'glyph' => '✓', 'label' => 'Established' ),
'promising' => array( 'glyph' => '◐', 'label' => 'Promising' ),
'investigational'=> array( 'glyph' => '?', 'label' => 'Investigational' ),
'insufficient' => array( 'glyph' => '⊘', 'label' => 'Insufficient Evidence' ),
'cautionary' => array( 'glyph' => '⚠', 'label' => 'Cautionary' ),
);
$vc = isset( $verdict_config[ $verdict_state ] ) ? $verdict_config[ $verdict_state ] : null;
// Signal rows (up to 3).
$signal_rows = array();
for ( $i = 1; $i <= 3; $i++ ) {
$row_label = get_post_meta( $post_id, 'signal_row_' . $i . '_label', true );
$row_glyph = get_post_meta( $post_id, 'signal_row_' . $i . '_glyph', true );
if ( $row_label ) {
$signal_rows[] = array(
'label' => $row_label,
'glyph' => $row_glyph ? $row_glyph : '•',
);
}
}
?>
<article class="hero-verdict-card" aria-label="<?php echo esc_attr( get_the_title( $post_id ) ); ?>">
<?php if ( $vc ) : ?>
<span
class="pr-verdict pr-verdict--<?php echo esc_attr( $verdict_state ); ?> hero-verdict-card__badge"
role="img"
aria-label="<?php echo esc_attr( sprintf( __( 'Verdict: %s', 'peptide-starter' ), $vc['label'] ) ); ?>"
>
<span class="pr-verdict__glyph" aria-hidden="true"><?php echo esc_html( $vc['glyph'] ); ?></span>
<span class="pr-verdict__label"><?php echo esc_html( $vc['label'] ); ?></span>
</span>
<?php endif; ?>
<h3 class="hero-verdict-card__title">
<a href="<?php echo esc_url( $post_url ); ?>"><?php echo esc_html( get_the_title( $post_id ) ); ?></a>
</h3>
<?php if ( $verdict_text ) : ?>
<p class="hero-verdict-card__summary"><?php echo esc_html( $verdict_text ); ?></p>
<?php endif; ?>
<?php if ( ! empty( $signal_rows ) ) : ?>
<ul class="hero-verdict-card__signals" aria-label="<?php esc_attr_e( 'Evidence signals', 'peptide-starter' ); ?>">
<?php foreach ( $signal_rows as $row ) : ?>
<li class="hero-verdict-card__signal-item">
<span class="hero-verdict-card__signal-glyph" aria-hidden="true"><?php echo esc_html( $row['glyph'] ); ?></span>
<?php echo esc_html( $row['label'] ); ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<a href="<?php echo esc_url( $post_url ); ?>" class="hero-verdict-card__link">
<?php esc_html_e( 'Read the full evidence →', 'peptide-starter' ); ?>
</a>
</article>
<?php endforeach; ?>
</div>
<div class="hero-featured-verdicts__footer">
<a href="<?php echo esc_url( home_url( '/peptides' ) ); ?>" class="ps-btn ps-btn-secondary">
<?php esc_html_e( 'Browse all peptides', 'peptide-starter' ); ?>
</a>
</div>
</div>
</section>
<?php endif; ?>
<!-- Research Modules Grid (6 cards) -->
<?php get_template_part( 'template-parts/module', 'cards' ); ?>
@@ -95,6 +287,7 @@ get_header();
<?php
}
?>
</main>
<?php get_footer(); ?>

View File

@@ -155,7 +155,7 @@ function peptide_starter_the_custom_logo() {
* @return string Hero title text.
*/
function peptide_starter_get_hero_title() {
return get_theme_mod( 'hero_title', get_bloginfo( 'name' ) );
return get_theme_mod( 'hero_title', esc_html__( 'Is this peptide right for you?', 'peptide-starter' ) );
}
/**
@@ -164,7 +164,7 @@ function peptide_starter_get_hero_title() {
* @return string Hero subtitle text.
*/
function peptide_starter_get_hero_subtitle() {
return get_theme_mod( 'hero_subtitle', esc_html__( 'A scientific peptide reference database', 'peptide-starter' ) );
return get_theme_mod( 'hero_subtitle', esc_html__( 'What the research really says', 'peptide-starter' ) );
}
/**

258
style.css
View File

@@ -4,7 +4,7 @@ Theme URI: https://github.com/peptiderepo/peptide-starter
Description: Premium, accessible WordPress theme for scientific peptide reference database
Author: Peptide Repo
Author URI: https://peptiderepo.com
Version: 2.0.0-alpha.3
Version: 2.1.0-alpha.3
License: GPL v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: peptide-starter
@@ -165,7 +165,8 @@ img, svg {
/* ---- LIGHT MODE COLOR PALETTE ---- */
/* Brand Colors */
--color-brand-primary: #0066CC;
--color-brand-primary: var(--teal-500); /* Brand rebrand v2.0.0 — Direction C */
--color-brand-hover: var(--teal-600);
--color-status-success: #059669;
--color-status-warning: #F59E0B;
--color-status-error: #DC2626;
@@ -196,10 +197,10 @@ img, svg {
--color-bg-tertiary: #EDEAE3;
/* Component-Specific Colors */
--color-input-focus: #0066CC;
--color-link-hover: #0052A3;
--color-badge-bg: #DBEAFE;
--color-badge-text: #0066CC;
--color-input-focus: var(--teal-500);
--color-link-hover: var(--teal-600);
--color-badge-bg: var(--teal-50);
--color-badge-text: var(--teal-700);
--color-code-bg: #F3F4F6;
--color-code-text: #111827;
@@ -220,10 +221,10 @@ img, svg {
--transition-slow: 300ms ease-in-out;
/* ---- FOCUS RING (per Design Director fix: 15% opacity) ---- */
--focus-color: #0066CC;
--focus-color: var(--teal-500);
--focus-width: 2px;
--focus-offset: 2px;
--focus-shadow: 0 0 0 4px rgba(0, 102, 204, 0.15);
--focus-shadow: 0 0 0 3px rgba(27, 138, 146, 0.15);
/* ---- CONTAINER WIDTHS ---- */
--container-sm: 640px;
@@ -498,7 +499,7 @@ nav a {
.ps-btn-primary:hover {
background-color: var(--color-link-hover);
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(0, 102, 204, 0.2);
box-shadow: 0 4px 16px rgba(27, 138, 146, 0.2);
}
.ps-btn-primary:active {
@@ -558,7 +559,7 @@ nav a {
.ps-card:hover {
border-color: var(--color-brand-primary);
box-shadow: 0 4px 12px rgba(0, 102, 204, 0.1);
box-shadow: 0 4px 12px rgba(27, 138, 146, 0.1);
}
.ps-card-header {
@@ -741,9 +742,9 @@ input[type="radio"] {
}
.ps-alert-info {
background-color: #DBEAFE;
background-color: var(--teal-50);
border-color: var(--color-brand-primary);
color: #0652CD;
color: var(--teal-700);
}
.ps-alert-success {
@@ -1119,7 +1120,7 @@ input[type="radio"] {
.hero-section::before {
width: 200px;
height: 200px;
background: rgba(244, 114, 182, 0.10);
background: rgba(27, 138, 146, 0.07);
top: 8%;
left: -4%;
}
@@ -1128,7 +1129,7 @@ input[type="radio"] {
.hero-section::after {
width: 260px;
height: 260px;
background: rgba(52, 211, 153, 0.08);
background: rgba(127, 214, 0, 0.07);
top: 20%;
right: -6%;
}
@@ -1164,7 +1165,7 @@ input[type="radio"] {
left: 0;
right: 0;
height: 6px;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 8'%3E%3Cpath d='M0 4 Q12.5 0 25 4 T50 4 T75 4 T100 4' fill='none' stroke='%230066CC' stroke-width='2'/%3E%3C/svg%3E") repeat-x;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 8'%3E%3Cpath d='M0 4 Q12.5 0 25 4 T50 4 T75 4 T100 4' fill='none' stroke='%231B8A92' stroke-width='2'/%3E%3C/svg%3E") repeat-x;
background-size: 50px 6px;
}
@@ -1228,16 +1229,18 @@ input[type="radio"] {
}
.hero-search .psa-search-btn {
background-color: var(--color-brand-primary);
color: white;
background-color: var(--lime-500); /* CMO brief §6: lime submit in hero */
color: var(--color-ink);
border: none;
border-radius: 0 var(--radius-lg) var(--radius-lg) 0;
cursor: pointer;
font-family: "Poppins", sans-serif;
font-weight: 600;
transition: background-color var(--transition-normal);
}
.hero-search .psa-search-btn:hover {
background-color: var(--color-brand-hover);
background-color: var(--lime-600);
}
.hero-search .psa-search-results {
@@ -1361,6 +1364,204 @@ input[type="radio"] {
border-radius: var(--radius-lg);
}
/* ---- VERDICT TAXONOMY EXPLAINER (homepage) ---- */
.hero-verdict-explainer {
background: var(--bg-inset, var(--gray-100));
padding: var(--spacing-2xl) var(--spacing-xl);
border-top: 1px solid var(--border-default, #E8E8E8);
}
.hero-verdict-explainer__heading {
text-align: center;
font-family: "Poppins", sans-serif;
font-weight: 600;
font-size: 16px;
color: var(--text-secondary, var(--color-text-secondary));
margin-bottom: var(--spacing-xl);
letter-spacing: 0.01em;
}
.hero-verdict-explainer__grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: var(--spacing-md);
max-width: var(--container-xl);
margin: 0 auto var(--spacing-xl);
align-items: start;
}
.hero-verdict-explainer__item {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-sm);
text-align: center;
}
.hero-verdict-explainer__desc {
font-family: "Inter", sans-serif;
font-size: 12px;
color: var(--text-muted, var(--color-text-tertiary));
line-height: 1.5;
max-width: 160px;
}
.hero-verdict-explainer__cta-line {
text-align: center;
}
/* ---- FEATURED VERDICT CARDS (homepage) ---- */
.hero-featured-verdicts {
padding: var(--spacing-3xl) var(--spacing-xl);
background: var(--bg-surface, #FFFFFF);
}
.hero-featured-verdicts__title {
text-align: center;
font-family: "Poppins", sans-serif;
font-weight: 700;
font-size: 28px;
color: var(--text-primary, var(--color-text-primary));
margin-bottom: var(--spacing-sm);
margin-top: 0;
}
.hero-featured-verdicts__subtitle {
text-align: center;
font-size: 15px;
color: var(--text-secondary, var(--color-text-secondary));
margin-bottom: var(--spacing-2xl);
}
.hero-featured-verdicts__grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--spacing-xl);
max-width: var(--container-xl);
margin: 0 auto var(--spacing-xl);
}
.hero-verdict-card {
background: var(--bg-surface, #FFFFFF);
border: 1px solid var(--border-default, #E8E8E8);
border-radius: var(--radius-lg, 12px);
padding: var(--spacing-xl);
box-shadow: 0 1px 2px rgba(13, 13, 13, 0.04), 0 2px 8px rgba(13, 13, 13, 0.04);
display: flex;
flex-direction: column;
gap: var(--spacing-md);
transition: box-shadow var(--transition-normal);
}
.hero-verdict-card:hover {
box-shadow: 0 2px 4px rgba(13, 13, 13, 0.06), 0 8px 16px rgba(13, 13, 13, 0.06);
}
.hero-verdict-card__badge {
align-self: flex-start;
}
.hero-verdict-card__title {
font-family: "Poppins", sans-serif;
font-weight: 700;
font-size: 20px;
color: var(--text-primary, var(--color-text-primary));
margin: 0;
line-height: 1.3;
}
.hero-verdict-card__title a {
color: inherit;
text-decoration: none;
}
.hero-verdict-card__title a:hover {
color: var(--teal-600, var(--color-brand-primary));
}
.hero-verdict-card__summary {
font-family: "Inter", sans-serif;
font-size: 14px;
line-height: 1.65;
color: var(--text-secondary, var(--color-text-secondary));
flex: 1;
}
.hero-verdict-card__signals {
list-style: none;
background: var(--bg-inset, var(--gray-100));
border-radius: var(--radius-md, 8px);
padding: var(--spacing-md) var(--spacing-lg);
margin: 0;
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
}
.hero-verdict-card__signal-item {
display: flex;
align-items: flex-start;
gap: var(--spacing-sm);
font-family: "Inter", sans-serif;
font-size: 13px;
color: var(--text-primary, var(--color-text-primary));
line-height: 1.4;
}
.hero-verdict-card__signal-glyph {
flex-shrink: 0;
font-weight: 600;
width: 16px;
text-align: center;
}
.hero-verdict-card__link {
font-family: "Poppins", sans-serif;
font-weight: 600;
font-size: 14px;
color: var(--teal-600, var(--color-brand-primary));
text-decoration: none;
align-self: flex-start;
margin-top: auto;
}
.hero-verdict-card__link:hover {
color: var(--teal-700);
text-decoration: underline;
}
.hero-featured-verdicts__footer {
text-align: center;
}
/* Responsive: verdict explainer → 2-col on tablet, 1-col on mobile */
@media (max-width: 900px) {
.hero-verdict-explainer__grid {
grid-template-columns: repeat(3, 1fr);
}
.hero-featured-verdicts__grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 600px) {
.hero-verdict-explainer__grid {
grid-template-columns: repeat(2, 1fr);
}
.hero-featured-verdicts__grid {
grid-template-columns: 1fr;
}
.hero-verdict-explainer__desc {
max-width: none;
}
}
/* ---- PEPTIDE NEWS PLUGIN OVERRIDES ---- */
/* Remove line-clamp so full article summaries are visible.
Uses body prefix for specificity to beat the plugin's own stylesheet
@@ -1429,7 +1630,7 @@ body .pn-article-title {
position: absolute;
width: 180px;
height: 180px;
background: rgba(52, 211, 153, 0.08);
background: rgba(127, 214, 0, 0.07);
border-radius: 50%;
top: -40px;
right: -40px;
@@ -1629,7 +1830,7 @@ body .pn-article-title {
position: absolute;
width: 160px;
height: 160px;
background: rgba(244, 114, 182, 0.08);
background: rgba(27, 138, 146, 0.07);
border-radius: 50%;
top: -30px;
right: -30px;
@@ -2026,7 +2227,8 @@ html[data-theme="dark"] {
}
html[data-theme="light"] {
--color-brand-primary: #0066CC;
--color-brand-primary: var(--teal-500); /* Brand rebrand v2.0.0 — Direction C */
--color-brand-hover: var(--teal-600);
--color-status-success: #059669;
--color-status-warning: #F59E0B;
--color-status-error: #DC2626;
@@ -2045,13 +2247,13 @@ html[data-theme="light"] {
--color-bg-primary: #FAFAF7;
--color-bg-secondary: #F5F3EE;
--color-bg-tertiary: #EDEAE3;
--color-input-focus: #0066CC;
--color-link-hover: #0052A3;
--color-badge-bg: #DBEAFE;
--color-badge-text: #0066CC;
--color-input-focus: var(--teal-500);
--color-link-hover: var(--teal-600);
--color-badge-bg: var(--teal-50);
--color-badge-text: var(--teal-700);
--color-code-bg: #F3F4F6;
--color-code-text: #111827;
--focus-shadow: 0 0 0 4px rgba(0, 102, 204, 0.15);
--focus-shadow: 0 0 0 3px rgba(27, 138, 146, 0.15);
}
/* Dark mode alert colors */
@@ -2335,7 +2537,7 @@ html[data-theme="light"] {
.ps-module-card:hover {
border-color: var(--color-brand-primary);
box-shadow: 0 4px 16px rgba(0, 102, 204, 0.1);
box-shadow: 0 4px 16px rgba(27, 138, 146, 0.1);
transform: translateY(-2px);
}
@@ -2351,7 +2553,7 @@ html[data-theme="light"] {
width: 48px;
height: 48px;
border-radius: 50%;
background-color: rgba(0, 102, 204, 0.1);
background-color: rgba(27, 138, 146, 0.1);
color: var(--color-brand-primary);
margin-bottom: var(--spacing-md);
}