diff --git a/CHANGELOG.md b/CHANGELOG.md
index 38789ed..e9ec09c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,73 @@
All notable changes to the Peptide Starter Theme are documented in this file.
+## [2.0.0-alpha.1] - 2026-04-26 — Brand Identity v1.0.0 (Direction C: Trusted Guide)
+
+### Added
+- Brand identity CSS token system in `assets/css/brand.css` (Direction C palette: Teal/Lime/Orange)
+- Poppins + Inter + IBM Plex Mono font loading (Google Fonts) with preload/preconnect
+- Full favicon/PWA/OG asset pack from peptide-repo-brand v1.0.0:
+ - Logo variants: horizontal, horizontal-reverse, horizontal-on-teal, mark, mark-small, wordmark, wordmark-reverse, mono
+ - Favicons: ICO + PNG 16/32/48, apple-touch-icon
+ - PWA icons and manifest
+ - og-default.png (1200×630) for social sharing fallback
+- `inc/verdict-meta.php` — Post meta registration for pr_peptide CPT:
+ - `verdict_state` (required): established|promising|investigational|insufficient|cautionary
+ - `signal_row_1/2/3` (optional): evidence signal labels
+ - Meta box in pr_peptide edit screen with sanitization and nonce protection
+- Verdict badge component (`template-parts/verdict/badge.php`) with state-specific glyphs
+- Verdict card component (`template-parts/verdict/card.php`) for monograph hero with evidence rows
+- Evidence signal row sub-component (`template-parts/verdict/evidence-row.php`)
+- Affiliate disclosure component (`template-parts/affiliate-disclosure.php`) with 3 contexts:
+ - Inline (adjacent to links)
+ - Banner (page-top disclosure)
+ - Footer (persistent sitewide)
+- `page-how-we-review.php` — How We Review Peptides page template with ToC sidebar
+- `page-about.php` — About & Editorial Standards page template with disclosure block
+- Footer "Our Method" link section pointing to verdict explainer and editorial standards
+- Footer affiliate disclosure via template-part (footer context)
+- OG image fallback meta tag in header.php (og-default.png)
+- Favicon and PWA manifest links in header.php with theme-color
+- SVG logo support in header via inline `logo-horizontal.svg` (fallback to text if unavailable)
+- Skip-to-content link in header.php (screen reader text)
+- Reduced-motion media query in brand.css for button transitions
+
+### Changed
+- `header.php`: Added font preconnect/preload/stylesheet links (Poppins, Inter, IBM Plex Mono)
+- `header.php`: Swapped logo function to use inline SVG `logo-horizontal.svg` if available
+- `functions.php`: Updated version to 2.0.0-alpha.1
+- `functions.php`: Added `require_once` for new `inc/verdict-meta.php`
+- `functions.php`: Enqueued `assets/css/brand.css` before main stylesheet (dependency order)
+- `functions.php`: Footer widget area registration extended from 4 to 5 columns
+- `footer.php`: Added "Our Method" footer section with two links
+- `footer.php`: Integrated affiliate disclosure component (footer context)
+- `inc/helpers.php`: Updated `peptide_starter_the_custom_logo()` to prefer SVG logo from `assets/brand/logo-horizontal.svg`
+
+### Styling
+- Brand CSS tokens cascade into existing theme; all new components use semantic token variables
+- Verdict states (5-state taxonomy) signaled by color AND glyph AND label (never color-only)
+- Lime (`#7FD600`) restricted to badge/button backgrounds with ink foreground (WCAG AA compliant)
+- Prefers-reduced-motion honored for chip hover transitions
+- All component BEM classes use `.pr-` prefix (brand) or `.ps-` prefix (theme); no collision with plugin prefixes (`.pn-`, `.psa-`, `.prab-`)
+
+### Accessibility
+- Verdict badge component: `role="img"` + `aria-label="Verdict: {State}"` for screen readers
+- Glyph marked `aria-hidden="true"` to avoid redundant announcement
+- Affiliate disclosure component: `` for context
+- Skip-to-content link: `.screen-reader-text` class, keyboard-focusable
+- All form inputs in verdict meta box properly labeled
+- Evidence rows and card CTAs properly labeled and semantic
+
+### Notes
+- Requires brand assets to be copied into `assets/brand/`. All 9 SVG logos + 7 raster files included.
+- Theme logo currently from hardcoded SVG; custom logo upload still supported via fallback.
+- Verdict system is opt-in: card renders only if `verdict_state` meta is set; graceful fallback if not.
+- Affiliate disclosure copy is hardcoded (not DB-driven) in v1. Can migrate to post meta or settings in v2.
+- Footer extends to 5 columns; "Our Method" section can be replaced via widget for footer-5.
+- Dark mode: verdict colors were validated for light mode only. Dark mode support planned for v1.1.
+
+## [1.7.0] - 2026-04-24 — Remove WooCommerce integration
+
## [1.7.0] - 2026-04-24 — Remove WooCommerce integration
WooCommerce is not used on peptiderepo.com. Removing dead code reduces the asset
diff --git a/apple-touch-icon.png b/apple-touch-icon.png
new file mode 100755
index 0000000..13fb848
Binary files /dev/null and b/apple-touch-icon.png differ
diff --git a/assets/brand/apple-touch-icon.png b/assets/brand/apple-touch-icon.png
new file mode 100755
index 0000000..13fb848
Binary files /dev/null and b/assets/brand/apple-touch-icon.png differ
diff --git a/assets/brand/favicon-16.png b/assets/brand/favicon-16.png
new file mode 100755
index 0000000..79051ee
Binary files /dev/null and b/assets/brand/favicon-16.png differ
diff --git a/assets/brand/favicon-32.png b/assets/brand/favicon-32.png
new file mode 100755
index 0000000..2a7e11f
Binary files /dev/null and b/assets/brand/favicon-32.png differ
diff --git a/assets/brand/favicon-48.png b/assets/brand/favicon-48.png
new file mode 100755
index 0000000..c101221
Binary files /dev/null and b/assets/brand/favicon-48.png differ
diff --git a/assets/brand/icon-192.png b/assets/brand/icon-192.png
new file mode 100755
index 0000000..b516764
Binary files /dev/null and b/assets/brand/icon-192.png differ
diff --git a/assets/brand/icon-512.png b/assets/brand/icon-512.png
new file mode 100755
index 0000000..5c8ceb6
Binary files /dev/null and b/assets/brand/icon-512.png differ
diff --git a/assets/brand/logo-horizontal-on-teal.svg b/assets/brand/logo-horizontal-on-teal.svg
new file mode 100755
index 0000000..eb420c4
--- /dev/null
+++ b/assets/brand/logo-horizontal-on-teal.svg
@@ -0,0 +1,7 @@
+
+
+ PR
+
+
+ Peptide Repo
+
\ No newline at end of file
diff --git a/assets/brand/logo-horizontal-reverse.svg b/assets/brand/logo-horizontal-reverse.svg
new file mode 100755
index 0000000..0981d80
--- /dev/null
+++ b/assets/brand/logo-horizontal-reverse.svg
@@ -0,0 +1,7 @@
+
+
+ PR
+
+
+ Peptide Repo
+
\ No newline at end of file
diff --git a/assets/brand/logo-horizontal.svg b/assets/brand/logo-horizontal.svg
new file mode 100755
index 0000000..aa67573
--- /dev/null
+++ b/assets/brand/logo-horizontal.svg
@@ -0,0 +1,7 @@
+
+
+ PR
+
+
+ Peptide Repo
+
\ No newline at end of file
diff --git a/assets/brand/logo-mark-small.svg b/assets/brand/logo-mark-small.svg
new file mode 100755
index 0000000..9e468bb
--- /dev/null
+++ b/assets/brand/logo-mark-small.svg
@@ -0,0 +1,5 @@
+
+
+ PR
+
+
\ No newline at end of file
diff --git a/assets/brand/logo-mark.svg b/assets/brand/logo-mark.svg
new file mode 100755
index 0000000..513cf51
--- /dev/null
+++ b/assets/brand/logo-mark.svg
@@ -0,0 +1,6 @@
+
+
+ PR
+
+
+
\ No newline at end of file
diff --git a/assets/brand/logo-mono.svg b/assets/brand/logo-mono.svg
new file mode 100755
index 0000000..6706c3f
--- /dev/null
+++ b/assets/brand/logo-mono.svg
@@ -0,0 +1,8 @@
+
+
+ PR
+
+
+
+ Peptide Repo
+
\ No newline at end of file
diff --git a/assets/brand/logo-wordmark-reverse.svg b/assets/brand/logo-wordmark-reverse.svg
new file mode 100755
index 0000000..36f3881
--- /dev/null
+++ b/assets/brand/logo-wordmark-reverse.svg
@@ -0,0 +1,3 @@
+
+ Peptide Repo
+
\ No newline at end of file
diff --git a/assets/brand/logo-wordmark.svg b/assets/brand/logo-wordmark.svg
new file mode 100755
index 0000000..ab94678
--- /dev/null
+++ b/assets/brand/logo-wordmark.svg
@@ -0,0 +1,3 @@
+
+ Peptide Repo
+
\ No newline at end of file
diff --git a/assets/brand/og-default.png b/assets/brand/og-default.png
new file mode 100755
index 0000000..06d10ee
Binary files /dev/null and b/assets/brand/og-default.png differ
diff --git a/assets/brand/og-default.svg b/assets/brand/og-default.svg
new file mode 100755
index 0000000..9053143
--- /dev/null
+++ b/assets/brand/og-default.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+ PR
+
+
+ Peptide Repo
+
+
+
+
+ What the research
+ really says.
+
+
+
+
+
+ Established
+
+ Promising
+
+ Investigational
+
+
\ No newline at end of file
diff --git a/assets/css/brand.css b/assets/css/brand.css
new file mode 100644
index 0000000..3a495d9
--- /dev/null
+++ b/assets/css/brand.css
@@ -0,0 +1,202 @@
+/**
+ * Peptide Repo Brand Identity v1.0.0
+ * Direction C: "The Trusted Guide"
+ *
+ * Contains CSS custom property tokens and brand component styles.
+ * Enqueued before style.css so tokens cascade into existing theme.
+ *
+ * @package peptide-starter
+ */
+
+:root {
+ /* Base palette */
+ --color-teal: #1B8A92;
+ --color-ink: #0D0D0D;
+ --color-lime: #7FD600;
+ --color-orange: #FF8A3D;
+ --color-neutral: #D0D0D0;
+ --color-light: #F5F5F5;
+ --color-white: #FFFFFF;
+
+ /* Teal scale (primary) */
+ --teal-50: #EBF5F6;
+ --teal-100: #CEE7EA;
+ --teal-200: #A6D2D7;
+ --teal-300: #74B8C0;
+ --teal-400: #429DA6;
+ --teal-500: #1B8A92;
+ --teal-600: #147178;
+ --teal-700: #0F585E;
+ --teal-800: #0A3F44;
+ --teal-900: #072A2E;
+
+ /* Lime scale (accent — badge/button only, never body text) */
+ --lime-50: #F5FFE0;
+ --lime-100: #E8FFB8;
+ --lime-200: #D4FF85;
+ --lime-300: #BDFF4D;
+ --lime-400: #A5EE20;
+ --lime-500: #7FD600;
+ --lime-600: #66B000;
+ --lime-700: #4D8A00;
+ --lime-800: #365F00;
+ --lime-900: #1F3700;
+
+ /* Orange scale (caution) */
+ --orange-50: #FFF3EB;
+ --orange-100: #FFDEC4;
+ --orange-200: #FFC299;
+ --orange-300: #FFA66E;
+ --orange-400: #FF9455;
+ --orange-500: #FF8A3D;
+ --orange-600: #E46B1F;
+ --orange-700: #B8520F;
+ --orange-800: #833708;
+ --orange-900: #4F2003;
+
+ /* Gray scale (neutral) */
+ --gray-50: #FAFAFA;
+ --gray-100: #F5F5F5;
+ --gray-200: #E8E8E8;
+ --gray-300: #D0D0D0;
+ --gray-400: #A8A8A8;
+ --gray-500: #808080;
+ --gray-600: #5C5C5C;
+ --gray-700: #3D3D3D;
+ --gray-800: #1F1F1F;
+ --gray-900: #0D0D0D;
+
+ /* Semantic tokens */
+ --text-primary: var(--gray-900);
+ --text-secondary: var(--gray-700);
+ --text-muted: var(--gray-500);
+ --text-inverse: var(--color-white);
+
+ --bg-page: var(--color-white);
+ --bg-surface: var(--color-white);
+ --bg-inset: var(--gray-100);
+ --bg-brand: var(--teal-500);
+ --bg-brand-deep: var(--teal-700);
+
+ --border-default: var(--gray-200);
+ --border-strong: var(--gray-300);
+ --border-brand: var(--teal-500);
+
+ /* Verdict system tokens (the signature) */
+ --verdict-established-bg: var(--teal-500);
+ --verdict-established-fg: var(--color-white);
+ --verdict-promising-bg: var(--lime-500);
+ --verdict-promising-fg: var(--gray-900);
+ --verdict-investigational-bg: var(--orange-500);
+ --verdict-investigational-fg: var(--gray-900);
+ --verdict-insufficient-bg: var(--gray-300);
+ --verdict-insufficient-fg: var(--gray-700);
+ --verdict-cautionary-bg: #C0392B;
+ --verdict-cautionary-fg: var(--color-white);
+
+ /* Spacing & sizing primitives */
+ --radius-sm: 4px;
+ --radius-md: 8px;
+ --radius-lg: 12px;
+ --radius-pill: 999px;
+
+ --shadow-card: 0 1px 2px rgba(13,13,13,0.04), 0 2px 8px rgba(13,13,13,0.04);
+ --shadow-card-hover: 0 2px 4px rgba(13,13,13,0.06), 0 8px 16px rgba(13,13,13,0.06);
+}
+
+.pr-verdict {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 6px 14px 6px 10px;
+ border-radius: var(--radius-pill);
+ font-family: "Poppins", sans-serif;
+ font-weight: 600;
+ font-size: 14px;
+ line-height: 1;
+ letter-spacing: 0.01em;
+ min-height: 32px;
+}
+
+.pr-verdict__glyph {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 20px;
+ height: 20px;
+ border-radius: var(--radius-pill);
+ background: rgba(255,255,255,0.25);
+ font-size: 13px;
+ flex-shrink: 0;
+}
+
+.pr-verdict--established { background: var(--verdict-established-bg); color: var(--verdict-established-fg); }
+.pr-verdict--promising { background: var(--verdict-promising-bg); color: var(--verdict-promising-fg); }
+.pr-verdict--investigational { background: var(--verdict-investigational-bg); color: var(--verdict-investigational-fg); }
+.pr-verdict--insufficient { background: var(--verdict-insufficient-bg); color: var(--verdict-insufficient-fg); }
+.pr-verdict--cautionary { background: var(--verdict-cautionary-bg); color: var(--verdict-cautionary-fg); }
+
+.pr-verdict--insufficient .pr-verdict__glyph { background: rgba(13,13,13,0.10); color: var(--gray-700); }
+.pr-verdict--promising .pr-verdict__glyph,
+.pr-verdict--investigational .pr-verdict__glyph { background: rgba(13,13,13,0.12); color: var(--gray-900); }
+
+.pr-verdict-card {
+ background: var(--bg-surface);
+ border: 1px solid var(--border-default);
+ border-radius: var(--radius-lg);
+ padding: 32px;
+ box-shadow: var(--shadow-card);
+}
+
+.pr-verdict-card__header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 24px; }
+.pr-verdict-card__updated { font-size: 13px; color: var(--text-muted); }
+.pr-verdict-card__title { font-family: "Poppins", sans-serif; font-weight: 700; font-size: 36px; line-height: 1.2; margin: 0 0 8px; color: var(--text-primary); }
+.pr-verdict-card__summary { font-family: "Inter", sans-serif; font-size: 18px; line-height: 1.4; color: var(--text-secondary); margin-bottom: 24px; }
+
+.pr-evidence-row {
+ background: var(--bg-inset);
+ border-radius: var(--radius-md);
+ padding: 16px 20px;
+ margin-bottom: 24px;
+}
+
+.pr-evidence-row__item { display: flex; align-items: flex-start; gap: 12px; font-family: "Inter", sans-serif; font-size: 15px; line-height: 1.5; color: var(--text-primary); }
+.pr-evidence-row__item + .pr-evidence-row__item { margin-top: 10px; }
+.pr-evidence-row__glyph { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; flex-shrink: 0; font-weight: 600; }
+
+.pr-verdict-card__verdict-label { font-family: "Poppins", sans-serif; font-weight: 600; font-size: 14px; color: var(--text-secondary); margin-bottom: 8px; }
+.pr-verdict-card__verdict-text { font-family: "Inter", sans-serif; font-size: 16px; line-height: 1.6; color: var(--text-primary); margin-bottom: 24px; }
+.pr-verdict-card__cta-group { display: flex; gap: 16px; flex-wrap: wrap; }
+.pr-verdict-card__cta-link { color: var(--teal-600); text-decoration: none; font-weight: 600; font-size: 15px; }
+.pr-verdict-card__cta-link:hover { color: var(--teal-700); text-decoration: underline; }
+
+.pr-disclosure {
+ background: var(--bg-inset);
+ border-left: 4px solid var(--teal-500);
+ border-radius: var(--radius-md);
+ padding: 12px 16px;
+ font-family: "Inter", sans-serif;
+ font-size: 14px;
+ color: var(--text-secondary);
+ line-height: 1.5;
+}
+
+.pr-disclosure__label { font-family: "Poppins", sans-serif; font-weight: 600; color: var(--text-secondary); }
+.pr-disclosure--inline { margin: 12px 0; }
+.pr-disclosure--banner { background: var(--teal-50); border: 1px solid var(--teal-200); border-left: 4px solid var(--teal-500); padding: 20px 24px; margin-bottom: 24px; font-size: 14px; }
+.pr-disclosure--footer { font-size: 13px; }
+
+.pr-chip-row { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 24px; }
+.pr-chip { display: inline-flex; align-items: center; gap: 8px; padding: 8px 16px; border: 1.5px solid var(--border-default); border-radius: var(--radius-pill); background: transparent; color: var(--text-primary); text-decoration: none; font-family: "Inter", sans-serif; font-weight: 600; font-size: 14px; cursor: pointer; transition: all 0.2s ease; }
+.pr-chip:hover { border-color: var(--teal-500); color: var(--teal-600); }
+.pr-chip--active { background: var(--teal-500); border-color: var(--teal-500); color: var(--color-white); }
+
+@media (prefers-reduced-motion: reduce) {
+ .pr-chip { transition: none; }
+}
+
+@media (max-width: 768px) {
+ .pr-verdict-card { padding: 20px; }
+ .pr-verdict-card__title { font-size: 28px; }
+ .pr-verdict-card__summary { font-size: 16px; }
+}
diff --git a/favicon-16.png b/favicon-16.png
new file mode 100755
index 0000000..79051ee
Binary files /dev/null and b/favicon-16.png differ
diff --git a/favicon-32.png b/favicon-32.png
new file mode 100755
index 0000000..2a7e11f
Binary files /dev/null and b/favicon-32.png differ
diff --git a/favicon-48.png b/favicon-48.png
new file mode 100755
index 0000000..c101221
Binary files /dev/null and b/favicon-48.png differ
diff --git a/favicon.ico b/favicon.ico
new file mode 100755
index 0000000..c0dee47
Binary files /dev/null and b/favicon.ico differ
diff --git a/footer.php b/footer.php
index 2ff1809..6cdea11 100644
--- a/footer.php
+++ b/footer.php
@@ -23,7 +23,7 @@
';
@@ -65,6 +71,15 @@
+
+ 'footer' )
+ );
+ ?>
+
>
diff --git a/icon-192.png b/icon-192.png
new file mode 100755
index 0000000..b516764
Binary files /dev/null and b/icon-192.png differ
diff --git a/icon-512.png b/icon-512.png
new file mode 100755
index 0000000..5c8ceb6
Binary files /dev/null and b/icon-512.png differ
diff --git a/inc/helpers.php b/inc/helpers.php
index 6fdbeaa..9c1ddbc 100644
--- a/inc/helpers.php
+++ b/inc/helpers.php
@@ -136,6 +136,15 @@ function peptide_starter_the_custom_logo() {
the_custom_logo();
return;
}
+ // Use SVG logo if available
+ $logo_path = get_template_directory() . '/assets/brand/logo-horizontal.svg';
+ if ( file_exists( $logo_path ) ) {
+ echo '';
+ include $logo_path;
+ echo ' ';
+ return;
+ }
+ // Fallback to text
$site_name = get_bloginfo( 'name' );
echo '' . esc_html( $site_name ) . ' ';
}
diff --git a/inc/verdict-meta.php b/inc/verdict-meta.php
new file mode 100644
index 0000000..8ffef81
--- /dev/null
+++ b/inc/verdict-meta.php
@@ -0,0 +1,179 @@
+ 'string',
+ 'description' => 'Verdict classification state',
+ 'single' => true,
+ 'show_in_rest' => true,
+ 'auth_callback' => '__return_true',
+ 'sanitize_callback' => function ( $value ) use ( $allowed_states ) {
+ return in_array( $value, $allowed_states, true ) ? $value : '';
+ },
+ )
+ );
+
+ // Register signal row meta (up to 3).
+ for ( $i = 1; $i <= 3; $i++ ) {
+ register_post_meta(
+ 'pr_peptide',
+ 'signal_row_' . $i,
+ array(
+ 'type' => 'string',
+ 'description' => 'Evidence signal row ' . $i,
+ 'single' => true,
+ 'show_in_rest' => true,
+ 'auth_callback' => '__return_true',
+ 'sanitize_callback' => 'sanitize_text_field',
+ )
+ );
+ }
+}
+add_action( 'init', 'peptide_starter_register_verdict_meta' );
+
+/**
+ * Add verdict meta box to pr_peptide edit screen.
+ *
+ * @return void
+ */
+function peptide_starter_add_verdict_meta_box() {
+ add_meta_box(
+ 'peptide_starter_verdict',
+ esc_html__( 'Verdict System', 'peptide-starter' ),
+ 'peptide_starter_render_verdict_meta_box',
+ 'pr_peptide',
+ 'normal',
+ 'high'
+ );
+}
+add_action( 'add_meta_boxes', 'peptide_starter_add_verdict_meta_box' );
+
+/**
+ * Render verdict meta box HTML.
+ *
+ * @param WP_Post $post The post object.
+ * @return void
+ */
+function peptide_starter_render_verdict_meta_box( $post ) {
+ wp_nonce_field( 'peptide_starter_verdict_nonce', 'peptide_starter_verdict_nonce' );
+
+ $verdict_state = get_post_meta( $post->ID, 'verdict_state', true );
+ $signal_row_1 = get_post_meta( $post->ID, 'signal_row_1', true );
+ $signal_row_2 = get_post_meta( $post->ID, 'signal_row_2', true );
+ $signal_row_3 = get_post_meta( $post->ID, 'signal_row_3', true );
+ $allowed_states = array(
+ 'established' => esc_html__( 'Established', 'peptide-starter' ),
+ 'promising' => esc_html__( 'Promising', 'peptide-starter' ),
+ 'investigational' => esc_html__( 'Investigational', 'peptide-starter' ),
+ 'insufficient' => esc_html__( 'Insufficient Evidence', 'peptide-starter' ),
+ 'cautionary' => esc_html__( 'Cautionary', 'peptide-starter' ),
+ );
+ ?>
+
+ post_type ) {
+ return;
+ }
+
+ // Allow only editors and admins.
+ if ( ! current_user_can( 'edit_post', $post_id ) ) {
+ return;
+ }
+
+ $allowed_states = array( 'established', 'promising', 'investigational', 'insufficient', 'cautionary' );
+
+ // Save verdict_state.
+ if ( isset( $_POST['verdict_state'] ) ) {
+ $state = sanitize_text_field( wp_unslash( $_POST['verdict_state'] ) );
+ if ( in_array( $state, $allowed_states, true ) ) {
+ update_post_meta( $post_id, 'verdict_state', $state );
+ } else {
+ delete_post_meta( $post_id, 'verdict_state' );
+ }
+ }
+
+ // Save signal rows.
+ for ( $i = 1; $i <= 3; $i++ ) {
+ $field_name = 'signal_row_' . $i;
+ if ( isset( $_POST[ $field_name ] ) ) {
+ $value = sanitize_text_field( wp_unslash( $_POST[ $field_name ] ) );
+ if ( ! empty( $value ) ) {
+ update_post_meta( $post_id, $field_name, $value );
+ } else {
+ delete_post_meta( $post_id, $field_name );
+ }
+ }
+ }
+}
+add_action( 'save_post', 'peptide_starter_save_verdict_meta', 10, 2 );
diff --git a/og-default.png b/og-default.png
new file mode 100755
index 0000000..06d10ee
Binary files /dev/null and b/og-default.png differ
diff --git a/page-about.php b/page-about.php
new file mode 100644
index 0000000..52559ce
--- /dev/null
+++ b/page-about.php
@@ -0,0 +1,45 @@
+
+
+
+
+
+
>
+
+
+
+
+
+
+
+
+
+
+ 'banner' )
+ );
+ ?>
+
+
+
+
+
+
+
+
+
+
+' . esc_html__( 'How we work', 'peptide-starter' ) . ' →';
+
+switch ( $context ) {
+ case 'banner':
+ ?>
+
+
+
+
+
+ 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' ),
+);
+
+// Early exit if invalid state.
+if ( ! isset( $states[ $verdict_state ] ) ) {
+ return;
+}
+
+$state_info = $states[ $verdict_state ];
+?>
+
+
+
+
+
+
diff --git a/template-parts/verdict/card.php b/template-parts/verdict/card.php
new file mode 100644
index 0000000..095e04a
--- /dev/null
+++ b/template-parts/verdict/card.php
@@ -0,0 +1,99 @@
+ $i === 1 ? '✓' : ( $i === 2 ? '!' : '?' ),
+ 'label' => $signal_text,
+ );
+ }
+}
+
+$post = get_post( $post_id );
+?>
+
+
+
+
+
+
+
+
+
+
+ $signals )
+ );
+ ?>
+
+
+
+
+
+
+
+
+
diff --git a/template-parts/verdict/evidence-row.php b/template-parts/verdict/evidence-row.php
new file mode 100644
index 0000000..482af8c
--- /dev/null
+++ b/template-parts/verdict/evidence-row.php
@@ -0,0 +1,34 @@
+ '...', 'label' => '...']
+ *
+ * @package peptide-starter
+ */
+
+if ( ! defined( 'ABSPATH' ) ) {
+ exit;
+}
+
+$signals = isset( $args['signals'] ) && is_array( $args['signals'] ) ? $args['signals'] : array();
+
+if ( empty( $signals ) ) {
+ return;
+}
+?>
+