diff --git a/src/pages/about.astro b/src/pages/about.astro index db6bd43..8f74089 100644 --- a/src/pages/about.astro +++ b/src/pages/about.astro @@ -185,7 +185,7 @@ const { Content } = await render(about);
-
+
01

ปรึกษาฟรี

30–60 นาทีคุยกับเจ้าของธุรกิจ ฟัง pain points, เป้าหมาย, budget ให้คำแนะนำเบื้องต้นฟรี ไม่ผูก commitment

@@ -195,17 +195,15 @@ const { Content } = await render(about);

วางแผน

วิเคราะห์เชิงลึก ดูคู่แข่ง ส่ง Proposal เป็น PDF คุณอ่าน ถามคำถาม แก้ไข scope ได้ก่อนเซ็น

-
+
03

ดำเนินการ

แจ้งความคืบหน้าเป็นช่วง ๆ ผ่าน LINE Group — demo เมื่อเราพร้อมส่งงานรอบใหญ่ ๆ ไม่ sprint ไม่ deadline ล็อก

-
+
04 -
-

ส่งมอบ + ดูแล

-

ส่งมอบงาน + อบรมทีม + มอบคู่มือ หลังส่งมอบปรับเล็ก ๆ น้อย ๆ ฟรี — คิดค่าใช้จ่ายเฉพาะ feature ใหม่หรือปรับแต่งครั้งใหญ่

-
+

ส่งมอบ + ดูแล

+

ส่งมอบงาน + อบรมทีม + มอบคู่มือ หลังส่งมอบปรับเล็ก ๆ น้อย ๆ ฟรี — คิดค่าใช้จ่ายเฉพาะ feature ใหม่หรือปรับแต่งครั้งใหญ่

@@ -287,65 +285,63 @@ const { Content } = await render(about); } .value-card-yellow .value-desc { color: rgba(0, 0, 0, 0.85); } - /* PROCESS (asymmetric bento) */ + /* PROCESS — clean 4x1 grid */ .process-section { background: var(--color-bg-alt); position: relative; overflow: hidden; } .process-grid { display: grid; - grid-template-columns: repeat(6, 1fr); - grid-auto-rows: minmax(160px, auto); + grid-template-columns: repeat(4, 1fr); gap: 16px; } .process-step { background: var(--color-white); border: 1px solid var(--color-gray-200); border-radius: var(--radius-xl); - padding: 32px; + padding: 32px 24px; transition: all 0.3s ease; - grid-column: span 3; display: flex; flex-direction: column; - justify-content: center; + min-height: 280px; } - .process-step-wide { grid-column: span 3; } - .process-step-full { grid-column: span 6; flex-direction: row; align-items: center; gap: 32px; } - .process-step-full .step-num { margin-bottom: 0; } - .process-step-teal { background: var(--color-teal); border-color: var(--color-teal); color: var(--color-white); } - .process-step-teal .step-num { color: var(--color-primary); } - .process-step-teal .step-title { color: var(--color-white); } - .process-step-teal .step-desc { color: rgba(255, 255, 255, 0.92); } - .process-step-yellow { background: var(--color-primary); border-color: var(--color-primary); } - .process-step-yellow .step-num { color: var(--color-black); } .process-step:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); + border-color: var(--color-primary); } + .process-step-yellow { + background: var(--color-primary); + border-color: var(--color-primary); + } + .process-step-yellow .step-num, + .process-step-yellow .step-title { color: var(--color-black); } + .process-step-yellow .step-desc { color: rgba(0, 0, 0, 0.85); } + .process-step-yellow:hover { border-color: var(--color-black); } .step-num { display: block; font-family: var(--font-display); - font-size: clamp(48px, 5vw, 64px); + font-size: clamp(40px, 4vw, 56px); font-weight: 900; color: var(--color-primary); line-height: 1; - margin-bottom: 12px; + margin-bottom: 16px; } .step-title { font-family: var(--font-display); - font-size: 20px; + font-size: 18px; font-weight: 800; color: var(--color-black); margin-bottom: 10px; } .step-desc { - font-size: 15px; + font-size: 14px; color: var(--color-gray-700); line-height: 1.6; } @media (max-width: 1024px) { - .process-step, .process-step-wide { grid-column: span 6; } + .process-grid { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 640px) { - .process-step, .process-step-wide, .process-step-full { grid-column: span 6; flex-direction: column; align-items: flex-start; } + .process-grid { grid-template-columns: 1fr; } .values-grid { grid-template-columns: 1fr; } } diff --git a/src/pages/blog/[slug].astro b/src/pages/blog/[slug].astro index 21c81d2..d97bcd0 100644 --- a/src/pages/blog/[slug].astro +++ b/src/pages/blog/[slug].astro @@ -3,6 +3,9 @@ import Base from '../../layouts/Base.astro'; import Navigation from '../../components/Navigation.astro'; import Footer from '../../components/Footer.astro'; import PageHero from '../../components/PageHero.astro'; +import BentoGrid from '../../components/BentoGrid.astro'; +import BentoTile from '../../components/BentoTile.astro'; +import DecoOrb from '../../components/DecoOrb.astro'; import { getCollection, render } from 'astro:content'; const { slug } = Astro.params; @@ -33,6 +36,12 @@ const formattedDate = post.data.date.toLocaleDateString('th-TH', { month: 'long', day: 'numeric' }); + +// Surface rotation for related cards +const surfaces = ['soft', 'yellow', 'mint'] as const; +function surfaceFor(i: number) { + return surfaces[i % surfaces.length]; +} --- @@ -45,104 +54,143 @@ const formattedDate = post.data.date.toLocaleDateString('th-TH', { /> {post.data.image && ( -
-
- {post.data.title} +
+ + +
+
+ {post.data.title} +
-
+ )} -
-
-
-
+
+ + +
+ + + +
+ {formattedDate} +
-
+ -
-
-

เกี่ยวกับ MoreminiMore

-

- ดิจิทัลเอเจนซี่ที่ช่วยให้ธุรกิจไทยเติบโตด้วยเทคโนโลยีสมัยใหม่ -

- ดูเพิ่มเติม -
+ + +

ดิจิทัลเอเจนซี่ที่ช่วยให้ธุรกิจไทยเติบโตด้วยเทคโนโลยีสมัยใหม่

+ ดูเพิ่มเติม -
-

สนใจบริการ?

-

ติดต่อเราได้เลย ปรึกษาฟรี!

+
+ + สนใจบริการ? +

ติดต่อเราได้เลย ปรึกษาฟรี!

+
ติดต่อเรา - 080-995-5945 + 080-995-5945
- - {related.length > 0 && ( -
-

บทความที่เกี่ยวข้อง

-
- {related.map(r => ( - - {r.data.title} - {r.data.title} - - ))} -
-
- )} -
-
+ +
+ {related.length > 0 && ( +
+ + +
+
+ บทความที่เกี่ยวข้อง +

อ่านต่อ เนื้อหาใกล้เคียง

+
+ + + {related.map((r, i) => ( + + +
+ {r.data.image && ( +
+ {r.data.title} +
+ )} + + {new Date(r.data.date).toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' })} + +
+
+
+ ))} +
+
+
+ )} +
+ + diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro index 6ca8579..bf47989 100644 --- a/src/pages/blog/index.astro +++ b/src/pages/blog/index.astro @@ -3,10 +3,19 @@ import Base from '../../layouts/Base.astro'; import Navigation from '../../components/Navigation.astro'; import Footer from '../../components/Footer.astro'; import PageHero from '../../components/PageHero.astro'; +import BentoGrid from '../../components/BentoGrid.astro'; +import BentoTile from '../../components/BentoTile.astro'; +import DecoOrb from '../../components/DecoOrb.astro'; import { getCollection } from 'astro:content'; const blogPosts = await getCollection('blog'); const sortedPosts = blogPosts.sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf()); + +// Surface color rotation for variety across the post grid +const surfaces = ['white', 'soft', 'yellow', 'mint', 'purple-soft', 'teal'] as const; +function surfaceFor(i: number) { + return surfaces[i % surfaces.length]; +} --- @@ -19,57 +28,74 @@ const sortedPosts = blogPosts.sort((a, b) => b.data.date.valueOf() - a.data.date /> {sortedPosts.length > 0 && ( -
-
- -
- {sortedPosts[0].data.image && ( - {sortedPosts[0].data.title} - )} - บทความล่าสุด -
-
- {sortedPosts[0].data.category} -

