Add EmDash CMS blog + hero standardization + seed fix
- Add EmDash CMS integration with SQLite and local storage - Add blog collection (seed/seed.json) with 3 sample posts - Add /บทความ list page and /บทความ/[slug] detail page - Add blog section to homepage - Fix reserved field slugs (slug, published_at removed from fields) - Fix date field mapping (publishedAt camelCase) - Fix featured image URL for admin-uploaded images (meta.storageKey) - Standardize all product page hero sections - Update navigation with 'บทความ' link - Configure Google OAuth provider
This commit is contained in:
17
.gitignore
vendored
17
.gitignore
vendored
@@ -8,3 +8,20 @@ dist/
|
||||
.DS_Store
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# Database
|
||||
*.db
|
||||
*.db-shm
|
||||
*.db-wal
|
||||
*.bak
|
||||
*.old
|
||||
*.test-run
|
||||
|
||||
# Agent context
|
||||
.context/
|
||||
|
||||
# Uploaded media
|
||||
uploads/
|
||||
|
||||
# Generated
|
||||
emdash-env.d.ts
|
||||
|
||||
217
EMDASH-SETUP-GUIDE.md
Normal file
217
EMDASH-SETUP-GUIDE.md
Normal file
@@ -0,0 +1,217 @@
|
||||
# EmDash CMS Integration Guide
|
||||
|
||||
## Overview
|
||||
This document summarizes the problems encountered and solutions when integrating EmDash CMS into an existing Astro static site, covering seed file setup, template design, and image/media handling.
|
||||
|
||||
---
|
||||
|
||||
## 1. Database & Seed File
|
||||
|
||||
### 1.1 Reserved Field Slugs
|
||||
|
||||
**Problem**: Adding `slug` or `published_at` as collection fields in `seed.json` causes the seed to fail. The `ec_blog` table is created but custom fields (like `excerpt`, `body`, `featured_image`) never get their columns added, resulting in errors like:
|
||||
```
|
||||
SqliteError: table ec_blog has no column named excerpt
|
||||
```
|
||||
|
||||
**Root Cause**: EmDash has a `RESERVED_FIELD_SLUGS` set in `node_modules/emdash/src/schema/types.ts` that includes:
|
||||
- `id`, `slug`, `status`, `author_id`, `primary_byline_id`
|
||||
- `created_at`, `updated_at`, `published_at`, `scheduled_at`, `deleted_at`
|
||||
- `version`, `live_revision_id`, `draft_revision_id`, `locale`, `translation_group`
|
||||
- Plus runtime-hydrated fields: `terms`, `bylines`, `byline`
|
||||
|
||||
When `createField()` encounters a reserved slug, it **throws a SchemaError**, which stops the transaction and prevents all subsequent fields from being created.
|
||||
|
||||
**Fix**: Do NOT include reserved slugs in the `fields` array of your collection definition. The system already creates these columns automatically in the content table (e.g., `ec_blog`).
|
||||
|
||||
```json
|
||||
// ❌ WRONG - slug and published_at are reserved
|
||||
"fields": [
|
||||
{ "slug": "title", "type": "string" },
|
||||
{ "slug": "slug", "type": "slug" },
|
||||
{ "slug": "excerpt", "type": "text" },
|
||||
{ "slug": "published_at", "type": "datetime" }
|
||||
]
|
||||
|
||||
// ✅ CORRECT - only define custom fields
|
||||
"fields": [
|
||||
{ "slug": "title", "type": "string" },
|
||||
{ "slug": "excerpt", "type": "text" },
|
||||
{ "slug": "body", "type": "portableText" },
|
||||
{ "slug": "featured_image", "type": "image" },
|
||||
{ "slug": "tags", "type": "string" }
|
||||
]
|
||||
```
|
||||
|
||||
### 1.2 Database Reset
|
||||
|
||||
**Problem**: The old database (`data.db`) caches schema and seed data. Changes to `seed.json` aren't reflected unless the database is fully deleted.
|
||||
|
||||
**Fix**: Remove all database files before restarting:
|
||||
```bash
|
||||
cd /path/to/project
|
||||
rm -f data.db data.db-shm data.db-wal
|
||||
npm run dev
|
||||
```
|
||||
|
||||
The `npx emdash dev` command hardcodes port 4321 and ignores `astro.config.mjs`'s `server.port` setting. Always use `npm run dev` for daily development.
|
||||
|
||||
### 1.3 Seed Content Data Format
|
||||
|
||||
**Problem**: Content entries in the seed file must only include non-system fields in `data`. System fields like `slug`, `status`, `published_at` are stored as direct columns on the `ec_*` table - they go at the same level as `data`, not inside it.
|
||||
|
||||
```json
|
||||
// ✅ CORRECT structure
|
||||
{
|
||||
"id": "my-post",
|
||||
"slug": "my-slug",
|
||||
"status": "published",
|
||||
"data": {
|
||||
"title": "My Title",
|
||||
"excerpt": "Description",
|
||||
"featured_image": {
|
||||
"src": "/images/photo.jpg",
|
||||
"alt": "Photo description"
|
||||
},
|
||||
"body": [
|
||||
{
|
||||
"_type": "block",
|
||||
"style": "normal",
|
||||
"children": [
|
||||
{ "_type": "span", "text": "Hello world" }
|
||||
]
|
||||
}
|
||||
],
|
||||
"tags": "news"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Template Data Access
|
||||
|
||||
### 2.1 Date Field Name (published_at -> publishedAt)
|
||||
|
||||
**Problem**: In templates, `article.data.published_at` returns `undefined`, showing "Invalid Date".
|
||||
|
||||
**Root Cause**: EmDash's loader (`mapRowToData` in `node_modules/emdash/src/loader.ts`) maps system date columns to **camelCase** using an `INCLUDE_IN_DATA` map:
|
||||
```js
|
||||
const INCLUDE_IN_DATA = {
|
||||
published_at: "publishedAt",
|
||||
created_at: "createdAt",
|
||||
updated_at: "updatedAt",
|
||||
scheduled_at: "scheduledAt",
|
||||
};
|
||||
```
|
||||
|
||||
**Fix**: Use camelCase property names in templates:
|
||||
```astro
|
||||
{/* ❌ WRONG */}
|
||||
<time datetime={article.data.published_at}>
|
||||
|
||||
{/* ✅ CORRECT */}
|
||||
<time datetime={article.data.publishedAt}>
|
||||
```
|
||||
|
||||
Note: `orderBy` in queries uses the actual column name (snake_case) because it's passed directly to SQL:
|
||||
```js
|
||||
orderBy: { published_at: 'desc' } // ✅ column name for SQL
|
||||
```
|
||||
|
||||
### 2.2 Featured Image URL
|
||||
|
||||
**Problem**: Images uploaded via the admin UI show as 404:
|
||||
```
|
||||
Failed to load resource: the server responded with a status of 404 (Not Found)
|
||||
/_emdash/api/media/file/01KSETDVHCWSAWF8HM72DSD8KT
|
||||
```
|
||||
|
||||
**Root Cause**: EmDash's `normalizeMediaValue()` function (in `node_modules/emdash/src/media/normalize.ts`) **strips the `src` property** from local media objects during save:
|
||||
```js
|
||||
if (provider === "local") {
|
||||
delete result.src; // src is removed
|
||||
}
|
||||
```
|
||||
|
||||
The local media provider stores files with `storageKey = "{ulid}.{ext}"` (e.g., `01HM2xyz.jpg`), and the URL must include the file extension. The stored value becomes:
|
||||
```json
|
||||
{
|
||||
"id": "01HM2xyz",
|
||||
"provider": "local",
|
||||
"meta": { "storageKey": "01HM2xyz.jpg" }
|
||||
// NO "src" property!
|
||||
}
|
||||
```
|
||||
|
||||
**Fix**: Handle three possible formats when rendering images:
|
||||
|
||||
| Source | Format | URL Resolution |
|
||||
|--------|--------|----------------|
|
||||
| Seed data (plain path) | `"string/path.jpg"` | Use string directly |
|
||||
| Seed data (object with src) | `{ src: "/images/pic.jpg" }` | Use `img.src` |
|
||||
| Admin UI uploaded | `{ provider: "local", id: "xxx", meta: { storageKey: "xxx.jpg" } }` | Use `img.meta?.storageKey \|\| img.id` |
|
||||
|
||||
```astro
|
||||
---
|
||||
function getImageUrl(img) {
|
||||
if (typeof img === 'string') return img;
|
||||
if (img?.src) return img.src;
|
||||
if (img?.provider === 'local') {
|
||||
return `/_emdash/api/media/file/${img.meta?.storageKey || img.id}`;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
---
|
||||
<img src={getImageUrl(article.data.featured_image)} alt={article.data.title} />
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Google OAuth Setup
|
||||
|
||||
### 3.1 Configuration
|
||||
|
||||
```js
|
||||
import { google } from 'emdash/auth/providers/google'
|
||||
emdash({ authProviders: [google()] })
|
||||
```
|
||||
|
||||
### 3.2 Environment Variables
|
||||
|
||||
1. Go to https://console.cloud.google.com/apis/credentials
|
||||
2. Create OAuth client ID -> Web application
|
||||
3. Add Authorized redirect URI: `http://localhost:3100/_emdash/api/auth/callback/google`
|
||||
4. Set env vars: `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`
|
||||
|
||||
---
|
||||
|
||||
## 4. Key Architecture Notes
|
||||
|
||||
### 4.1 Publish Flow
|
||||
|
||||
When a collection supports `"revisions"`:
|
||||
- **Save** -> creates a **draft revision** in the `revisions` table
|
||||
- **Publish** -> calls `syncDataColumns()` to copy draft data into the `ec_*` table columns
|
||||
- Frontend reads from `ec_*` table, NOT revisions table
|
||||
- You must click **Publish** for edits to appear on frontend
|
||||
|
||||
### 4.2 Field Storage
|
||||
|
||||
- Fields become **SQL columns** on `ec_{slug}` table
|
||||
- Type mapping: `string`->`TEXT`, `text`->`TEXT`, `portableText`->`JSON`, `image`->`TEXT`
|
||||
- Object values are JSON.stringify'd for storage, JSON.parsed on read
|
||||
|
||||
### 5.3 Media URL Pattern
|
||||
|
||||
Admin-uploaded images: `/_emdash/api/media/file/{storageKey}` where `storageKey = {ulid}.{ext}`
|
||||
|
||||
---
|
||||
|
||||
## 5. Quick Reference
|
||||
|
||||
| Task | Command |
|
||||
|------|---------|
|
||||
| Start dev server | `npm run dev` |
|
||||
| Reset database | `rm -f data.db data.db-shm data.db-wal && npm run dev` |
|
||||
| Admin UI | `/_emdash/admin` |
|
||||
@@ -1,5 +1,10 @@
|
||||
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'
|
||||
|
||||
@@ -7,6 +12,10 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
|
||||
export default defineConfig({
|
||||
site: 'https://dealplustech.com',
|
||||
output: 'server',
|
||||
adapter: node({
|
||||
mode: 'standalone',
|
||||
}),
|
||||
vite: {
|
||||
plugins: [tailwindcss()],
|
||||
resolve: {
|
||||
@@ -18,7 +27,17 @@ export default defineConfig({
|
||||
},
|
||||
},
|
||||
},
|
||||
output: 'static',
|
||||
integrations: [
|
||||
react(),
|
||||
emdash({
|
||||
database: sqlite({ url: 'file:./data.db' }),
|
||||
storage: local({
|
||||
directory: './uploads',
|
||||
baseUrl: '/_emdash/api/media/file',
|
||||
}),
|
||||
authProviders: [google()],
|
||||
}),
|
||||
],
|
||||
build: {
|
||||
assets: '_assets',
|
||||
},
|
||||
@@ -26,4 +45,5 @@ export default defineConfig({
|
||||
host: '0.0.0.0',
|
||||
port: 3100,
|
||||
},
|
||||
devToolbar: { enabled: false },
|
||||
})
|
||||
|
||||
5067
package-lock.json
generated
5067
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -7,14 +7,20 @@
|
||||
"dev": "astro dev",
|
||||
"build": "astro build",
|
||||
"preview": "astro preview",
|
||||
"astro": "astro"
|
||||
"astro": "astro",
|
||||
"start": "node ./dist/server/entry.mjs"
|
||||
},
|
||||
"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",
|
||||
"tailwindcss": "^4.0.0",
|
||||
"typescript": "^5.6.3"
|
||||
},
|
||||
|
||||
137
seed/seed.json
Normal file
137
seed/seed.json
Normal file
@@ -0,0 +1,137 @@
|
||||
{
|
||||
"$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": "วาล์ว"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -110,6 +110,10 @@ const productLinks = [
|
||||
เกี่ยวกับเรา
|
||||
<span class="nav-underline"></span>
|
||||
</a>
|
||||
<a href="/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1" class="nav-link text-neutral-600 hover:text-primary-600 font-medium relative">
|
||||
บทความ
|
||||
<span class="nav-underline"></span>
|
||||
</a>
|
||||
|
||||
<div class="relative group">
|
||||
<button class="nav-link flex items-center gap-1 text-neutral-600 hover:text-primary-600 font-medium">
|
||||
@@ -178,6 +182,7 @@ const productLinks = [
|
||||
<div class="px-4 py-6 space-y-4">
|
||||
<a href="/" class="block text-neutral-600 hover:text-primary-600 font-medium py-2">หน้าแรก</a>
|
||||
<a href="/about-us" class="block text-neutral-600 hover:text-primary-600 font-medium py-2">เกี่ยวกับเรา</a>
|
||||
<a href="/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1" class="block text-neutral-600 hover:text-primary-600 font-medium py-2">บทความ</a>
|
||||
<a href="/all-products" class="block text-neutral-600 hover:text-primary-600 font-medium py-2">สินค้าทั้งหมด</a>
|
||||
<a href="/portfolio" class="block text-neutral-600 hover:text-primary-600 font-medium py-2">ผลงาน</a>
|
||||
<a href="/contact-us" class="block bg-primary-600 text-white text-center py-3 rounded-lg font-medium mt-4">ติดต่อเรา</a>
|
||||
@@ -230,6 +235,7 @@ const productLinks = [
|
||||
<ul class="space-y-2 text-sm text-neutral-600">
|
||||
<li><a href="/" class="hover:text-primary-600 hover:translate-x-1 transition-all inline-block">หน้าแรก</a></li>
|
||||
<li><a href="/about-us" class="hover:text-primary-600 hover:translate-x-1 transition-all inline-block">เกี่ยวกับเรา</a></li>
|
||||
<li><a href="/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1" class="hover:text-primary-600 hover:translate-x-1 transition-all inline-block">บทความ</a></li>
|
||||
<li><a href="/all-products" class="hover:text-primary-600 hover:translate-x-1 transition-all inline-block">สินค้าทั้งหมด</a></li>
|
||||
<li><a href="/portfolio" class="hover:text-primary-600 hover:translate-x-1 transition-all inline-block">ผลงาน</a></li>
|
||||
<li><a href="/contact-us" class="hover:text-primary-600 hover:translate-x-1 transition-all inline-block">ติดต่อเรา</a></li>
|
||||
|
||||
6
src/live.config.ts
Normal file
6
src/live.config.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import { defineLiveCollection } from 'astro:content'
|
||||
import { emdashLoader } from 'emdash/runtime'
|
||||
|
||||
export const collections = {
|
||||
_emdash: defineLiveCollection({ loader: emdashLoader() }),
|
||||
}
|
||||
@@ -51,14 +51,14 @@ import Footer from '@/components/common/Footer.astro';
|
||||
|
||||
<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-center gap-2">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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-center gap-2">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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">
|
||||
|
||||
@@ -51,14 +51,14 @@ import Footer from '@/components/common/Footer.astro';
|
||||
|
||||
<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-center gap-2">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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-center gap-2">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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">
|
||||
|
||||
@@ -14,8 +14,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -53,14 +51,14 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
</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">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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-start gap-2">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
||||
@@ -14,8 +14,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -53,14 +51,14 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
</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">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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-start gap-2">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
---
|
||||
import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
import { getEmDashCollection } from 'emdash';
|
||||
|
||||
const { entries: articles, cacheHint } = await getEmDashCollection('blog', {
|
||||
limit: 3,
|
||||
orderBy: { published_at: 'desc' },
|
||||
status: 'published',
|
||||
});
|
||||
Astro.cache.set(cacheHint);
|
||||
---
|
||||
|
||||
<BaseLayout title="ดีล พลัส เทค - ระบบน้ำคุณภาพสูง ราคาโรงงาน" description="ดีล พลัส เทค จำกัด ผู้นำด้านระบบน้ำคุณภาพสูง ราคาโรงงาน ท่อ PPR ท่อ HDPE อุปกรณ์วาล์ว ปั๊มน้ำ เครื่องเชื่อมท่อ และอุปกรณ์โรงงานคุณภาพ">
|
||||
@@ -304,6 +312,80 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- บทความ Section -->
|
||||
<section class="py-16 lg:py-24 bg-white">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex items-end justify-between mb-12">
|
||||
<div>
|
||||
<span class="inline-block px-4 py-1.5 bg-primary-100 text-primary-700 rounded-full text-sm font-medium mb-4">บทความ</span>
|
||||
<h2 class="text-3xl lg:text-4xl font-bold text-slate-900">บทความล่าสุด</h2>
|
||||
<p class="text-lg text-slate-600 mt-2">ความรู้และข้อมูลที่เป็นประโยชน์เกี่ยวกับระบบน้ำและอุปกรณ์</p>
|
||||
</div>
|
||||
<a href="/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1" class="hidden sm:inline-flex items-center gap-2 text-primary-600 hover:text-primary-700 font-semibold transition-colors">
|
||||
ดูทั้งหมด
|
||||
<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="M17 8l4 4m0 0l-4 4m4-4H3"/>
|
||||
</svg>
|
||||
</a>
|
||||
</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>
|
||||
)}
|
||||
</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>
|
||||
|
||||
<div class="text-center mt-10 sm:hidden">
|
||||
<a href="/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1" class="inline-flex items-center gap-2 text-primary-600 hover:text-primary-700 font-semibold transition-colors">
|
||||
ดูบทความทั้งหมด
|
||||
<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="M17 8l4 4m0 0l-4 4m4-4H3"/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA Section -->
|
||||
<section class="py-16 lg:py-24 bg-gradient-to-br from-primary-700 via-primary-600 to-primary-800 text-white relative overflow-hidden">
|
||||
<!-- Background Elements -->
|
||||
|
||||
@@ -51,14 +51,14 @@ import Footer from '@/components/common/Footer.astro';
|
||||
|
||||
<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-center gap-2">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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-center gap-2">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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">
|
||||
|
||||
@@ -14,8 +14,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -53,14 +51,14 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
</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">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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-start gap-2">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
||||
@@ -26,7 +26,7 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
|
||||
<main class="bg-white min-h-screen pb-24 md:pb-0">
|
||||
<!-- Hero Section -->
|
||||
<section class="bg-gradient-to-br from-primary-700 to-primary-600 text-white py-12 relative overflow-hidden">
|
||||
<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">
|
||||
@@ -36,8 +36,6 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -64,25 +62,26 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
<nav class="text-sm mb-4 text-primary-100">
|
||||
<a href="/" class="hover:text-white">หน้าแรก</a> / <a href="/all-products" class="hover:text-white">สินค้าทั้งหมด</a> / <span class="text-white">Realflex</span>
|
||||
</nav>
|
||||
<div class="grid lg:grid-cols-2 gap-8 items-start">
|
||||
<div class="grid lg:grid-cols-2 gap-12 items-start">
|
||||
<div class="lg:sticky lg:top-24">
|
||||
<div class="img-hover rounded-2xl overflow-hidden bg-white/10">
|
||||
<div class="rounded-2xl overflow-hidden bg-white/10" p-2>
|
||||
<img src="/images/products-cropped/realflex_000C.jpg" alt="Realflex" class="w-full" loading="eager" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="text-sm text-primary-200 font-medium">สายอ่อนสแตนเลส</span>
|
||||
<h1 class="text-3xl lg:text-4xl font-bold mt-2 mb-4">Realflex | สายอ่อนสแตนเลส</h1>
|
||||
<p class="text-primary-100 text-lg mb-6">Stainless Steel Flexible Hose Fitting สำหรับระบบดับเพลิงอัตโนมัติ</p>
|
||||
<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">Realflex | สายอ่อนสแตนเลส</h1>
|
||||
<p class="text-lg sm:text-xl text-white/80 mb-6 leading-relaxed">Stainless Steel Flexible Hose Fitting สำหรับระบบดับเพลิงอัตโนมัติ</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">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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-start gap-2">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
||||
@@ -14,8 +14,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -53,14 +51,14 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
</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">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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-start gap-2">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
||||
@@ -26,7 +26,7 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
|
||||
<main class="bg-white min-h-screen pb-24 md:pb-0">
|
||||
<!-- Hero Section -->
|
||||
<section class="bg-gradient-to-br from-primary-700 to-primary-600 text-white py-12 relative overflow-hidden">
|
||||
<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">
|
||||
@@ -36,8 +36,6 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -64,25 +62,26 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
<nav class="text-sm mb-4 text-primary-100">
|
||||
<a href="/" class="hover:text-white">หน้าแรก</a> / <a href="/all-products" class="hover:text-white">สินค้าทั้งหมด</a> / <span class="text-white">ระบบกรองน้ำ</span>
|
||||
</nav>
|
||||
<div class="grid lg:grid-cols-2 gap-8 items-start">
|
||||
<div class="grid lg:grid-cols-2 gap-12 items-start">
|
||||
<div class="lg:sticky lg:top-24">
|
||||
<div class="img-hover rounded-2xl overflow-hidden bg-white/10">
|
||||
<div class="rounded-2xl overflow-hidden bg-white/10" p-2>
|
||||
<img src="/images/products-cropped/water-treatment_000C.jpg" alt="ระบบกรองน้ำ" class="w-full" loading="eager" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="text-sm text-primary-200 font-medium">ปั๊มและระบบน้ำ</span>
|
||||
<h1 class="text-3xl lg:text-4xl font-bold mt-2 mb-4">ระบบกรองน้ำดี (Water Treatment)</h1>
|
||||
<p class="text-primary-100 text-lg mb-6">ระบบกรองน้ำคุณภาพสูง กรองสารอนินทรีย์ คลอรีน เหมาะสำหรับน้ำดื่ม</p>
|
||||
<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">ระบบกรองน้ำดี (Water Treatment)</h1>
|
||||
<p class="text-lg sm:text-xl text-white/80 mb-6 leading-relaxed">ระบบกรองน้ำคุณภาพสูง กรองสารอนินทรีย์ คลอรีน เหมาะสำหรับน้ำดื่ม</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">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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-start gap-2">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
||||
@@ -63,14 +63,14 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
</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-center gap-2">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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-center gap-2">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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">
|
||||
@@ -359,8 +359,6 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
|
||||
@@ -15,8 +15,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
|
||||
@@ -15,8 +15,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
|
||||
@@ -15,8 +15,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
|
||||
@@ -14,8 +14,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -53,14 +51,14 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
</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">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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-start gap-2">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
||||
@@ -15,8 +15,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
---
|
||||
<BaseLayout title="ท่อ XYLENT - ดีล พลัส เทค" description="ท่อระบายน้ำ 3 ชั้น ไซเลนท์ (XYLENT) ระบบ Push Fit เงียบสนิท 22 เดซิเบล จาก Poloplast">
|
||||
<section class="bg-gradient-to-br from-primary-700 to-primary-600 text-white py-12 relative overflow-hidden">
|
||||
<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">
|
||||
@@ -12,8 +12,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -40,15 +38,16 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<nav class="text-sm mb-4 text-primary-100">
|
||||
<a href="/" class="hover:text-white">หน้าแรก</a> / <a href="/all-products" class="hover:text-white">สินค้าทั้งหมด</a> / <span class="text-white">ท่อ XYLENT</span>
|
||||
</nav>
|
||||
<div class="grid lg:grid-cols-2 gap-8 items-start">
|
||||
<div class="grid lg:grid-cols-2 gap-12 items-start">
|
||||
<div class="lg:sticky lg:top-24">
|
||||
<div class="img-hover rounded-2xl overflow-hidden bg-white/10">
|
||||
<div class="rounded-2xl overflow-hidden bg-white/10">
|
||||
<img src="/images/products-cropped/XYLENT_001.png" alt="ท่อ XYLENT" class="w-full" loading="eager" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="text-sm text-primary-200 font-medium">ท่อระบายน้ำ</span>
|
||||
<h1 class="text-3xl lg:text-4xl font-bold mt-2 mb-4">ท่อระบายน้ำ 3 ชั้น ไซเลนท์ (XYLENT)</h1>
|
||||
<p class="text-primary-100 text-lg mb-6">นวัตกรรมท่อระบายน้ำคุณภาพสูงจาก Poloplast ผู้ผลิตชั้นนำจากยุโรป ด้วยเทคโนโลยี 3 ชั้นที่ลดเสียงรบกวนได้อย่างมีประสิทธิภาพ ระดับเสียงเพียง 22 เดซิเบล ซึ่งเงียบกว่าท่อระบายน้ำทั่วไปถึง 3 เท่า</p>
|
||||
<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">ท่อระบายน้ำ 3 ชั้น ไซเลนท์ (XYLENT)</h1>
|
||||
<p class="text-lg sm:text-xl text-white/80 mb-6 leading-relaxed">นวัตกรรมท่อระบายน้ำคุณภาพสูงจาก Poloplast ผู้ผลิตชั้นนำจากยุโรป ด้วยเทคโนโลยี 3 ชั้นที่ลดเสียงรบกวนได้อย่างมีประสิทธิภาพ ระดับเสียงเพียง 22 เดซิเบล ซึ่งเงียบกว่าท่อระบายน้ำทั่วไปถึง 3 เท่า</p>
|
||||
<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>
|
||||
|
||||
130
src/pages/บทความ/[slug].astro
Normal file
130
src/pages/บทความ/[slug].astro
Normal file
@@ -0,0 +1,130 @@
|
||||
---
|
||||
import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
import { getEmDashEntry, getEmDashCollection } from 'emdash';
|
||||
import { PortableText, Image } from 'emdash/ui';
|
||||
|
||||
const { slug } = Astro.params;
|
||||
const { entry: article, cacheHint } = await getEmDashEntry('blog', slug);
|
||||
Astro.cache.set(cacheHint);
|
||||
|
||||
if (!article) {
|
||||
return Astro.redirect('/404');
|
||||
}
|
||||
|
||||
// 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);
|
||||
---
|
||||
|
||||
<BaseLayout title={`${article.data.title} - ดีล พลัส เทค`} description={article.data.excerpt || `บทความ ${article.data.title}`}>
|
||||
<main class="bg-white min-h-screen">
|
||||
{/* Breadcrumb */}
|
||||
<section class="bg-slate-50 border-b border-slate-100">
|
||||
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
|
||||
<nav class="text-sm text-slate-500">
|
||||
<a href="/" class="hover:text-primary-600 transition-colors">หน้าแรก</a>
|
||||
<span class="mx-2">/</span>
|
||||
<a href={`/${encodeURI('บทความ')}`} class="hover:text-primary-600 transition-colors">บทความ</a>
|
||||
<span class="mx-2">/</span>
|
||||
<span class="text-slate-800">{article.data.title}</span>
|
||||
</nav>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Article Header */}
|
||||
<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>
|
||||
)}
|
||||
<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>
|
||||
</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 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>
|
||||
)}
|
||||
</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>
|
||||
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">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Related Articles */}
|
||||
{related.length > 0 && (
|
||||
<section class="py-12 lg:py-16 bg-slate-50">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<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">
|
||||
<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>
|
||||
);
|
||||
})()
|
||||
}
|
||||
</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>
|
||||
<p class="text-sm text-slate-600 line-clamp-2">{rel.data.excerpt}</p>
|
||||
</div>
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
</main>
|
||||
</BaseLayout>
|
||||
86
src/pages/บทความ/index.astro
Normal file
86
src/pages/บทความ/index.astro
Normal file
@@ -0,0 +1,86 @@
|
||||
---
|
||||
import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
import { getEmDashCollection } from 'emdash';
|
||||
|
||||
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
|
||||
---
|
||||
|
||||
<BaseLayout title="บทความทั้งหมด - ดีล พลัส เทค" description="รวมบทความและความรู้เกี่ยวกับระบบน้ำ ท่อ และอุปกรณ์ต่างๆ จากดีล พลัส เทค">
|
||||
<main class="bg-white min-h-screen">
|
||||
<!-- Hero -->
|
||||
<section class="bg-gradient-to-br from-primary-800 via-primary-700 to-primary-900 text-white py-16 lg:py-24">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="max-w-3xl">
|
||||
<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">บทความทั้งหมด</h1>
|
||||
<p class="text-lg sm:text-xl text-white/80 leading-relaxed">ความรู้และข้อมูลที่เป็นประโยชน์เกี่ยวกับระบบน้ำ ท่อ อุปกรณ์วาล์ว และอื่นๆ</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 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>
|
||||
)}
|
||||
</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>
|
||||
</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>
|
||||
<p class="text-xl text-slate-400 mb-2">ยังไม่มีบทความ</p>
|
||||
<p class="text-slate-400">กลับมาตรวจสอบอีกครั้งในภายหลัง</p>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</BaseLayout>
|
||||
@@ -14,8 +14,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
|
||||
@@ -26,7 +26,7 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
|
||||
<main class="bg-white min-h-screen pb-24 md:pb-0">
|
||||
<!-- Hero Section -->
|
||||
<section class="bg-gradient-to-br from-primary-700 to-primary-600 text-white py-12 relative overflow-hidden">
|
||||
<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">
|
||||
@@ -36,8 +36,6 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -64,25 +62,26 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
<nav class="text-sm mb-4 text-primary-100">
|
||||
<a href="/" class="hover:text-white">หน้าแรก</a> / <a href="/all-products" class="hover:text-white">สินค้าทั้งหมด</a> / <span class="text-white">ระบบรั้วไวน์แมน</span>
|
||||
</nav>
|
||||
<div class="grid lg:grid-cols-2 gap-8 items-start">
|
||||
<div class="grid lg:grid-cols-2 gap-12 items-start">
|
||||
<div class="lg:sticky lg:top-24">
|
||||
<div class="img-hover rounded-2xl overflow-hidden bg-white/10">
|
||||
<div class="rounded-2xl overflow-hidden bg-white/10" p-2>
|
||||
<img src="/images/products-raw/vineman/ระบบรั้วไวน์แมน-Vineman-e1613286324569-1024x880.jpg" alt="ระบบรั้วไวน์แมน Vineman" class="w-full" loading="eager" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="text-sm text-primary-200 font-medium">ระบบรั้ว</span>
|
||||
<h1 class="text-3xl lg:text-4xl font-bold mt-2 mb-4">ระบบรั้วไวน์แมน | Vineman</h1>
|
||||
<p class="text-primary-100 text-lg mb-6">ส่งฟรี กรุงเทพมหานคร ปริมณฑล รั้วตาข่ายคุณภาพสูงจากออสเตรเลีย ทนทาน ดีไซน์ทันสมัย</p>
|
||||
<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">ระบบรั้วไวน์แมน | Vineman</h1>
|
||||
<p class="text-lg sm:text-xl text-white/80 mb-6 leading-relaxed">ส่งฟรี กรุงเทพมหานคร ปริมณฑล รั้วตาข่ายคุณภาพสูงจากออสเตรเลีย ทนทาน ดีไซน์ทันสมัย</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">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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-start gap-2">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
||||
@@ -3,7 +3,7 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
---
|
||||
|
||||
<BaseLayout title="รั้วเทวดา | ระบบรั้วสำเร็จรูป คุณภาพสูง ราคาคุ้มค่า" description="รั้วเทวดา ระบบรั้วสำเร็จรูปสำหรับโรงงาน โกดัง สถานที่เกษตร รีสอร์ท และอื่นๆ พร้อมบริการติดตั้งครบวงจร">
|
||||
<section class="bg-gradient-to-br from-primary-700 to-primary-600 text-white py-12 relative overflow-hidden">
|
||||
<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">
|
||||
@@ -13,8 +13,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -41,15 +39,16 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<nav class="text-sm mb-4 text-primary-100">
|
||||
<a href="/" class="hover:text-white">หน้าแรก</a> / <a href="/all-products" class="hover:text-white">สินค้าทั้งหมด</a> / <span class="text-white">รั้วเทวดา</span>
|
||||
</nav>
|
||||
<div class="grid lg:grid-cols-2 gap-8 items-start">
|
||||
<div class="grid lg:grid-cols-2 gap-12 items-start">
|
||||
<div class="lg:sticky lg:top-24">
|
||||
<div class="img-hover rounded-2xl overflow-hidden bg-white/10">
|
||||
<div class="rounded-2xl overflow-hidden bg-white/10">
|
||||
<img src="/images/tevada/LINE_ALBUM_รั้วเทวดา_260522_1.jpg" alt="รั้วเทวดา" class="w-full" loading="eager" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="text-sm text-primary-200 font-medium">ระบบรั้วและฉากกั้น</span>
|
||||
<h1 class="text-3xl lg:text-4xl font-bold mt-2 mb-4">รั้วเทวดา</h1>
|
||||
<p class="text-primary-100 text-lg mb-6">ระบบรั้วสำเร็จรูปคุณภาพสูง ราคาคุ้มค่า เหมาะสำหรับโรงงาน โกดัง สถานที่เกษตร และอื่นๆ พร้อมบริการติดตั้งครบวงจรโดยทีมงานมืออาชีพ</p>
|
||||
<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">รั้วเทวดา</h1>
|
||||
<p class="text-lg sm:text-xl text-white/80 mb-6 leading-relaxed">ระบบรั้วสำเร็จรูปคุณภาพสูง ราคาคุ้มค่า เหมาะสำหรับโรงงาน โกดัง สถานที่เกษตร และอื่นๆ พร้อมบริการติดตั้งครบวงจรโดยทีมงานมืออาชีพ</p>
|
||||
<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 flex items-start gap-2">
|
||||
|
||||
@@ -30,8 +30,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -56,9 +54,8 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
</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>
|
||||
<div class="lg:sticky lg:top-24">
|
||||
<div class="rounded-2xl overflow-hidden bg-white/10">
|
||||
<div class="lg:sticky lg:top-24">
|
||||
<div class="rounded-2xl overflow-hidden bg-white/10 p-2">
|
||||
<img src="/images/products-cropped/valve_000C.jpg" alt="วาล์ว (Valve)" class="w-full" width="600" height="400" loading="eager" />
|
||||
</div>
|
||||
</div>
|
||||
@@ -70,14 +67,14 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
</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-center gap-2">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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-center gap-2">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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">
|
||||
|
||||
@@ -30,8 +30,6 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -69,14 +67,14 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
||||
</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">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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-start gap-2">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
||||
@@ -18,8 +18,6 @@ import Footer from '@/components/common/Footer.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -61,14 +59,14 @@ import Footer from '@/components/common/Footer.astro';
|
||||
|
||||
<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-center gap-2">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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-center gap-2">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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">
|
||||
|
||||
@@ -26,7 +26,7 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
|
||||
<main class="bg-white min-h-screen pb-24 md:pb-0">
|
||||
<!-- Hero Section -->
|
||||
<section class="bg-gradient-to-br from-primary-700 to-primary-600 text-white py-12 relative overflow-hidden">
|
||||
<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">
|
||||
@@ -36,8 +36,6 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
@@ -64,25 +62,26 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
<nav class="text-sm mb-4 text-primary-100">
|
||||
<a href="/" class="hover:text-white">หน้าแรก</a> / <a href="/all-products" class="hover:text-white">สินค้าทั้งหมด</a> / <span class="text-white">เทอร์โมเบรค Thermobreak</span>
|
||||
</nav>
|
||||
<div class="grid lg:grid-cols-2 gap-8 items-start">
|
||||
<div class="grid lg:grid-cols-2 gap-12 items-start">
|
||||
<div class="lg:sticky lg:top-24">
|
||||
<div class="img-hover rounded-2xl overflow-hidden bg-white/10">
|
||||
<div class="rounded-2xl overflow-hidden bg-white/10" p-2>
|
||||
<img src="/images/thermobreak/thermobreak-solarblock.png" alt="เทอร์โมเบรค Thermobreak" class="w-full" loading="eager" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="text-sm text-primary-200 font-medium">ฉนวนและรั้ว</span>
|
||||
<h1 class="text-3xl lg:text-4xl font-bold mt-2 mb-4">เทอร์โมเบรค Thermobreak</h1>
|
||||
<p class="text-primary-100 text-lg mb-6">ฉนวนเทอร์โมเบรค คุณภาพสูงจากออสเตรเลีย ป้องกันความร้อนได้ดีเยี่ยม มาตรฐาน FM และ UL</p>
|
||||
<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">เทอร์โมเบรค Thermobreak</h1>
|
||||
<p class="text-lg sm:text-xl text-white/80 mb-6 leading-relaxed">ฉนวนเทอร์โมเบรค คุณภาพสูงจากออสเตรเลีย ป้องกันความร้อนได้ดีเยี่ยม มาตรฐาน FM และ UL</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">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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-start gap-2">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
||||
@@ -63,14 +63,14 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
</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-center gap-2">
|
||||
<span>แชท Line</span>
|
||||
<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>
|
||||
<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-center gap-2">
|
||||
<span>090-555-1415</span>
|
||||
<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>
|
||||
<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">
|
||||
@@ -334,8 +334,6 @@ import StickyBottomCTA from '@/components/common/StickyBottomCTA.astro';
|
||||
<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>
|
||||
<div class="absolute top-1/2 right-1/3 w-4 h-4 bg-white/15 rounded-full animate-float"></div>
|
||||
<div class="absolute bottom-1/4 left-2/3 w-3 h-3 bg-primary-400/15 rounded-full animate-float-delayed-3"></div>
|
||||
|
||||
<!-- Water-inspired Waves -->
|
||||
<svg class="absolute bottom-0 left-0 w-full h-[250px] opacity-20" viewBox="0 0 1440 250" preserveAspectRatio="none">
|
||||
|
||||
Reference in New Issue
Block a user