feat: Restore full product data from commit 668f69048f

- Restored site-config.ts (2100 lines with all product tables)
- Restored proper product page template with table rendering
- Restored Header, Footer, FloatingContact components
- All 6 products now show detailed specification tables
- Preserved all PDPA compliance features
This commit is contained in:
Kunthawat
2026-03-12 14:58:57 +07:00
parent 7e8c7d1314
commit 2894e836a6
23 changed files with 3328 additions and 342 deletions

File diff suppressed because one or more lines are too long

12
dist/blog/index.html vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

After

Width:  |  Height:  |  Size: 137 KiB

1606
dist/images/2021/03/hdpe002.jpg vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1579,4 +1579,28 @@ var _wpUtilSettings = {"ajax":{"url":"/wp-admin/admin-ajax.php"}};
<script type="text/javascript" src="https://www.dealplustech.co.th/wp-includes/js/wp-util.min.js?ver=6.9.4" id="wp-util-js"></script> <script type="text/javascript" src="https://www.dealplustech.co.th/wp-includes/js/wp-util.min.js?ver=6.9.4" id="wp-util-js"></script>
<script type="text/javascript" id="wc-add-to-cart-variation-js-extra"> <script type="text/javascript" id="wc-add-to-cart-variation-js-extra">
/* <![CDATA[ */ /* <![CDATA[ */
var wc_add_to_cart_variation_params = {"wc_ajax_url":"/?wc-ajax=%%endpoint%%","i18n_no_matching_variations_text":"\u0e02\u0e2d\u0e2d\u0e20\u0e31\u0e22\u0e04\u0e48\u0e30 \u0e44\u0e21\u0e48\u0e21\u0e35\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e17\u0e35\u0e48\u0e15\u0e23\u0e07\u0e01\u0e31\u0e1a\u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e40\u0e25\u0e37\u0e2d\u0e01 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e43\u0e2b\u0e21\u0e48","i18n_make_a_selection_text":"\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e01\u0e48\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e08\u0e30\u0e17\u0e33\u0e01\u0e32\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2a\u0e34\u0e19\u0e04\u0e var wc_add_to_cart_variation_params = {"wc_ajax_url":"/?wc-ajax=%%endpoint%%","i18n_no_matching_variations_text":"\u0e02\u0e2d\u0e2d\u0e20\u0e31\u0e22\u0e04\u0e48\u0e30 \u0e44\u0e21\u0e48\u0e21\u0e35\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e17\u0e35\u0e48\u0e15\u0e23\u0e07\u0e01\u0e31\u0e1a\u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e40\u0e25\u0e37\u0e2d\u0e01 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e43\u0e2b\u0e21\u0e48","i18n_make_a_selection_text":"\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e01\u0e48\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e08\u0e30\u0e17\u0e33\u0e01\u0e32\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e19\u0e35\u0e49\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e22\u0e31\u0e07\u0e15\u0e30\u0e01\u0e23\u0e49\u0e32\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13","i18n_unavailable_text":"\u0e02\u0e2d\u0e2d\u0e20\u0e31\u0e22 \u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e19\u0e35\u0e49\u0e44\u0e21\u0e48\u0e21\u0e35\u0e2d\u0e22\u0e39\u0e48 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e43\u0e2b\u0e21\u0e48","i18n_reset_alert_text":"Your selection has been reset. Please select some product options before adding this product to your cart."};
//# sourceURL=wc-add-to-cart-variation-js-extra
/* ]]> */
</script>
<script type="text/javascript" src="https://www.dealplustech.co.th/wp-content/plugins/woocommerce/assets/js/frontend/add-to-cart-variation.min.js?ver=10.4.4" id="wc-add-to-cart-variation-js" defer="defer" data-wp-strategy="defer"></script>
<script type="text/javascript" src="https://www.dealplustech.co.th/wp-content/plugins/js_composer/assets/js/dist/js_composer_front.min.js?ver=6.5.0" id="wpb_composer_front_js-js"></script>
<script type="text/javascript" id="ivory-ajax-search-scripts-js-extra">
/* <![CDATA[ */
var IvoryAjaxVars = {"ajaxurl":"https://www.dealplustech.co.th/wp-admin/admin-ajax.php","ajax_nonce":"f67d8ea69a"};
//# sourceURL=ivory-ajax-search-scripts-js-extra
/* ]]> */
</script>
<script type="text/javascript" src="https://www.dealplustech.co.th/wp-content/plugins/add-search-to-menu/public/js/ivory-ajax-search.min.js?ver=5.5.14" id="ivory-ajax-search-scripts-js"></script>
<script id="wp-emoji-settings" type="application/json">
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://www.dealplustech.co.th/wp-includes/js/wp-emoji-release.min.js?ver=6.9.4"}}
</script>
<script type="module">
/* <![CDATA[ */
/*! This file is auto-generated */
const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))});
//# sourceURL=https://www.dealplustech.co.th/wp-includes/js/wp-emoji-loader.min.js
/* ]]> */
</script>
</body>
</html>

