Phase 1: Homepage seamless design - add gradient transitions

- Added gradient transitions between sections in global.css
- Portfolio section now has gradient-top (dark to white fade)
- Blog section now has gradient-bottom (white fade from dark)
- Reduced portfolio overlay opacity from 0.85 to 0.65
- Added border to blog cards for white-on-white visibility
- Blog cards now have primary color accent on hover
This commit is contained in:
Kunthawat Greethong
2026-05-21 14:29:31 +07:00
parent 9db1d12b9c
commit b9cd01a55f
85 changed files with 8005 additions and 4702 deletions

View File

@@ -1,104 +1,96 @@
---
import Base from '../../layouts/Base.astro';
import Navigation from '../../components/Navigation.astro';
import Hero from '../../components/Hero.astro';
import Footer from '../../components/Footer.astro';
import PageHero from '../../components/PageHero.astro';
import { getCollection, render } from 'astro:content';
export function getStaticPaths() {
const posts = [
{ slug: "5-ways-ai-increase-sales", title: "5 วิธี AI เพิ่มยอดขาย", image: "/images/blog/5-ways-ai-increase-sales.jpg" },
{ slug: "ai-content-google-love", title: "AI Content ที่ Google รัก", image: "/images/blog/ai-content-google-love.jpg" },
{ slug: "ai-for-sme-thailand", title: "AI สำหรับ SME ไทย", image: "/images/blog/ai-for-sme-thailand.jpg" },
{ slug: "back-office-automation", title: "Back Office Automation", image: "/images/blog/back-office-automation.jpg" },
{ slug: "chatbot-business-case-study", title: "Chatbot Business Case Study", image: "/images/blog/chatbot-business-case-study.jpg" },
{ slug: "data-driven-marketing", title: "Data Driven Marketing", image: "/images/blog/data-driven-marketing.jpg" },
{ slug: "digital-transformation-guide", title: "Digital Transformation Guide", image: "/images/blog/digital-transformation.jpg" },
{ slug: "marketing-automation-guide", title: "Marketing Automation Guide", image: "/images/blog/marketing-automation-guide.jpg" },
{ slug: "seo-2026-business-guide", title: "SEO 2026 สำหรับ Business", image: "/images/blog/seo-2026-business-guide.jpg" },
{ slug: "website-2026-must-have", title: "Website 2026 Must Have", image: "/images/blog/website-2026-must-have.jpg" }
];
// For SSR mode, use Astro.params directly
const { slug } = Astro.params;
return posts.map(post => ({
params: { slug: post.slug },
props: { post }
}));
const allPosts = await getCollection('blog');
// Use id for matching since slug might be undefined
const post = allPosts.find(p => p.id === slug);
if (!post) {
return Astro.redirect('/404');
}
const { post } = Astro.props;
const { Content } = await render(post);
const related = allPosts
.filter(p => p.id !== post.id)
.sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf())
.slice(0, 3);
const formattedDate = post.data.date.toLocaleDateString('th-TH', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
---
<Base title={`${post.title} | MoreminiMore`}>
<Base title={`${post.data.title} | MoreminiMore`}>
<Navigation />
<Hero
title={post.title}
subtitle="อ่านบทความล่าสุดเกี่ยวกับ AI, Marketing และเทคโนโลยีสำหรับธุรกิจ"
badge="บทความ"
image={post.image}
theme="yellow"
showCTA={false}
<PageHero
badge={post.data.category}
title={post.data.title}
subtitle={formattedDate}
/>
<!-- Article Section -->
<!-- Article Image -->
{post.data.image && (
<div class="article-image">
<div class="container">
<img src={post.data.image} alt={post.data.title} />
</div>
</div>
)}
<!-- Article Content -->
<section class="section article-section">
<div class="container">
<div class="article-layout">
<div class="article-grid">
<article class="article-content">
<div class="article-hero">
<img src={post.image} alt={post.title} />
</div>
<div class="article-body">
<p class="article-lead">
ในยุคที่ AI กลายเป็นเครื่องมือสำคัญในการทำธุรกิจ หลายคนอาจสงสัยว่า AI สามารถช่วยเพิ่มยอดขายได้อย่างไร
</p>
<h2>AI กับการเพิ่มยอดขาย</h2>
<p>
AI สามารถช่วยเพิ่มยอดขายได้หลายวิธี ไม่ว่าจะเป็นการวิเคราะห์พฤติกรรมลูกค้า การทำ Personalization
การ automate การตลาด และการให้บริการลูกค้าตลอด 24 ชั่วโมง
</p>
<h2>วิธีที่ 1: Chatbot ตอบคำถามลูกค้า</h2>
<p>
Chatbot ที่ขับเคลื่อนด้วย AI สามารถตอบคำถามลูกค้าได้ตลอด 24 ชั่วโมง โดยไม่ต้องมีพนักงาน wake อยู่
นอกจากนี้ยังสามารถเก็บข้อมูลลูกค้าและแนะนำสินค้าที่เหมาะสมได้อีกด้วย
</p>
<h2>วิธีที่ 2: วิเคราะห์ข้อมูลลูกค้า</h2>
<p>
AI สามารถวิเคราะห์ข้อมูลลูกค้าเพื่อหา pattern และ insights ที่ซ่อนอยู่ ทำให้ธุรกิจเข้าใจลูกค้าได้ลึกขึ้น
และสามารถนำไปปรับปรุงสินค้าหรือบริการได้ตรงจุด
</p>
<h2>วิธีที่ 3: Personalization</h2>
<p>
AI สามารถสร้างประสบการณ์ที่ personalized ให้กับลูกค้าแต่ละคน ไม่ว่าจะเป็นการแนะนำสินค้าที่สนใจ
การส่ง offer ที่เหมาะสม หรือการปรับ content ให้ตรงกับความต้องการ
</p>
<h2>สรุป</h2>
<p>
AI สามารถช่วยเพิ่มยอดขายได้อย่างมาก สิ่งสำคัญคือการเลือกใช้ AI ให้เหมาะกับธุรกิจของคุณ
และเริ่มต้นจากจุดที่มี impact สูงสุดก่อน
</p>
<Content />
</div>
</article>
<!-- Sidebar -->
<aside class="article-sidebar">
<div class="sidebar-widget">
<h3>บริการที่เกี่ยวข้อง</h3>
<ul class="related-services">
<li><a href="/services/ai">AI Automation</a></li>
<li><a href="/services/marketing">Marketing Automation</a></li>
<li><a href="/services/webdev">พัฒนาเว็บไซต์</a></li>
</ul>
<!-- About -->
<div class="sidebar-card">
<h3 class="sidebar-title">เกี่ยวกับ MoreminiMore</h3>
<p class="sidebar-text">
ดิจิทัลเอเจนซี่ที่ช่วยให้ธุรกิจไทยเติบโตด้วยเทคโนโลยีสมัยใหม่
</p>
<a href="/about" class="btn btn-dark btn-sm">ดูเพิ่มเติม</a>
</div>
<div class="sidebar-widget">
<h3>ติดต่อปรึกษา</h3>
<p>สนใจใช้ AI ในธุรกิจของคุณ?</p>
<a href="/contact" class="btn btn-primary">ปรึกษาฟรี</a>
<!-- Contact -->
<div class="sidebar-card">
<h3 class="sidebar-title">สนใจบริการ?</h3>
<p class="sidebar-text">ติดต่อเราได้เลย ปรึกษาฟรี!</p>
<a href="/contact" class="btn btn-primary btn-sm">ติดต่อเรา</a>
<a href="tel:0809955945" class="btn btn-outline btn-sm" style="margin-top: 8px;">080-995-5945</a>
</div>
<!-- Related Posts -->
{related.length > 0 && (
<div class="sidebar-card">
<h3 class="sidebar-title">บทความที่เกี่ยวข้อง</h3>
<div class="related-list">
{related.map(r => (
<a href={`/blog/${r.id}`} class="related-item">
<img src={r.data.image} alt={r.data.title} />
<span>{r.data.title}</span>
</a>
))}
</div>
</div>
)}
</aside>
</div>
</div>
@@ -108,134 +100,206 @@ const { post } = Astro.props;
</Base>
<style>
.hero {
padding: 140px 0 60px;
background: var(--color-black);
.article-image {
padding: 40px 0;
background: var(--color-gray-100);
}
.back-link {
display: inline-block;
color: var(--color-primary);
font-size: 14px;
margin-bottom: 24px;
transition: opacity 0.2s;
}
.back-link:hover {
opacity: 0.8;
}
.hero-title {
font-size: clamp(32px, 5vw, 48px);
font-weight: 800;
color: var(--color-white);
max-width: 800px;
.article-image img {
width: 100%;
max-height: 500px;
object-fit: cover;
border-radius: 20px;
}
.article-section {
background: var(--color-white);
padding-top: 60px;
}
.article-layout {
.article-grid {
display: grid;
grid-template-columns: 1fr 320px;
gap: 64px;
}
.article-hero {
margin-bottom: 48px;
border-radius: 16px;
overflow: hidden;
}
.article-hero img {
width: 100%;
height: auto;
grid-template-columns: 1fr 360px;
gap: 60px;
}
.article-body {
max-width: 720px;
}
.article-lead {
font-size: 20px;
color: var(--color-medium-gray);
font-size: 18px;
line-height: 1.8;
margin-bottom: 32px;
padding-bottom: 32px;
border-bottom: 1px solid #eee;
color: var(--color-gray-600);
}
.article-body h2 {
font-size: 24px;
.article-body :global(h2) {
font-size: 28px;
font-weight: 700;
margin: 40px 0 16px;
color: var(--color-dark);
margin: 40px 0 20px;
}
.article-body p {
font-size: 16px;
color: var(--color-medium-gray);
line-height: 1.8;
.article-body :global(h3) {
font-size: 22px;
font-weight: 700;
color: var(--color-dark);
margin: 32px 0 16px;
}
.article-body :global(p) {
margin-bottom: 20px;
}
.article-body :global(ul), .article-body :global(ol) {
margin: 20px 0;
padding-left: 24px;
}
.article-body :global(li) {
margin-bottom: 12px;
}
.article-body :global(a) {
color: var(--color-primary);
font-weight: 600;
}
.article-body :global(a:hover) {
text-decoration: underline;
}
.article-body :global(blockquote) {
border-left: 4px solid var(--color-primary);
padding-left: 24px;
margin: 32px 0;
font-style: italic;
color: var(--color-gray-600);
}
.article-body :global(img) {
border-radius: 12px;
margin: 24px 0;
}
/* Sidebar */
.article-sidebar {
display: flex;
flex-direction: column;
gap: 32px;
gap: 24px;
}
.sidebar-widget {
background: var(--color-light-gray);
.sidebar-card {
background: var(--color-gray-100);
border-radius: 16px;
padding: 28px;
}
.sidebar-widget h3 {
.sidebar-title {
font-size: 18px;
font-weight: 700;
color: var(--color-dark);
margin-bottom: 16px;
}
.related-services {
list-style: none;
padding: 0;
}
.related-services li {
margin-bottom: 12px;
}
.related-services a {
color: var(--color-medium-gray);
.sidebar-text {
font-size: 14px;
transition: color 0.2s;
}
.related-services a:hover {
color: var(--color-primary);
}
.sidebar-widget p {
font-size: 14px;
color: var(--color-medium-gray);
color: var(--color-gray-600);
line-height: 1.6;
margin-bottom: 16px;
}
.btn-sm {
padding: 12px 20px;
font-size: 14px;
border-radius: 8px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
display: inline-flex;
align-items: center;
justify-content: center;
}
.btn-dark {
background: var(--color-dark);
color: var(--color-white);
}
.btn-dark:hover {
background: var(--color-dark-light);
}
.btn-primary {
background: var(--color-primary);
color: var(--color-black);
}
.btn-primary:hover {
background: var(--color-primary-dark);
}
.btn-outline {
background: transparent;
border: 2px solid var(--color-dark);
color: var(--color-dark);
}
.btn-outline:hover {
background: var(--color-dark);
color: var(--color-white);
}
/* Related Posts */
.related-list {
display: flex;
flex-direction: column;
gap: 16px;
}
.related-item {
display: flex;
align-items: center;
gap: 12px;
padding: 12px;
background: var(--color-white);
border-radius: 12px;
transition: all 0.3s ease;
}
.related-item:hover {
transform: translateX(4px);
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
.related-item img {
width: 60px;
height: 60px;
object-fit: cover;
border-radius: 8px;
flex-shrink: 0;
}
.related-item span {
font-size: 14px;
font-weight: 600;
color: var(--color-dark);
line-height: 1.3;
}
@media (max-width: 1024px) {
.article-layout {
.article-grid {
grid-template-columns: 1fr;
}
.article-sidebar {
order: -1;
flex-direction: row;
flex-wrap: wrap;
display: grid;
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 640px) {
.article-sidebar {
grid-template-columns: 1fr;
}
.sidebar-widget {
flex: 1;
min-width: 280px;
.article-body {
font-size: 16px;
}
}
</style>

View File

@@ -1,147 +1,58 @@
---
import Base from '../../layouts/Base.astro';
import Navigation from '../../components/Navigation.astro';
import Hero from '../../components/Hero.astro';
import Footer from '../../components/Footer.astro';
import PageHero from '../../components/PageHero.astro';
import BlogCard from '../../components/BlogCard.astro';
import { getCollection } from 'astro:content';
const blogPosts = [
{
slug: "5-ways-ai-increase-sales",
title: "5 วิธี AI เพิ่มยอดขาย",
excerpt: "เรียนรู้ 5 วิธีที่ AI สามารถช่วยเพิ่มยอดขายของคุณได้อย่างมีประสิทธิภาพ",
image: "/images/blog/5-ways-ai-increase-sales.jpg",
date: "2026-01-15",
category: "AI"
},
{
slug: "ai-content-google-love",
title: "AI Content ที่ Google รัก",
excerpt: "วิธีสร้าง AI Content ที่ท z้ both user-friendly และ SEO-friendly",
image: "/images/blog/ai-content-google-love.jpg",
date: "2026-01-10",
category: "AI"
},
{
slug: "ai-for-sme-thailand",
title: "AI สำหรับ SME ไทย",
excerpt: "คู่มือการใช้ AI สำหรับธุรกิจ SME ไทยเพื่อเพิ่มขีดความสามารถในการแข่งขัน",
image: "/images/blog/ai-for-sme-thailand.jpg",
date: "2026-01-05",
category: "AI"
},
{
slug: "back-office-automation",
title: "Back Office Automation",
excerpt: "ลดต้นทุนและเพิ่มประสิทธิภาพด้วยระบบอัตโนมัติ",
image: "/images/blog/back-office-automation.jpg",
date: "2025-12-28",
category: "Automation"
},
{
slug: "chatbot-business-case-study",
title: "Chatbot Business Case Study",
excerpt: "กรณีศึกษาการใช้ Chatbot เพื่อเพิ่มยอดขายและลดต้นทุนการให้บริการ",
image: "/images/blog/chatbot-business-case-study.jpg",
date: "2025-12-20",
category: "Chatbot"
},
{
slug: "data-driven-marketing",
title: "Data Driven Marketing",
excerpt: "การตลาดที่ขับเคลื่อนด้วยข้อมูลเพื่อผลลัพธ์ที่ดีที่สุด",
image: "/images/blog/data-driven-marketing.jpg",
date: "2025-12-15",
category: "Marketing"
},
{
slug: "digital-transformation-guide",
title: "Digital Transformation Guide",
excerpt: "คู่มือฉบับสมบูรณ์สำหรับการ transform ธุรกิจของคุณสู่ดิจิทัล",
image: "/images/blog/digital-transformation.jpg",
date: "2025-12-10",
category: "Business"
},
{
slug: "marketing-automation-guide",
title: "Marketing Automation Guide",
excerpt: "เรียนรู้พื้นฐานของ Marketing Automation และวิธีเริ่มต้น",
image: "/images/blog/marketing-automation-guide.jpg",
date: "2025-12-05",
category: "Marketing"
},
{
slug: "seo-2026-business-guide",
title: "SEO 2026 Business Guide",
excerpt: "การทำ SEO สำหรับธุรกิจในยุค 2026 ต้องรู้อะไรบ้าง",
image: "/images/blog/seo-2026-business-guide.jpg",
date: "2025-11-28",
category: "SEO"
},
{
slug: "website-2026-must-have",
title: "Website 2026 Must Have",
excerpt: "ฟีเจอร์ที่เว็บไซต์ต้องมีในปี 2026",
image: "/images/blog/website-2026-must-have.jpg",
date: "2025-11-20",
category: "Web Dev"
}
];
const categories = ["ทั้งหมด", "AI", "Marketing", "Automation", "SEO", "Web Dev", "Business", "Chatbot"];
function formatDate(dateStr: string) {
const date = new Date(dateStr);
return date.toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' });
}
const blogPosts = await getCollection('blog');
const sortedPosts = blogPosts.sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf());
---
<Base title="บทความ | MoreminiMore">
<Base title="บทความ | MoreminiMore - รับทำเว็บไซต์ SEO AI Chatbot">
<Navigation />
<!-- Hero Section -->
<Hero
title="ความรู้ด้านดิจิทัล"
subtitle="อ่านบทความล่าสุดเกี่ยวกับ AI, Marketing และเทคโนโลยีสำหรับธุรกิจ"
<PageHero
badge="บทความ"
image="/images/hero/blog-hero.jpg"
theme="yellow"
showCTA={false}
variant="centered"
size="compact"
title="บทความ"
subtitle="ความรู้ด้านดิจิทัลและเทคนิคใหม่ๆ สำหรับธุรกิจไทย"
/>
<!-- Blog Section -->
<section class="section blog-section">
<div class="container">
<!-- Featured Post -->
<div class="featured-post">
<a href={`/blog/${blogPosts[0].slug}`} class="featured-card">
<!-- Featured Post -->
{sortedPosts.length > 0 && (
<section class="section featured-section">
<div class="container">
<a href={`/blog/${sortedPosts[0].id}`} class="featured-card">
<div class="featured-image">
<img src={blogPosts[0].image} alt={blogPosts[0].title} />
{sortedPosts[0].data.image && (
<img src={sortedPosts[0].data.image} alt={sortedPosts[0].data.title} loading="eager" />
)}
</div>
<div class="featured-content">
<span class="category-badge">{blogPosts[0].category}</span>
<h2 class="featured-title">{blogPosts[0].title}</h2>
<p class="featured-excerpt">{blogPosts[0].excerpt}</p>
<span class="category-badge">{sortedPosts[0].data.category}</span>
<h2 class="featured-title">{sortedPosts[0].data.title}</h2>
<p class="featured-excerpt">{sortedPosts[0].data.excerpt}</p>
<span class="read-more">อ่านต่อ →</span>
</div>
</a>
</div>
</section>
)}
<!-- Blog Grid -->
<!-- Blog Grid -->
<section class="section blog-section">
<div class="container">
<div class="blog-grid">
{blogPosts.slice(1).map((post) => (
<a href={`/blog/${post.slug}`} class="blog-card card">
<div class="blog-image">
<img src={post.image} alt={post.title} loading="lazy" />
</div>
<div class="blog-content">
<span class="category-badge">{post.category}</span>
<h3 class="blog-title">{post.title}</h3>
<p class="blog-excerpt">{post.excerpt}</p>
<span class="blog-date">{formatDate(post.date)}</span>
</div>
</a>
{sortedPosts.slice(1).map((post, i) => (
<BlogCard
title={post.data.title}
excerpt={post.data.excerpt}
image={post.data.image}
date={post.data.date}
slug={post.id}
category={post.data.category}
/>
))}
</div>
</div>
@@ -162,182 +73,99 @@ function formatDate(dateStr: string) {
</Base>
<style>
.blog-section {
.featured-section {
background: var(--color-white);
padding-top: 80px;
}
.featured-post {
margin-bottom: 60px;
}
.featured-card {
display: grid;
grid-template-columns: 1.5fr 1fr;
gap: 48px;
background: var(--color-light-gray);
gap: 0;
background: var(--color-dark);
border-radius: 24px;
overflow: hidden;
transition: transform 0.4s ease;
}
.featured-card:hover { transform: scale(1.01); }
.featured-image {
aspect-ratio: 16/10;
overflow: hidden;
}
.featured-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s;
transition: transform 0.5s ease;
}
.featured-card:hover .featured-image img {
transform: scale(1.05);
}
.featured-card:hover .featured-image img { transform: scale(1.05); }
.featured-content {
padding: 48px;
display: flex;
flex-direction: column;
justify-content: center;
}
.category-badge {
display: inline-block;
background: var(--color-primary);
color: var(--color-black);
padding: 6px 16px;
border-radius: 20px;
padding: 6px 14px;
border-radius: 12px;
font-size: 12px;
font-weight: 600;
align-self: flex-start;
margin-bottom: 16px;
}
.featured-title {
font-size: 32px;
font-size: clamp(24px, 3vw, 32px);
font-weight: 700;
color: var(--color-white);
margin-bottom: 16px;
line-height: 1.3;
}
.featured-excerpt {
font-size: 16px;
color: var(--color-medium-gray);
font-size: 15px;
color: rgba(255,255,255,0.6);
line-height: 1.7;
margin-bottom: 24px;
}
.read-more {
color: var(--color-primary);
font-weight: 600;
font-size: 16px;
font-size: 14px;
}
.blog-section { background: var(--color-gray-100); }
.blog-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 32px;
}
.blog-card {
display: flex;
flex-direction: column;
overflow: hidden;
}
.blog-image {
aspect-ratio: 16/10;
overflow: hidden;
}
.blog-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s;
}
.blog-card:hover .blog-image img {
transform: scale(1.05);
}
.blog-content {
padding: 24px;
flex-grow: 1;
display: flex;
flex-direction: column;
}
.blog-title {
font-size: 18px;
font-weight: 600;
margin-bottom: 8px;
line-height: 1.4;
}
.blog-excerpt {
font-size: 14px;
color: var(--color-medium-gray);
line-height: 1.6;
margin-bottom: 16px;
flex-grow: 1;
}
.blog-date {
font-size: 12px;
color: #999;
}
.cta-section {
padding: 100px 0;
}
.cta-content {
text-align: center;
max-width: 600px;
margin: 0 auto;
}
.section-primary { background: var(--color-primary); }
.cta-content { text-align: center; }
.cta-title {
font-size: clamp(28px, 4vw, 40px);
font-size: clamp(28px, 4vw, 42px);
font-weight: 800;
margin-bottom: 16px;
color: var(--color-black);
}
.cta-desc {
font-size: 18px;
color: rgba(0,0,0,0.7);
margin-bottom: 32px;
opacity: 0.8;
}
.btn-lg {
padding: 18px 40px;
font-size: 16px;
max-width: 500px;
margin-left: auto;
margin-right: auto;
}
.btn-lg { padding: 16px 36px; font-size: 16px; }
@media (max-width: 1024px) {
.featured-card {
grid-template-columns: 1fr;
}
.blog-grid {
grid-template-columns: repeat(2, 1fr);
}
.featured-card { grid-template-columns: 1fr; }
.featured-image { aspect-ratio: 16/7; }
.blog-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
.blog-grid {
grid-template-columns: 1fr;
}
.featured-content {
padding: 32px;
}
.featured-title {
font-size: 24px;
}
.blog-grid { grid-template-columns: 1fr; }
.featured-content { padding: 32px; }
}
</style>