feat: replace all emojis with professional lucide-style SVG icon library

Build a curated 50-icon lucide library (Icon.astro + icon-paths.ts) and
replace every emoji across the site (~50 occurrences in 9 files):
- index.astro: 3 problem cards (message, trendingDown, globe)
- about.astro: 4 value cards (target, users, clock, shield)
- portfolio.astro: 7 industry filter buttons (factory, package, scale,
  graduationCap, trendingUp, pen, shoppingCart, layers)
- services/[slug].astro: ~25 feature/target/service icons
- services/index.astro: 6 decision-row tags + phone icon in CTA
- faq.astro: 5 category icons, 3 channel cards
- contact.astro: 3 channel picker, 5 info column, form options data-driven,
  checkCircle success
- Footer.astro: 3 contact icons (phone, mail, mapPin)
- Hero.astro: award icon in trust strip

Add icon wrapper styles to global.css (.problem-icon, .value-icon,
.channel-pick-icon, .info-icon, .channel-icon, .category-icon,
.feature-icon, .target-icon, .success-icon, .contact-icon, .btn-icon,
.filter-icon) — yellow square/circle backgrounds, dark text, consistent
sizing.

Build: 18 pages, 0 errors
This commit is contained in:
Macky
2026-06-04 09:20:43 +07:00
parent 6701c462ee
commit 0f79808a43
12 changed files with 770 additions and 109 deletions

View File