12
dist/index.html vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

After

Width:  |  Height:  |  Size: 137 KiB

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,10 @@
--- ---
import CookieConsentBanner from '../components/CookieConsentBanner.astro'; export interface Props {
export interface Props { title: string; description?: string; image?: string; } title: string;
description?: string;
image?: string;
}
const { title, description, image } = Astro.props; const { title, description, image } = Astro.props;
--- ---
@@ -9,18 +13,35 @@ const { title, description, image } = Astro.props;
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content={description || 'บริษัท ดีล พลัส เทค จำกัด'} /> <meta name="generator" content={Astro.generator} />
<meta name="description" content={description || 'บริษัท ดีล พลัส เทค จำกัด - ผู้เชี่ยวชาญด้านระบบน้ำ ท่อ PPR ตราช้าง ท่อพีพีอาร์ ท่อ HDPE'} />
<!-- Favicon -->
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="alternate icon" href="/favicon.ico" sizes="any" />
<link rel="apple-touch-icon" href="/favicon.svg" />
<!-- Google Fonts: Kanit for Thai -->
<link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Kanit:wght@300;400;500;600;700&display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Kanit:wght@300;400;500;600;700&display=swap" rel="stylesheet" />
<!-- SEO -->
<meta property="og:title" content={title} /> <meta property="og:title" content={title} />
<meta property="og:description" content={description || 'Deal Plus Tech'} /> <meta property="og:description" content={description || 'Deal Plus Tech - ผู้เชี่ยวชาญด้านระบบน้ำ'} />
<meta property="og:image" content={image || '/og-image.jpg'} />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary_large_image" />
<title>{title} | ดีล พลัส เทค</title> <title>{title} | ดีล พลัส เทค</title>
</head> </head>
<body class="flex flex-col min-h-screen"> <body class="flex flex-col min-h-screen">
<slot /> <slot />
<CookieConsentBanner />
</body> </body>
</html> </html>
<style is:global>@import "../styles/globals.css";</style>
<style is:global>
html {
font-family: 'Kanit', system-ui, sans-serif;
}
</style>

View File

