Compare commits

...

10 Commits

Author SHA1 Message Date
Kunthawat Greethong
9ed0abb5d4 fix(seo): fix hardcoded dealplustech.co.th URLs in JSON-LD
The JSON-LD Product schema in 6 product pages had hardcoded
URLs to dealplustech.co.th, but astro.config.mjs configures the
site as dealplustech.com. When this project replaces the old
site, those URLs would 404.

Changes:
- Replace `https://dealplustech.co.th/images/...` with relative
  `/images/...` paths (resolved by Astro at build time)
- Replace `https://dealplustech.co.th/<page>` with
  `https://dealplustech.com/<page>` (canonical domain)
- Special case: vineman schema `image` referenced an .svg that
  doesn't exist locally — switch to the .jpg version that does
  (also used by the page body) at
  /images/products-raw/vineman/ระบบรั้วไวน์แมน-Vineman-e1613286324569-1024x880.jpg

Files changed:
- realflex.astro
- วาล์ว-valve.astro
- water-treatment.astro
- เครื่องเชื่อม-hdpe.astro
- ระบบรั้วไวน์แมน.astro
- เทอร์โมเบรค-thermobreak.astro
2026-06-04 19:07:20 +07:00
Kunthawat Greethong
ff4e5ae346 refactor(ball-jet): remove performance section and image
The ตารางสมรรถนะการจ่ายลม section and its image are no longer
needed. The dimensions/specs section alone is sufficient for the
product page.
2026-06-04 12:17:37 +07:00
Kunthawat Greethong
52761c3946 refactor(ball-jet): drop redundant HTML tables
The HTML tables for dimensions and airflow performance are less
complete than the user-supplied spec images (which include more
data: bigger size range, more flow rates, unit annotations).
Remove the tables — the spec images alone are clearer and more
informative for the customer.
2026-06-04 12:11:24 +07:00
Kunthawat Greethong
4abb361897 fix(ball-jet): replace copyright images with user-supplied photos
The 7 product photos in commit 47f28cd were scraped from
sapaengineer.com without copyright clearance. Replace them
with 4 user-supplied photos from the LINE album:

- ball-jet-main.jpg (478x542) — original main product photo
- ball-jet-main-hd.jpg (1764x2000) — 4x upscale for hero
- ball-jet-front.jpg — front view of the diffuser
- ball-jet-specs.jpg — dimensions + parameters table
- ball-jet-performance.jpg — airflow performance table

Page now uses:
- Hero: ball-jet-main-hd (upscaled from user's photo)
- Gallery: ball-jet-main-hd + ball-jet-front
- New section: ขนาดและพารามิเตอร์ (Dimensions & Parameters)
  - Spec image + readable HTML table (sizes 4"-10")
  - D / A / B / C / E dimensions in mm
- New section: ตารางสมรรถนะการจ่ายลม (Airflow Performance)
  - Performance image + HTML table (sizes 4"-10", 5 flow rates each)
  - Columns: Air Volume (CMH), Outlet Velocity (m/s), Pressure
    Loss (Pa), Throw Distance (m), Noise (dB(A))
2026-06-04 12:06:27 +07:00
Kunthawat Greethong
47f28cdf65 feat: add หัวจ่ายแอร์ Ball Jet product page
New product page at /หัวจ่าย-ball-jet covering Ball Spout Jet
Diffuser (JD Series) — long-throw ceiling air diffuser for
high-ceiling commercial/industrial buildings.

Content sourced from sapamaket.com, sapaengineer.com (official),
superaircool.com technical specs, and the user's brief. The page
covers:
- Hero with full feature badges (360° rotation, 45° nozzle, sizes,
  materials)
- Product description, features, technical specs, applications,
  advantages
- Image gallery (7 photos scraped from the official SAPA source at
  sapaengineer.com — public product marketing images, used to
  illustrate the product)
- 5-question FAQ
- Contact CTA

Nav updated: added หัวจ่ายแอร์ Ball Jet as the 3rd subcategory under
'อุปกรณ์ปรับอากาศ' in BaseLayout.astro.

No PDF pricelist (none provided by source). No price data displayed
(per user request — pricing to be confirmed separately).
2026-06-04 10:12:24 +07:00
Kunthawat Greethong
5f4e667c65 fix: remove text label from grilles floating card in homepage hero
The กริลแอร์ floating card image remains in the homepage hero,
but the 'กริลแอร์คุณภาพสูง' text label that previously overlaid the
card has been removed.
2026-06-04 09:46:29 +07:00
Kunthawat Greethong
238e6500a6 Revert "fix: remove 'คุณภาพสูง' from grilles hero description"
This reverts commit be565e416c.
2026-06-04 09:30:30 +07:00
Kunthawat Greethong
be565e416c fix: remove 'คุณภาพสูง' from grilles hero description 2026-06-04 09:29:06 +07:00
Kunthawat Greethong
63a58727f9 feat: add price list PDFs and pricelist sections to nav products
Copy all 12 PDF price lists from dealplustech-emdash-old (pdf-batch3
branch) into public/documents/. These were the actual price lists
referenced by the original site.

Add the missing #pricelist sections and data-price-button links in
the hero to the 4 nav products that were missing them:
- ท่อ-ppr-thai-ppr.astro → PRICE-LIST_TPPR_V28-2023.pdf
- ท่อ-ppr-scg.astro → เอสซีเจ ปี68.pdf
- ท่อ-hdpe.astro → Price List HDPE TAP.pdf
- ท่อ-xy-lent.astro → Price List XYLENT_Novat.pdf

The 6 products that already had pricelists (aeroflex, armflex, maxflex,
เครื่องเชื่อม-hdpe, เทอร์โมเบรค, เม็กกรู๊ฟ-คับปลิ้ง) are unchanged.

The BaseLayout auto-detect script now finds #pricelist on these pages
and unhides the data-price-button (ราคาสินค้า) in the hero.
2026-06-03 19:44:25 +07:00
Kunthawat Greethong
ef4b0f2e89 refactor: move blog from EmDash to Astro content collections
EmDash CMS integration is being removed. The blog content is
moved to native Astro content collections (markdown files in
src/content/blog/) which works with the static output config.

Changes:
- Remove EmDash from astro.config.mjs (revert to static output)
- Remove emdash packages from package.json/package-lock.json
- Remove seed/seed.json (was EmDash-only)
- Remove src/live.config.ts (EmDash Astro loader)
- Add src/content.config.ts (Astro content collection for blog)
- Move 3 blog posts to src/content/blog/*.md
- Update src/pages/index.astro to use getCollection('blog')
- Update src/pages/บทความ/[slug].astro to use render() from astro:content
  (Astro 6 API: render(article), not article.render())
- Update src/pages/บทความ/index.astro (blog list)
- Add .hermes/ to .gitignore

Verified:
- npm run build: 35 pages, complete in 2.50s
- / , /aeroflex, /about-us, /บทความ, /บทความ/welcome-post: all 200
2026-06-03 14:02:41 +07:00
42 changed files with 656 additions and 4815 deletions

1
.gitignore vendored
View File

@@ -25,3 +25,4 @@ uploads/
# Generated
emdash-env.d.ts
.hermes/

View File

@@ -1,10 +1,6 @@
import { defineConfig } from 'astro/config'
import tailwindcss from '@tailwindcss/vite'
import node from '@astrojs/node'
import react from '@astrojs/react'
import emdash, { local } from 'emdash/astro'
import { sqlite } from 'emdash/db'
import { google } from 'emdash/auth/providers/google'
import { fileURLToPath } from 'url'
import path from 'path'
@@ -12,10 +8,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url))
export default defineConfig({
site: 'https://dealplustech.com',
output: 'server',
adapter: node({
mode: 'standalone',
}),
output: 'static',
vite: {
plugins: [tailwindcss()],
resolve: {
@@ -29,14 +22,6 @@ export default defineConfig({
},
integrations: [
react(),
emdash({
database: sqlite({ url: 'file:./data.db' }),
storage: local({
directory: './uploads',
baseUrl: '/_emdash/api/media/file',
}),
authProviders: [google()],
}),
],
build: {
assets: '_assets',

4480
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -7,17 +7,14 @@
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro",
"start": "node ./dist/server/entry.mjs"
"astro": "astro"
},
"dependencies": {
"@astrojs/check": "^0.9.4",
"@astrojs/node": "^10.1.1",
"@astrojs/react": "^5.0.5",
"@tailwindcss/typography": "^0.5.15",
"@tailwindcss/vite": "^4.0.0",
"astro": "^6.1.7",
"emdash": "^0.14.0",
"marked": "^18.0.3",
"react": "^19.2.6",
"react-dom": "^19.2.6",

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

@@ -1,137 +0,0 @@
{
"$schema": "https://emdashcms.com/seed.schema.json",
"version": "1",
"meta": {
"name": "ดีล พลัส เทค",
"description": "ระบบน้ำคุณภาพสูง ราคาโรงงาน",
"author": "ดีล พลัส เทค"
},
"settings": {
"title": "ดีล พลัส เทค",
"tagline": "ระบบน้ำคุณภาพสูง ราคาโรงงาน"
},
"collections": [
{
"slug": "blog",
"label": "บทความ",
"labelSingular": "บทความ",
"description": "บทความและข่าวสาร",
"supports": ["drafts", "revisions", "search"],
"fields": [
{ "slug": "title", "label": "หัวข้อ", "type": "string", "required": true, "searchable": true },
{ "slug": "excerpt", "label": "คำอธิบายสั้น", "type": "text", "required": true, "searchable": true },
{ "slug": "body", "label": "เนื้อหา", "type": "portableText", "required": true, "searchable": true },
{ "slug": "featured_image", "label": "รูปภาพหลัก", "type": "image" },
{ "slug": "tags", "label": "แท็ก", "type": "string", "searchable": true }
]
}
],
"menus": [
{
"name": "primary",
"label": "เมนูหลัก",
"items": [
{ "type": "custom", "label": "หน้าแรก", "url": "/" },
{ "type": "custom", "label": "สินค้าทั้งหมด", "url": "/all-products" },
{ "type": "custom", "label": "บทความ", "url": "/บทความ" },
{ "type": "custom", "label": "เกี่ยวกับเรา", "url": "/about-us" },
{ "type": "custom", "label": "ติดต่อเรา", "url": "/contact-us" }
]
}
],
"content": {
"blog": [
{
"id": "welcome-post",
"slug": "ยินดีต้อนรับ",
"status": "published",
"data": {
"title": "ยินดีต้อนรับสู่บล็อกดีล พลัส เทค",
"excerpt": "บทความแรกของดีล พลัส เทค พบกับความรู้และข้อมูลที่เป็นประโยชน์เกี่ยวกับระบบน้ำ ท่อ และอุปกรณ์ต่างๆ",
"featured_image": { "src": "/images/logo.png", "alt": "ดีล พลัส เทค" },
"body": [
{
"_type": "block",
"style": "normal",
"children": [
{ "_type": "span", "text": "ยินดีต้อนรับสู่บล็อกของดีล พลัส เทค! เราจะนำเสนอความรู้และข้อมูลที่เป็นประโยชน์เกี่ยวกับระบบน้ำ ท่อ และอุปกรณ์ต่างๆ ให้กับคุณ" }
]
},
{
"_type": "block",
"style": "normal",
"children": [
{ "_type": "span", "text": "ติดตามบทความใหม่ๆ ได้ที่นี่ หรือแวะมาพูดคุยกันที่ Line: @JPPSELECTION" }
]
}
],
"published_at": "2025-05-25T00:00:00Z",
"tags": "ข่าวสาร"
}
},
{
"id": "pipe-knowledge",
"slug": "ความรู้เรื่องท่อ-ppr",
"status": "published",
"data": {
"title": "ความรู้เกี่ยวกับท่อ PPR สำหรับระบบน้ำ",
"excerpt": "ท่อ PPR เป็นวัสดุที่นิยมใช้ในระบบประปาและการเดินท่อน้ำร้อน-น้ำเย็น เนื่องจากมีคุณสมบัติเด่นหลายประการ",
"featured_image": { "src": "/images/hdpe001-page1.jpg", "alt": "ท่อ PPR" },
"body": [
{
"_type": "block",
"style": "normal",
"children": [
{ "_type": "span", "text": "ท่อ PPR (Polypropylene Random Copolymer) เป็นท่อพลาสติกชนิดหนึ่งที่ได้รับความนิยมอย่างสูงในระบบประปา ท่อน้ำร้อน-น้ำเย็น และระบบทำความร้อนใต้พื้น เนื่องจากมีความทนทานต่อความร้อนและสารเคมีได้ดี" }
]
},
{
"_type": "block",
"style": "normal",
"children": [
{ "_type": "span", "text": "ท่อ PPR มีอายุการใช้งานยาวนานกว่า 50 ปี สามารถทนอุณหภูมิได้สูงถึง 95°C และทนแรงดันได้ดี นอกจากนี้ยังมีน้ำหนักเบา ติดตั้งง่าย และไม่เป็นสนิม ทำให้เป็นทางเลือกที่ดีสำหรับระบบท่อ Modern Plumbing." }
]
}
],
"published_at": "2025-05-24T00:00:00Z",
"tags": "ท่อ-ppr"
}
},
{
"id": "valve-guide",
"slug": "ประเภทของวาล์ว",
"status": "published",
"data": {
"title": "ประเภทของวาล์วที่ใช้ในระบบน้ำ",
"excerpt": "วาล์วเป็นอุปกรณ์สำคัญในระบบท่อที่ใช้ควบคุมการไหลของน้ำ เลือกใช้วาล์วให้ถูกประเภทช่วยให้ระบบทำงานได้อย่างมีประสิทธิภาพ",
"featured_image": { "src": "/images/valve-In01.jpg", "alt": "วาล์วน้ำ" },
"body": [
{
"_type": "block",
"style": "normal",
"children": [
{ "_type": "span", "text": "วาล์ว (Valve) เป็นอุปกรณ์ควบคุมการไหลของของเหลวและก๊าซในระบบท่อ มีหลายประเภทตามลักษณะการใช้งาน วาล์วแต่ละประเภทมีข้อดีและข้อเสียแตกต่างกัน" }
]
},
{
"_type": "block",
"style": "normal",
"children": [
{ "_type": "span", "text": "วาล์วประตู (Gate Valve) ใช้นิ้วเปิด-ปิดการไหลแบบเต็มที่ วาล์วปีกผีเสื้อ (Butterfly Valve) เหมาะกับระบบขนาดใหญ่ที่ต้องการควบคุมการไหลอย่างรวดเร็ว และวาล์วกันกลับ (Check Valve) ป้องกันน้ำไหลย้อนกลับในระบบ." }
]
},
{
"_type": "block",
"style": "normal",
"children": [
{ "_type": "span", "text": "ที่ดีล พลัส เทค เรามีวาล์วคุณภาพสูงให้เลือกหลากหลายประเภท พร้อมให้คำปรึกษาในการเลือกใช้วาล์วให้เหมาะสมกับระบบของคุณ" }
]
}
],
"published_at": "2025-05-23T00:00:00Z",
"tags": "วาล์ว"
}
}
]
}
}

15
src/content.config.ts Normal file
View File

@@ -0,0 +1,15 @@
import { defineCollection, z } from 'astro:content';
import { glob } from 'astro/loaders';
const blog = defineCollection({
loader: glob({ pattern: '**/*.md', base: './src/content/blog' }),
schema: z.object({
title: z.string(),
excerpt: z.string(),
featured_image: z.string().optional(),
published_at: z.coerce.date(),
tags: z.array(z.string()).optional(),
}),
});
export const collections = { blog };