@@ -2,6 +2,7 @@
import Base from '../layouts/Base.astro';
import Navigation from '../components/Navigation.astro';
import Footer from '../components/Footer.astro';
import Icon from '../components/Icon.astro';
import Hero from '../components/Hero.astro';
import { getCollection } from 'astro:content';
import { render } from 'astro:content';
@@ -34,71 +35,77 @@ const serviceImages: Record<string, string> = {
subtitle={home?.data.subtitle}
/>
<!-- STATS SECTION — yellow band -->
<section class="section section-stats">
<!-- STATS SECTION — yellow band (counters animate on view) -->
<section class="section section-stats reveal">
<div class="container">
<div class="stats-grid">
<div class="stat-item">
<span class="stat-number">50+</span>
<span class="stat-number counter" data-from="0">50+</span>
<span class="stat-label">โปรเจกต์สำเร็จ</span>
</div>
<div class="stat-item">
<span class="stat-number">40+</span>
<span class="stat-number counter" data-from="0">40+</span>
<span class="stat-label">ลูกค้าที่ไว้วางใจ</span>
</div>
<div class="stat-item">
<span class="stat-number">5+</span>
<span class="stat-number counter" data-from="0">5+</span>
<span class="stat-label">ปีประสบการณ์</span>
</div>
<div class="stat-item">
<span class="stat-number">24/7</span>
<span class="stat-number counter" data-from="0">24/7</span>
<span class="stat-label">ให้บริการ</span>
</div>
</div>
</div>
</section>
<!-- PROBLEM SECTION — light, 3 cards -->
<!-- PROBLEM SECTION — light, 3 cards (stagger-children) -->
<section class="section section-soft">
<div class="container">
<div class="section-header">
<div class="section-header reveal">
<span class="section-badge">ปัญหาที่ SME ไทยเจอซ้ำทุกวัน</span>
<h2 class="section-title">
คุณกำลังเจอ <span class="highlight">แบบนี้อยู่</span> ใช่ไหม?
</h2>
</div>
<div class="problem-grid">
<div class="problem-grid stagger-children">
<div class="problem-card">
<div class="problem-icon">😩</div>
<div class="problem-icon">
<Icon name="message" />
</div>
<h3 class="problem-title">ลูกค้าทัก LINE เข้ามา แต่ตอบไม่ทัน</h3>
<p class="problem-desc">ทีมเซลล์ 12 คน ตอบแชตไม่ไหว ลูกค้ารอ 5 นาทีแล้วไปซื้อที่อื่น</p>
<span class="problem-result">→ ยอดหายก่อนที่คุณจะเห็น</span>
</div>
<div class="problem-card">
<div class="problem-icon">📉</div>
<div class="problem-icon">
<Icon name="trendingDown" />
</div>
<h3 class="problem-title">ลงโฆษณา แต่ยอดขายไม่ขยับ</h3>
<p class="problem-desc">ไม่มีระบบ Lead ไม่มี Funnel ไม่รู้ว่าใครซื้อ ใครแค่ทักมาถามเล่น</p>
<span class="problem-result">→ เงินหายไปกับคลิกที่ไม่มีคุณภาพ</span>
</div>
<div class="problem-card">
<div class="problem-icon">🌐</div>
<div class="problem-icon">
<Icon name="globe" />
</div>
<h3 class="problem-title">เว็บไซต์มีอยู่ แต่ไม่มีใครเจอใน Google</h3>
<p class="problem-desc">อันดับหน้า 5 ไม่มีใครเปิด ขณะที่คู่แข่งติดหน้าแรกจาก SEO อย่างเดียว</p>
<span class="problem-result">→ เสียเงินฟรีทุกเดือน</span>
</div>
</div>
<p class="problem-closing">
<p class="problem-closing reveal">
<span class="highlight">ทุกปัญหาข้างต้นแก้ได้ด้วยระบบเดียว</span> — ดูว่าเราทำยังไง
</p>
</div>
</section>
<!-- SERVICES SECTION — 4 mega cards on white -->
<!-- SERVICES SECTION — 4 mega cards on white (stagger-children) -->
<section class="section services-section">
<div class="container">
<div class="section-header">
<div class="section-header reveal">
<span class="section-badge">บริการของเรา</span>
<h2 class="section-title">
ครบจบในที่เดียว — <span class="highlight">โซลูชัน AI สำหรับธุรกิจไทย</span>
@@ -106,7 +113,7 @@ const serviceImages: Record<string, string> = {
<p class="section-desc">เลือกแค่ที่คุณต้องการ หรือให้เราวางแผนทั้งระบบให้ก็ได้</p>
</div>
<div class="services-mega-grid">
<div class="services-mega-grid stagger-children">
{allServices.map(s => (
<a href={`/services/${s.id}`} class="mega-card">
<span class="mega-tag">{s.data.badge}</span>
@@ -128,7 +135,7 @@ const serviceImages: Record<string, string> = {
</section>
<!-- PULL QUOTE — black section, oversized white text -->
<section class="section section-dark-quote">
<section class="section section-dark-quote reveal">
<div class="container">
<blockquote class="pull-quote">
<p class="quote-text">
@@ -142,7 +149,7 @@ const serviceImages: Record<string, string> = {
<!-- PORTFOLIO PREVIEW — 3 latest on soft -->
<section class="section section-soft">
<div class="container">
<div class="section-header">
<div class="section-header reveal">
<span class="section-badge">ผลงานจริง · ไม่ใช่ Mockup</span>
<h2 class="section-title">
ลูกค้าจริง <span class="highlight">ผลลัพธ์จริง</span>
@@ -150,9 +157,9 @@ const serviceImages: Record<string, string> = {
<p class="section-desc">9 โปรเจกต์ที่เราภาคภูมิใจ — ตั้งแต่ร้านค้าออนไลน์ ไปจนถึงโรงงานฉีดพลาสติก</p>
</div>
<div class="blog-editorial">
<div class="blog-editorial reveal">
{sortedPosts[0] && (
<a href={`/blog/${sortedPosts[0].slug}`} class="blog-featured">
<a href={`/blog/${sortedPosts[0].id}`} class="blog-featured">
<div class="blog-image">
<img src={sortedPosts[0].data.image} alt={sortedPosts[0].data.title} loading="lazy" />
<span class="blog-badge">บทความล่าสุด</span>
@@ -168,7 +175,7 @@ const serviceImages: Record<string, string> = {
<div class="blog-sidebar">
{sortedPosts.slice(1, 4).map((post) => (
<a href={`/blog/${post.slug}`} class="blog-card-mini">
<a href={`/blog/${post.id}`} class="blog-card-mini">
<div class="blog-card-image">
<img src={post.data.image} alt={post.data.title} loading="lazy" />
</div>
@@ -193,7 +200,7 @@ const serviceImages: Record<string, string> = {
<!-- FINAL CTA — yellow section -->
<section class="section section-yellow cta-section">
<div class="container">
<div class="cta-content">
<div class="cta-content reveal">
<h2 class="cta-title">พร้อมเปลี่ยนธุรกิจของคุณ?</h2>
<p class="cta-desc">ปรึกษาฟรี 30 นาที — เราจะถามคำถาม 5 ข้อ แล้วบอกคุณได้เลยว่าควรเริ่มจากตรงไหน</p>
<div class="cta-actions">
@@ -318,7 +325,7 @@ const serviceImages: Record<string, string> = {
box-shadow: var(--shadow-md);
border-color: var(--color-primary);
}
.problem-icon { font-size: 48px; margin-bottom: 16px; }
.problem-icon { margin-bottom: 16px; }
.problem-title {
font-family: var(--font-display);
font-size: 20px;