{sortedPosts[0].data.title}

-

{sortedPosts[0].data.excerpt}

- - อ่านต่อ - - - - -
+
+ + +
+ + + +
+
+ {sortedPosts[0].data.image && ( + {sortedPosts[0].data.title} + )} +
+
+
+ + +
+

{sortedPosts[0].data.excerpt}

+
+ + {new Date(sortedPosts[0].data.date).toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' })} + +
+ + อ่านต่อ + + + + +
+
+
)} -
-
-
+
+ + +
+
บทความทั้งหมด

บทความ ล่าสุด

-
- {sortedPosts.slice(1).map((post, i) => ( - -
- {post.data.image && ( - {post.data.title} - )} -
-
- {post.data.category} -

{post.data.title}

-

{post.data.excerpt}

- - {new Date(post.data.date).toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' })} - -
-
- ))} -
+ {sortedPosts.length > 1 && ( + + {sortedPosts.slice(1).map((post, i) => ( + + +
+ {post.data.image && ( +
+ {post.data.title} +
+ )} +

{post.data.excerpt}

+ + {new Date(post.data.date).toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' })} + +
+
+
+ ))} +
+ )}
@@ -92,77 +118,46 @@ const sortedPosts = blogPosts.sort((a, b) => b.data.date.valueOf() - a.data.date + + diff --git a/src/pages/contact.astro b/src/pages/contact.astro index dcf03f8..ce7a0e4 100644 --- a/src/pages/contact.astro +++ b/src/pages/contact.astro @@ -4,6 +4,9 @@ import Navigation from '../components/Navigation.astro'; import Footer from '../components/Footer.astro'; import PageHero from '../components/PageHero.astro'; import Icon from '../components/Icon.astro'; +import BentoGrid from '../components/BentoGrid.astro'; +import BentoTile from '../components/BentoTile.astro'; +import DecoOrb from '../components/DecoOrb.astro'; // Service options for the form — with lucide icon names const serviceOptions = [ @@ -26,105 +29,43 @@ const serviceOptions = [ subtitle="ตอบกลับภายใน 2 ชั่วโมง · เลือกช่องทางที่คุณสะดวก — LINE, โทร, Email หรือฟอร์ม" /> - -
-
-
- -
- -
-

LINE Official

-

คนที่อยากคุยเร็ว ๆ แบบเป็นกันเอง

-

ตอบใน 30 นาที (เวลาทำการ)

- ทักเลย → -
- -
- -
-

โทรศัพท์

-

คนที่อยากคุยยาว ๆ 5–10 นาที ถามตอบสด

-

รับสายทันที หรือโทรกลับภายใน 2 ชม.

- 080-995-5945 -
- -
- -
-

Email

-

คนที่อยากส่งรายละเอียดโปรเจกต์ + ไฟล์แนบ

-

ตอบภายใน 1 วันทำการ

- contact@moreminimore.com -
-
+ +
+ + +
+ + +
+

คนที่อยากคุยเร็ว ๆ แบบเป็นกันเอง

+

ตอบใน 30 นาที (เวลาทำการ)

+ ทักเลย → +
+ +
+

คนที่อยากคุยยาว ๆ 5–10 นาที ถามตอบสด

+

รับสายทันที หรือโทรกลับภายใน 2 ชม.

+ โทรเลย → +
+ +
+

คนที่อยากส่งรายละเอียดโปรเจกต์ + ไฟล์แนบ

+

ตอบภายใน 1 วันทำการ

+ ส่งอีเมล → +
+
- -
-
-
- -
-

ข้อมูลติดต่อ

- -
-
- -
-
-

โทรศัพท์

- 080-995-5945 -

โทรคุยสดได้เลย จ-ศ 09:00-18:00

-
-
-
-
- -
-
-

อีเมล

- contact@moreminimore.com -

เหมาะกับส่งรายละเอียดโปรเจกต์ + ไฟล์แนบ

-
-
-
-
- -
-
-

LINE

- @moreminimore -

เร็วที่สุด ตอบใน 30 นาที (เวลาทำการ)

-
-
-
-
- -
-
-

ออฟฟิศ

-

53 หมู่ 1 ต.บ้านแพ้ว อ.บ้านแพ้ว สมุทรสาคร 74120

-

นัดเจอล่วงหน้า สะดวกกว่าเดินเข้ามาเฉย ๆ

-
-
-
-
- -
-
-

เวลาทำการ

-

จันทร์ - ศุกร์ 09:00 - 18:00 น.

-

นอกเวลา? ทัก LINE ทิ้งไว้ได้ ตอบเช้าวันถัดไป

-
-
-
- - -
-

ส่งข้อความถึงเรา

-

กรอก 4 ช่อง ใช้เวลา 60 วินาที — เราจะตอบกลับภายใน 2 ชั่วโมง (เวลาทำการ)

+ +
+ + +
+ + + +

เราจะตอบกลับภายใน 2 ชั่วโมง (เวลาทำการ)

@@ -189,66 +130,86 @@ const serviceOptions = [

ส่งแล้ว!

เราจะตอบกลับภายใน 2 ชั่วโมง (ในเวลาทำการ) ถ้าเร่งด่วน ทัก LINE @moreminimore ครับ

-
-
+ + + + +
+

โทรคุยสดได้เลย

+

จ-ศ 09:00-18:00

+ โทรเลย → +
+ + +
+

เหมาะกับส่งรายละเอียดโปรเจกต์ + ไฟล์แนบ

+

ตอบภายใน 1 วันทำการ

+ ส่งอีเมล → +
+ + +
+

เร็วที่สุด ตอบใน 30 นาที (เวลาทำการ)

+

นอกเวลา? ทักทิ้งไว้ได้

+ ทักเลย → +
+ + +
+

นอกเวลาทำการ? ทัก LINE ทิ้งไว้ได้ ตอบเช้าวันถัดไป

+

53 หมู่ 1 ต.บ้านแพ้ว อ.บ้านแพ้ว สมุทรสาคร 74120 · นัดเจอล่วงหน้า

+
+
- -
-
+ +
+ + +
หลังส่งฟอร์ม

3 ขั้นตอนถัดไป — ไม่มีอะไรซับซ้อน

- -
-
-
1
-

ตอบกลับภายใน 2 ชั่วโมง

+ +

คนจริง (ไม่ใช่ Bot) จะตอบ — ถามคำถามเพิ่ม 2–3 ข้อ เพื่อเข้าใจปัญหาคุณ

-
-
-
2
-

นัดปรึกษาฟรี 30 นาที

+ +

คุยผ่าน Zoom / โทร / นัดเจอที่ออฟฟิศ (กรุงเทพ / สมุทรสาคร) — ไม่มี script sales

-
-
-
3
-

ส่ง Proposal (3–5 วัน)

+ +

เอกสาร PDF ที่ระบุ scope, timeline, ราคา — ไม่ชอบตรงไหนคุยกันแก้ได้

-
-
+ +

ถ้าไม่ตรง → เราจะบอกตรง ๆ ว่า "ไม่เหมาะ" และแนะนำทางเลือกอื่น

- -
-
+ +
+ + +
ก่อนกดส่ง

4 คำถามที่คนถาม ก่อน กดส่งฟอร์ม

- -
-
-

คุยกัน 30 นาทีแล้วจะถูกบังคับซื้อไหม?

+ +

ไม่ คุยแล้วคุณไม่ชอบก็ไม่เป็นไร ไม่มี follow-up ไม่มีขายของเพิ่ม

-
-
-

ถ้าส่งฟอร์มไปแล้วเงียบ ทำยังไง?

+ +

ทัก LINE @moreminimore ตรง ๆ จะเร็วกว่า — หรือโทร 080-995-5945

-
-
-

คุยช่วงไหนได้บ้าง?

+ +

จันทร์-ศุกร์ 09:00-18:00 ปกติ ถ้าคุณต่างจังหวัด/ต่างประเทศ นัดนอกเวลาได้ บอกล่วงหน้า 1–2 วัน

-
-
-

ต้องเตรียมอะไรไปคุยไหม?

+ +

ไม่ต้องเตรียมอะไรเลย แค่บอกธุรกิจคุณทำอะไร ปวดหัวเรื่องอะไร งบประมาณเท่าไหร่ ที่เหลือเราถามเอง

-
-
+ +
@@ -269,84 +230,26 @@ const serviceOptions = [
- - + + diff --git a/src/pages/faq.astro b/src/pages/faq.astro index 4fef79b..30b5aad 100644 --- a/src/pages/faq.astro +++ b/src/pages/faq.astro @@ -3,20 +3,65 @@ import Base from '../layouts/Base.astro'; import Navigation from '../components/Navigation.astro'; import Footer from '../components/Footer.astro'; import PageHero from '../components/PageHero.astro'; -import Icon from '../components/Icon.astro'; +import BentoGrid from '../components/BentoGrid.astro'; +import BentoTile from '../components/BentoTile.astro'; +import DecoOrb from '../components/DecoOrb.astro'; import { getCollection } from 'astro:content'; const faqItems = await getCollection('faq'); const categories = ['บริการ', 'ราคา', 'ระยะเวลา', 'AI & เทคนิค', 'หลังการขาย']; -// Map categories to lucide icon names (semantic match, not visual emoji) -const categoryIcons: Record = { - 'บริการ': 'briefcase', - 'ราคา': 'dollarSign', - 'ระยะเวลา': 'clock', - 'AI & เทคนิค': 'bot', - 'หลังการขาย': 'wrench', -}; +// Group FAQ items by category (preserve original order within each category) +const groupedFaq = categories + .map(cat => ({ + category: cat, + items: faqItems.filter(f => f.data.category === cat), + })) + .filter(g => g.items.length > 0); + +// Split each category's items into chunks of 2 (or 3 for the last chunk if odd count) +function chunkItems(arr: T[], size: number): T[][] { + const chunks: T[][] = []; + for (let i = 0; i < arr.length; i += size) { + chunks.push(arr.slice(i, i + size)); + } + return chunks; +} + +// Pre-compute all FAQ tiles with assigned spans + surfaces for visual rhythm +// Rotation: yellow, soft, purple-soft, mint, teal, dark, coral, purple, mint +const surfaceRotation = ['yellow', 'soft', 'purple-soft', 'mint', 'teal', 'dark', 'coral', 'purple', 'mint'] as const; + +// Span strategy for category tile pairs: 7+5, 5+7, 8+4, 4+8, 7+5 ... avoid 6+6 +const spanPairs = [[7, 5], [5, 7], [8, 4], [4, 8], [7, 5]] as const; + +interface FaqTile { + category: string; + items: typeof faqItems; + surface: typeof surfaceRotation[number]; + span: 4 | 5 | 7 | 8; + tileIndex: number; // 0, 1 within category + isFirst: boolean; + isLast: boolean; +} + +const faqTiles: FaqTile[] = []; +groupedFaq.forEach((group, gIdx) => { + const chunks = chunkItems(group.items, 2); + const pair = spanPairs[gIdx % spanPairs.length]; + chunks.forEach((chunk, cIdx) => { + const tileSurface = surfaceRotation[faqTiles.length % surfaceRotation.length]; + faqTiles.push({ + category: group.category, + items: chunk, + surface: tileSurface, + span: (pair[cIdx] ?? 6) as 4 | 5 | 7 | 8, + tileIndex: cIdx, + isFirst: cIdx === 0, + isLast: cIdx === chunks.length - 1, + }); + }); +}); --- @@ -28,21 +73,20 @@ const categoryIcons: Record = { subtitle="30+ คำถามที่รวบรวมจากแชต LINE จริง ๆ ไม่ใช่แต่งขึ้นเอง" /> -
-
- {categories.map(cat => { - const items = faqItems.filter(f => f.data.category === cat); - if (items.length === 0) return null; - return ( -
-

- - - - {cat} -

+ +
+ + +
+ + {faqTiles.map((tile) => ( +
- {items.map((item, qIndex) => ( + {tile.items.map((item) => (
{item.data.question} @@ -54,72 +98,64 @@ const categoryIcons: Record = {
))}
+
+ ))} + + + +
+ โฮสติ้ง + โดเมน + SSL + ใบเสนอราคา + ใบกำกับภาษี + สัญญา + NDA + ลิขสิทธิ์งาน + ทีมงาน + ขนาดทีม + ที่ตั้งบริษัท + ตัวอย่างงาน + ขอดูเว็บจริง + นัดคุยนอกสถานที่
- ); - })} +
+
+
+
- -
-

- - - - เรื่องอื่น ๆ ที่ลูกค้าถามบ่อย -

-
- โฮสติ้ง - โดเมน - SSL - ใบเสนอราคา - ใบกำกับภาษี - สัญญา - NDA - ลิขสิทธิ์งาน - ทีมงาน - ขนาดทีม - ที่ตั้งบริษัท - ตัวอย่างงาน - ขอดูเว็บจริง - นัดคุยนอกสถานที่ -
-
- - -
-

ไม่เจอคำตอบ? ถามตรง ๆ เลย

-
- -
- -
-

LINE

-

@moreminimore

-

ตอบใน 30 นาที (เวลาทำการ)

-
- -
- -
-

โทร

-

080-995-5945

-

จ-ศ 09:00-18:00

-
- -
- -
-

Email

-

contact@moreminimore.com

-

ตอบภายใน 1 วัน

-
-
+ +
+ + +
+
+ ช่องทางติดต่อ +

ไม่เจอคำตอบ? ถามตรง ๆ เลย

+ + +

คนที่อยากคุยเร็ว ๆ แบบเป็นกันเอง

+

ตอบใน 30 นาที (เวลาทำการ)

+ ทักเลย → +
+ +

คนที่อยากคุยยาว ๆ 5–10 นาที ถามตอบสด

+

จ-ศ 09:00-18:00

+ โทรเลย → +
+ +

คนที่อยากส่งรายละเอียดโปรเจกต์ + ไฟล์แนบ

+

ตอบภายใน 1 วัน

+ ส่งอีเมล → +
+
-
+

พร้อมคุยรายละเอียด?

นัดปรึกษาฟรี 30 นาที ผ่าน Zoom หรือนัดเจอที่ออฟฟิศ (กรุงเทพ/สมุทรสาคร)

@@ -134,27 +170,13 @@ const categoryIcons: Record = { + + diff --git a/src/pages/index.astro b/src/pages/index.astro index ac749ce..88243e3 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -2,217 +2,146 @@ 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 BentoGrid from '../components/BentoGrid.astro'; +import BentoTile from '../components/BentoTile.astro'; +import DecoOrb from '../components/DecoOrb.astro'; import { getCollection } from 'astro:content'; -import ServiceCard from '../components/ServiceCard.astro'; import PortfolioCard from '../components/PortfolioCard.astro'; -// Hardcoded home page copy (previously in src/content/pages/home.md, now inlined) -const homeContent = { - badge: 'AI AGENCY ในประเทศไทย', - title: 'เพิ่มยอดขาย ลดต้นทุน ลดเวลา — ให้ธุรกิจของคุณ', - subtitle: - 'นโยบายของเราคือสร้างระบบที่ทำให้ลูกค้ามีกำไรมากขึ้น — ด้วยเว็บไซต์ SEO AI Chatbot และ Marketing Automation ที่ออกแบบมาเพื่อ SME ไทยโดยเฉพาะ', -}; - -const services = await getCollection('services'); -const portfolio = await getCollection('portfolio'); -const featuredPortfolio = portfolio.slice(0, 4); - -// 4 mega-services (use existing service collection filtered) -const allServices = services.slice(0, 4); -const serviceImages: Record = { - 'automation': '/images/services/automation.jpg', - 'ai-consult': '/images/services/ai-consult.jpg', - 'marketing': '/images/services/marketing.jpg', - 'webdev': '/images/services/webdev.jpg', -}; - -// 12 problem cards grouped by 4 service buckets (3 per bucket). -// Each card: serviceBucket, icon (Lucide), title, description, result. +// 4 problem cards (down from 12) — each has symptom + cause + how we fix it const problemCards = [ - // 🏢 Website — load/SEO/visibility { - bucket: 'website', - icon: 'globe', - title: 'เว็บไซต์โหลดช้า ลูกค้าปิดก่อนเห็นสินค้า', - description: 'หน้าเว็บใช้เวลาโหลดเกิน 5 วินาที ลูกค้า 53% ปิดทิ้งทันที', - result: '→ เสียโอกาสขายตั้งแต่วินาทีแรก', + icon: 'trendingDown', + title: 'ลงโฆษณาแล้วยอดไม่ขยับ', + symptom: 'คลิกเยอะ ยอดขายเท่าเดิม งบหมดไปกับคนที่ไม่ซื้อ', + cause: 'เลือกกลุ่มเป้าหมายผิด หรือยิงทุก Platform โดยไม่ดูว่าอันไหนคุ้ม', + fix: 'ดูสถิติ 3 เดือนย้อนหลัง แยกว่า Platform ไหน Convert ดี ตัดอันที่เสียเงินเปล่า', + example: 'เคส Dataroot: เพิ่ม Impression 373%, Click 114% โดยใช้งบน้อยลง 28% — ดูเคสเต็มใน Portfolio', }, { - bucket: 'website', - icon: 'search', - title: 'อยู่หน้า 5 ของ Google หรือหายไปเลย', - description: 'ลูกค้าค้นหาแล้วไม่เจอเว็บคุณ เจอแต่คู่แข่ง', - result: '→ ต้องจ่ายค่าโฆษณาเพิ่มทุกเดือน', - }, - { - bucket: 'website', icon: 'shoppingCart', - title: 'เว็บมีอยู่ แต่ลูกค้าซื้อไม่ได้', - description: '�อร์มไม่ส่ง ตะกร้าค้าง ชำระเงินไม่ผ่าน', - result: '→ ยอดขายตกทั้งที่คนเข้าเว็บเยอะ', - }, - // ⚙️ AI Automation — operations / efficiency - { - bucket: 'automation', - icon: 'message', - title: 'ทีมเซลล์ตอบแชตไม่ทัน ลูกค้าหายตอนกลางคืน', - description: 'ทีม 1–2 คนตอบไม่ไหว ลูกค้ารอ 5 นาทีแล้วไปซื้อที่อื่น', - result: '→ ยอดหายโดยไม่มีใครรู้ตัว', + title: 'เว็บมีคนเข้า แต่ไม่มีคนซื้อ', + symptom: 'Traffic เข้าพอสมควร แต่ไม่มีใครทัก ไม่มีใครโทร ตะกร้าค้าง', + cause: 'เว็บสวยแต่ไม่ได้ออกแบบมาให้คนซื้อ หรือมีจุดติดขัดที่ทำให้คนออกก่อน', + fix: 'ดู Heatmap ว่าคนเข้ามาแล้วทำอะไร ปรับจุดที่คนออก', + example: 'ลองคุยกัน เราจะดูให้ว่าเว็บคุณติดปัญหาตรงไหน', }, { - bucket: 'automation', icon: 'clipboard', title: 'งานซ้ำ ๆ ใช้เวลาคนเป็นชั่วโมงทุกวัน', - description: 'คีย์ข้อมูล ทำใบเสนอราคา อัปเดตสต็อก ทุกอย่างทำมือ', - result: '→ ต้นทุนค่าแรงสูงขึ้นโดยไม่จำเป็น', + symptom: 'ทีมต้องคีย์ข้อมูล ทำรายงาน ตอบแชตเดิม ๆ จนไม่มีเวลาทำงานหลัก', + cause: 'ระบบเก่าที่ไม่ได้เชื่อมกัน หรือยังทำ Manual อยู่', + fix: 'ดู Workflow ก่อน แล้วเลือกเครื่องมือที่เหมาะ — n8n, Script, หรือ AI', + example: 'ลองคุยกัน เราจะดู Workflow ให้ฟรี', }, { - bucket: 'automation', - icon: 'cog', - title: 'ระบบแยกกัน ไม่คุยกัน', - description: 'CRM · ERP · ระบบบัญชี · หน้าร้าน ต่างคนต่างอยู่', - result: '→ ตัดสินใจช้า เพราะข้อมูลไม่เชื่อม', - }, - // 📈 SEO + Content — traffic / leads - { - bucket: 'marketing', - icon: 'trendingDown', - title: 'ลงโฆษณา แต่ยอดขายไม่ขยับ', - description: 'คลิกเยอะ แต่ไม่มีใครซื้อ — ไม่มี Funnel ไม่มี Lead scoring', - result: '→ เงินหายไปกับคลิกที่ไม่มีคุณภาพ', - }, - { - bucket: 'marketing', - icon: 'pen', - title: 'เขียนคอนเทนต์เองไม่ทัน', - description: 'อยากโพสต์สม่ำเสมอ แต่ทีมไม่มีเวลา', - result: '→ คอนเทนต์หยุดชะงัก ลูกค้าลืม', - }, - { - bucket: 'marketing', - icon: 'megaphone', - title: 'ไม่รู้ว่าใครซื้อ ใครแค่ทักมาถามเล่น', - description: 'ไม่มีระบบติดตาม ไม่มี CRM ไม่มี Report', - result: '→ ลงทุนการตลาดแบบเดา', - }, - // 🖥️ Tech Consult — infrastructure / scale - { - bucket: 'tech', - icon: 'server', - title: 'ไม่อยากจ้างทีม IT แต่ต้องมี Server', - description: 'ระบบหลังบ้านต้องทำงาน แต่จ้างประจำแพงเกิน', - result: '→ ต้นทุนคงที่สูงโดยไม่คุ้ม', - }, - { - bucket: 'tech', - icon: 'shield', - title: 'กังวลเรื่อง PDPA / ข้อมูลรั่วไหล', - description: 'เก็บข้อมูลลูกค้าแต่ไม่รู้ว่าปลอดภัยแค่ไหน', - result: '→ เสี่ยงถูกฟ้องร้อง ถูกปรับ', - }, - { - bucket: 'tech', - icon: 'monitor', - title: 'อยากใช้ AI แต่ไม่รู้จะเริ่มยังไง', - description: 'มี ChatGPT ใช้ แต่เอามาทำงานจริงในธุรกิจไม่เป็น', - result: '→ เสียโอกาสที่ AI จะช่วยลดงานได้', + icon: 'brain', + title: 'ใช้ AI แต่ไม่เห็นผล', + symptom: 'จ่ายแพง ใช้ AI ระดับ Frontier กับทุกงาน แต่ผลลัพธ์ไม่คุ้มเงิน', + cause: 'ใช้ AI ผิดแบบ — งานหลายอย่างใช้ Model ราคาถูกก็ได้ผลเท่า ๆ กัน', + fix: 'เลือก AI ตามงาน ไม่ใช่เลือกของแพงสุด — เน้น Local LLM สำหรับงานที่ต้องการความลับ', + example: 'AI Audit ฟรี — บอกได้ว่าควรใช้ AI ตัวไหน', }, ]; -const bucketLabels: Record = { - website: 'Website', - automation: 'AI Automation', - marketing: 'SEO + Content', - tech: 'Tech Consult', -}; +// Surface color rotation for the 4 problem cards — keep variety +const problemSurfaces = ['yellow', 'purple-soft', 'mint', 'soft'] as const; -// Pre-group problem cards by bucket (4 groups, in canonical service order) -const problemGroupOrder = ['website', 'automation', 'marketing', 'tech'] as const; -const problemGroups = problemGroupOrder.map((bucket) => ({ - bucket, - label: bucketLabels[bucket], - cards: problemCards.filter((c) => c.bucket === bucket), -})); +const services = await getCollection('services'); +const portfolio = await getCollection('portfolio'); +const featuredPortfolio = portfolio.filter(p => p.data.featured).slice(0, 4); --- - + ดูผลงานจริง - -
-
+ +
+ + +
- ปัญหาที่ SME ไทยเจอซ้ำทุกวัน + 4 ปัญหาที่เจอบ่อยที่สุด

- คุณกำลังเจอ แบบนี้อยู่ ใช่ไหม? + แต่ละปัญหามีวิธีแก้ที่เจาะจง

-

12 ปัญหาที่แบ่งตามบริการของเรา เลือกดูได้เลยว่าตรงกับคุณข้อไหน

+

เราไม่ได้บอกว่า "เราทำได้หมด" แต่บอกว่า "ถ้าเป็นแบบนี้ ทำแบบนี้"

- {problemGroups.map((group) => ( -
-

- {group.label} -

-
- {group.cards.map((card) => ( -
-
- -
-

{card.title}

-

{card.description}

- {card.result} -
- ))} -
-
- ))} + + {problemCards.map((card, i) => ( + +
+ อาการ +

{card.symptom}

+
+ +
+ สาเหตุส่วนใหญ่ +

{card.cause}

+
+ +
+ เราแก้ยังไง +

{card.fix}

+
+ +
+ ▸ {card.example} +
+
+ ))} +

- ทุกปัญหาข้างต้นแก้ได้ด้วยระบบเดียว — ดูว่าเราทำยังไง + ไม่แน่ใจว่าตรงกับข้อไหน — นัดคุย 30 นาทีฟรี เราจะช่วยดู

- -
-
+ +
+ + +
บริการของเรา

- ครบจบในที่เดียว — โซลูชัน AI สำหรับธุรกิจไทย + เริ่มจากอันที่ปวดที่สุด ค่อยขยายไปอันอื่น

-

เลือกแค่ที่คุณต้องการ หรือให้เราวางแผนทั้งระบบให้ก็ได้

+

ไม่จำเป็นต้องทำทุกอย่างพร้อมกัน

-
- {allServices.map(s => ( - - {s.data.badge} -

{s.data.title}

-

{s.data.subtitle}

-
- เป้าหมาย: - {s.data.objective} -
- ดูรายละเอียด → -
- ))} -
+ + {services.slice(0, 4).map((s, i) => { + // Asymmetric layout: 8 + 4, 4 + 8 — alternating + const span = i % 2 === 0 ? 8 : 4; + const surface = (['yellow', 'purple-soft', 'mint', 'soft'] as const)[i]; + return ( + + +

{s.data.subtitle}

+
+ เป้าหมาย: + {s.data.objective} +
+ ดูรายละเอียด → +
+
+ ); + })} +
ดูบริการทั้งหมด → @@ -220,31 +149,31 @@ const problemGroups = problemGroupOrder.map((bucket) => ({
- +

"เป้าหมายของเราคือ กำไรที่มากขึ้นของลูกค้า"

- — มอร์มินิมอร์, ปณิธานการทำงาน + — มอร์มินิมอร์
- +
- ผลงานจริง · ไม่ใช่ Mockup + ผลงานจริง ไม่ใช่ Mockup

- ลูกค้าจริง ผลลัพธ์จริง + ลูกค้าจริง เว็บจริง

-

ตัวอย่างผลงานที่เราภาคภูมิใจ — คลิกดูเว็บจริงได้เลย

+

คลิกเข้าไปดูเว็บจริงที่ใช้งานอยู่ทุกวันนี้

- {featuredPortfolio.map((item) => ( + {featuredPortfolio.filter(p => p.data.url).slice(0, 4).map((item) => ( ({
- +
-

พร้อมเปลี่ยนธุรกิจของคุณ?

-

ปรึกษาฟรี 30 นาที — เราจะถามคำถาม 5 ข้อ แล้วบอกคุณได้เลยว่าควรเริ่มจากตรงไหน

+

คุยกันก่อน 30 นาที ฟรี

+

เราจะถามคำถาม 5 ข้อ แล้วบอกคุณได้เลยว่าควรเริ่มจากตรงไหน — จะบอกตรง ๆ ว่าทำได้หรือทำไม่ได้

นัดคุย 30 นาที @@ -282,7 +211,7 @@ const problemGroups = problemGroupOrder.map((bucket) => ({ ทัก LINE: @moreminimore
-

ไม่มี commitment · ไม่มี script sales · พูดตรง ๆ ว่าทำได้หรือทำไม่ได้

+

ไม่มี commitment · ไม่มี script sales · พูดตรง ๆ

@@ -291,259 +220,155 @@ const problemGroups = problemGroupOrder.map((bucket) => ({ + + diff --git a/src/pages/portfolio.astro b/src/pages/portfolio.astro index 186107c..519d5a9 100644 --- a/src/pages/portfolio.astro +++ b/src/pages/portfolio.astro @@ -5,9 +5,14 @@ import Footer from '../components/Footer.astro'; import PageHero from '../components/PageHero.astro'; import PortfolioCard from '../components/PortfolioCard.astro'; import Icon from '../components/Icon.astro'; +import BentoGrid from '../components/BentoGrid.astro'; +import BentoTile from '../components/BentoTile.astro'; +import DecoOrb from '../components/DecoOrb.astro'; import { getCollection } from 'astro:content'; const portfolio = await getCollection('portfolio'); +// Filter: only show real cases (have url) and not drafts +const realPortfolio = portfolio.filter(p => p.data.url && p.data.url !== ''); // Industry filter metadata: id -> { label, icon } // Icons are lucide-style SVGs; emoji-free. @@ -44,17 +49,19 @@ const industryFilters = [ > {f.id !== 'all' && } {f.id === 'all' && } - {f.id === 'all' ? `ทั้งหมด (${portfolio.length})` : f.label} + {f.id === 'all' ? `ทั้งหมด (${realPortfolio.length})` : f.label} ))}
-
-
+
+ + +
- {portfolio.map(item => ( + {realPortfolio.map(item => (
- -
-
+ +
+ + +
ดีลที่เราเลือก

@@ -81,23 +90,19 @@ const industryFilters = [

-
-
-
1
-

ธุรกิจที่พร้อมจริง ๆ

-

เราคุยกับเจ้าของธุรกิจก่อน ถ้าเป้าหมายยังไม่ชัด เราจะแนะนำให้รอก่อน ดีกว่าเสียเงินแล้วไม่ได้ผล

-
-
-
2
-

งบประมาณที่สมเหตุสมผล

-

เราไม่ได้ถูกที่สุด แต่ก็ไม่ได้แพงที่สุด ถ้าใครบอก "งบ 5,000 ทำเว็บได้ไหม" — เราแนะนำให้ไปฟรีแลนซ์ก่อน

-
-
-
3
-

ลูกค้าที่ฟัง

-

เราทำงานกับลูกค้าที่พร้อมฟังคำแนะนำ ไม่ใช่ลูกค้าที่บอก "ทำตามนี้เป๊ะ ๆ" แล้วผิดคาดทุกที

-
-
+ + +

เราคุยกับเจ้าของธุรกิจก่อน ถ้าเป้าหมายยังไม่ชัด เราจะแนะนำให้รอก่อน ดีกว่าเสียเงินแล้วไม่ได้ผล

+
+ + +

เราไม่ได้ถูกที่สุด แต่ก็ไม่ได้แพงที่สุด ถ้าใครบอก "งบ 5,000 ทำเว็บได้ไหม" — เราแนะนำให้ไปฟรีแลนซ์ก่อน

+
+ + +

เราทำงานกับลูกค้าที่พร้อมฟังคำแนะนำ ไม่ใช่ลูกค้าที่บอก "ทำตามนี้เป๊ะ ๆ" แล้วผิดคาดทุกที

+
+
@@ -137,9 +142,27 @@ const industryFilters = [ }); }); }); + + // Parallax orbs + const parallaxEls = document.querySelectorAll('[data-parallax-speed]'); + function updateParallax() { + const scrolled = window.scrollY; + parallaxEls.forEach(el => { + const speed = parseFloat(el.getAttribute('data-parallax-speed') || '0.4'); + const ty = scrolled * speed * -0.3; + el.style.transform = `translate3d(0, ${ty}px, 0)`; + }); + } + window.addEventListener('scroll', () => requestAnimationFrame(updateParallax), { passive: true }); + + diff --git a/src/pages/services/[slug].astro b/src/pages/services/[slug].astro index 4922808..5bcc370 100644 --- a/src/pages/services/[slug].astro +++ b/src/pages/services/[slug].astro @@ -2,18 +2,11 @@ import Base from '../../layouts/Base.astro'; import Navigation from '../../components/Navigation.astro'; import Footer from '../../components/Footer.astro'; -import PageHero from '../../components/PageHero.astro'; -import Icon from '../../components/Icon.astro'; +import BentoGrid from '../../components/BentoGrid.astro'; +import BentoTile from '../../components/BentoTile.astro'; +import DecoOrb from '../../components/DecoOrb.astro'; import { getCollection, render } from 'astro:content'; -const { slug } = Astro.params; -const services = await getCollection('services'); -const service = services.find(s => s.id === slug); - -if (!service) { - return Astro.redirect('/404'); -} - export async function getStaticPaths() { const services = await getCollection('services'); return services.map(service => ({ @@ -22,15 +15,17 @@ export async function getStaticPaths() { })); } +const { service } = Astro.props; const { Content } = await render(service); +const slug = service.id; const isWebDev = slug === 'webdev'; const isMarketing = slug === 'marketing'; const isAutomation = slug === 'automation'; const isTechConsult = slug === 'ai-consult'; -// Service-specific data -const serviceData = { +// Service-specific data — keyed by slug, with safe fallback to webdev. +const serviceData: Record = { 'webdev': { badge: 'บริการรับทำเว็บไซต์สำหรับ SME ไทย', title: 'สร้างเว็บไซต์', @@ -150,26 +145,24 @@ const serviceData = { }; const data = serviceData[slug] || serviceData['webdev']; +const featureList = data.features || data.services || []; --- - -
-
-
-
-
- -
+ +
+ + +
{data.badge} -

- {data.title} - {data.titleAccent} - {data.titleAccent2 && {data.titleAccent2}} +

+ {data.title} + {data.titleAccent} + {data.titleAccent2 && {data.titleAccent2}}

{data.desc}

@@ -181,7 +174,7 @@ const data = serviceData[slug] || serviceData['webdev']; โทรหาเรา - + ทัก LINE
@@ -196,29 +189,33 @@ const data = serviceData[slug] || serviceData['webdev'];
+
-
-
- บริการหลัก -
- {(data.features || data.services || []).slice(0, 4).map((f) => ( -
-
-
- {f.title} - {f.desc || f.items?.[0]} -
-
- ))} -
+ + +
    + {featureList.slice(0, 4).map((f) => ( +
  • +
    {String(featureList.indexOf(f) + 1).padStart(2, '0')}
    +
    + {f.title} + {f.desc || f.items?.[0]} +
    +
  • + ))} +
+
+
- -
-
+ +
+ + +
{isTechConsult ? 'บริการของเรา' : 'ความสามารถ'}

@@ -226,180 +223,219 @@ const data = serviceData[slug] || serviceData['webdev'];

-
- {(data.features || data.services || []).map((f) => ( -
-
-

{f.title}

-

{f.desc || f.items?.join(' · ')}

-
- ))} -
+ + {featureList.map((f: any, i: number) => { + // Asymmetric span + surface rotation per the bento design system + const span = i % 3 === 0 ? 8 : 4; + const surfaces = ['yellow', 'purple-soft', 'mint', 'soft', 'teal', 'soft'] as const; + const surface = surfaces[i % surfaces.length]; + return ( + +

{f.desc || f.items?.join(' · ')}

+
+ ); + })} +
- + {data.targets && ( -
-
+
+ + +
เหมาะกับใคร?

ธุรกิจทุกประเภท

-
- {data.targets.map((t) => ( -
-
-

{t.title}

-

{t.desc}

-
- ))} -
+ + {data.targets.map((t: any, i: number) => { + // First target takes 12 to lead, then 6+6 for remaining pair + const span = i === 0 ? 12 : 6; + const surfaces = ['yellow', 'soft', 'purple-soft'] as const; + const surface = surfaces[i % surfaces.length]; + return ( + +

{t.desc}

+
+ ); + })} +
)} - - {data.included && ( -
-
-
- สิ่งที่ได้รับ -

- ทุกเว็บไซต์มาพร้อมให้ครบ -

-
- -
- {data.included.map((item) => ( -
- - - - {item} + + {(data.included || data.techOptions) && ( +
+ + +
+ {data.included && ( + <> +
+ สิ่งที่ได้รับ +

ทุกเว็บไซต์มาพร้อมให้ครบ

- ))} -
+ + {data.included.map((item: string, i: number) => ( + +

รวมอยู่ในแพ็คเกจ — ไม่มีค่าใช้จ่ายเพิ่ม

+
+ ))} + +

เริ่มต้น ฿15,500*

+

*ราคาขึ้นอยู่กับความซับซ้อนของเว็บไซต์

+
+
+ + )} -
-

รวม: เว็บไซต์ + Server 1 ปี + Domain .com = เริ่มต้น ฿15,500*

- *ราคาขึ้นอยู่กับความซับซ้อนของเว็บไซต์ -
-
-
- )} - - {data.techOptions && ( -
-
-
- เลือกระบบ -

- เลือกระบบที่เหมาะกับคุณ -

-
- -
- {data.techOptions.map((t) => ( -
-
{t.badge}
-

{t.name}

-

{t.desc}

- {t.duration} -
- ))} -
+ {data.techOptions && ( + <> +
+ เลือกระบบ +

เลือกระบบที่เหมาะกับคุณ

+
+ + {data.techOptions.map((t: any, i: number) => ( + +

{t.desc}

+

{t.duration}

+
+ ))} +
+ + )}
)} + {data.pricing && ( -
-
+
+ + +
ราคา

ราคาค่าบริการ

ชัดเจน ไม่มีค่าใช้จ่ายซ่อนเร้น

-
- {data.pricing.map((p) => ( -
- {p.label} - {p.price} -
- ))} -
+ + {data.pricing.map((p: any, i: number) => { + const surfaces = ['white', 'soft', 'yellow', 'mint', 'purple-soft'] as const; + const surface = surfaces[i % surfaces.length]; + return ( + + + ); + })} +
)} + {data.aiFeatures && ( -
-
+
+ + +
AI Analytics -

- AI วิเคราะห์ทุกความเคลื่อนไหว -

+

AI วิเคราะห์ทุกความเคลื่อนไหว

-
- {data.aiFeatures.map((f) => ( -
- - - - {f} -
- ))} -
+ + {data.aiFeatures.map((f: string, i: number) => { + // Asymmetric: first item 12, then 6+6 paired + const span = i === 0 ? 12 : 6; + const surfaces = ['yellow', 'soft', 'mint', 'purple-soft'] as const; + const surface = surfaces[i % surfaces.length]; + return ( + + + ); + })} +
)} + {data.whyUs && ( -
-
+
+ + +
ทำไมต้องเลือกเรา?

ความเชี่ยวชาญที่คุณไว้วางใจได้

-
- {data.whyUs.map((w) => ( -
-

{w.title}

-

{w.desc}

-
- ))} -
+ + {data.whyUs.map((w: any, i: number) => { + const surfaces = ['yellow', 'soft', 'purple-soft'] as const; + const surface = surfaces[i % surfaces.length]; + return ( + +

{w.desc}

+
+ ); + })} +
)} - -
-
+ +
+ + +
+ + +
+ +
+
+
+
+
+ + +
+ + +
FAQ

คำถามที่พบบ่อย

-
- {data.faqs.map((faq) => ( -
- - {faq.q} - + - -
-

{faq.a}

-
-
- ))} -
+ + {data.faqs.map((faq: any, i: number) => { + // Hero: first question 12-span, then alternating 8+4 for visual tension + let span: 12 | 8 | 4 = 6; + if (i === 0) span = 12; + else if (i % 3 === 1) span = 8; + else if (i % 3 === 2) span = 4; + else span = 6; + const surfaces = ['yellow', 'soft', 'purple-soft', 'mint', 'teal', 'soft'] as const; + const surface = surfaces[i % surfaces.length]; + return ( + +
+

{faq.a}

+
+
+ ); + })} +
@@ -411,7 +447,9 @@ const data = serviceData[slug] || serviceData['webdev'];

ติดต่อเราเพื่อคุยกันและให้คำปรึกษาฟรี! เราพร้อมช่วยคุณสร้าง{data.title}ที่ตอบโจทย์ธุรกิจ

- + + + 080-995-5945 สอบถามราคา @@ -424,29 +462,26 @@ const data = serviceData[slug] || serviceData['webdev']; + + diff --git a/src/pages/services/index.astro b/src/pages/services/index.astro index c99fdd6..485f71d 100644 --- a/src/pages/services/index.astro +++ b/src/pages/services/index.astro @@ -3,28 +3,15 @@ import Base from '../../layouts/Base.astro'; import Navigation from '../../components/Navigation.astro'; import Footer from '../../components/Footer.astro'; import PageHero from '../../components/PageHero.astro'; -import Icon from '../../components/Icon.astro'; +import BentoGrid from '../../components/BentoGrid.astro'; +import BentoTile from '../../components/BentoTile.astro'; +import DecoOrb from '../../components/DecoOrb.astro'; import { getCollection } from 'astro:content'; const services = await getCollection('services'); -// Decision-table icon lookup -const serviceIcons: Record = { - 'webdev': 'globe', - 'automation': 'cog', - 'marketing': 'megaphone', - 'seo': 'search', - 'consult': 'server', - 'audit': 'refresh', -}; - -// Map service slugs to images -const serviceImages: Record = { - 'automation': '/images/services/automation.jpg', - 'ai-consult': '/images/services/ai-consult.jpg', - 'marketing': '/images/services/marketing.jpg', - 'webdev': '/images/services/webdev.jpg', -}; +// Surface rotation for services Bento — keep variety +const serviceSurfaces = ['yellow', 'purple-soft', 'mint', 'soft', 'teal', 'coral'] as const; --- @@ -36,51 +23,49 @@ const serviceImages: Record = { subtitle="เลือกเฉพาะที่คุณต้องการ หรือให้เราวางแผนให้ทั้งระบบ" /> - -
-
+ +
+ + +
ไม่แน่ใจว่าจะเริ่มจากตรงไหน?

เลือกบริการที่ใช่ ใน 30 วินาที

-
-
-
คุณกำลังเจอ
-
เริ่มที่
-
คาดเห็นผลใน
-
-
-
ยังไม่มีเว็บไซต์ หรือเว็บเก่าโหลดช้า
-
AI-Enhanced Website
-
2–4 สัปดาห์
-
-
-
ทีมเซลล์ตอบแชตไม่ทัน ลูกค้าหายตอนกลางคืน
-
AI Automation
-
1–3 เดือน
-
-
-
ลงโฆษณาเยอะ แต่ยอดขายไม่โต
-
Online Marketing Automation
-
1–3 เดือน
-
-
-
อยากติดหน้าแรก Google แต่ไม่รู้จะเริ่มยังไง
-
SEO + AI Content
-
3–6 เดือน
-
-
-
ไม่อยากจ้างทีม IT ประจำ แต่อยากมี Server/ระบบหลังบ้าน
-
Tech Consult
-
2–6 สัปดาห์
-
-
-
มีเว็บอยู่แล้ว แต่ขายไม่ได้
-
เริ่มจาก Audit ฟรี 30 นาที
-
1 สัปดาห์
-
-
+ + +
+
คุณกำลังเจอ
+
เริ่มที่
+
คาดเห็นผลใน
+ +
ยังไม่มีเว็บไซต์ หรือเว็บเก่าโหลดช้า
+
AI-Enhanced Website
+
2–4 สัปดาห์
+ +
ทีมเซลล์ตอบแชตไม่ทัน ลูกค้าหายตอนกลางคืน
+
AI Automation
+
1–3 เดือน
+ +
ลงโฆษณาเยอะ แต่ยอดขายไม่โต
+
Online Marketing Automation
+
1–3 เดือน
+ +
อยากติดหน้าแรก Google แต่ไม่รู้จะเริ่มยังไง
+
SEO + AI Content
+
3–6 เดือน
+ +
ไม่อยากจ้างทีม IT ประจำ แต่อยากมี Server/ระบบหลังบ้าน
+
Tech Consult
+
2–6 สัปดาห์
+ +
มีเว็บอยู่แล้ว แต่ขายไม่ได้
+
เริ่มจาก Audit ฟรี 30 นาที
+
1 สัปดาห์
+
+
+

ถ้ายังไม่แน่ใจ → กดปุ่ม "ปรึกษาฟรี" ด้านล่าง เราจะถาม 5 คำถามแล้วบอกคำตอบเอง @@ -88,57 +73,70 @@ const serviceImages: Record = {

- -
-
+ +
+ + +
บริการทั้งหมด

เลือกตาม เป้าหมาย ของคุณ

-
- {services.map(s => ( - - {s.data.badge} -

{s.data.title}

-

{s.data.subtitle}

-
- เป้าหมาย - {s.data.objective} -
- ดูรายละเอียด → -
- ))} -
+ + {services.map((s, i) => { + // Asymmetric: 6+6 for the first pair, then 4+4+4 for the rest + let span: 3 | 4 | 6 | 8 | 12; + if (i === 0) span = 8; + else if (i === 1) span = 4; + else if (i === 2) span = 4; + else if (i === 3) span = 4; + else if (i === 4) span = 6; + else span = 6; + const surface = serviceSurfaces[i % serviceSurfaces.length]; + return ( + + +

{s.data.subtitle}

+
+ เป้าหมาย + {s.data.objective} +
+ ดูรายละเอียด → +
+
+ ); + })} +
- -
-
+ +
+ + +
งบประมาณ

ไม่ใช่ทุกงบที่จะเหมือนกัน

-
-
-

เริ่มต้น

+ +
15,000–35,000 บาท

Landing Page + AI Chatbot

-
-
-
แนะนำ
-

ธุรกิจ

-
50,000–150,000 บาท
-

เว็บไซต์เต็มรูป + SEO 3 เดือน

-
-
-

องค์กร

-
200,000 บาทขึ้นไป
-

ระบบครบวงจร + Automation

-
-
+ + + +
50,000–150,000 บาท
+

เว็บไซต์เต็มรูป + SEO 3 เดือน

+
+ + +
200,000 บาทขึ้นไป
+

ระบบครบวงจร + Automation

+
+
@@ -159,73 +157,48 @@ const serviceImages: Record = { + + diff --git a/src/pages/terms.astro b/src/pages/terms.astro index 5b56534..3a7b586 100644 --- a/src/pages/terms.astro +++ b/src/pages/terms.astro @@ -3,6 +3,9 @@ import Base from '../layouts/Base.astro'; import Navigation from '../components/Navigation.astro'; import Footer from '../components/Footer.astro'; import PageHero from '../components/PageHero.astro'; +import BentoGrid from '../components/BentoGrid.astro'; +import BentoTile from '../components/BentoTile.astro'; +import DecoOrb from '../components/DecoOrb.astro'; --- @@ -14,46 +17,70 @@ import PageHero from '../components/PageHero.astro'; subtitle="มีผลบังคับใช้วันที่ 5 พฤษภาคม 2569" /> -
-
-
-

ชื่อเว็บไซต์: MoreminiMore | เว็บไซต์: https://www.moreminimore.com | บริษัท: MoreminiMore Co.,Ltd.

+
+ + +
+ + +
+

ชื่อเว็บไซต์: MoreminiMore | เว็บไซต์: https://www.moreminimore.com | บริษัท: MoreminiMore Co.,Ltd.

-
-

1. การยอมรับเงื่อนไข

-

ด้วยการเข้าถึงและใช้งานเว็บไซต์ของบริษัท มอร์มินิมอร์ จำกัด ท่านยอมรับและตกลงที่จะถูกผูกมัดด้วยเงื่อนไขการให้บริการฉบับนี้

-
+
+

1. การยอมรับเงื่อนไข

+

ด้วยการเข้าถึงและใช้งานเว็บไซต์ของบริษัท มอร์มินิมอร์ จำกัด ท่านยอมรับและตกลงที่จะถูกผูกมัดด้วยเงื่อนไขการให้บริการฉบับนี้

+
-
-

2. การแก้ไขเงื่อนไข

-

เราขอสงวนสิทธิในการแก้ไขเงื่อนไขนี้เมื่อใดก็ได้ การแก้ไขจะมีผลทันทีเมื่อโพสต์บนเว็บไซต์ ท่านควรตรวจสอบเงื่อนไขนี้เป็นประจำ

-
+
+

2. การแก้ไขเงื่อนไข

+

เราขอสงวนสิทธิในการแก้ไขเงื่อนไขนี้เมื่อใดก็ได้ การแก้ไขจะมีผลทันทีเมื่อโพสต์บนเว็บไซต์ ท่านควรตรวจสอบเงื่อนไขนี้เป็นประจำ

+
-
-

3. บริการของเรา

-

เราให้บริการพัฒนาเว็บไซต์ AI Automation และ Marketing Automation สำหรับธุรกิจไทย โดยมีรายละเอียดและขอบเขตงานตามที่ตกลงกันในสัญญา

-
+
+

3. บริการของเรา

+

เราให้บริการพัฒนาเว็บไซต์ AI Automation และ Marketing Automation สำหรับธุรกิจไทย โดยมีรายละเอียดและขอบเขตงานตามที่ตกลงกันในสัญญา

+
-
-

4. การชำระเงิน

-

การชำระเงินจะเป็นไปตามเงื่อนไขที่กำหนดในใบเสนอราคาและสัญญา ลูกค้าตกลงชำระตามกำหนดเวลาที่ระบุ

-
+
+

4. การชำระเงิน

+

การชำระเงินจะเป็นไปตามเงื่อนไขที่กำหนดในใบเสนอราคาและสัญญา ลูกค้าตกลงชำระตามกำหนดเวลาที่ระบุ

+
-
-

5. การรับประกัน

-

เรารับประกันคุณภาพงานตามที่ระบุในสัญญา หากไม่พอใจในงาน เราพร้อมแก้ไขจนกว่าจะถูกใจตามเงื่อนไขที่กำหนด

-
+
+

5. การรับประกัน

+

เรารับประกันคุณภาพงานตามที่ระบุในสัญญา หากไม่พอใจในงาน เราพร้อมแก้ไขจนกว่าจะถูกใจตามเงื่อนไขที่กำหนด

+
-
-

6. ข้อจำกัดความรับผิด

-

ความรับผิดของบริษัทจะจำกัดอยู่ที่มูลค่าของงานที่ให้บริการตามที่ระบุในสัญญา

-
+
+

6. ข้อจำกัดความรับผิด

+

ความรับผิดของบริษัทจะจำกัดอยู่ที่มูลค่าของงานที่ให้บริการตามที่ระบุในสัญญา

+
-
-

7. ติดต่อเรา

-

หากมีคำถามเกี่ยวกับเงื่อนไขการให้บริการ กรุณาติดต่อเราที่ contact@moreminimore.com หรือ 080-995-5945

-
-
+
+

7. ติดต่อเรา

+

หากมีคำถามเกี่ยวกับเงื่อนไขการให้บริการ กรุณาติดต่อเราที่ contact@moreminimore.com หรือ 080-995-5945

+
+
+ + + +
+

ชื่อเอกสาร: เงื่อนไขการให้บริการ

+

มีผลบังคับใช้: 5 พฤษภาคม 2569

+

จัดการโดย: MoreminiMore Co.,Ltd.

+

หัวข้อทั้งหมด 7 ข้อ:

+
    +
  1. การยอมรับเงื่อนไข
  2. +
  3. การแก้ไขเงื่อนไข
  4. +
  5. บริการของเรา
  6. +
  7. การชำระเงิน
  8. +
  9. การรับประกัน
  10. +
  11. ข้อจำกัดความรับผิด
  12. +
  13. ติดต่อเรา
  14. +
+
+
+
@@ -62,25 +89,83 @@ import PageHero from '../components/PageHero.astro'; + +