View File

@@ -0,0 +1,50 @@
---
title: "ความรู้เกี่ยวกับท่อ PPR สำหรับระบบน้ำ"
excerpt: "ท่อ PPR เป็นวัสดุที่นิยมใช้ในระบบประปาและการเดินท่อน้ำร้อน-น้ำเย็น เนื่องจากมีคุณสมบัติที่เหมาะสมและอายุการใช้งานยาวนาน"
featured_image: "/images/hdpe001-page1.jpg"
published_at: 2025-02-01
tags: ["ท่อ PPR", "ระบบน้ำ", "ความรู้"]
---
# ความรู้เกี่ยวกับท่อ PPR
**ท่อ PPR (Polypropylene Random Copolymer)** เป็นท่อพลาสติกคุณภาพสูงที่ได้รับความนิยมอย่างแพร่หลายในงานระบบประปา เนื่องจากมีคุณสมบัติที่เหมาะสมกับการใช้งานทั้งน้ำร้อนและน้ำเย็น
## คุณสมบัติเด่นของท่อ PPR
### 1. ทนความร้อนสูง
- ทนอุณหภูมิได้ถึง **95°C**
- เหมาะสำหรับงานน้ำร้อนและระบบทำความร้อน
### 2. อายุการใช้งานยาวนาน
- มากกว่า **50 ปี** เมื่อใช้งานตามมาตรฐาน
- ทนต่อการกัดกร่อนจากสารเคมี
### 3. Food Grade ปลอดภัย
- ไม่มีสารโลหะหนักปนเปื้อน
- เหมาะสำหรับระบบน้ำดื่ม
### 4. น้ำหนักเบา ติดตั้งง่าย
- เบากว่าท่อเหล็กหลายเท่า
- ประหยัดค่าแรงและเวลา
## มาตรฐานการผลิต
ท่อ PPR ที่มีคุณภาพต้องผ่านมาตรฐาน:
- **DIN 8077 / DIN 8078** (มาตรฐานเยอรมัน)
- **ISO 15874** (มาตรฐานสากล)
- **มอก.** สำหรับผลิตภัณฑ์ในประเทศไทย
## การเลือกขนาดท่อ PPR
| ขนาดท่อ (mm) | ขนาด (นิ้ว) | การใช้งาน |
|---|---|---|
| 20 | 1/2" | ท่อน้ำดื่มในบ้าน |
| 25 | 3/4" | ท่อน้ำทั่วไป |
| 32 | 1" | ท่อเมนเข้าบ้าน |
| 40-50 | 1.5"-2" | ท่อเมนอาคาร |
| 63+ | 2.5"+ | ท่อเมนโรงงาน |
## สรุป
ท่อ PPR เป็นตัวเลือกที่คุ้มค่าสำหรับระบบน้ำทั้งในบ้านและอาคาร ด้วยคุณสมบัติที่เหนือกว่าท่อโลหะในหลายด้าน และอายุการใช้งานที่ยาวนาน

View File