@@ -2,8 +2,6 @@
import { getCollection, render } from 'astro:content'; import { getCollection, render } from 'astro:content';
import type { CollectionEntry } from 'astro:content'; import type { CollectionEntry } from 'astro:content';
import BaseLayout from '../../layouts/BaseLayout.astro'; import BaseLayout from '../../layouts/BaseLayout.astro';
import Header from '../../components/Header.astro';
import Footer from '../../components/Footer.astro';
import { productCategories } from '../../data/site-config'; import { productCategories } from '../../data/site-config';
export async function getStaticPaths() { export async function getStaticPaths() {
@@ -14,7 +12,9 @@ export async function getStaticPaths() {
})); }));
} }
interface Props { product: CollectionEntry<'products'>; } interface Props {
product: CollectionEntry<'products'>;
}
const { product } = Astro.props; const { product } = Astro.props;
const { Content } = await render(product); const { Content } = await render(product);
@@ -24,29 +24,35 @@ const productData = productCategories.find(p => p.id === product.data.id);
const productTables = productData?.productTables || []; const productTables = productData?.productTables || [];
--- ---
<BaseLayout title={product.data.title} description={product.data.description || ''}> <BaseLayout title={product.data.name} description={product.data.shortDescription || product.data.description}>
<Header /> <main class="py-12">
<main class="pt-20"> <article class="container mx-auto px-4 max-w-7xl">
<article class="container mx-auto px-4 py-12"> <header class="mb-12">
<h1 class="text-4xl font-bold mb-6">{product.data.title}</h1> <h1 class="text-4xl md:text-5xl lg:text-6xl xl:text-7xl font-bold text-secondary-900 mb-6">{product.data.name}</h1>
<div class="prose max-w-none mb-12"><Content /></div> <p class="text-lg md:text-xl lg:text-2xl xl:text-3xl text-secondary-600 max-w-4xl">{product.data.description}</p>
</header>
<div class="prose prose-lg md:prose-xl lg:prose-2xl max-w-none mb-12"><Content /></div>
{productTables.length > 0 && ( {productTables.length > 0 && (
<div class="space-y-8"> <section class="mb-12">
{productTables.map((table: any) => ( <h2 class="text-3xl md:text-4xl lg:text-5xl font-bold text-secondary-900 mb-8">ข้อมูลจำเพาะ</h2>
<div> {productTables.map((table: any, tableIndex: number) => (
<h3 class="text-2xl font-bold mb-4">{table.tableName}</h3> <div class="bg-white rounded-2xl border-2 border-secondary-200 shadow-lg mb-8">
<div class="overflow-x-auto"> <h3 class="text-lg md:text-xl lg:text-2xl font-semibold text-secondary-800 p-4 md:p-6 bg-secondary-50 border-b-2 border-secondary-200">{table.tableName}</h3>
<table class="w-full border-collapse border"> <div class="w-full overflow-x-auto">
<table class="w-full min-w-[600px] border-collapse text-sm md:text-base">
<thead> <thead>
<tr class="bg-secondary-100"> <tr class="bg-primary-100">
{table.headers?.map((h: string) => <th class="border p-3 text-left">{h}</th>)} {table.headers.map((header: string, headerIndex: number) => (
<th class="px-3 py-2 md:px-4 md:py-3 text-left text-xs md:text-sm lg:text-base font-bold text-primary-800 border-b-2 border-primary-300 whitespace-nowrap">{header}</th>
))}
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{table.rows?.map((row: string[]) => ( {table.rows.map((row: string[], rowIndex: number) => (
<tr> <tr class={rowIndex % 2 === 0 ? 'bg-white' : 'bg-secondary-50'}>
{row.map((cell: string) => <td class="border p-3">{cell}</td>)} {row.map((cell: string, cellIndex: number) => (
<td class="px-3 py-2 md:px-4 md:py-3 text-secondary-700 border-b border-secondary-200">{cell}</td>
))}
</tr> </tr>
))} ))}
</tbody> </tbody>
@@ -54,9 +60,8 @@ const productTables = productData?.productTables || [];
</div> </div>
</div> </div>
))} ))}
</div> </section>
)} )}
</article> </article>
</main> </main>
<Footer />
</BaseLayout> </BaseLayout>

View File

@@ -1,36 +0,0 @@
@import "tailwindcss";
@theme {
--color-primary-500: #22c55e;
--color-primary-600: #16a34a;
--color-primary-700: #15803d;
--color-secondary-50: #f8fafc;
--color-secondary-100: #f1f5f9;
--color-secondary-200: #e2e8f0;
--color-secondary-300: #cbd5e1;
--color-secondary-500: #64748b;
--color-secondary-600: #475569;
--color-secondary-700: #334155;
--color-secondary-800: #1e293b;
--color-secondary-900: #0f172a;
--color-accent-500: #eab308;
}
html { font-family: 'Kanit', system-ui, sans-serif; scroll-behavior: smooth; }
body { background-color: white; color: var(--color-secondary-900); -webkit-font-smoothing: antialiased; }
h1, h2, h3, h4, h5, h6 { font-weight: 700; letter-spacing: -0.025em; }
.btn-primary { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 1.5rem; background-color: var(--color-primary-600); color: white; font-weight: 600; border-radius: 0.5rem; transition: all 0.2s; }
.btn-primary:hover { background-color: var(--color-primary-700); }
.btn-secondary { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 1.5rem; background-color: var(--color-secondary-800); color: white; font-weight: 600; border-radius: 0.5rem; transition: all 0.2s; }
.btn-secondary:hover { background-color: var(--color-secondary-900); }
.btn-outline { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 1.5rem; border: 2px solid var(--color-primary-600); color: var(--color-primary-600); font-weight: 600; border-radius: 0.5rem; background-color: transparent; transition: all 0.2s; }
.btn-outline:hover { background-color: var(--color-primary-600); color: white; }
.section-title { font-size: 1.875rem; font-weight: 700; text-align: center; margin-bottom: 1rem; }
@media (min-width: 768px) { .section-title { font-size: 2.25rem; } }
@media (min-width: 1024px) { .section-title { font-size: 3rem; } }
.section-subtitle { font-size: 1.125rem; text-align: center; color: var(--color-secondary-600); }
.card { background-color: white; border-radius: 0.75rem; overflow: hidden; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1); transition: all 0.3s; }
.card:hover { box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1); transform: translateY(-0.25rem); }