Next.js คืออะไร?
สำหรับการทำเว็บยุคใหม่ เรามักจะได้ยินคำว่า React และ Next.js ทั้งสองตัวนี้เกี่ยวข้องกันอย่างแนบแน่น แต่หน้าที่ต่างกัน
🎮 เทียบศัพท์ให้เข้าใจง่าย (สไตล์ Game Dev)
-
React = UI Library (เปรียบเหมือนระบบวาด UI)
เก่งเรื่องการสร้างชิ้นส่วนหน้าจอ (Component) หรือ Prefab เอาไว้ใช้ซ้ำ แต่ถ้าจะทำเว็บแบบมีหลายๆ หน้า หรือทำ SEO ให้ Google ค้นหาเจอ React เพียวๆ จะจัดการยาก -
Next.js = Framework (เปรียบเหมือน Game Engine)
เอา React มาเป็นแกนกลาง แล้วเพิ่มระบบจัดการจำเป็นต่างๆ มาให้ครบจบ เช่น ระบบเปลี่ยนหน้า, การเรนเดอร์ฝั่งเซิร์ฟเวอร์ (SSR)
Unity vs Web Development
มีพื้นฐานเขียนเกม (C#/Unity) มาก่อนถือว่า ได้เปรียบมาก! เพราะคุณเข้าใจเรื่อง Logic และ Object-Oriented อยู่แล้ว สิ่งที่ต้องทำตอนนี้มีแค่การ "ปรับวิธีคิด" (Mindset) เล็กน้อยเท่านั้น
1. จับคู่คำศัพท์ (Terminology Mapping)
| 🎮 ฝั่ง Unity (Game Dev) | 🌐 ฝั่ง Next.js (Web Dev) |
|---|---|
| Scene (ฉากต่างๆ ในเกม) | Page / Route (หน้าเว็บแต่ละ URL) |
| GameObject (วัตถุเปล่าๆ ในฉาก) | HTML Element / Tag (เช่น <div>, <img>) |
| Prefab (ก้อน Object ที่ตั้งค่าไว้ใช้ซ้ำ) | Component (ก้อน UI ที่เขียนแยกไว้ใช้ซ้ำ) |
| Material / Inspector (กำหนดสี ขนาด) | CSS / Tailwind (className="text-red-500") |
| C# Script (สั่งการทำงาน) | JavaScript / TypeScript |
| UI Canvas Hierarchy (ซ้อนทับกันลงมา) | DOM Tree (แท็ก HTML ที่เขียนซ้อนกัน) |
2. ความแตกต่างที่สำคัญที่สุด (ต้องอ่าน!)
Loop vs Event
ในเกม: โค้ดจะทำงานตลอดเวลาผ่าน Update() ทุกๆ เฟรม (60 FPS) เพื่อเช็คว่าผู้เล่นกดปุ่มหรือยัง
ในเว็บ: เว็บ ไม่มี Update Loop เว็บจะอยู่นิ่งๆ จนกว่าจะเกิด Event (เช่น คนคลิกปุ่ม) แล้วโค้ดถึงจะทำงาน
การวางตำแหน่ง UI
ในเกม: ลากวาง UI Canvas แบบอิสระ (Absolute Position) อยากให้อยู่ตรงไหนก็ปรับแกน X, Y
ในเว็บ: เว็บทำงานแบบ Document Flow (กล่องต่อกล่อง) เรียงจากบนลงล่าง เราจะใช้ Flexbox หรือ Grid ในการดันกล่องให้ไปอยู่ในจุดที่ต้องการ
3. เทียบโค้ด: การซ่อน/แสดงของ
public GameObject panel; public void TogglePanel() { bool isActive = panel.activeSelf; panel.SetActive(!isActive); }
const [isOpen, setIsOpen] = useState(false); const togglePanel = () => { setIsOpen(!isOpen); } {/* เอาไปใช้ใน HTML */} {isOpen && <div>โผล่มาแล้ว!</div>}
Core Concepts ที่ต้องรู้ก่อนลุย
1. Server vs Client Components
ใน Next.js ทุกหน้าคือ Server Component โดยค่าเริ่มต้น
- ถ้าต้องมีปุ่มคลิก (onClick), Animation → ต้องใช้ Client Component (ใส่ "use client"; ไว้บรรทัดแรก)
2. File-System Based Routing
สร้างโฟลเดอร์ = สร้าง URL ไม่ต้องเขียนโค้ดตั้งค่า Route แยกต่างหาก
การทำให้เว็บรองรับทุกอุปกรณ์ (Responsive Design)
ในสายพัฒนาเกม เราใช้ Canvas Scaler และ Anchors เพื่อให้ UI ย่อ-ขยายตามหน้าจอโทรศัพท์หรือคอมพิวเตอร์
สำหรับโลกของ Web Development เราใช้ระบบที่เรียกว่า Breakpoints (จุดตัดขนาดจอ) ของ Tailwind CSS ในการควบคุม Layout ครับ
1. Tailwind CSS Breakpoints ที่ต้องจำ
| คำนำหน้า (Prefix) | ขนาดหน้าจอขั้นต่ำ | ประเภทอุปกรณ์ |
|---|---|---|
| (ไม่มี prefix) | > 0px | สมาร์ตโฟนแนวตั้ง (Mobile-First) |
| sm: | ≥ 640px | สมาร์ตโฟนจอใหญ่ / แนวนอน |
| md: | ≥ 768px | แท็บเล็ต (iPad, Galaxy Tab) |
| lg: | ≥ 1024px | แล็ปท็อป / คอมพิวเตอร์ตั้งโต๊ะ |
| xl: | ≥ 1280px | จอคอมพิวเตอร์ขนาดใหญ่ (Widescreen) |
2. กฎทอง: คิดแบบ Mobile-First เสมอ
เขียนสไตล์สำหรับ จอมือถือเป็นพื้นฐานก่อน แล้วค่อยใช้ Prefix กำหนดการแสดงผลบนจอที่ใหญ่ขึ้น ตัวอย่างเช่น:
grid-cols-1: หน้าจอมือถือแสดง 1 คอลัมน์เดี่ยว การ์ดเรียงซ้อนลงมาmd:grid-cols-2: จอแท็บเล็ตขยายออกเป็น 2 คอลัมน์ซ้ายขวาlg:grid-cols-3: จอคอมพิวเตอร์ขยายออกเป็น 3 คอลัมน์เต็มพื้นที่
📱 3. Checklist ตรวจสอบเว็บก่อนส่งงาน (Responsive Testing)
ให้น้องเปิด Google Chrome แล้วกดปุ่ม F12 (DevTools) จากนั้นกดไอคอนรูปมือถือ/แท็บเล็ต เพื่อจำลองหน้าจอต่างๆ แล้วตรวจตาม 4 ข้อนี้:
- ✔ 1. ไม่เกิด Scroll แนวนอน: หน้าเว็บต้องเลื่อนได้เฉพาะบน-ลงล่างเท่านั้น ห้ามมีแถบเลื่อนซ้าย-ขวาหลุดออกมาในจอมือถือ
-
✔ 2. รูปภาพปรับขนาดอัตโนมัติ:
รูปภาพต้องใส่คลาสยืดหยุ่น เช่น
w-full h-48 sm:h-64 object-coverเพื่อไม่ให้บีบเบี้ยวหรือล้นกรอบ -
✔ 3. ขนาดตัวหนังสืออ่านง่ายทุกจอ:
ตัวหนังสือเนื้อหาในมือถือต้องไม่เล็กกว่า
text-sm(14px) และหัวข้อหลักไม่ตัดคำจนอ่านไม่รู้เรื่อง -
✔ 4. ปุ่มกดสัมผัสได้ง่าย (Touch Target):
ปุ่มบนจอมือถือต้องมีความสูงไม่น้อยกว่า 40-44px หรือใส่ padding เช่น
py-2.5 px-6ให้นิ้วกดได้พอดี
คลังคำศัพท์ & คีย์เวิร์ดสำคัญ
ก่อนเขียนโค้ด เราต้องเข้าใจคำศัพท์เหล่านี้ให้ตรงกันก่อน จะได้อ่านโค้ดรู้เรื่องและนำไปประยุกต์ใช้ได้
1. โครงสร้างพื้นฐาน (HTML/DOM)
DOM (Document Object Model)
โครงสร้างต้นไม้ของหน้าเว็บ (เหมือน Hierarchy ใน Game Engine ที่มี Parent/Child)
การใช้ JS ไปเปลี่ยนสีข้อความ คือการสั่งแก้ไข DOM
Tag / Element
กล่องแต่ละใบ หรือ GameObject ที่เราเอามาวาง เช่น <div> (กล่องเปล่า), <h1> (หัวข้อ), <img> (รูป)
Attribute / ClassName
การกำหนดคุณสมบัติให้ Tag นั้นๆ (เหมือนปรับค่าใน Inspector) เช่น
<img src="pic.jpg" className="w-full" />
2. หัวใจของ React
Component (คอมโพเนนต์)
คือชิ้นส่วน UI ที่สร้างไว้เพื่อนำมาประกอบและใช้ซ้ำได้ (เหมือน Prefab) เช่น การ์ดสินค้า 1 ใบ เราเขียน Component ครั้งเดียว แล้วใช้ลูปสร้าง 10 ใบได้เลย
JSX (JavaScript XML)
ไวยากรณ์พิเศษที่ยอมให้เรา "เขียน HTML แทรกเข้าไปในไฟล์ JavaScript ได้เลย" ทำให้เราผสมโค้ดเงื่อนไข (If-Else, Loop) เข้ากับหน้าตาเว็บได้
Props (Properties)
การส่งข้อมูลจากตัวแม่ไปหาตัวลูก (คล้ายการส่ง Parameter เข้าฟังก์ชัน) เช่น ส่งชื่อ "เซรั่ม" เข้าไปใน Component การ์ดสินค้า เพื่อให้มันแสดงผล
State (สถานะ)
ความจำของ Component หากค่า State เปลี่ยน React จะอัปเดตหน้าจออัตโนมัติ (เช่น กดปุ่มแล้วตะกร้าสินค้าเลขเพิ่มขึ้น)
3. คำสั่ง (Syntax) ยอดฮิตที่ต้องใช้แน่ๆ
// 1. Map (การวนลูปสร้างของ) - ใช้บ่อยมากตอนทำหน้าสินค้า! array.map((item) => <h1>{item.name}</h1>) // 2. Arrow Function (การประกาศฟังก์ชันแบบสั้น) const DoSomething = () => { return "fleur d'or" } // 3. การแทรกตัวแปร JS ลงใน HTML (ต้องครอบด้วยวงเล็บปีกกา {}) <div>{product.name}</div>
การติดตั้ง & รันโปรเจกต์
⚙️ 0. สิ่งที่ต้องมีในเครื่องก่อน (Prerequisites)
ก่อนจะพิมพ์คำสั่งสร้างโปรเจกต์ เครื่องของน้องต้องติดตั้ง 2 โปรแกรมนี้ให้เรียบร้อยก่อน:
- Node.js: ดาวน์โหลดเวอร์ชัน LTS จาก nodejs.org (ถ้าไม่มีตัวนี้ คำสั่ง
npxและnpmจะใช้ไม่ได้) - VS Code Extensions แนะนำ:
Tailwind CSS IntelliSenseและPrettier
1. สร้างโปรเจกต์ใหม่
เปิด Terminal ใน VS Code แล้วพิมพ์คำสั่งนี้:
npx create-next-app@latest fleur-dor
ระบบจะถามตั้งค่า ให้กดเลือกลำดับตามนี้:
- Would you like to use TypeScript? No (เริ่มด้วย JS ธรรมดาก่อน)
- Would you like to use ESLint? Yes
- Would you like to use Tailwind CSS? Yes (ใช้จัดหน้าเว็บ)
- Would you like to use `src/` directory? Yes
- Would you like to use App Router? Yes (สำคัญมาก!)
- Would you like to customize import alias (@/*)? No (กด Enter ผ่านได้เลย)
2. เคลียร์โค้ดเริ่มต้น (Clean Up)
ก่อนเริ่มเขียนเว็บ ให้เปิดไฟล์ src/app/globals.css ลบโค้ดเดิมทั้งหมดออก แล้ววาง 3 บรรทัดนี้แทน เพื่อเปิดใช้ Tailwind CSS อย่างสะอาดตา:
@tailwind base; @tailwind components; @tailwind utilities;
3. รันโปรเจกต์ทดสอบ
cd fleur-dor npm run dev
เปิดเบราว์เซอร์ไปที่ http://localhost:3000 ถ้าขึ้นหน้าขาวว่างๆ พร้อมแสดงผล แปลว่าพร้อมเข้าสู่ Workshop ถัดไปแล้วครับ!
โครงสร้างไฟล์ฉบับเต็ม (App Router)
เมื่อเปิดโปรเจกต์ขึ้นมาใน VS Code คุณจะเห็นโฟลเดอร์ยุ่บยั่บเต็มไปหมด ไม่ต้องตกใจ!
นี่คือการแยกหมวดหมู่ว่า โฟลเดอร์ไหนเราต้องเข้าไปแก้, โฟลเดอร์ไหนใช้เก็บของ, และไฟล์ไหน "ห้ามนำขึ้น Production" เด็ดขาด
1️⃣ พื้นที่ทำงานหลัก (เราจะคลุกคลีอยู่ตรงนี้)
- 📄 page.js ไฟล์เนื้อหาหลัก (ตัวละครหลักในฉาก)
- 📄 layout.js โครงร่างนอกสุด เช่น Navbar/Footer (Master Scene)
- 📄 globals.css CSS หลักของเว็บ (ไฟล์นี้แหละที่เราต้องไปลบโค้ดขยะทิ้ง)
💡 โฟลเดอร์ที่ "ควรสร้างเพิ่ม" ภายใน src/ (Best Practice)
-
📂 src/components/
เอาไว้เก็บ Prefab หรือ ชิ้นส่วน UI ที่ใช้ซ้ำๆ เช่นProductCard.jsxหรือNavbar.jsx -
📂 src/data/
เอาไว้เก็บ ข้อมูลจำลอง (Mock Data) เช่น ไฟล์products.jsเพื่อให้โค้ดดูสะอาดตา ไม่ปนกับหน้า UI
2️⃣ พื้นที่เก็บของ (Assets)
ใช้สำหรับเก็บ รูปภาพ (.jpg, .png), ไฟล์ฟอนต์ (.ttf), หรือไอคอนต่างๆ
ข้อดี: คุณสามารถเรียกใช้รูปในโฟลเดอร์นี้ได้ง่ายๆ เช่น <img src="/logo.png" /> (อ้างอิงจาก Root ได้เลยโดยไม่ต้องพิมพ์ path ยาวๆ)
3️⃣ พื้นที่อันตราย & ไฟล์ระบบ (Do NOT Upload!)
ไฟล์เก็บตัวแปรระบบ เช่น รหัสผ่าน Database, API Keys
ห้ามอัปโหลดขึ้น GitHub หรือ Production เด็ดขาด! (เสี่ยงโดนแฮก)
ไฟล์ข้อมูลสำคัญสุดๆ! (เหมือน Unity Package Manager) มันจะจดไว้หมดว่าโปรเจกต์เราลง Plugin อะไรไว้บ้าง และเวอร์ชั่นอะไร ไฟล์นี้ "ต้องอัปโหลด" ขึ้น Production เสมอ
โฟลเดอร์เก็บโค้ด Plugin ที่ดาวน์โหลดมา โฟลเดอร์นี้ใหญ่มาก (หลายร้อย MB) ห้ามยุ่ง และห้ามอัปโหลด ระบบจะติดตั้งเองอัตโนมัติเมื่อเพื่อนร่วมทีมรัน npm install
โฟลเดอร์นี้จะถูกสร้างขึ้นมาเองตอนเรารันเว็บ (Build Output) ข้อมูลข้างในอ่านไม่รู้เรื่อง ห้ามยุ่ง และห้ามอัปโหลดขึ้น Git ให้ปล่อยระบบมันจัดการเอง
🛡️ วิธีป้องกันไม่ให้ไฟล์ความลับหลุดไป Production
แล้วเราจะบอกระบบยังไงว่า "ห้ามอัปโหลด node_modules/ กับ .env นะ?"
คำตอบคือ เราจะใช้ไฟล์พระเอกที่ชื่อว่า .gitignore (มีจุดนำหน้าด้วยนะ) ซึ่งปกติคำสั่ง create-next-app จะสร้างไฟล์นี้มาให้เราอัตโนมัติที่หน้าแรกของโปรเจกต์เลย
# ซ่อนโฟลเดอร์ Plugin (เพราะมันหนักมาก) node_modules/ # ซ่อนโฟลเดอร์ที่ระบบ Build ขึ้นมาเอง .next/ out/ # ซ่อนไฟล์ความลับ (สำคัญมาก!!!) .env .env.local .env.*.local
.gitignore เสมอว่ามีชื่อไฟล์นั้นเขียนดักไว้หรือยัง ก่อนที่จะกด Commit ขึ้น Git!
🎯 โจทย์การพัฒนา (Project Brief)
🎨 ดูสไตล์เว็บอ้างอิง (LIHT Organics) ↗"พัฒนาเว็บไซต์เกี่ยวกับผลิตภัณฑ์ผสมสารสกัดจากบัวตองของแม่ฮ่องสอน โดยให้มีเนื้อหาเกี่ยวกับประวัติความเป็นมา พื้นที่ที่พบหรือปลูก คุณสมบัติของบัวตอง งานวิจัยที่เกี่ยวข้องกับ ผลิตภัณฑ์จากบัวตองที่มีอยู่ในปัจจุบัน พร้อมมีภาพประกอบในแต่ละหัวข้อ ชื่อเว็บ fleur d'or"[cite: 3]
Workshop: หน้าปก & ประวัติ
export default function Home() { return ( <main className="bg-[#faf8f5] text-stone-800 min-h-screen"> {/* หน้าปก Responsive Hero Banner */} <section className="relative min-h-[50vh] sm:min-h-[60vh] md:min-h-[70vh] flex items-center justify-center bg-black px-4 py-16"> <img src="https://images.unsplash.com/photo-1605235889708-3232bb82a7a9?q=80&w=2000" className="absolute inset-0 w-full h-full object-cover opacity-60" /> <div className="relative z-10 text-center text-white max-w-4xl mx-auto"> <h1 className="text-4xl sm:text-6xl md:text-7xl font-bold mb-4 drop-shadow-lg tracking-wider font-serif">fleur d'or</h1> <p className="text-base sm:text-xl md:text-2xl font-light leading-relaxed px-2"> มนต์เสน่ห์สีทองแห่งขุนเขา: รากเหง้าประวัติศาสตร์ นวัตกรรมคุณค่า และความงามจาก "ดอกบัวตอง" แม่ฮ่องสอน </p> </div> </section> {/* ประวัติความเป็นมา */} <section className="max-w-5xl mx-auto py-12 sm:py-16 md:py-24 px-4 sm:px-6 md:px-8 text-center"> <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-[#8a6b32] mb-6 tracking-wide font-serif">ประวัติความเป็นมา</h2> <p className="text-sm sm:text-base md:text-lg text-stone-600 leading-relaxed mb-4 max-w-3xl mx-auto"> เบื้องหลังความงามของดอกบัวตอง (Mexican Sunflower) มีจุดเริ่มต้นจากมิชชันนารีชาวเม็กซิกัน ที่เดินทางมาเผยแผ่ศาสนาและให้ความช่วยเหลือชุมชนบนภูเขาสูงในจังหวัดแม่ฮ่องสอน </p> <p className="text-sm sm:text-base md:text-lg text-stone-600 leading-relaxed max-w-3xl mx-auto"> ด้วยความคิดถึงบ้านเกิด จึงนำเมล็ดพันธุ์มาปลูกไว้ จนกาลเวลาผ่านไป เมล็ดได้กระจายไปทั่วผืนป่า กลายเป็นความงดงามที่หาชมไม่ได้จากจังหวัดอื่น และถูกยกให้เป็น "ดอกไม้ประจำจังหวัดแม่ฮ่องสอน" </p> </section> </main> ); }
fleur d'or
มนต์เสน่ห์สีทองแห่งขุนเขา: รากเหง้าประวัติศาสตร์ นวัตกรรมคุณค่า และความงามจาก "ดอกบัวตอง" แม่ฮ่องสอน[cite: 3]
ประวัติความเป็นมา
เบื้องหลังความงามของดอกบัวตอง มีจุดเริ่มต้นจากมิชชันนารีชาวเม็กซิกันที่เดินทางมาปฏิบัติภารกิจบนภูเขาสูงในจังหวัดแม่ฮ่องสอน[cite: 3]
ด้วยความคิดถึงบ้านเกิดจึงนำเมล็ดพันธุ์มาปลูกไว้ จนกระทั่งขยายพันธุ์งดงามทั่วผืนป่า และกลายเป็น "ดอกไม้ประจำจังหวัดแม่ฮ่องสอน"[cite: 3]
Workshop: พื้นที่ปลูก (Responsive Grid)
<section className="max-w-5xl mx-auto py-10 sm:py-16 px-4 sm:px-6 md:px-8">
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-12 items-center">
<div className="w-full overflow-hidden rounded-2xl shadow-lg">
<img src="https://images.unsplash.com/photo-1632551571216-92cba7234661?q=80&w=800"
className="w-full h-64 sm:h-80 md:h-96 object-cover hover:scale-105 transition duration-500" />
</div>
<div className="text-left">
<h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-[#8a6b32] mb-4 font-serif">พื้นที่พบและการจัดการ</h2>
<p className="text-sm sm:text-base md:text-lg text-stone-600 leading-relaxed mb-4">
ทุ่งดอกบัวตองจะบานสะพรั่งสุดลูกหูลูกตาในช่วงเดือน พฤศจิกายนถึงธันวาคม ของทุกปี
ดึงดูดนักท่องเที่ยวและสร้างรายได้สู่จังหวัดแม่ฮ่องสอน
</p>
<p className="text-sm sm:text-base md:text-lg text-stone-600 leading-relaxed">
อย่างไรก็ตาม ในเชิงนิเวศวิทยา บัวตองถือเป็น พืชต่างถิ่นรุกราน (Alien Invasive Species)
ที่เพิ่มความเสี่ยงไฟป่า เราจึงนำแนวคิดการตัดแต่งควบคุมมาเปลี่ยนวัชพืชให้เป็นสารสกัดทรงคุณค่า
</p>
</div>
</div>
</section>
พื้นที่พบและการจัดการ
ทุ่งดอกบัวตองจะบานสะพรั่งในช่วงเดือน พฤศจิกายนถึงธันวาคม ของทุกปี ดึงดูดนักท่องเที่ยวและขับเคลื่อนเศรษฐกิจชุมชน[cite: 3]
ในเชิงนิเวศวิทยา บัวตองถือเป็น พืชต่างถิ่นรุกราน ที่เสี่ยงต่อการเกิดไฟป่า เราจึงนำแนวคิดการควบคุมตัดแต่งมาแปรรูปเป็นผลิตภัณฑ์บำรุงผิว[cite: 3]
Workshop: คุณสมบัติ & งานวิจัย
<section className="bg-white py-12 sm:py-16 md:py-20">
<div className="max-w-5xl mx-auto px-4 sm:px-6 md:px-8">
<h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-[#8a6b32] text-center mb-8 sm:mb-12 font-serif">คุณสมบัติและงานวิจัย</h2>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 sm:gap-8">
<div className="bg-[#faf8f5] p-6 sm:p-8 rounded-2xl border border-stone-200 shadow-sm">
<h3 className="text-xl sm:text-2xl font-bold text-[#8a6b32] mb-3 sm:mb-4">🌿 นวัตกรรมสารสกัด</h3>
<p className="text-stone-600 text-sm sm:text-base mb-3 leading-relaxed">จากการควบคุมวัชพืชสู่สารสกัดทรงคุณค่า พบว่าอุดมไปด้วยสารออกฤทธิ์สำคัญ ได้แก่:</p>
<ul className="list-disc pl-5 text-stone-700 space-y-1 sm:space-y-2 text-sm sm:text-base font-medium">
<li>Sesquiterpene Lactones</li>
<li>Flavonoids</li>
<li>Phenolics</li>
</ul>
</div>
<div className="bg-[#faf8f5] p-6 sm:p-8 rounded-2xl border border-stone-200 shadow-sm">
<h3 className="text-xl sm:text-2xl font-bold text-[#8a6b32] mb-3 sm:mb-4">🔬 งานวิจัยรองรับ</h3>
<p className="text-stone-600 text-sm sm:text-base leading-relaxed">
การวิจัยระบุชัดเจนว่าสารสกัดจากดอกบัวตองมีฤทธิ์เด่นในการ ต้านอนุมูลอิสระ ต้านการอักเสบ และต้านเชื้อแบคทีเรีย
ซึ่งมีประสิทธิภาพไม่ด้อยไปกว่าพืชสมุนไพรยอดนิยมที่ใช้ในเวชสำอางทั่วไป เช่น ใบบัวบก
</p>
</div>
</div>
</div>
</section>
คุณสมบัติและงานวิจัย
🌿 นวัตกรรมสารสกัด
อุดมไปด้วยสารออกฤทธิ์ทางชีวภาพสำคัญ:[cite: 3]
- Sesquiterpene Lactones[cite: 3]
- Flavonoids[cite: 3]
- Phenolics[cite: 3]
🔬 งานวิจัยรองรับ
มีฤทธิ์เด่นในการ ต้านอนุมูลอิสระ ต้านการอักเสบ และต้านเชื้อแบคทีเรีย มีประสิทธิภาพในการดูแลผิวพรรณเทียบเคียงสมุนไพรเวชสำอางชั้นนำ[cite: 3]
Workshop: การ์ดผลิตภัณฑ์ (Fluid Grid)
export default function Home() { const products = [ { id: 1, name: "fleur d'or Bua Tong Serum", desc: "เซรั่มบำรุงผิวที่อุดมไปด้วย Flavonoids มีฤทธิ์ต้านการอักเสบ ดูแลผิวพรรณอย่างอ่อนโยนและปลอดภัย", img: "https://images.unsplash.com/photo-1620916566398-39f1143ab7be?q=80&w=400" }, { id: 2, name: "fleur d'or Anti-oxidant Cream", desc: "ครีมบำรุงพร้อมสารต้านอนุมูลอิสระจากดอกบัวตอง ป้องกันแบคทีเรียและช่วยสร้างอาชีพให้ชุมชนแม่ฮ่องสอน", img: "https://images.unsplash.com/photo-1608248593842-8d76db9ee606?q=80&w=400" } ]; return ( <!-- ... โค้ด section อื่นๆ ... --> <section className="max-w-6xl mx-auto py-12 sm:py-16 md:py-24 px-4 sm:px-6 md:px-8"> <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-[#8a6b32] text-center mb-8 sm:mb-12 font-serif">ผลิตภัณฑ์ของเรา</h2> <div className="grid grid-cols-1 sm:grid-cols-2 gap-6 sm:gap-8 max-w-3xl mx-auto"> {products.map((item) => ( <div key={item.id} className="bg-white rounded-2xl shadow-sm border border-stone-200 overflow-hidden hover:shadow-md transition flex flex-col"> <img src={item.img} className="w-full h-48 sm:h-64 object-cover" /> <div className="p-5 sm:p-6 flex-1 flex flex-col justify-between"> <div> <h3 className="font-bold text-lg sm:text-xl text-stone-800 font-serif">{item.name}</h3> <p className="text-stone-600 mt-2 leading-relaxed text-xs sm:text-sm">{item.desc}</p> </div> <button className="mt-4 w-full py-2.5 rounded-full border border-[#8a6b32] text-[#8a6b32] text-xs sm:text-sm uppercase tracking-wider hover:bg-[#8a6b32] hover:text-white transition"> ดูรายละเอียด </button> </div> </div> ))} </div> </section> /* ... </main> */
ผลิตภัณฑ์ของเรา
fleur d'or Bua Tong Serum
เซรั่มบำรุงผิวที่อุดมไปด้วย Flavonoids มีฤทธิ์ต้านการอักเสบ ดูแลผิวพรรณอย่างอ่อนโยน[cite: 3]
fleur d'or Anti-oxidant Cream
ครีมบำรุงพร้อมสารต้านอนุมูลอิสระจากดอกบัวตอง ป้องกันแบคทีเรีย[cite: 3]
Workshop: แยกชิ้นส่วน (Components)
สร้างไฟล์ Component ย่อยในโฟลเดอร์ src/components/ เช่น Banner.jsx เพื่อให้โค้ดหน้าหลักกระชับและรองรับ Responsive ในระดับ Component[cite: 4]
1. ตัวอย่างไฟล์ Banner.jsx
export default function Banner() { return ( <section className="relative min-h-[50vh] sm:min-h-[60vh] md:min-h-[70vh] flex items-center justify-center bg-black px-4 py-16"> <img src="https://images.unsplash.com/photo-1605235889708-3232bb82a7a9?q=80&w=2000" className="absolute inset-0 w-full h-full object-cover opacity-60" /> <div className="relative z-10 text-center text-white max-w-4xl mx-auto"> <h1 className="text-4xl sm:text-6xl md:text-7xl font-bold mb-4 drop-shadow-lg tracking-wider font-serif">fleur d'or</h1> <p className="text-base sm:text-xl md:text-2xl font-light leading-relaxed"> มนต์เสน่ห์สีทองแห่งขุนเขา: รากเหง้าประวัติศาสตร์ นวัตกรรมคุณค่า และความงามจาก "ดอกบัวตอง" แม่ฮ่องสอน </p> </div> </section> ); }
🔥 ภารกิจท้าทาย (Final Challenge)
📄 เปิดดูไฟล์ข้อมูลรายละเอียดเว็บ (PDF)
ให้น้องนำเนื้อหาทั้งหมดจากไฟล์ PDF ด้านบน มาสร้างเป็น Component แยกกัน เช่น History.jsx, Location.jsx, Research.jsx และ Products.jsx ในโฟลเดอร์ src/components/
เกณฑ์สำคัญ: ทุก Component ต้องใส่คลาสรองรับ Responsive (`sm:`, `md:`, `lg:`) ให้แสดงผลสวยงามทั้งบนมือถือและคอมพิวเตอร์!