@@ -0,0 +1,60 @@
---
title: "ประเภทของวาล์วที่ใช้ในระบบน้ำ"
excerpt: "วาล์วเป็นอุปกรณ์สำคัญในระบบท่อที่ใช้ควบคุมการไหลของน้ำ เลือกใช้วาล์วให้ถูกประเภทตามการใช้งานจะช่วยยืดอายุและลดค่าใช้จ่ายในการบำรุงรักษา"
featured_image: "/images/valve-In01.jpg"
published_at: 2025-02-15
tags: ["วาล์ว", "ระบบน้ำ", "ความรู้"]
---
# ประเภทของวาล์วที่ใช้ในระบบน้ำ
**วาล์ว (Valve)** เป็นอุปกรณ์สำคัญที่สุดในระบบท่อ ใช้สำหรับควบคุมการไหล การเปิด-ปิด และการปรับแรงดันของน้ำ การเลือกวาล์วที่เหมาะสมกับการใช้งานเป็นสิ่งสำคัญมาก
## 1. Ball Valve (วาล์วบอล)
วาล์วที่ใช้ลูกบอลเจาะรูเปิด-ปิด เหมาะสำหรับ:
- ใช้งานทั่วไปในระบบประปา
- เปิด-ปิดเร็ว
- ปิดสนิท ไม่รั่วซึม
## 2. Gate Valve (วาล์วประตูน้ำ)
วาล์วที่ใช้ประตูเลื่อนขึ้น-ลง:
- เหมาะกับงานที่ต้องเปิด-ปิดเต็มที่
- แรงดันตกต่ำ
- ใช้ในท่อเมนขนาดใหญ่
## 3. Check Valve (วาล์วกันกลับ)
ป้องกันน้ำไหลย้อนกลับ:
- ใช้ในระบบปั๊มน้ำ
- ป้องกันน้ำท่วม
- ป้องกันการปนเปื้อน
## 4. Butterfly Valve (วาล์วผีเสื้อ)
วาล์วที่ใช้แผ่นโลหะหมุน:
- เหมาะกับท่อขนาดใหญ่
- น้ำหนักเบา
- ติดตั้งง่าย
## 5. Globe Valve (วาล์วโกลบ์)
วาล์วสำหรับปรับค่าการไหล:
- ควบคุมอัตราการไหลได้แม่นยำ
- ใช้ในระบบที่ต้องการความเที่ยงตรง
- แรงดันตกสูง
## การเลือกวาล์วที่เหมาะสม
| การใช้งาน | วาล์วแนะนำ |
|---|---|
| ท่อน้ำดื่มในบ้าน | Ball Valve |
| ท่อเมนอาคาร | Gate Valve |
| ระบบปั๊มน้ำ | Check Valve |
| ท่อขนาดใหญ่ | Butterfly Valve |
| ระบบควบคุมอัตราการไหล | Globe Valve |
## สรุป
การเลือกวาล์วที่ถูกต้องตามการใช้งานจะช่วยให้ระบบทำงานได้อย่างมีประสิทธิภาพ ลดปัญหาการรั่วซึม และยืดอายุการใช้งานของระบบทั้งหมด

View File

@@ -0,0 +1,36 @@
---
title: "ยินดีต้อนรับสู่บล็อกดีล พลัส เทค"
excerpt: "บทความแรกของดีล พลัส เทค พบกับความรู้และข้อมูลที่เป็นประโยชน์เกี่ยวกับระบบน้ำ ท่อ และอุปกรณ์ต่างๆ"
featured_image: "/images/logo.png"
published_at: 2025-01-15
tags: ["ทั่วไป", "แนะนำ"]
---
ยินดีต้อนรับสู่บล็อกของ **ดีล พลัส เทค** ครับ
ที่นี่คุณจะได้พบกับความรู้ คำแนะนำ และข้อมูลที่เป็นประโยชน์เกี่ยวกับ:
- ระบบน้ำประปา
- ท่อ PPR, HDPE, UPVC และท่อเหล็ก
- ปั๊มน้ำและอุปกรณ์
- วาล์วและข้อต่อ
- ฉนวนกันความร้อน
- ระบบดับเพลิง
## เกี่ยวกับดีล พลัส เทค
**บริษัท ดีล พลัส เทค จำกัด** เป็นผู้นำเข้าและจัดจำหน่ายสินค้าระบบน้ำคุณภาพสูงจากโรงงาน ด้วยประสบการณ์กว่า 10 ปี เราพร้อมให้คำปรึกษาและจัดส่งสินค้าถึงมือคุณ
### บริการของเรา
- **สินค้าระบบน้ำ** — ท่อ PPR ท่อ HDPE อุปกรณ์วาล์ว
- **อุปกรณ์ปรับอากาศ** — กริลแอร์ หัวจ่ายแอร์
- **ระบบรั้ว** — รั้วเทวดา ระบบรั้วไวน์แมน
### ติดต่อเรา
- **โทร:** 090-555-1415
- **LINE:** @JPPSELECTION
- **อีเมล:** dealplustech@gmail.com
หวังว่าบทความของเราจะเป็นประโยชน์กับท่านครับ

View File

