diff --git a/public/class-peptide-news-public.php b/public/class-peptide-news-public.php
index 24db92d..88a2bf1 100644
--- a/public/class-peptide-news-public.php
+++ b/public/class-peptide-news-public.php
@@ -75,7 +75,7 @@ class Peptide_News_Public {
public function render_shortcode( $atts ) {
$atts = shortcode_atts( array(
'count' => get_option( 'peptide_news_articles_count', 10 ),
- 'layout' => 'card', // card | compact | list
+ 'layout' => 'list', // card | compact | list
), $atts, 'peptide_news' );
$articles = $this->get_articles( absint( $atts['count'] ) );
@@ -130,13 +130,14 @@ class Peptide_News_Public {
-
- ai_summary ) ? $article->ai_summary : $article->excerpt;
- echo esc_html( $display_text );
- ?>
-
+ ai_summary ) ? $article->ai_summary : ( $article->excerpt ?? '' );
+ if ( ! empty( $display_text ) ) : ?>
+
+
+
+
author ) ) : ?>
diff --git a/public/css/public-style.css b/public/css/public-style.css
index 24bc1f4..11fb011 100644
--- a/public/css/public-style.css
+++ b/public/css/public-style.css
@@ -4,67 +4,212 @@
* Styles for the front-end display of peptide news articles.
*
* @since 1.0.0
+ * @since 1.2.2 Rewritten for list layout with thumbnail left / text right.
*/
-/* Article grid / card layout */
-.peptide-news-container {
- display: grid;
- gap: 1.5rem;
+/* ── Feed container ────────────────────────────────────────────── */
+.pn-news-feed {
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ max-width: 900px;
+ margin: 0 auto;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
}
-.article-card {
- background: #fff;
- border: 1px solid #e0e0e0;
- padding: 1.25rem;
+.pn-no-articles p {
+ text-align: center;
+ color: #666;
+ padding: 2rem 1rem;
+ font-size: 0.9375rem;
+}
+
+/* ── Individual article row ────────────────────────────────────── */
+.pn-article {
+ display: flex;
+ flex-direction: row;
+ align-items: flex-start;
+ gap: 1.25rem;
+ padding: 1.25rem 0;
+ border-bottom: 1px solid #e8e8e8;
+ transition: background-color 0.15s ease;
+}
+
+.pn-article:last-child {
+ border-bottom: none;
+}
+
+.pn-article:hover {
+ background-color: #fafbfc;
+}
+
+/* ── Thumbnail (left column, fixed width) ──────────────────────── */
+.pn-article-thumb {
+ flex: 0 0 160px;
+ width: 160px;
+ min-height: 100px;
+ overflow: hidden;
border-radius: 6px;
- transition: box-shadow 0.2s ease;
}
-.article-card:hover {
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+.pn-article-thumb a {
+ display: block;
+ line-height: 0;
}
-.article-title {
- font-size: 1.125rem;
- font-weight: 600;
- color: #1a1a1a;
- margin: 0 0 0.5rem;
+.pn-article-thumb img {
+ width: 100%;
+ height: 110px;
+ object-fit: cover;
+ border-radius: 6px;
+ transition: transform 0.2s ease;
+}
+
+.pn-article:hover .pn-article-thumb img {
+ transform: scale(1.03);
+}
+
+/* ── Content (right column, flexible) ──────────────────────────── */
+.pn-article-content {
+ flex: 1;
+ min-width: 0;
+}
+
+/* ── Meta line (source · date) ─────────────────────────────────── */
+.pn-article-meta {
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ font-size: 0.8rem;
+ color: #777;
+ margin-bottom: 0.35rem;
line-height: 1.4;
}
-.article-title a {
- color: inherit;
- text-decoration: none;
+.pn-source {
+ font-weight: 600;
+ color: #555;
+ text-transform: uppercase;
+ letter-spacing: 0.025em;
+ font-size: 0.7rem;
}
-.article-title a:hover {
+.pn-separator {
+ color: #ccc;
+}
+
+.pn-date {
+ color: #888;
+}
+
+/* ── Title ─────────────────────────────────────────────────────── */
+.pn-article-title {
+ font-size: 1.05rem;
+ font-weight: 600;
+ line-height: 1.4;
+ margin: 0 0 0.4rem;
+ color: #1a1a2e;
+}
+
+.pn-article-title a {
+ color: inherit;
+ text-decoration: none;
+ transition: color 0.15s ease;
+}
+
+.pn-article-title a:hover {
color: #0073aa;
}
-.article-meta {
- font-size: 0.8125rem;
- color: #666;
- margin-bottom: 0.75rem;
+.pn-article-title a:focus,
+.pn-article-thumb a:focus {
+ outline: 2px solid #0073aa;
+ outline-offset: 2px;
}
-.article-excerpt {
- font-size: 0.9375rem;
+/* ── Excerpt / AI summary ──────────────────────────────────────── */
+.pn-article-excerpt {
+ font-size: 0.875rem;
line-height: 1.6;
- color: #444;
-}
-
-.article-source {
- display: inline-block;
- font-size: 0.75rem;
- background: #f0f0f0;
- padding: 0.2rem 0.5rem;
- border-radius: 3px;
color: #555;
+ margin: 0 0 0.5rem;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
}
-.article-thumbnail {
- width: 100%;
- height: auto;
- border-radius: 4px;
- margin-bottom: 0.75rem;
+/* ── Author ────────────────────────────────────────────────────── */
+.pn-author {
+ display: inline-block;
+ font-size: 0.775rem;
+ color: #888;
+ margin-bottom: 0.35rem;
+}
+
+.pn-author::before {
+ content: "By ";
+ font-style: italic;
+}
+
+/* ── Tags ──────────────────────────────────────────────────────── */
+.pn-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.35rem;
+ margin-top: 0.25rem;
+}
+
+.pn-tag {
+ display: inline-block;
+ font-size: 0.7rem;
+ background: #f0f4f8;
+ color: #4a6fa5;
+ padding: 0.15rem 0.55rem;
+ border-radius: 12px;
+ line-height: 1.5;
+ font-weight: 500;
+}
+
+/* ── Compact layout override (for widgets) ─────────────────────── */
+.pn-layout-compact .pn-article {
+ gap: 0.85rem;
+ padding: 0.75rem 0;
+}
+
+.pn-layout-compact .pn-article-thumb {
+ flex: 0 0 80px;
+ width: 80px;
+ min-height: 56px;
+}
+
+.pn-layout-compact .pn-article-thumb img {
+ height: 56px;
+}
+
+.pn-layout-compact .pn-article-title {
+ font-size: 0.9rem;
+}
+
+.pn-layout-compact .pn-article-excerpt,
+.pn-layout-compact .pn-author,
+.pn-layout-compact .pn-tags {
+ display: none;
+}
+
+/* ── Responsive: stack on small screens ────────────────────────── */
+@media (max-width: 600px) {
+ .pn-article {
+ flex-direction: column;
+ gap: 0.75rem;
+ }
+
+ .pn-article-thumb {
+ flex: none;
+ width: 100%;
+ }
+
+ .pn-article-thumb img {
+ height: 180px;
+ }
}