@@ -49,6 +49,7 @@ const categories = [
subcategories: [
{ name: 'กริลแอร์', slug: '/grilles' },
{ name: 'DURGO วาล์วเติมอากาศ', slug: '/durgo-avvs' },
{ name: 'หัวจ่ายแอร์ Ball Jet', slug: '/หัวจ่าย-ball-jet' },
]
},
{

View File

@@ -1,6 +0,0 @@
import { defineLiveCollection } from 'astro:content'
import { emdashLoader } from 'emdash/runtime'
export const collections = {
_emdash: defineLiveCollection({ loader: emdashLoader() }),
}

View File

@@ -1,13 +1,10 @@
---
import BaseLayout from '@/layouts/BaseLayout.astro';
import { getEmDashCollection } from 'emdash';
import { getCollection } from 'astro:content';
const { entries: articles, cacheHint } = await getEmDashCollection('blog', {
limit: 3,
orderBy: { published_at: 'desc' },
status: 'published',
});
Astro.cache.set(cacheHint);
const articles = (await getCollection('blog')).sort(
(a, b) => b.data.published_at.getTime() - a.data.published_at.getTime()
).slice(0, 3);
---
<BaseLayout title="ดีล พลัส เทค - ระบบน้ำคุณภาพสูง ราคาโรงงาน" description="ดีล พลัส เทค จำกัด ผู้นำด้านระบบน้ำคุณภาพสูง ราคาโรงงาน ท่อ PPR ท่อ HDPE อุปกรณ์วาล์ว ปั๊มน้ำ เครื่องเชื่อมท่อ และอุปกรณ์โรงงานคุณภาพ">
@@ -114,9 +111,6 @@ Astro.cache.set(cacheHint);
<!-- Card 3 - Large, center front -->
<div class="absolute top-32 left-1/2 -translate-x-1/2 w-52 lg:w-72 rounded-2xl shadow-2xl overflow-hidden animate-float-delayed-2 glass-strong tilt-card z-10">
<img src="/images/products-cropped/grilles_000C.jpg" alt="กริลแอร์" class="w-full h-full object-cover" loading="lazy" />
<div class="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/60 to-transparent p-4">
<p class="text-white font-medium">กริลแอร์คุณภาพสูง</p>
</div>
</div>
<!-- Decorative Elements -->
@@ -330,49 +324,43 @@ Astro.cache.set(cacheHint);
</div>
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
{
articles.length > 0 ? articles.map(article => (
<a href={`/${encodeURI('บทความ')}/${encodeURIComponent(article.data.slug || article.id)}`} class="group block bg-white rounded-3xl overflow-hidden border border-slate-100 hover:border-primary-200 hover:shadow-xl transition-all duration-300">
<div class="aspect-[16/9] bg-slate-100 overflow-hidden">
{
(() => {
const img = article.data.featured_image;
const imgSrc = typeof img === 'string' ? img : img?.src || (img?.provider === 'local' && (img?.meta?.storageKey || img?.id) ? `/_emdash/api/media/file/${img.meta?.storageKey || img.id}` : null);
const imgAlt = typeof img === 'object' && img?.alt ? img.alt : article.data.title;
return imgSrc ? (
<img src={imgSrc} alt={imgAlt} class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500" loading="lazy" />
) : (
<div class="w-full h-full flex items-center justify-center text-slate-300">
<svg class="w-16 h-16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"/>
</svg>
</div>
);
})()
}
</div>
<div class="p-6">
<div class="flex items-center gap-3 text-sm text-slate-500 mb-3">
<time datetime={article.data.publishedAt}>{new Date(article.data.publishedAt).toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' })}</time>
{article.data.tags && (
<span class="px-2.5 py-0.5 bg-primary-50 text-primary-600 rounded-full text-xs font-medium">{article.data.tags}</span>
)}
{articles.length > 0 && articles.map(article => (
<a href={`/${encodeURI('บทความ')}/${encodeURIComponent(article.id)}`} class="group block bg-white rounded-3xl overflow-hidden border border-slate-100 hover:border-primary-200 hover:shadow-xl transition-all duration-300">
<div class="aspect-[16/9] bg-slate-100 overflow-hidden">
{article.data.featured_image ? (
<img src={article.data.featured_image} alt={article.data.title} class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500" loading="lazy" />
) : (
<div class="w-full h-full flex items-center justify-center text-slate-300">
<svg class="w-16 h-16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"/>
</svg>
</div>
<h3 class="text-lg font-bold text-slate-900 group-hover:text-primary-600 transition-colors mb-2 line-clamp-2">{article.data.title}</h3>
<p class="text-sm text-slate-600 line-clamp-2">{article.data.excerpt}</p>
</div>
</a>
)) : (
<div class="md:col-span-2 lg:col-span-3 text-center py-16">
<div class="text-slate-300 mb-4">
<svg class="w-16 h-16 mx-auto" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m2 13a2 2 0 01-2-2V7m2 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z"/>
</svg>
</div>
<p class="text-lg text-slate-400">ยังไม่มีบทความในขณะนี้</p>
)}
</div>
)
}
<div class="p-6">
<div class="flex items-center gap-3 text-sm text-slate-500 mb-3">
<time datetime={article.data.published_at.toISOString().slice(0, 10)}>
{article.data.published_at.toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' })}
</time>
{article.data.tags?.[0] && (
<span class="px-2.5 py-0.5 bg-primary-50 text-primary-600 rounded-full text-xs font-medium">{article.data.tags[0]}</span>
)}
</div>
<h3 class="text-lg font-bold text-slate-900 group-hover:text-primary-600 transition-colors mb-2 line-clamp-2">{article.data.title}</h3>
<p class="text-sm text-slate-600 line-clamp-2">{article.data.excerpt}</p>
</div>
</a>
))}
{articles.length === 0 && (
<div class="md:col-span-2 lg:col-span-3 text-center py-16">
<div class="text-slate-300 mb-4">
<svg class="w-16 h-16 mx-auto" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m2 13a2 2 0 01-2-2V7m2 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z"/>
</svg>
</div>
<p class="text-lg text-slate-400">ยังไม่มีบทความในขณะนี้</p>
</div>
)}
</div>
<div class="text-center mt-10 sm:hidden">

View File

@@ -11,10 +11,10 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
"@type": "Product",
"name": "Realflex | สายอ่อนสแตนเลส",
"description": "จำหน่ายRealflex สายอ่อนสแตนเลสคุณภาพสูง ราคาโรงงาน ส่งฟรี กทม. ปริมณฑล",
"image": "https://dealplustech.co.th/images/products-cropped/realflex_000C.jpg",
"image": "/images/products-cropped/realflex_000C.jpg",
"offers": {
"@type": "Offer",
"url": "https://dealplustech.co.th/realflex",
"url": "https://dealplustech.com/realflex",
"priceCurrency": "THB",
"availability": "https://schema.org/InStock"
}

View File

@@ -11,10 +11,10 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
"@type": "Product",
"name": "ระบบกรองน้ำ Water Treatment",
"description": "จำหน่ายระบบกรองน้ำดี (Water Treatment) คุณภาพสูง ราคาโรงงาน ส่งฟรี กทม. ปริมณฑล",
"image": "https://dealplustech.co.th/images/products-cropped/water-treatment_000C.jpg",
"image": "/images/products-cropped/water-treatment_000C.jpg",
"offers": {
"@type": "Offer",
"url": "https://dealplustech.co.th/water-treatment",
"url": "https://dealplustech.com/water-treatment",
"priceCurrency": "THB",
"availability": "https://schema.org/InStock"
}

View File

@@ -78,6 +78,12 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
</svg>
090-555-1415
</a>
<a href="#pricelist" data-price-button class="hidden bg-white text-primary-700 hover:bg-primary-50 py-3 px-6 rounded-xl font-semibold flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
</svg>
<span>ราคาสินค้า</span>
</a>
</div>
</div>
<div class="lg:sticky lg:top-24">
@@ -128,6 +134,24 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
</div>
</section>
<!-- Pricelist -->
<section id="pricelist" class="py-16 bg-gradient-to-br from-primary-700 to-primary-600 text-white relative overflow-hidden">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-lg mx-auto text-center">
<h2 class="text-xl font-bold mb-6">📥 ดาวน์โหลดราคาสินค้า ท่อ HDPE</h2>
<a href="/documents/Price List HDPE TAP.pdf" target="_blank" class="inline-flex items-center gap-4 p-4 bg-white rounded-xl shadow-sm hover:shadow-md transition-shadow text-left">
<svg class="w-8 h-8 text-red-600 flex-shrink-0" fill="currentColor" viewBox="0 0 24 24">
<path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8l-6-6zm-1 9V3.5L18.5 9H13zM8 13h8v2H8v-2zm0 4h8v2H8v-2zm0-8h2v2H8V9z" />
</svg>
<div>
<div class="font-medium text-slate-900">Price List HDPE TAP</div>
<div class="text-sm text-slate-500">PDF Document</div>
</div>
</a>
</div>
</div>
</section>
<!-- CTA -->
<section class="py-16 bg-gradient-to-br from-primary-700 to-primary-600 text-white relative overflow-hidden">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">

View File

@@ -78,6 +78,12 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
</svg>
090-555-1415
</a>
<a href="#pricelist" data-price-button class="hidden bg-white text-primary-700 hover:bg-primary-50 py-3 px-6 rounded-xl font-semibold flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
</svg>
<span>ราคาสินค้า</span>
</a>
</div>
</div>
<div class="lg:sticky lg:top-24">
@@ -120,6 +126,24 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
</div>
</section>
<!-- Pricelist -->
<section id="pricelist" class="py-16 bg-gradient-to-br from-primary-700 to-primary-600 text-white relative overflow-hidden">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-lg mx-auto text-center">
<h2 class="text-xl font-bold mb-6">📥 ดาวน์โหลดราคาสินค้า ท่อ PPR ตราช้าง (SCG)</h2>
<a href="/documents/เอสซีเจ ปี68.pdf" target="_blank" class="inline-flex items-center gap-4 p-4 bg-white rounded-xl shadow-sm hover:shadow-md transition-shadow text-left">
<svg class="w-8 h-8 text-red-600 flex-shrink-0" fill="currentColor" viewBox="0 0 24 24">
<path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8l-6-6zm-1 9V3.5L18.5 9H13zM8 13h8v2H8v-2zm0 4h8v2H8v-2zm0-8h2v2H8V9z" />
</svg>
<div>
<div class="font-medium text-slate-900">เอสซีเจ ปี68</div>
<div class="text-sm text-slate-500">PDF Document</div>
</div>
</a>
</div>
</div>
</section>
<!-- CTA -->
<section class="py-16 bg-gradient-to-br from-primary-700 to-primary-600 text-white relative overflow-hidden">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">

View File

@@ -78,6 +78,12 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
</svg>
090-555-1415
</a>
<a href="#pricelist" data-price-button class="hidden bg-white text-primary-700 hover:bg-primary-50 py-3 px-6 rounded-xl font-semibold flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
</svg>
<span>ราคาสินค้า</span>
</a>
</div>
</div>
<div class="lg:sticky lg:top-24">
@@ -139,6 +145,24 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
</div>
</section>
<!-- Pricelist -->
<section id="pricelist" class="py-16 bg-gradient-to-br from-primary-700 to-primary-600 text-white relative overflow-hidden">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-lg mx-auto text-center">
<h2 class="text-xl font-bold mb-6">📥 ดาวน์โหลดราคาสินค้า ไทยพีพีอาร์</h2>
<a href="/documents/PRICE-LIST_TPPR_V28-2023 [26012023].pdf" target="_blank" class="inline-flex items-center gap-4 p-4 bg-white rounded-xl shadow-sm hover:shadow-md transition-shadow text-left">
<svg class="w-8 h-8 text-red-600 flex-shrink-0" fill="currentColor" viewBox="0 0 24 24">
<path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8l-6-6zm-1 9V3.5L18.5 9H13zM8 13h8v2H8v-2zm0 4h8v2H8v-2zm0-8h2v2H8V9z" />
</svg>
<div>
<div class="font-medium text-slate-900">PRICE-LIST_TPPR_V28-2023</div>
<div class="text-sm text-slate-500">PDF Document</div>
</div>
</a>
</div>
</div>
</section>
<!-- CTA -->
<section class="py-16 bg-gradient-to-br from-primary-700 to-primary-600 text-white relative overflow-hidden">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">

View File

@@ -51,6 +51,12 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
<div class="flex flex-wrap gap-4">
<a href="/contact-us" class="bg-accent-500 hover:bg-accent-600 text-white py-3 px-6 rounded-xl font-semibold">สอบถามราคา</a>
<a href="https://line.me/ti/p/~JPPSELECTION" target="_blank" rel="noopener" class="bg-white/10 hover:bg-white/20 text-white py-3 px-6 rounded-xl font-semibold border border-white/30">แอดไลน์</a>
<a href="#pricelist" data-price-button class="hidden bg-white/10 hover:bg-white/20 text-white py-3 px-6 rounded-xl font-semibold border border-white/30 flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
</svg>
<span>ราคาสินค้า</span>
</a>
</div>
</div>
</div>
@@ -241,6 +247,24 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
</div>
</section>
<!-- Pricelist -->
<section id="pricelist" class="py-16 bg-gradient-to-br from-primary-700 to-primary-600 text-white relative overflow-hidden">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-lg mx-auto text-center">
<h2 class="text-xl font-bold mb-6">📥 ดาวน์โหลดราคาสินค้า ท่อ XYLENT</h2>
<a href="/documents/Price List XYLENT_Novat_V12-2022 [080265]_220727_155718 (1).pdf" target="_blank" class="inline-flex items-center gap-4 p-4 bg-white rounded-xl shadow-sm hover:shadow-md transition-shadow text-left">
<svg class="w-8 h-8 text-red-600 flex-shrink-0" fill="currentColor" viewBox="0 0 24 24">
<path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8l-6-6zm-1 9V3.5L18.5 9H13zM8 13h8v2H8v-2zm0 4h8v2H8v-2zm0-8h2v2H8V9z" />
</svg>
<div>
<div class="font-medium text-slate-900">Price List XYLENT_Novat_V12-2022</div>
<div class="text-sm text-slate-500">PDF Document</div>
</div>
</a>
</div>
</div>
</section>
<!-- CTA -->
<section class="py-16 bg-gradient-to-br from-primary-700 to-primary-600 text-white text-center relative overflow-hidden">
<div class="max-w-4xl mx-auto px-4">

View File

@@ -1,23 +1,31 @@
---
import BaseLayout from '@/layouts/BaseLayout.astro';
import { getEmDashEntry, getEmDashCollection } from 'emdash';
import { PortableText, Image } from 'emdash/ui';
import { getCollection, render } from 'astro:content';
const { slug } = Astro.params;
const { entry: article, cacheHint } = await getEmDashEntry('blog', slug);
Astro.cache.set(cacheHint);
if (!article) {
return Astro.redirect('/404');
export async function getStaticPaths() {
const articles = await getCollection('blog');
return articles.map(article => ({
params: { slug: article.id },
props: { article },
}));
}
// Get related articles (same tags, excluding current)
const { entries: relatedArticles } = await getEmDashCollection('blog', {
limit: 3,
orderBy: { published_at: 'desc' },
status: 'published',
});
const related = relatedArticles.filter(a => a.id !== article.id).slice(0, 3);
const { article } = Astro.props;
const { Content } = await render(article);
// Get related articles (same tags first, then by date, excluding current)
const allArticles = await getCollection('blog');
const related = allArticles
.filter(a => a.id !== article.id)
.sort((a, b) => {
const aTagMatch = a.data.tags?.some(t => article.data.tags?.includes(t)) ? 1 : 0;
const bTagMatch = b.data.tags?.some(t => article.data.tags?.includes(t)) ? 1 : 0;
if (aTagMatch !== bTagMatch) return bTagMatch - aTagMatch;
return b.data.published_at.getTime() - a.data.published_at.getTime();
})
.slice(0, 3);
const tag = article.data.tags?.[0] ?? '';
---
<BaseLayout title={`${article.data.title} - ดีล พลัส เทค`} description={article.data.excerpt || `บทความ ${article.data.title}`}>
@@ -39,49 +47,38 @@ const related = relatedArticles.filter(a => a.id !== article.id).slice(0, 3);
<section class="py-12 lg:py-16">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="mb-8">
{article.data.tags && (
<span class="inline-block px-3 py-1 bg-primary-50 text-primary-600 rounded-full text-sm font-medium mb-4">{article.data.tags}</span>
{tag && (
<span class="inline-block px-3 py-1 bg-primary-50 text-primary-600 rounded-full text-sm font-medium mb-4">{tag}</span>
)}
<h1 class="text-3xl sm:text-4xl lg:text-5xl font-bold text-slate-900 mb-4 leading-tight">{article.data.title}</h1>
<div class="flex items-center gap-4 text-slate-500">
<time datetime={article.data.publishedAt} class="text-lg">
{new Date(article.data.publishedAt).toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' })}
<time datetime={article.data.published_at.toISOString().slice(0, 10)} class="text-lg">
{article.data.published_at.toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' })}
</time>
</div>
</div>
{/* Featured Image */}
{
(() => {
const img = article.data.featured_image;
const imgSrc = typeof img === 'string' ? img : img?.src || (img?.provider === 'local' && (img?.meta?.storageKey || img?.id) ? `/_emdash/api/media/file/${img.meta?.storageKey || img.id}` : null);
const imgAlt = typeof img === 'object' && img?.alt ? img.alt : article.data.title;
return imgSrc ? (
<div class="rounded-3xl overflow-hidden mb-12 shadow-lg">
<img src={imgSrc} alt={imgAlt} class="w-full h-auto" />
</div>
) : null;
})()
}
{article.data.featured_image && (
<div class="rounded-3xl overflow-hidden mb-12 shadow-lg">
<img src={article.data.featured_image} alt={article.data.title} class="w-full h-auto" />
</div>
)}
{/* Article Body */}
<article class="prose prose-lg max-w-none prose-headings:text-slate-900 prose-a:text-primary-600 prose-img:rounded-2xl prose-img:shadow-md mb-16">
{article.data.body ? (
<PortableText value={article.data.body} />
) : (
<p class="text-slate-500 italic">ไม่มีเนื้อหา</p>
)}
<Content />
</article>
{/* Share Buttons */}
<div class="border-t border-slate-100 pt-8 mb-8">
<div class="flex items-center gap-4">
<span class="text-sm font-medium text-slate-700">แชร์บทความ:</span>
<a href={`https://line.me/R/msg/text/?${encodeURIComponent(`${article.data.title} - https://dealplustech.com/${encodeURI('บทความ')}/${encodeURIComponent(article.data.slug || article.id)}`)}`} target="_blank" rel="noopener" class="inline-flex items-center gap-2 px-4 py-2 bg-green-50 text-green-600 rounded-xl hover:bg-green-100 transition-colors text-sm font-medium">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.344.282-.629.627-.629h2.386c.349 0 .63.285.63.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.629.63-.629.345 0 .63.284.63.629v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.629.627-.629.349 0 .631.284.631.629v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.629.63-.629.348 0 .63.284.63.629v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314"/></svg>
<a href={`https://line.me/R/msg/text/?${encodeURIComponent(`${article.data.title} - https://dealplustech.com/${encodeURI('บทความ')}/${encodeURIComponent(article.id)}`)}`} target="_blank" rel="noopener" class="inline-flex items-center gap-2 px-4 py-2 bg-green-50 text-green-600 rounded-xl hover:bg-green-100 transition-colors text-sm font-medium">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.344.282-.629.627-.629h2.386c.349 0 .63.285.63.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.629.63-.629.345 0 .63.284.63.629v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.629.627-.629.349 0 .631.284.631.629v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.629.63-.629.348 0 .63.284.63.629v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 18.062 24 10.314\"/></svg>
Line
</a>
<a href={`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(`https://dealplustech.com/${encodeURI('บทความ')}/${encodeURIComponent(article.data.slug || article.id)}`)}`} target="_blank" rel="noopener" class="inline-flex items-center gap-2 px-4 py-2 bg-blue-50 text-blue-600 rounded-xl hover:bg-blue-100 transition-colors text-sm font-medium">
<a href={`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(`https://dealplustech.com/${encodeURI('บทความ')}/${encodeURIComponent(article.id)}`)}`} target="_blank" rel="noopener" class="inline-flex items-center gap-2 px-4 py-2 bg-blue-50 text-blue-600 rounded-xl hover:bg-blue-100 transition-colors text-sm font-medium">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>
Facebook
</a>
@@ -97,24 +94,17 @@ const related = relatedArticles.filter(a => a.id !== article.id).slice(0, 3);
<h2 class="text-2xl font-bold text-slate-900 mb-8">บทความที่เกี่ยวข้อง</h2>
<div class="grid md:grid-cols-3 gap-8">
{related.map(rel => (
<a href={`/${encodeURI('บทความ')}/${encodeURIComponent(rel.data.slug || rel.id)}`} class="group block bg-white rounded-3xl overflow-hidden border border-slate-100 hover:border-primary-200 hover:shadow-xl transition-all duration-300">
<a href={`/${encodeURI('บทความ')}/${encodeURIComponent(rel.id)}`} class="group block bg-white rounded-3xl overflow-hidden border border-slate-100 hover:border-primary-200 hover:shadow-xl transition-all duration-300">
<div class="aspect-[16/9] bg-slate-100 overflow-hidden">
{
(() => {
const img = rel.data.featured_image;
const imgSrc = typeof img === 'string' ? img : img?.src || (img?.provider === 'local' && (img?.meta?.storageKey || img?.id) ? `/_emdash/api/media/file/${img.meta?.storageKey || img.id}` : null);
const imgAlt = typeof img === 'object' && img?.alt ? img.alt : rel.data.title;
return imgSrc ? (
<img src={imgSrc} alt={imgAlt} class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500" loading="lazy" />
) : (
<div class="w-full h-full flex items-center justify-center text-slate-300">
<svg class="w-12 h-12" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"/>
</svg>
</div>
);
})()
}
{rel.data.featured_image ? (
<img src={rel.data.featured_image} alt={rel.data.title} class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500" loading="lazy" />
) : (
<div class="w-full h-full flex items-center justify-center text-slate-300">
<svg class="w-12 h-12" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"/>
</svg>
</div>
)}
</div>
<div class="p-5">
<h3 class="text-base font-bold text-slate-900 group-hover:text-primary-600 transition-colors mb-2 line-clamp-2">{rel.data.title}</h3>

View File

@@ -1,19 +1,10 @@
---
import BaseLayout from '@/layouts/BaseLayout.astro';
import { getEmDashCollection } from 'emdash';
import { getCollection } from 'astro:content';
const page = Astro.url.searchParams.get('page') || '1';
const limit = 9;
const offset = (parseInt(page) - 1) * limit;
const { entries: articles, nextCursor, cacheHint } = await getEmDashCollection('blog', {
limit,
orderBy: { published_at: 'desc' },
status: 'published',
});
Astro.cache.set(cacheHint);
const totalPages = nextCursor ? null : 1; // Simple pagination
const articles = (await getCollection('blog')).sort(
(a, b) => b.data.published_at.getTime() - a.data.published_at.getTime()
);
---
<BaseLayout title="บทความทั้งหมด - ดีล พลัส เทค" description="รวมบทความและความรู้เกี่ยวกับระบบน้ำ ท่อ และอุปกรณ์ต่างๆ จากดีล พลัส เทค">
@@ -32,54 +23,47 @@ const totalPages = nextCursor ? null : 1; // Simple pagination
<!-- Articles Grid -->
<section class="py-16 lg:py-24">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
{
articles.length > 0 ? (
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
{articles.map(article => (
<a href={`/${encodeURI('บทความ')}/${encodeURIComponent(article.data.slug || article.id)}`} class="group block bg-white rounded-3xl overflow-hidden border border-slate-100 hover:border-primary-200 hover:shadow-xl transition-all duration-300">
<div class="aspect-[16/9] bg-slate-100 overflow-hidden">
{
(() => {
const img = article.data.featured_image;
const imgSrc = typeof img === 'string' ? img : img?.src || (img?.provider === 'local' && (img?.meta?.storageKey || img?.id) ? `/_emdash/api/media/file/${img.meta?.storageKey || img.id}` : null);
const imgAlt = typeof img === 'object' && img?.alt ? img.alt : article.data.title;
return imgSrc ? (
<img src={imgSrc} alt={imgAlt} class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500" loading="lazy" />
) : (
<div class="w-full h-full flex items-center justify-center text-slate-300">
<svg class="w-16 h-16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"/>
</svg>
</div>
);
})()
}
</div>
<div class="p-6">
<div class="flex items-center gap-3 text-sm text-slate-500 mb-3">
<time datetime={article.data.publishedAt}>{new Date(article.data.publishedAt).toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' })}</time>
{article.data.tags && (
<span class="px-2.5 py-0.5 bg-primary-50 text-primary-600 rounded-full text-xs font-medium">{article.data.tags}</span>
)}
{articles.length > 0 ? (
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
{articles.map(article => (
<a href={`/${encodeURI('บทความ')}/${encodeURIComponent(article.id)}`} class="group block bg-white rounded-3xl overflow-hidden border border-slate-100 hover:border-primary-200 hover:shadow-xl transition-all duration-300">
<div class="aspect-[16/9] bg-slate-100 overflow-hidden">
{article.data.featured_image ? (
<img src={article.data.featured_image} alt={article.data.title} class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500" loading="lazy" />
) : (
<div class="w-full h-full flex items-center justify-center text-slate-300">
<svg class="w-16 h-16" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"/>
</svg>
</div>
<h2 class="text-lg font-bold text-slate-900 group-hover:text-primary-600 transition-colors mb-2 line-clamp-2">{article.data.title}</h2>
<p class="text-sm text-slate-600 line-clamp-2">{article.data.excerpt}</p>
)}
</div>
<div class="p-6">
<div class="flex items-center gap-3 text-sm text-slate-500 mb-3">
<time datetime={article.data.published_at.toISOString().slice(0, 10)}>
{article.data.published_at.toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric' })}
</time>
{article.data.tags?.[0] && (
<span class="px-2.5 py-0.5 bg-primary-50 text-primary-600 rounded-full text-xs font-medium">{article.data.tags[0]}</span>
)}
</div>
</a>
))}
<h2 class="text-lg font-bold text-slate-900 group-hover:text-primary-600 transition-colors mb-2 line-clamp-2">{article.data.title}</h2>
<p class="text-sm text-slate-600 line-clamp-2">{article.data.excerpt}</p>
</div>
</a>
))}
</div>
) : (
<div class="text-center py-16">
<div class="text-slate-300 mb-4">
<svg class="w-16 h-16 mx-auto" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m2 13a2 2 0 01-2-2V7m2 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z"/>
</svg>
</div>
) : (
<div class="text-center py-16">
<div class="text-slate-300 mb-4">
<svg class="w-16 h-16 mx-auto" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m2 13a2 2 0 01-2-2V7m2 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z"/>
</svg>
</div>
<p class="text-xl text-slate-400 mb-2">ยังไม่มีบทความ</p>
<p class="text-slate-400">กลับมาตรวจสอบอีกครั้งในภายหลัง</p>
</div>
)
}
<p class="text-xl text-slate-400 mb-2">ยังไม่มีบทความ</p>
<p class="text-slate-400">กลับมาตรวจสอบอีกครั้งในภายหลัง</p>
</div>
)}
</div>
</section>
</main>

View File

@@ -11,10 +11,10 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
"@type": "Product",
"name": "ระบบรั้วไวน์แมน Vineman รั้วตาข่าย ลวดหนาม",
"description": "จำหน่ายระบบรั้วไวน์แมน Vineman รั้วตาข่าย ลวดหนามคุณภาพสูง ราคาโรงงาน ส่งฟรี กทม. ปริมณฑล",
"image": "https://dealplustech.co.th/images/products-raw/vineman/ระบบรั้วไวน์แมน-Vineman-e1613286324569-1024x880.svg",
"image": "/images/products-raw/vineman/ระบบรั้วไวน์แมน-Vineman-e1613286324569-1024x880.jpg",
"offers": {
"@type": "Offer",
"url": "https://dealplustech.co.th/ระบบรั้วไวน์แมน-vineman-2",
"url": "https://dealplustech.com/ระบบรั้วไวน์แมน-vineman-2",
"priceCurrency": "THB",
"availability": "https://schema.org/InStock"
}

View File

@@ -8,10 +8,10 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
"@type": "Product",
"name": "วาล์ว (Valve) - วาล์วน้ำทุกประเภท",
"description": "จำหน่ายวาล์ว (Valve) - วาล์วน้ำทุกประเภทคุณภาพสูง ราคาโรงงาน ส่งฟรี กทม. ปริมณฑล",
"image": "https://dealplustech.co.th/images/products-cropped/valve_000C.jpg",
"image": "/images/products-cropped/valve_000C.jpg",
"offers": {
"@type": "Offer",
"url": "https://dealplustech.co.th/วาล์ว-valve",
"url": "https://dealplustech.com/วาล์ว-valve",
"priceCurrency": "THB",
"availability": "https://schema.org/InStock"
}

View File

@@ -0,0 +1,251 @@
---
import BaseLayout from '@/layouts/BaseLayout.astro';
---
<BaseLayout title="หัวจ่ายแอร์ Ball Jet (Ball Spout Jet Diffuser)" description="จำหน่ายหัวจ่ายแอร์ Ball Jet (Ball Spout Jet Diffuser) ส่งลมระยะไกล ปรับทิศทาง 360° มุมปาก 45° เหมาะกับอาคารเพดานสูง สนามบิน โรงงาน ห้างสรรพสินค้า">
<main class="bg-white min-h-screen">
<!-- Product Hero Section -->
<section class="relative bg-gradient-to-br from-primary-800 via-primary-700 to-primary-900 text-white py-16 lg:py-24 overflow-hidden">
<!-- Animated Background -->
<div class="absolute inset-0 overflow-hidden pointer-events-none">
<div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[800px] bg-gradient-to-br from-primary-400/30 via-primary-500/15 to-transparent rounded-full blur-[100px] animate-mesh-1"></div>
<!-- Floating Particles -->
<div class="absolute top-1/4 left-1/4 w-2 h-2 bg-white/30 rounded-full animate-float"></div>
<div class="absolute top-1/3 right-1/4 w-3 h-3 bg-primary-300/20 rounded-full animate-float-delayed-1"></div>
<div class="absolute top-2/3 left-1/3 w-2 h-2 bg-primary-200/20 rounded-full animate-float-delayed-2"></div>
<!-- Water-inspired Waves -->
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
<path d="M0,150 Q360,50 720,150 T1440,150 L1440,250 L0,250 Z" fill="none" stroke="url(#water-gradient-hero)" stroke-width="2">
<animate attributeName="d" dur="10s" repeatCount="indefinite" values="M0,150 Q360,50 720,150 T1440,150 L1440,250 L0,250 Z;M0,180 Q360,80 720,180 T1440,180 L1440,250 L0,250 Z;M0,150 Q360,50 720,150 T1440,150 L1440,250 L0,250 Z"/>
</path>
<defs>
<linearGradient id="water-gradient-hero" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#40916c"/>
<stop offset="50%" stop-color="#74c69d"/>
<stop offset="100%" stop-color="#40916c"/>
</linearGradient>
</defs>
</svg>
<!-- Second Wave Layer -->
<svg class="absolute bottom-0 left-0 w-full h-[200px] opacity-10" viewBox="0 0 1440 200" preserveAspectRatio="none">
<path d="M0,100 Q240,200 480,100 T960,100 T1440,100 L1440,200 L0,200 Z" fill="none" stroke="rgba(255,255,255,0.3)" stroke-width="1">
<animate attributeName="d" dur="15s" repeatCount="indefinite" values="M0,100 Q240,200 480,100 T960,100 T1440,100 L1440,200 L0,200 Z;M0,120 Q240,20 480,120 T960,120 T1440,120 L1440,200 L0,200 Z;M0,100 Q240,200 480,100 T960,100 T1440,100 L1440,200 L0,200 Z"/>
</path>
</svg>
</div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="grid lg:grid-cols-2 gap-12 items-start">
<div class="lg:sticky lg:top-24">
<div class="rounded-2xl overflow-hidden bg-white/10 p-2">
<img src="/images/ball-jet/ball-jet-main-hd.jpg" alt="หัวจ่ายแอร์ Ball Jet" class="w-full h-auto rounded-xl" width="1764" height="2000" loading="eager" />
</div>
</div>
<div>
<span class="inline-block px-4 py-1.5 bg-white/20 text-white rounded-full text-sm font-medium mb-4">หัวจ่ายแอร์</span>
<h1 class="text-3xl sm:text-4xl lg:text-5xl font-bold mb-4">หัวจ่ายแอร์ Ball Jet (Ball Spout Jet Diffuser)</h1>
<p class="text-lg sm:text-xl text-white/80 mb-8 leading-relaxed">
หัวจ่ายเจ็ทกลม (Ball Spout Jet Diffuser) ออกแบบสำหรับอาคารโล่ง เพดานสูง ส่งลมระยะไกลได้โดยไม่ต้องเดินท่อลมยาว ปรับทิศทาง 360° และมุมปาก 45° เหมาะกับงานสถานที่ขนาดใหญ่ เช่น สนามบิน ห้างสรรพสินค้า โรงงาน ห้องประชุม โรงยิม
</p>
<div class="flex flex-wrap gap-4 mb-8">
<a href="https://line.me/ti/p/~JPPSELECTION" target="_blank" class="bg-accent-500 hover:bg-accent-600 text-white py-3 px-6 rounded-xl font-semibold flex items-start gap-2">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.344.282-.629.627-.629h2.386c.349 0 .63.285.63.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.629.63-.629.345 0 .63.284.63.629v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.629.627-.629.349 0 .631.284.631.629v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.629.63-.629.348 0 .63.284.63.629v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 23.458 12.458 23.458 10.314"/></svg>
<span>แชท Line</span>
</a>
<a href="tel:0905551415" class="bg-white text-primary-700 hover:bg-primary-50 py-3 px-6 rounded-xl font-semibold flex items-start gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"/>
</svg>
<span>090-555-1415</span>
</a>
</div>
<div class="flex flex-wrap gap-6">
<div class="flex items-start gap-2 text-white/80">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
</svg>
<span>ส่งลมระยะไกล ไม่ต้องเดินท่อ</span>
</div>
<div class="flex items-start gap-2 text-white/80">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
</svg>
<span>ปรับทิศทาง 360° + มุมปาก 45°</span>
</div>
<div class="flex items-start gap-2 text-white/80">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
</svg>
<span>ปรับปริมาณลมได้</span>
</div>
<div class="flex items-start gap-2 text-white/80">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
</svg>
<span>อลูมิเนียม / พลาสติก PVC</span>
</div>
<div class="flex items-start gap-2 text-white/80">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
</svg>
<span>ขนาด 4" 25.2"</span>
</div>
<div class="flex items-start gap-2 text-white/80">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
</svg>
<span>ราคาโรงงาน คุ้มค่า</span>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Product Details -->
<section class="py-16 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-4xl mx-auto">
<h2 class="text-2xl font-bold text-primary-700 mb-8">รายละเอียดสินค้า</h2>
<div class="prose prose-lg max-w-none">
<p class="text-lg text-neutral-700 leading-relaxed mb-6">
<strong>หัวจ่ายแอร์ Ball Jet (Ball Spout Jet Diffuser)</strong> หรือที่เรียกกันทั่วไปว่า "หัวจ่ายเจ็ท" เป็นอุปกรณ์กระจายลมเพดานแบบกลม ออกแบบมาเพื่อ<strong>ส่งลมระยะไกล (Long Throw)</strong> ไปยังจุดเฉพาะในอาคารที่มีเพดานสูง โดยไม่จำเป็นต้องเดินท่อลมยาวลงมาให้พื้นที่ทำงาน — ช่วยลดค่าใช้จ่ายในการติดตั้งท่อและอุปกรณ์ได้อย่างมาก
</p>
<p class="text-lg text-neutral-700 leading-relaxed mb-6">
ตัวหัวจ่ายมีลักษณะเป็นทรงกลมหมุนได้ (Ball) สามารถ<strong>ปรับทิศทางเป่าลมได้ 360 องศา</strong> และ<strong>ปรับมุมปากได้ถึง 45 องศา</strong> มาพร้อมปุ่มปรับปริมาณลม (Volume Control) เพื่อควบคุมทิศทางและแรงลมได้อย่างแม่นยำตามต้องการ เหมาะสำหรับการเป่าลมเฉพาะจุด (Spot Cooling) และการกระจายลมระยะกลางถึงไกล
</p>
<p class="text-lg text-neutral-700 leading-relaxed mb-6">
ผลิตจาก<strong>อลูมิเนียม</strong>คุณภาพสูง (Powder-coated สีขาว RAL9010/9016) หรือ<strong>พลาสติก PVC</strong> (เหมาะกับงานที่ต้องการทนกรด ด่าง ความชื้น และสารเคมี) ให้เลือกตามการใช้งานและงบประมาณ ติดตั้งง่ายเพียงเจาะเพดานและสอดเข้าไป ไม่ต้องต่อท่อยาว — เหมาะกับอาคารสาธารณะ สนามบิน ห้างสรรพสินค้า โรงงานอุตสาหกรรม สนามกีฬา ห้องประชุม โรงละคร และพื้นที่ขนาดใหญ่ทุกประเภท
</p>
<h3 class="text-xl font-bold text-primary-700 mt-8 mb-4">จุดเด่น</h3>
<ul class="list-disc pl-6 mb-4 space-y-2 text-neutral-700">
<li><strong>ส่งลมได้ไกล (Long Throw)</strong> — ลดค่าใช้จ่ายในการติดตั้งท่อและอุปกรณ์ เพราะไม่ต้องเดินท่อลมยาวลงมา</li>
<li><strong>ประหยัดพื้นที่</strong> — ไม่จำเป็นต้องต่อท่อ ตัวอุปกรณ์ติดตั้งบนเพดานเท่านั้น ส่งลมโดยตรง</li>
<li><strong>ปรับทิศทางได้ 360°</strong> — หัว Ball หมุนได้รอบทิศ ควบคุมทิศทางการกระจายลมได้แม่นยำ</li>
<li><strong>ปรับมุมปากได้ 45°</strong> — ปรับมุมเอียงของปากจ่ายลมเพื่อกระจายลมเฉพาะจุดหรือกว้างออก</li>
<li><strong>ปรับปริมาณลมได้</strong> — มีปุ่ม/วาล์วควบคุมปริมาณลมออกที่ตัวอุปกรณ์</li>
<li><strong>หลากหลายวัสดุ</strong> — เลือกได้ทั้งอลูมิเนียม (แข็งแรง สวยงาม) และพลาสติก PVC (ทนสารเคมี ประหยัด)</li>
<li><strong>หลายขนาดให้เลือก</strong> — 4", 5", 6", 8", 10", 12", 14", 16", 18", 20", 25.2" นิ้ว เพื่อให้เหมาะกับทุกขนาดห้อง</li>
<li><strong>ติดตั้งง่าย</strong> — น้ำหนักเบา ไม่ต้องใช้เครื่องมือพิเศษ ประหยัดเวลาและค่าแรง</li>
</ul>
<h3 class="text-xl font-bold text-primary-700 mt-8 mb-4">ข้อมูลจำเพาะทางเทคนิค</h3>
<ul class="list-disc pl-6 mb-4 space-y-2 text-neutral-700">
<li><strong>ชื่อทางเทคนิค:</strong> Ball Spout Jet Diffuser (JD Series)</li>
<li><strong>รูปทรง:</strong> ทรงกลม ติดเพดาน (Round Ceiling Mount)</li>
<li><strong>ทิศทางการจ่ายลม:</strong> แนวระดับหรือแนวดิ่ง (ปรับได้)</li>
<li><strong>การปรับทิศทาง:</strong> หมุนได้ 360° + ปรับมุมปาก 45°</li>
<li><strong>วัสดุ:</strong> อลูมิเนียม Powder-coated (RAL9010/9016) หรือ พลาสติก PVC</li>
<li><strong>สี:</strong> ขาว (มาตรฐาน)</li>
<li><strong>ขนาด:</strong> 4", 5", 6", 8", 10", 12", 14", 16", 18", 20", 25.2" นิ้ว</li>
<li><strong>การติดตั้ง:</strong> เจาะเพดาน แล้วสอดตัวหัวจ่ายเข้าไป ไม่ต้องต่อท่อลมยาว</li>
<li><strong>การใช้งาน:</strong> ติดตั้งบนเพดาน ในอาคารที่มีเพดานสูง ต้องการส่งลมระยะไกล</li>
</ul>
<h3 class="text-xl font-bold text-primary-700 mt-8 mb-4">เหมาะสำหรับงาน</h3>
<ul class="list-disc pl-6 mb-4 space-y-2 text-neutral-700">
<li><strong>อาคารสาธารณะขนาดใหญ่</strong> — สนามบิน สถานีขนส่ง ห้างสรรพสินค้า</li>
<li><strong>โรงงานอุตสาหกรรม</strong> — โรงงานผลิต คลังสินค้า</li>
<li><strong>อาคารสำนักงาน</strong> — โถงต้อนรับขนาดใหญ่ ล็อบบี้</li>
<li><strong>สถานที่จัดงาน</strong> — ห้องประชุม โรงละคร ห้องแสดงคอนเสิร์ต</li>
<li><strong>สถานที่ออกกำลังกาย</strong> — โรงยิม สนามกีฬาในร่ม</li>
<li><strong>พื้นที่สาธารณะอื่นๆ</strong> — สวนสนุก พิพิธภัณฑ์ ศูนย์การค้า</li>
</ul>
<h3 class="text-xl font-bold text-primary-700 mt-8 mb-4">ข้อดี</h3>
<ul class="list-disc pl-6 mb-4 space-y-2 text-neutral-700">
<li><strong>ประหยัดค่าใช้จ่าย</strong> — ลดต้นทุนการติดตั้งเพราะไม่ต้องเดินท่อลมยาว</li>
<li><strong>เพิ่มความสวยงาม</strong> — ไม่บดบังสายตา ทำให้พื้นที่ดูโปร่งโล่ง เรียบร้อย</li>
<li><strong>ง่ายต่อการบำรุงรักษา</strong> — ถอดล้างทำความสะอาดได้ง่าย</li>
<li><strong>ปรับเปลี่ยนได้ง่าย</strong> — สามารถเปลี่ยนตำแหน่งและทิศทางได้สะดวกหากมีการปรับผังห้อง</li>
<li><strong>ประหยัดพลังงาน</strong> — ส่งลมเฉพาะจุดที่ต้องการ ไม่ต้องทำความเย็นทั้งห้อง</li>
</ul>
</div>
</div>
</div>
</section>
<!-- Product Gallery -->
<section class="py-16 bg-neutral-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="max-w-4xl mx-auto">
<h2 class="text-2xl font-bold text-primary-700 mb-8 text-center">ภาพสินค้า หัวจ่ายแอร์ Ball Jet</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 max-w-3xl mx-auto">
<div class="rounded-2xl overflow-hidden shadow-md bg-white">
<img src="/images/ball-jet/ball-jet-main-hd.jpg" alt="หัวจ่ายแอร์ Ball Jet ภาพหลัก" class="w-full h-auto" width="1764" height="2000" loading="lazy" />
</div>
<div class="rounded-2xl overflow-hidden shadow-md bg-white">
<img src="/images/ball-jet/ball-jet-front.jpg" alt="หัวจ่ายแอร์ Ball Jet ภาพด้านหน้า" class="w-full h-auto" width="450" height="416" loading="lazy" />
</div>
</div>
</div>
</div>
</section>
<!-- Product Dimensions and Parameters -->
<section class="py-16 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="max-w-4xl mx-auto">
<h2 class="text-2xl font-bold text-primary-700 mb-8 text-center">ขนาดและพารามิเตอร์</h2>
<div class="rounded-2xl overflow-hidden shadow-md bg-white">
<img src="/images/ball-jet/ball-jet-specs.jpg" alt="ขนาดและพารามิเตอร์ หัวจ่ายแอร์ Ball Jet" class="w-full h-auto" width="712" height="1096" loading="lazy" />
</div>
</div>
</div>
</section>
<!-- FAQ Section -->
<section class="py-16 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-4xl mx-auto">
<h2 class="text-2xl font-bold text-primary-700 mb-8">คำถามที่พบบ่อย</h2>
<div class="space-y-4">
<div class="bg-neutral-50 rounded-lg p-4">
<h3 class="font-semibold text-neutral-800 mb-2">Q: หัวจ่ายแอร์ Ball Jet คืออะไร?</h3>
<p class="text-neutral-700">Ball Jet (Ball Spout Jet Diffuser) คืออุปกรณ์กระจายลมเพดานแบบกลม ออกแบบมาเพื่อส่งลมระยะไกลไปยังจุดเฉพาะในอาคารที่มีเพดานสูง โดยไม่ต้องเดินท่อลมยาว เหมาะสำหรับ Spot Cooling และงานที่ต้องการกระจายลมเป็นจุดเฉพาะ</p>
</div>
<div class="bg-neutral-50 rounded-lg p-4">
<h3 class="font-semibold text-neutral-800 mb-2">Q: เหมาะกับงานประเภทใด?</h3>
<p class="text-neutral-700">เหมาะกับอาคารที่มีเพดานสูง ต้องการส่งลมระยะไกล เช่น สนามบิน ห้างสรรพสินค้า โรงงานอุตสาหกรรม โรงยิม ห้องประชุม โรงละคร สนามกีฬาในร่ม และพื้นที่ขนาดใหญ่ทุกประเภท</p>
</div>
<div class="bg-neutral-50 rounded-lg p-4">
<h3 class="font-semibold text-neutral-800 mb-2">Q: เลือกอลูมิเนียมหรือ PVC ดี?</h3>
<p class="text-neutral-700"><strong>อลูมิเนียม</strong> แข็งแรง ทนทาน สวยงาม เหมาะกับงานทั่วไปและงานอาคารสำนักงาน ส่วน<strong>พลาสติก PVC</strong> ทนกรด ด่าง ความชื้น และสารเคมี เหมาะกับโรงงานอุตสาหกรรม ห้องปฏิบัติการ สระว่ายน้ำ หรือพื้นที่ที่มีความชื้นสูง</p>
</div>
<div class="bg-neutral-50 rounded-lg p-4">
<h3 class="font-semibold text-neutral-800 mb-2">Q: ขนาดที่เหมาะกับห้องของฉันคือ?</h3>
<p class="text-neutral-700">ขึ้นอยู่กับขนาดพื้นที่และความสูงเพดาน โดยทั่วไป: เพดาน 3-5 เมตร ใช้ขนาด 4"-6", เพดาน 5-8 เมตร ใช้ขนาด 8"-12", เพดาน 8-12 เมตร ใช้ขนาด 14"-18", เพดาน 12 เมตรขึ้นไป ใช้ขนาด 20"-25.2" ติดต่อเราเพื่อคำปรึกษาขนาดที่เหมาะสม</p>
</div>
<div class="bg-neutral-50 rounded-lg p-4">
<h3 class="font-semibold text-neutral-800 mb-2">Q: ติดตั้งยากไหม?</h3>
<p class="text-neutral-700">ติดตั้งง่ายมาก เพียงเจาะรูเพดานตามขนาดที่ต้องการ แล้วสอดตัวหัวจ่ายเข้าไป ไม่ต้องต่อท่อลมยาว ไม่ต้องใช้เครื่องมือพิเศษ น้ำหนักเบา ติดตั้งได้รวดเร็ว ประหยัดเวลาและค่าแรง</p>
</div>
</div>
</div>
</div>
</section>
<!-- Contact CTA -->
<section class="py-16 bg-gradient-to-br from-primary-700 to-primary-600 text-white relative overflow-hidden">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h2 class="text-3xl font-bold mb-6">สนใจสินค้านี้?</h2>
<p class="text-lg text-primary-100 mb-8">ติดต่อเราวันนี้ 090-555-1415 หรือแอดไลน์ @JPPSELECTION เพื่อรับคำปรึกษาและราคาพิเศษ</p>
<div class="flex flex-wrap justify-center gap-4">
<a href="https://line.me/ti/p/~JPPSELECTION" target="_blank" rel="noopener" class="bg-accent-500 hover:bg-accent-600 text-white py-3 px-8 rounded-xl font-semibold flex items-center gap-2">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.344.282-.629.627-.629h2.386c.349 0 .63.285.63.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.629.63-.629.345 0 .63.284.63.629v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.629.627-.629.349 0 .631.284.631.629v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.629.63-.629.348 0 .63.284.63.629v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314"/></svg>
แชท Line
</a>
<a href="tel:0905551415" class="bg-white text-primary-700 hover:bg-primary-50 py-3 px-8 rounded-xl font-semibold flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"/>
</svg>
โทร 090-555-1415
</a>
</div>
</div>
</section>
</main>
</BaseLayout>

View File

@@ -8,10 +8,10 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
"@type": "Product",
"name": "เครื่องเชื่อม HDPE",
"description": "เครื่องเชื่อมท่อ HDPE คุณภาพสูง เหมาะสำหรับงานเชื่อมท่อ HDPE ระบบประปา ระบบน้ำ งานอุตสาหกรรม ราคาพิเศษ ส่งฟรี",
"image": "https://dealplustech.co.th/images/HDPE-welding-crop.jpg",
"image": "/images/HDPE-welding-crop.jpg",
"offers": {
"@type": "Offer",
"url": "https://dealplustech.co.th/เครื่องเชื่อม-hdpe",
"url": "https://dealplustech.com/เครื่องเชื่อม-hdpe",
"priceCurrency": "THB",
"availability": "https://schema.org/InStock"
}

View File

@@ -11,10 +11,10 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
"@type": "Product",
"name": "ฉนวนหุ้มท่อแอร์ ฉนวนหุ้มท่อน้ำ เทอร์โมเบรค (Thermobreak)",
"description": "จำหน่ายฉนวนหุ้มท่อแอร์ ฉนวนหุ้มท่อน้ำ เทอร์โมเบรค (Thermobreak)คุณภาพสูง ราคาโรงงาน ส่งฟรี กทม. ปริมณฑล",
"image": "https://dealplustech.co.th/images/thermobreak/thermobreak-solarblock.png",
"image": "/images/thermobreak/thermobreak-solarblock.png",
"offers": {
"@type": "Offer",
"url": "https://dealplustech.co.th/เทอร์โมเบรค-thermobreak",
"url": "https://dealplustech.com/เทอร์โมเบรค-thermobreak",
"priceCurrency": "THB",
"availability": "https://schema.org/InStock"
}