🎨 Fix: Add Header and Footer to all pages + standardize colors
MAJOR FIX - Pages were missing Header and Footer components: ✅ Added Header import to all pages ✅ Added Footer import to all pages ✅ Added <Header /> and <Footer /> components ✅ Changed custom colors to standard Tailwind (green-600, gray-*) ✅ Fixed: about-us, services, products, blog pages COLOR SCHEME: - primary-600 → green-600 (trust, growth) - secondary-900 → gray-900 (professional) - secondary-800 → gray-800 - secondary-600 → gray-600 - secondary-200 → gray-200 All pages now show proper Header navigation and Footer with links!
1
dist/_astro/index.y5EIedwq.css
vendored
Normal file
3
dist/_noop-middleware.mjs
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
const onRequest = (_, next) => next();
|
||||
|
||||
export { onRequest };
|
||||
33
dist/about-us/index.html
vendored
Normal file
1606
dist/apple-touch-icon.png
vendored
Normal file
120
dist/blog/ข้อดี-ท่อ-hdpe.md/index.html
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
<!DOCTYPE html><html lang="th"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="Astro v5.18.0"><meta name="description" content="ท่อ HDPE (High Density Polyethylene) เป็นท่อที่ได้รับความนิยมสูงในงานระบบน้ำ เนื่องจากความทนทานและความยืดหยุ่นที่เหนือกว่าท่อชนิดอื่น"><!-- Favicon --><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.gstatic.com" crossorigin><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="ข้อดีของท่อ HDPE ในงานระบบน้ำ ทำไมถึงเป็นตัวเลือกยอดนิยม"><meta property="og:description" content="ท่อ HDPE (High Density Polyethylene) เป็นท่อที่ได้รับความนิยมสูงในงานระบบน้ำ เนื่องจากความทนทานและความยืดหยุ่นที่เหนือกว่าท่อชนิดอื่น"><meta property="og:image" content="/og-image.jpg"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><title>ข้อดีของท่อ HDPE ในงานระบบน้ำ ทำไมถึงเป็นตัวเลือกยอดนิยม | ดีล พลัส เทค</title><link rel="stylesheet" href="/_astro/index.y5EIedwq.css"></head> <body class="flex flex-col min-h-screen"> <main class="pt-32 pb-16"> <article class="container mx-auto px-4 max-w-4xl"> <!-- Header --> <header class="mb-8"> <div class="flex items-center gap-4 mb-4"> <span class="industrial-badge">ท่อ HDPE</span> <time class="text-secondary-500"> 10 มกราคม 2567 </time> <span class="text-secondary-500">•</span> <span class="text-secondary-500">Deal Plus Tech</span> </div> <h1 class="text-4xl md:text-5xl font-bold text-secondary-900 mb-4"> ข้อดีของท่อ HDPE ในงานระบบน้ำ ทำไมถึงเป็นตัวเลือกยอดนิยม </h1> </header> <!-- Featured Image --> <div class="relative aspect-video bg-secondary-100 rounded-xl overflow-hidden mb-8"> <img src="/images/2021/03/hdpe-pipe_000C.jpg" alt="ข้อดีของท่อ HDPE ในงานระบบน้ำ ทำไมถึงเป็นตัวเลือกยอดนิยม" class="object-cover w-full h-full" loading="lazy"> </div> <!-- Content --> <div class="prose prose-lg max-w-none prose-headings:font-bold prose-a:text-primary-600 hover:prose-a:text-primary-700 prose-img:rounded-xl"> <h2 id="ท่อ-hdpe-คืออะไร">ท่อ HDPE คืออะไร?</h2>
|
||||
<p>ท่อ HDPE (High Density Polyethylene) หรือท่อเอชดีพีอี เป็นท่อที่ผลิตจากโพลิเอทิลีนความหนาแน่นสูง เป็นวัสดุพลาสติกที่มีความแข็งแรงและทนทานเป็นอย่างมาก</p>
|
||||
<h2 id="ข้อดีของท่อ-hdpe">ข้อดีของท่อ HDPE</h2>
|
||||
<h3 id="1-ความยืดหยุ่นสูง">1. ความยืดหยุ่นสูง</h3>
|
||||
<p>ท่อ HDPE สามารถโค้งงอได้ถึง 45 องศา ทำให้เหมาะสำหรับพื้นที่ติดตั้งจำกัด และสามารถรองรับการเคลื่อนไหวของดินได้ดี</p>
|
||||
<h3 id="2-ทนทานต่อสารเคมี">2. ทนทานต่อสารเคมี</h3>
|
||||
<p>ท่อ HDPE ทนทานต่อการกัดกร่อนของสารเคมี กรด และด่าง ทำให้เหมาะสำหรับงานอุตสาหกรรม</p>
|
||||
<h3 id="3-อายุการใช้งานยาวนาน">3. อายุการใช้งานยาวนาน</h3>
|
||||
<p>ท่อ HDPE มีอายุการใช้งานมากกว่า 50 ปี เมื่อติดตั้งและใช้งานอย่างถูกต้อง</p>
|
||||
<h3 id="4-น้ำหนักเบา">4. น้ำหนักเบา</h3>
|
||||
<p>ท่อ HDPE มีน้ำหนักเบากว่าท่อโลหะ ทำให้ง่ายต่อการขนส่งและติดตั้ง</p>
|
||||
<h3 id="5-การเชื่อมต่อที่แน่นหนา">5. การเชื่อมต่อที่แน่นหนา</h3>
|
||||
<p>การเชื่อมท่อ HDPE ด้วยวิธี Butt Fusion ทำให้ท่อเชื่อมต่อกันเป็นเนื้อเดียว ไม่มีรอยต่อ ป้องกันการรั่วซึม</p>
|
||||
<h3 id="6-ปลอดภัยต่อสุขภาพ">6. ปลอดภัยต่อสุขภาพ</h3>
|
||||
<p>ท่อ HDPE ไม่เป็นสนิม ไม่ปล่อยสารพิษ ปลอดภัยสำหรับน้ำดื่ม</p>
|
||||
<h2 id="การใช้งานท่อ-hdpe">การใช้งานท่อ HDPE</h2>
|
||||
<h3 id="งานประปา">งานประปา</h3>
|
||||
<ul>
|
||||
<li>ท่อส่งน้ำประปา</li>
|
||||
<li>ระบบประปาในบ้านเรือน</li>
|
||||
<li>ระบบประปาในอาคาร</li>
|
||||
</ul>
|
||||
<h3 id="งานเกษตร">งานเกษตร</h3>
|
||||
<ul>
|
||||
<li>ระบบน้ำหยด</li>
|
||||
<li>ระบบสปริงเกลอร์</li>
|
||||
<li>ระบบน้ำเพื่อการเกษตร</li>
|
||||
</ul>
|
||||
<h3 id="งานอุตสาหกรรม">งานอุตสาหกรรม</h3>
|
||||
<ul>
|
||||
<li>ท่อส่งสารเคมี</li>
|
||||
<li>ระบบบำบัดน้ำเสีย</li>
|
||||
<li>งานโรงงานอุตสาหกรรม</li>
|
||||
</ul>
|
||||
<h3 id="งานโครงสร้างพื้นฐาน">งานโครงสร้างพื้นฐาน</h3>
|
||||
<ul>
|
||||
<li>งานท่อใต้ดิน</li>
|
||||
<li>ท่อร้อยสายไฟ</li>
|
||||
<li>งานสาธารณูปโภค</li>
|
||||
</ul>
|
||||
<h2 id="ขนาดท่อ-hdpe-ที่นิยมใช้">ขนาดท่อ HDPE ที่นิยมใช้</h2>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<table><thead><tr><th>ขนาด (มม.)</th><th>การใช้งาน</th></tr></thead><tbody><tr><td>16-32</td><td>งานประปาภายในบ้าน</td></tr><tr><td>40-63</td><td>งานประปาอาคารขนาดเล็ก</td></tr><tr><td>75-110</td><td>งานประปาอาคารขนาดใหญ่</td></tr><tr><td>125-315</td><td>งานท่อส่งน้ำหลัก</td></tr><tr><td>355-1200</td><td>งานโครงสร้างพื้นฐาน</td></tr></tbody></table>
|
||||
<h2 id="เกรดของท่อ-hdpe">เกรดของท่อ HDPE</h2>
|
||||
<h3 id="pe80">PE80</h3>
|
||||
<ul>
|
||||
<li>เหมาะสำหรับงานทั่วไป</li>
|
||||
<li>ทนแรงดันสูงสุด 8 MPa</li>
|
||||
</ul>
|
||||
<h3 id="pe100">PE100</h3>
|
||||
<ul>
|
||||
<li>เหมาะสำหรับงานที่ต้องการความแข็งแรงสูง</li>
|
||||
<li>ทนแรงดันสูงสุด 10 MPa</li>
|
||||
<li>เป็นเกรดที่นิยมใช้ในปัจจุบัน</li>
|
||||
</ul>
|
||||
<h2 id="การติดตั้งท่อ-hdpe">การติดตั้งท่อ HDPE</h2>
|
||||
<h3 id="วิธี-butt-fusion">วิธี Butt Fusion</h3>
|
||||
<ol>
|
||||
<li>ตัดท่อให้ตรง</li>
|
||||
<li>ทำความสะอาดผิวท่อ</li>
|
||||
<li>ใช้เครื่องเชื่อมท่อ HDPE</li>
|
||||
<li>ให้ความร้อนจนผิวท่อละลาย</li>
|
||||
<li>กดท่อเข้าด้วยกัน</li>
|
||||
<li>รอให้เย็นตัวลง</li>
|
||||
</ol>
|
||||
<h3 id="วิธี-electrofusion">วิธี Electrofusion</h3>
|
||||
<ol>
|
||||
<li>ใช้ข้อต่อแบบ Electrofusion</li>
|
||||
<li>เสียบปลั๊กไฟเข้ากับข้อต่อ</li>
|
||||
<li>รอจนกระบวนการเชื่อมเสร็จสิ้น</li>
|
||||
</ol>
|
||||
<h2 id="สรุป">สรุป</h2>
|
||||
<p>ท่อ HDPE เป็นตัวเลือกที่ยอดเยี่ยมสำหรับงานระบบน้ำ เนื่องจากมีความทนทาน ความยืดหยุ่น และอายุการใช้งานที่ยาวนาน ไม่ว่าจะเป็นงานประปา งานเกษตร หรืองานอุตสาหกรรม ท่อ HDPE สามารถตอบโจทย์ได้ทุกการใช้งาน</p>
|
||||
<hr>
|
||||
<p><strong>สนใจสินค้าท่อ HDPE?</strong>
|
||||
ติดต่อเราได้ที่:</p>
|
||||
<ul>
|
||||
<li>โทร: 090-555-1415</li>
|
||||
<li>LINE: jppselection</li>
|
||||
</ul>
|
||||
<p><a href="/%E0%B8%97%E0%B9%88%E0%B8%ADhdpe">ดูสินค้าท่อ HDPE ทั้งหมด</a></p> </div> <!-- Back to Blog --> <div class="mt-12 pt-8 border-t border-secondary-200"> <a href="/blog/" class="inline-flex items-center text-primary-600 font-medium hover:text-primary-700 transition-colors"> <svg class="w-5 h-5 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path> </svg>
|
||||
กลับสู่หน้าบทความ
|
||||
</a> </div> </article> </main> <!-- Cookie Consent Banner --> <script type="module">const t=JSON.parse(localStorage.getItem("consent-preferences")||"null");if(!t){const e=document.createElement("div");e.id="cookie-banner",e.className="fixed bottom-0 left-0 right-0 bg-secondary-900 text-white p-6 z-50 shadow-lg",e.innerHTML=`
|
||||
<div class="container mx-auto max-w-4xl">
|
||||
<p class="text-lg mb-4">เราใช้คุกกี้เพื่อปรับปรุงประสบการณ์การใช้งานเว็บไซต์ โดยคลิกยอมรับเพื่อใช้งานคุกกี้ทุกประเภท หรือคลิกปรับแต่งเพื่อเลือกคุกกี้ที่ต้องการ</p>
|
||||
<div class="flex flex-wrap gap-3">
|
||||
<button id="accept-all" class="px-6 py-2 bg-primary-600 text-white font-semibold rounded-md hover:bg-primary-700">ยอมรับ</button>
|
||||
<button id="reject-all" class="px-6 py-2 bg-secondary-700 text-white font-semibold rounded-md hover:bg-secondary-600">ปฏิเสธ</button>
|
||||
<button id="customize" class="px-6 py-2 border border-white text-white font-semibold rounded-md hover:bg-white hover:text-secondary-900">ปรับแต่ง</button>
|
||||
</div>
|
||||
</div>
|
||||
`,document.body.appendChild(e),document.getElementById("accept-all")?.addEventListener("click",()=>{localStorage.setItem("consent-preferences",JSON.stringify({essential:!0,analytics:!0,marketing:!0,timestamp:new Date().toISOString()})),e.remove()}),document.getElementById("reject-all")?.addEventListener("click",()=>{localStorage.setItem("consent-preferences",JSON.stringify({essential:!0,analytics:!1,marketing:!1,timestamp:new Date().toISOString()})),e.remove()}),document.getElementById("customize")?.addEventListener("click",()=>{localStorage.setItem("consent-preferences",JSON.stringify({essential:!0,analytics:!1,marketing:!1,timestamp:new Date().toISOString()})),e.remove()})}</script> </body> </html>
|
||||
72
dist/blog/ท่อ-ppr-คืออะไร.md/index.html
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
<!DOCTYPE html><html lang="th"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="Astro v5.18.0"><meta name="description" content="ท่อ PPR (Polypropylene Random Copolymer) เป็นท่อพลาสติกที่ได้รับความนิยมสูงในการใช้งานระบบประปา บทความนี้จะอธิบายทุกสิ่งที่คุณต้องรู้เกี่ยวกับท่อ PPR"><!-- Favicon --><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.gstatic.com" crossorigin><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="ท่อ PPR คืออะไร? คู่มือฉบับสมบูรณ์สำหรับการเลือกใช้งาน"><meta property="og:description" content="ท่อ PPR (Polypropylene Random Copolymer) เป็นท่อพลาสติกที่ได้รับความนิยมสูงในการใช้งานระบบประปา บทความนี้จะอธิบายทุกสิ่งที่คุณต้องรู้เกี่ยวกับท่อ PPR"><meta property="og:image" content="/og-image.jpg"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><title>ท่อ PPR คืออะไร? คู่มือฉบับสมบูรณ์สำหรับการเลือกใช้งาน | ดีล พลัส เทค</title><link rel="stylesheet" href="/_astro/index.y5EIedwq.css"></head> <body class="flex flex-col min-h-screen"> <main class="pt-32 pb-16"> <article class="container mx-auto px-4 max-w-4xl"> <!-- Header --> <header class="mb-8"> <div class="flex items-center gap-4 mb-4"> <span class="industrial-badge">ท่อ PPR</span> <time class="text-secondary-500"> 15 มกราคม 2567 </time> <span class="text-secondary-500">•</span> <span class="text-secondary-500">Deal Plus Tech</span> </div> <h1 class="text-4xl md:text-5xl font-bold text-secondary-900 mb-4"> ท่อ PPR คืออะไร? คู่มือฉบับสมบูรณ์สำหรับการเลือกใช้งาน </h1> </header> <!-- Featured Image --> <div class="relative aspect-video bg-secondary-100 rounded-xl overflow-hidden mb-8"> <img src="/images/2021/03/ppr-pipe_000C.jpg" alt="ท่อ PPR คืออะไร? คู่มือฉบับสมบูรณ์สำหรับการเลือกใช้งาน" class="object-cover w-full h-full" loading="lazy"> </div> <!-- Content --> <div class="prose prose-lg max-w-none prose-headings:font-bold prose-a:text-primary-600 hover:prose-a:text-primary-700 prose-img:rounded-xl"> <h2 id="ท่อ-ppr-คืออะไร">ท่อ PPR คืออะไร?</h2>
|
||||
<p>ท่อ PPR (Polypropylene Random Copolymer) หรือท่อพีพีอาร์ เป็นท่อพลาสติกที่ผลิตจากเม็ดพลาสติก PP-R 80 (Polypropylene Random Copolymer 80) ซึ่งเป็นวัสดุพลาสติกคุณภาพสูงที่มีความแข็งแรงและทนทานเป็นอย่างดี</p>
|
||||
<h2 id="ข้อดีของท่อ-ppr">ข้อดีของท่อ PPR</h2>
|
||||
<h3 id="1-ทนแรงดันและอุณหภูมิสูง">1. ทนแรงดันและอุณหภูมิสูง</h3>
|
||||
<p>ท่อ PPR สามารถทนแรงดันได้สูงถึง 20 บาร์ และทนต่ออุณหภูมิได้สูงถึง 95°C ทำให้เหมาะสำหรับใช้งานทั้งระบบน้ำเย็นและน้ำร้อน</p>
|
||||
<h3 id="2-สะอาดและปลอดภัย">2. สะอาดและปลอดภัย</h3>
|
||||
<p>ท่อ PPR ไม่เป็นสนิม ปราศจากโลหะหนักและสิ่งปนเปื้อน ทำให้น้ำที่ไหลผ่านสะอาดและปลอดภัยต่อการบริโภค</p>
|
||||
<h3 id="3-อายุการใช้งานยาวนาน">3. อายุการใช้งานยาวนาน</h3>
|
||||
<p>ด้วยคุณสมบัติที่ทนทาน ท่อ PPR มีอายุการใช้งานยาวนานกว่า 50 ปี</p>
|
||||
<h3 id="4-ติดตั้งง่าย">4. ติดตั้งง่าย</h3>
|
||||
<p>การเชื่อมต่อท่อ PPR ใช้วิธีเชื่อมด้วยความร้อน ทำให้ท่อและข้อต่อเป็นเนื้อเดียวกัน ไม่มีปัญหารั่วซึม</p>
|
||||
<h3 id="5-ประหยัดพลังงาน">5. ประหยัดพลังงาน</h3>
|
||||
<p>ท่อ PPR เป็นฉนวนกันความร้อนที่ดี ช่วยรักษาอุณหภูมิของน้ำได้ดีกว่าท่อโลหะ</p>
|
||||
<h2 id="การเลือกท่อ-ppr-ที่เหมาะสม">การเลือกท่อ PPR ที่เหมาะสม</h2>
|
||||
<h3 id="ขนาดท่อ">ขนาดท่อ</h3>
|
||||
<p>เลือกขนาดท่อให้เหมาะสมกับปริมาณน้ำที่ต้องการใช้งาน:</p>
|
||||
<ul>
|
||||
<li>ท่อขนาด 20-25 มม. เหมาะสำหรับบ้านเรือนทั่วไป</li>
|
||||
<li>ท่อขนาด 32-63 มม. เหมาะสำหรับอาคารขนาดใหญ่</li>
|
||||
</ul>
|
||||
<h3 id="เกรดของท่อ">เกรดของท่อ</h3>
|
||||
<ul>
|
||||
<li><strong>PN10</strong> - สำหรับน้ำเย็น ทนแรงดัน 10 บาร์</li>
|
||||
<li><strong>PN16</strong> - สำหรับน้ำอุ่น ทนแรงดัน 16 บาร์</li>
|
||||
<li><strong>PN20</strong> - สำหรับน้ำร้อน ทนแรงดัน 20 บาร์</li>
|
||||
</ul>
|
||||
<h2 id="การติดตั้งท่อ-ppr">การติดตั้งท่อ PPR</h2>
|
||||
<h3 id="ขั้นตอนการเชื่อมท่อ">ขั้นตอนการเชื่อมท่อ</h3>
|
||||
<ol>
|
||||
<li>ตัดท่อให้ตรงและเรียบ</li>
|
||||
<li>ทำความสะอาดผิวท่อและข้อต่อ</li>
|
||||
<li>ใช้เครื่องเชื่อมท่ออุณหภูมิ 260°C</li>
|
||||
<li>สอดท่อและข้อต่อเข้าด้วยกัน</li>
|
||||
<li>รอให้เย็นตัวลงประมาณ 2-3 นาที</li>
|
||||
</ol>
|
||||
<h3 id="ข้อควรระวัง">ข้อควรระวัง</h3>
|
||||
<ul>
|
||||
<li>หลีกเลี่ยงการติดตั้งในพื้นที่ที่มีแสงแดดโดยตรง</li>
|
||||
<li>ควรทิ้งระยะห่างสำหรับการขยายตัวของท่อ</li>
|
||||
<li>ตรวจสอบความร้อนของเครื่องเชื่อมก่อนใช้งาน</li>
|
||||
</ul>
|
||||
<h2 id="ท่อ-ppr-ตราช้าง">ท่อ PPR ตราช้าง</h2>
|
||||
<p>ท่อ PPR ตราช้าง เป็นท่อ PPR คุณภาพสูงที่ผลิตจากเม็ดพลาสติก PP-R 80 วัตถุดิบคุณภาพสูงมาตรฐานยุโรปจาก lyondellbasell</p>
|
||||
<p><strong>คุณสมบัติเด่น:</strong></p>
|
||||
<ul>
|
||||
<li>ทนแรงดันได้สูงสุด 20 บาร์</li>
|
||||
<li>ทนต่ออุณหภูมิได้สูงถึง 95°C</li>
|
||||
<li>ผลิตตามมาตรฐาน DIN8077 และ DIN8078 ของประเทศเยอรมัน</li>
|
||||
<li>รับประกันคุณภาพ</li>
|
||||
</ul>
|
||||
<h2 id="สรุป">สรุป</h2>
|
||||
<p>ท่อ PPR เป็นตัวเลือกที่ดีสำหรับระบบประปาในปัจจุบัน เนื่องจากมีความทนทานสูง ติดตั้งง่าย และมีอายุการใช้งานยาวนาน หากคุณกำลังมองหาท่อสำหรับงานระบบน้ำ ท่อ PPR เป็นตัวเลือกที่คุ้มค่าและเหมาะสม</p>
|
||||
<hr>
|
||||
<p><strong>สนใจสินค้าท่อ PPR?</strong>
|
||||
ติดต่อเราได้ที่:</p>
|
||||
<ul>
|
||||
<li>โทร: 090-555-1415</li>
|
||||
<li>LINE: jppselection</li>
|
||||
<li>อีเมล: <a href="mailto:dealplustech@gmail.com">dealplustech@gmail.com</a></li>
|
||||
</ul>
|
||||
<p><a href="/%E0%B8%97%E0%B9%88%E0%B8%AD%E0%B8%9E%E0%B8%B5%E0%B8%9E%E0%B8%B5%E0%B8%AD%E0%B8%B2%E0%B8%A3%E0%B9%8C%E0%B8%95%E0%B8%A3%E0%B8%B2%E0%B8%8A%E0%B9%89%E0%B8%B2%E0%B8%87">ดูสินค้าท่อ PPR ทั้งหมด</a></p> </div> <!-- Back to Blog --> <div class="mt-12 pt-8 border-t border-secondary-200"> <a href="/blog/" class="inline-flex items-center text-primary-600 font-medium hover:text-primary-700 transition-colors"> <svg class="w-5 h-5 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path> </svg>
|
||||
กลับสู่หน้าบทความ
|
||||
</a> </div> </article> </main> <!-- Cookie Consent Banner --> <script type="module">const t=JSON.parse(localStorage.getItem("consent-preferences")||"null");if(!t){const e=document.createElement("div");e.id="cookie-banner",e.className="fixed bottom-0 left-0 right-0 bg-secondary-900 text-white p-6 z-50 shadow-lg",e.innerHTML=`
|
||||
<div class="container mx-auto max-w-4xl">
|
||||
<p class="text-lg mb-4">เราใช้คุกกี้เพื่อปรับปรุงประสบการณ์การใช้งานเว็บไซต์ โดยคลิกยอมรับเพื่อใช้งานคุกกี้ทุกประเภท หรือคลิกปรับแต่งเพื่อเลือกคุกกี้ที่ต้องการ</p>
|
||||
<div class="flex flex-wrap gap-3">
|
||||
<button id="accept-all" class="px-6 py-2 bg-primary-600 text-white font-semibold rounded-md hover:bg-primary-700">ยอมรับ</button>
|
||||
<button id="reject-all" class="px-6 py-2 bg-secondary-700 text-white font-semibold rounded-md hover:bg-secondary-600">ปฏิเสธ</button>
|
||||
<button id="customize" class="px-6 py-2 border border-white text-white font-semibold rounded-md hover:bg-white hover:text-secondary-900">ปรับแต่ง</button>
|
||||
</div>
|
||||
</div>
|
||||
`,document.body.appendChild(e),document.getElementById("accept-all")?.addEventListener("click",()=>{localStorage.setItem("consent-preferences",JSON.stringify({essential:!0,analytics:!0,marketing:!0,timestamp:new Date().toISOString()})),e.remove()}),document.getElementById("reject-all")?.addEventListener("click",()=>{localStorage.setItem("consent-preferences",JSON.stringify({essential:!0,analytics:!1,marketing:!1,timestamp:new Date().toISOString()})),e.remove()}),document.getElementById("customize")?.addEventListener("click",()=>{localStorage.setItem("consent-preferences",JSON.stringify({essential:!0,analytics:!1,marketing:!1,timestamp:new Date().toISOString()})),e.remove()})}</script> </body> </html>
|
||||
164
dist/blog/บำรุงรักษาปั๊มน้ำ.md/index.html
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
<!DOCTYPE html><html lang="th"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="Astro v5.18.0"><meta name="description" content="ปั๊มน้ำเป็นอุปกรณ์สำคัญในระบบน้ำทุกบ้าน การบำรุงรักษาที่ถูกต้องจะช่วยยืดอายุการใช้งานและประหยัดค่าไฟฟ้า"><!-- Favicon --><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.gstatic.com" crossorigin><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="การบำรุงรักษาปั๊มน้ำให้มีอายุการใช้งานยาวนาน"><meta property="og:description" content="ปั๊มน้ำเป็นอุปกรณ์สำคัญในระบบน้ำทุกบ้าน การบำรุงรักษาที่ถูกต้องจะช่วยยืดอายุการใช้งานและประหยัดค่าไฟฟ้า"><meta property="og:image" content="/og-image.jpg"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><title>การบำรุงรักษาปั๊มน้ำให้มีอายุการใช้งานยาวนาน | ดีล พลัส เทค</title><link rel="stylesheet" href="/_astro/index.y5EIedwq.css"></head> <body class="flex flex-col min-h-screen"> <main class="pt-32 pb-16"> <article class="container mx-auto px-4 max-w-4xl"> <!-- Header --> <header class="mb-8"> <div class="flex items-center gap-4 mb-4"> <span class="industrial-badge">ปั๊มน้ำ</span> <time class="text-secondary-500"> 5 มกราคม 2567 </time> <span class="text-secondary-500">•</span> <span class="text-secondary-500">Deal Plus Tech</span> </div> <h1 class="text-4xl md:text-5xl font-bold text-secondary-900 mb-4"> การบำรุงรักษาปั๊มน้ำให้มีอายุการใช้งานยาวนาน </h1> </header> <!-- Featured Image --> <div class="relative aspect-video bg-secondary-100 rounded-xl overflow-hidden mb-8"> <img src="/images/2021/02/Water-Pump1.jpg" alt="การบำรุงรักษาปั๊มน้ำให้มีอายุการใช้งานยาวนาน" class="object-cover w-full h-full" loading="lazy"> </div> <!-- Content --> <div class="prose prose-lg max-w-none prose-headings:font-bold prose-a:text-primary-600 hover:prose-a:text-primary-700 prose-img:rounded-xl"> <h2 id="ความสำคัญของการบำรุงรักษาปั๊มน้ำ">ความสำคัญของการบำรุงรักษาปั๊มน้ำ</h2>
|
||||
<p>ปั๊มน้ำเป็นหัวใจของระบบน้ำในบ้าน การบำรุงรักษาอย่างสม่ำเสมอจะช่วย:</p>
|
||||
<ul>
|
||||
<li>ยืดอายุการใช้งานของปั๊มน้ำ</li>
|
||||
<li>ลดปัญหาการเสีย</li>
|
||||
<li>ประหยัดค่าไฟฟ้า</li>
|
||||
<li>ป้องกันอุบัติเหตุจากการรั่วซึม</li>
|
||||
</ul>
|
||||
<h2 id="การบำรุงรักษาปั๊มน้ำแบบทำเอง">การบำรุงรักษาปั๊มน้ำแบบทำเอง</h2>
|
||||
<h3 id="1-ตรวจสอบสายไฟและสวิตช์">1. ตรวจสอบสายไฟและสวิตช์</h3>
|
||||
<ul>
|
||||
<li>ตรวจสอบสายไฟว่ามีรอยชำรุดหรือไม่</li>
|
||||
<li>ตรวจสอบสวิตช์ว่าทำงานปกติหรือไม่</li>
|
||||
<li>หากพบความผิดปกติควรเรียกช่าง</li>
|
||||
</ul>
|
||||
<h3 id="2-ทำความสะอาดตัวกรอง">2. ทำความสะอาดตัวกรอง</h3>
|
||||
<ul>
|
||||
<li>ปิดวาล์วน้ำเข้าก่อนทำความสะอาด</li>
|
||||
<li>ถอดตัวกรองออกมาล้าง</li>
|
||||
<li>ตรวจสอบว่ามีสิ่งปนเปื้อนหรือไม่</li>
|
||||
<li>ติดตั้งกลับเข้าที่เดิม</li>
|
||||
</ul>
|
||||
<h3 id="3-ตรวจสอบแรงดันน้ำ">3. ตรวจสอบแรงดันน้ำ</h3>
|
||||
<ul>
|
||||
<li>สังเกตแรงดันน้ำว่าลดลงหรือไม่</li>
|
||||
<li>ตรวจสอบว่ามีเสียงผิดปกติหรือไม่</li>
|
||||
<li>หากแรงดันลดลงอาจมีการรั่วซึม</li>
|
||||
</ul>
|
||||
<h3 id="4-ตรวจสอบถังแรงดัน-pressure-tank">4. ตรวจสอบถังแรงดัน (Pressure Tank)</h3>
|
||||
<ul>
|
||||
<li>ตรวจสอบว่าถังมีอากาศเพียงพอหรือไม่</li>
|
||||
<li>หากปั๊มเปิด-ปิดบ่อยผิดปกติ อาจต้องเติมอากาศ</li>
|
||||
<li>ควรตรวจสอบทุก 6 เดือน</li>
|
||||
</ul>
|
||||
<h2 id="ปัญหาที่พบบ่อยและวิธีแก้ไข">ปัญหาที่พบบ่อยและวิธีแก้ไข</h2>
|
||||
<h3 id="ปั๊มไม่ทำงาน">ปั๊มไม่ทำงาน</h3>
|
||||
<p><strong>สาเหตุ:</strong></p>
|
||||
<ul>
|
||||
<li>ไฟดับหรือสายไฟขาด</li>
|
||||
<li>สวิตช์เสีย</li>
|
||||
<li>มอเตอร์เสีย</li>
|
||||
</ul>
|
||||
<p><strong>วิธีแก้:</strong></p>
|
||||
<ul>
|
||||
<li>ตรวจสอบไฟและสายไฟ</li>
|
||||
<li>เปลี่ยนสวิตช์</li>
|
||||
<li>เรียกช่างซ่อมมอเตอร์</li>
|
||||
</ul>
|
||||
<h3 id="แรงดันน้ำต่ำ">แรงดันน้ำต่ำ</h3>
|
||||
<p><strong>สาเหตุ:</strong></p>
|
||||
<ul>
|
||||
<li>ตัวกรองอุดตัน</li>
|
||||
<li>ท่อรั่ว</li>
|
||||
<li>ใบพัดสึกหรอ</li>
|
||||
</ul>
|
||||
<p><strong>วิธีแก้:</strong></p>
|
||||
<ul>
|
||||
<li>ทำความสะอาดตัวกรอง</li>
|
||||
<li>ตรวจสอบและซ่อมท่อ</li>
|
||||
<li>เปลี่ยนใบพัด</li>
|
||||
</ul>
|
||||
<h3 id="ปั๊มเปิด-ปิดบ่อย">ปั๊มเปิด-ปิดบ่อย</h3>
|
||||
<p><strong>สาเหตุ:</strong></p>
|
||||
<ul>
|
||||
<li>ถังแรงดันอากาศรั่ว</li>
|
||||
<li>แผ่นไดอะแฟรมแตก</li>
|
||||
<li>วาล์วตรวจสอบแรงดันเสีย</li>
|
||||
</ul>
|
||||
<p><strong>วิธีแก้:</strong></p>
|
||||
<ul>
|
||||
<li>เติมอากาศในถัง</li>
|
||||
<li>เปลี่ยนแผ่นไดอะแฟรม</li>
|
||||
<li>เปลี่ยนวาล์ว</li>
|
||||
</ul>
|
||||
<h3 id="ปั๊มมีเสียงดังผิดปกติ">ปั๊มมีเสียงดังผิดปกติ</h3>
|
||||
<p><strong>สาเหตุ:</strong></p>
|
||||
<ul>
|
||||
<li>ลูกปืนเสีย</li>
|
||||
<li>ใบพัดชำรุด</li>
|
||||
<li>การติดตั้งไม่แน่นหนา</li>
|
||||
</ul>
|
||||
<p><strong>วิธีแก้:</strong></p>
|
||||
<ul>
|
||||
<li>เปลี่ยนลูกปืน</li>
|
||||
<li>เปลี่ยนใบพัด</li>
|
||||
<li>ตรวจสอบการยึดแน่น</li>
|
||||
</ul>
|
||||
<h2 id="ตารางการบำรุงรักษา">ตารางการบำรุงรักษา</h2>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<table><thead><tr><th>รายการ</th><th>ความถี่</th><th>หมายเหตุ</th></tr></thead><tbody><tr><td>ตรวจสอบสายไฟ</td><td>ทุกเดือน</td><td>มองหารอยชำรุด</td></tr><tr><td>ทำความสะอาดตัวกรอง</td><td>ทุก 3 เดือน</td><td>หรือเมื่อแรงดันลด</td></tr><tr><td>ตรวจสอบถังแรงดัน</td><td>ทุก 6 เดือน</td><td>เติมอากาศหากจำเป็น</td></tr><tr><td>ตรวจสอบสวิตช์</td><td>ทุกปี</td><td>เปลี่ยนหากเสีย</td></tr><tr><td>ตรวจสอบใบพัด</td><td>ทุก 2 ปี</td><td>โดยช่างผู้เชี่ยวชาญ</td></tr></tbody></table>
|
||||
<h2 id="เคล็ดลับการใช้งานปั๊มน้ำ">เคล็ดลับการใช้งานปั๊มน้ำ</h2>
|
||||
<h3 id="ประหยัดไฟฟ้า">ประหยัดไฟฟ้า</h3>
|
||||
<ul>
|
||||
<li>เลือกขนาดปั๊มที่เหมาะสมกับการใช้งาน</li>
|
||||
<li>ติดตั้งถังแรงดันขนาดเหมาะสม</li>
|
||||
<li>หลีกเลี่ยงการเปิด-ปิดปั๊มบ่อย</li>
|
||||
</ul>
|
||||
<h3 id="ป้องกันปัญหา">ป้องกันปัญหา</h3>
|
||||
<ul>
|
||||
<li>อย่าให้ปั๊มแห้ง (ทำงานโดยไม่มีน้ำ)</li>
|
||||
<li>ตรวจสอบรอยรั่วอย่างสม่ำเสมอ</li>
|
||||
<li>ใช้ตัวกรองเพื่อป้องกันสิ่งสกปรก</li>
|
||||
</ul>
|
||||
<h3 id="เมื่อต้องเปลี่ยนปั๊ม">เมื่อต้องเปลี่ยนปั๊ม</h3>
|
||||
<ul>
|
||||
<li>เลือกปั๊มที่มีคุณภาพ</li>
|
||||
<li>พิจารณาขนาดและกำลังที่เหมาะสม</li>
|
||||
<li>ติดตั้งโดยช่างผู้เชี่ยวชาญ</li>
|
||||
</ul>
|
||||
<h2 id="สรุป">สรุป</h2>
|
||||
<p>การบำรุงรักษาปั๊มน้ำอย่างสม่ำเสมอจะช่วยยืดอายุการใช้งาน ลดปัญหาการเสีย และประหยัดค่าใช้จ่ายในระยะยาว ควรตรวจสอบและบำรุงรักษาตามตารางที่กำหนด และหากพบปัญหาที่ไม่สามารถแก้ไขได้เอง ควรติดต่อช่างผู้เชี่ยวชาญ</p>
|
||||
<hr>
|
||||
<p><strong>ต้องการซื้อปั๊มน้ำหรืออุปกรณ์เสริม?</strong>
|
||||
ติดต่อเราได้ที่:</p>
|
||||
<ul>
|
||||
<li>โทร: 090-555-1415</li>
|
||||
<li>LINE: jppselection</li>
|
||||
</ul>
|
||||
<p><a href="/%E0%B8%9B%E0%B8%B1%E0%B9%8A%E0%B8%A1%E0%B8%99%E0%B9%89%E0%B8%B3-pump">ดูสินค้าปั๊มน้ำทั้งหมด</a></p> </div> <!-- Back to Blog --> <div class="mt-12 pt-8 border-t border-secondary-200"> <a href="/blog/" class="inline-flex items-center text-primary-600 font-medium hover:text-primary-700 transition-colors"> <svg class="w-5 h-5 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path> </svg>
|
||||
กลับสู่หน้าบทความ
|
||||
</a> </div> </article> </main> <!-- Cookie Consent Banner --> <script type="module">const t=JSON.parse(localStorage.getItem("consent-preferences")||"null");if(!t){const e=document.createElement("div");e.id="cookie-banner",e.className="fixed bottom-0 left-0 right-0 bg-secondary-900 text-white p-6 z-50 shadow-lg",e.innerHTML=`
|
||||
<div class="container mx-auto max-w-4xl">
|
||||
<p class="text-lg mb-4">เราใช้คุกกี้เพื่อปรับปรุงประสบการณ์การใช้งานเว็บไซต์ โดยคลิกยอมรับเพื่อใช้งานคุกกี้ทุกประเภท หรือคลิกปรับแต่งเพื่อเลือกคุกกี้ที่ต้องการ</p>
|
||||
<div class="flex flex-wrap gap-3">
|
||||
<button id="accept-all" class="px-6 py-2 bg-primary-600 text-white font-semibold rounded-md hover:bg-primary-700">ยอมรับ</button>
|
||||
<button id="reject-all" class="px-6 py-2 bg-secondary-700 text-white font-semibold rounded-md hover:bg-secondary-600">ปฏิเสธ</button>
|
||||
<button id="customize" class="px-6 py-2 border border-white text-white font-semibold rounded-md hover:bg-white hover:text-secondary-900">ปรับแต่ง</button>
|
||||
</div>
|
||||
</div>
|
||||
`,document.body.appendChild(e),document.getElementById("accept-all")?.addEventListener("click",()=>{localStorage.setItem("consent-preferences",JSON.stringify({essential:!0,analytics:!0,marketing:!0,timestamp:new Date().toISOString()})),e.remove()}),document.getElementById("reject-all")?.addEventListener("click",()=>{localStorage.setItem("consent-preferences",JSON.stringify({essential:!0,analytics:!1,marketing:!1,timestamp:new Date().toISOString()})),e.remove()}),document.getElementById("customize")?.addEventListener("click",()=>{localStorage.setItem("consent-preferences",JSON.stringify({essential:!0,analytics:!1,marketing:!1,timestamp:new Date().toISOString()})),e.remove()})}</script> </body> </html>
|
||||
14
dist/chunks/BaseLayout_rqQLf6w4.mjs
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
import { c as createComponent, d as addAttribute, i as renderHead, j as renderSlot, h as renderScript, a as renderTemplate, b as createAstro } from './astro/server_i-dTRwm2.mjs';
|
||||
import 'piccolore';
|
||||
import 'clsx';
|
||||
/* empty css */
|
||||
|
||||
const $$Astro = createAstro();
|
||||
const $$BaseLayout = createComponent(($$result, $$props, $$slots) => {
|
||||
const Astro2 = $$result.createAstro($$Astro, $$props, $$slots);
|
||||
Astro2.self = $$BaseLayout;
|
||||
const { title, description, image } = Astro2.props;
|
||||
return renderTemplate`<html lang="th"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator"${addAttribute(Astro2.generator, "content")}><meta name="description"${addAttribute(description || "\u0E1A\u0E23\u0E34\u0E29\u0E31\u0E17 \u0E14\u0E35\u0E25 \u0E1E\u0E25\u0E31\u0E2A \u0E40\u0E17\u0E04 \u0E08\u0E33\u0E01\u0E31\u0E14 - \u0E1C\u0E39\u0E49\u0E40\u0E0A\u0E35\u0E48\u0E22\u0E27\u0E0A\u0E32\u0E0D\u0E14\u0E49\u0E32\u0E19\u0E23\u0E30\u0E1A\u0E1A\u0E19\u0E49\u0E33 \u0E17\u0E48\u0E2D PPR \u0E15\u0E23\u0E32\u0E0A\u0E49\u0E32\u0E07 \u0E17\u0E48\u0E2D\u0E1E\u0E35\u0E1E\u0E35\u0E2D\u0E32\u0E23\u0E4C \u0E17\u0E48\u0E2D HDPE", "content")}><!-- Favicon --><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.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Kanit:wght@300;400;500;600;700&display=swap" rel="stylesheet"><!-- SEO --><meta property="og:title"${addAttribute(title, "content")}><meta property="og:description"${addAttribute(description || "Deal Plus Tech - \u0E1C\u0E39\u0E49\u0E40\u0E0A\u0E35\u0E48\u0E22\u0E27\u0E0A\u0E32\u0E0D\u0E14\u0E49\u0E32\u0E19\u0E23\u0E30\u0E1A\u0E1A\u0E19\u0E49\u0E33", "content")}><meta property="og:image"${addAttribute(image || "/og-image.jpg", "content")}><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><title>${title} | ดีล พลัส เทค</title>${renderHead()}</head> <body class="flex flex-col min-h-screen"> ${renderSlot($$result, $$slots["default"])} <!-- Cookie Consent Banner --> ${renderScript($$result, "/Users/kunthawatgreethong/Gitea/dealplustech/src/layouts/BaseLayout.astro?astro&type=script&index=0&lang.ts")} </body> </html> `;
|
||||
}, "/Users/kunthawatgreethong/Gitea/dealplustech/src/layouts/BaseLayout.astro", void 0);
|
||||
|
||||
export { $$BaseLayout as $ };
|
||||
1945
dist/chunks/FloatingContact_06TlrfGj.mjs
vendored
Normal file
1837
dist/chunks/_astro_assets_omVwmtMY.mjs
vendored
Normal file
552
dist/chunks/_astro_content_BWFO8YAR.mjs
vendored
Normal file
@@ -0,0 +1,552 @@
|
||||
import { escape } from 'html-escaper';
|
||||
import { Traverse } from 'neotraverse/modern';
|
||||
import pLimit from 'p-limit';
|
||||
import { z } from 'zod';
|
||||
import { A as AstroError, R as RenderUndefinedEntryError, c as createComponent, u as unescapeHTML, a as renderTemplate, U as UnknownContentCollectionError, e as renderUniqueStylesheet, f as renderScriptElement, g as createHeadAndContent, r as renderComponent } from './astro/server_i-dTRwm2.mjs';
|
||||
import 'piccolore';
|
||||
import * as devalue from 'devalue';
|
||||
|
||||
function prependForwardSlash(path) {
|
||||
return path[0] === "/" ? path : "/" + path;
|
||||
}
|
||||
function removeTrailingForwardSlash(path) {
|
||||
return path.endsWith("/") ? path.slice(0, path.length - 1) : path;
|
||||
}
|
||||
function removeLeadingForwardSlash(path) {
|
||||
return path.startsWith("/") ? path.substring(1) : path;
|
||||
}
|
||||
function trimSlashes(path) {
|
||||
return path.replace(/^\/|\/$/g, "");
|
||||
}
|
||||
function isString(path) {
|
||||
return typeof path === "string" || path instanceof String;
|
||||
}
|
||||
function joinPaths(...paths) {
|
||||
return paths.filter(isString).map((path, i) => {
|
||||
if (i === 0) {
|
||||
return removeTrailingForwardSlash(path);
|
||||
} else if (i === paths.length - 1) {
|
||||
return removeLeadingForwardSlash(path);
|
||||
} else {
|
||||
return trimSlashes(path);
|
||||
}
|
||||
}).join("/");
|
||||
}
|
||||
function isRemotePath(src) {
|
||||
if (!src) return false;
|
||||
const trimmed = src.trim();
|
||||
if (!trimmed) return false;
|
||||
let decoded = trimmed;
|
||||
let previousDecoded = "";
|
||||
let maxIterations = 10;
|
||||
while (decoded !== previousDecoded && maxIterations > 0) {
|
||||
previousDecoded = decoded;
|
||||
try {
|
||||
decoded = decodeURIComponent(decoded);
|
||||
} catch {
|
||||
break;
|
||||
}
|
||||
maxIterations--;
|
||||
}
|
||||
if (/^[a-zA-Z]:/.test(decoded)) {
|
||||
return false;
|
||||
}
|
||||
if (decoded[0] === "/" && decoded[1] !== "/" && decoded[1] !== "\\") {
|
||||
return false;
|
||||
}
|
||||
if (decoded[0] === "\\") {
|
||||
return true;
|
||||
}
|
||||
if (decoded.startsWith("//")) {
|
||||
return true;
|
||||
}
|
||||
try {
|
||||
const url = new URL(decoded, "http://n");
|
||||
if (url.username || url.password) {
|
||||
return true;
|
||||
}
|
||||
if (decoded.includes("@") && !url.pathname.includes("@") && !url.search.includes("@")) {
|
||||
return true;
|
||||
}
|
||||
if (url.origin !== "http://n") {
|
||||
const protocol = url.protocol.toLowerCase();
|
||||
if (protocol === "file:") {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (URL.canParse(decoded)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
} catch {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
function removeBase(path, base) {
|
||||
if (path.startsWith(base)) {
|
||||
return path.slice(removeTrailingForwardSlash(base).length);
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
const CONTENT_IMAGE_FLAG = "astroContentImageFlag";
|
||||
const IMAGE_IMPORT_PREFIX = "__ASTRO_IMAGE_";
|
||||
|
||||
const VALID_INPUT_FORMATS = [
|
||||
"jpeg",
|
||||
"jpg",
|
||||
"png",
|
||||
"tiff",
|
||||
"webp",
|
||||
"gif",
|
||||
"svg",
|
||||
"avif"
|
||||
];
|
||||
const VALID_SUPPORTED_FORMATS = [
|
||||
"jpeg",
|
||||
"jpg",
|
||||
"png",
|
||||
"tiff",
|
||||
"webp",
|
||||
"gif",
|
||||
"svg",
|
||||
"avif"
|
||||
];
|
||||
const DEFAULT_OUTPUT_FORMAT = "webp";
|
||||
const DEFAULT_HASH_PROPS = [
|
||||
"src",
|
||||
"width",
|
||||
"height",
|
||||
"format",
|
||||
"quality",
|
||||
"fit",
|
||||
"position",
|
||||
"background"
|
||||
];
|
||||
|
||||
function imageSrcToImportId(imageSrc, filePath) {
|
||||
imageSrc = removeBase(imageSrc, IMAGE_IMPORT_PREFIX);
|
||||
if (isRemotePath(imageSrc)) {
|
||||
return;
|
||||
}
|
||||
const ext = imageSrc.split(".").at(-1)?.toLowerCase();
|
||||
if (!ext || !VALID_INPUT_FORMATS.includes(ext)) {
|
||||
return;
|
||||
}
|
||||
const params = new URLSearchParams(CONTENT_IMAGE_FLAG);
|
||||
if (filePath) {
|
||||
params.set("importer", filePath);
|
||||
}
|
||||
return `${imageSrc}?${params.toString()}`;
|
||||
}
|
||||
|
||||
class ImmutableDataStore {
|
||||
_collections = /* @__PURE__ */ new Map();
|
||||
constructor() {
|
||||
this._collections = /* @__PURE__ */ new Map();
|
||||
}
|
||||
get(collectionName, key) {
|
||||
return this._collections.get(collectionName)?.get(String(key));
|
||||
}
|
||||
entries(collectionName) {
|
||||
const collection = this._collections.get(collectionName) ?? /* @__PURE__ */ new Map();
|
||||
return [...collection.entries()];
|
||||
}
|
||||
values(collectionName) {
|
||||
const collection = this._collections.get(collectionName) ?? /* @__PURE__ */ new Map();
|
||||
return [...collection.values()];
|
||||
}
|
||||
keys(collectionName) {
|
||||
const collection = this._collections.get(collectionName) ?? /* @__PURE__ */ new Map();
|
||||
return [...collection.keys()];
|
||||
}
|
||||
has(collectionName, key) {
|
||||
const collection = this._collections.get(collectionName);
|
||||
if (collection) {
|
||||
return collection.has(String(key));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
hasCollection(collectionName) {
|
||||
return this._collections.has(collectionName);
|
||||
}
|
||||
collections() {
|
||||
return this._collections;
|
||||
}
|
||||
/**
|
||||
* Attempts to load a DataStore from the virtual module.
|
||||
* This only works in Vite.
|
||||
*/
|
||||
static async fromModule() {
|
||||
try {
|
||||
const data = await import('./_astro_data-layer-content_BioYrs-L.mjs');
|
||||
if (data.default instanceof Map) {
|
||||
return ImmutableDataStore.fromMap(data.default);
|
||||
}
|
||||
const map = devalue.unflatten(data.default);
|
||||
return ImmutableDataStore.fromMap(map);
|
||||
} catch {
|
||||
}
|
||||
return new ImmutableDataStore();
|
||||
}
|
||||
static async fromMap(data) {
|
||||
const store = new ImmutableDataStore();
|
||||
store._collections = data;
|
||||
return store;
|
||||
}
|
||||
}
|
||||
function dataStoreSingleton() {
|
||||
let instance = void 0;
|
||||
return {
|
||||
get: async () => {
|
||||
if (!instance) {
|
||||
instance = ImmutableDataStore.fromModule();
|
||||
}
|
||||
return instance;
|
||||
},
|
||||
set: (store) => {
|
||||
instance = store;
|
||||
}
|
||||
};
|
||||
}
|
||||
const globalDataStore = dataStoreSingleton();
|
||||
|
||||
const __vite_import_meta_env__ = {"ASSETS_PREFIX": undefined, "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SITE": undefined, "SSR": true};
|
||||
function createCollectionToGlobResultMap({
|
||||
globResult,
|
||||
contentDir
|
||||
}) {
|
||||
const collectionToGlobResultMap = {};
|
||||
for (const key in globResult) {
|
||||
const keyRelativeToContentDir = key.replace(new RegExp(`^${contentDir}`), "");
|
||||
const segments = keyRelativeToContentDir.split("/");
|
||||
if (segments.length <= 1) continue;
|
||||
const collection = segments[0];
|
||||
collectionToGlobResultMap[collection] ??= {};
|
||||
collectionToGlobResultMap[collection][key] = globResult[key];
|
||||
}
|
||||
return collectionToGlobResultMap;
|
||||
}
|
||||
z.object({
|
||||
tags: z.array(z.string()).optional(),
|
||||
lastModified: z.date().optional()
|
||||
});
|
||||
function createGetCollection({
|
||||
contentCollectionToEntryMap,
|
||||
dataCollectionToEntryMap,
|
||||
getRenderEntryImport,
|
||||
cacheEntriesByCollection,
|
||||
liveCollections
|
||||
}) {
|
||||
return async function getCollection(collection, filter) {
|
||||
if (collection in liveCollections) {
|
||||
throw new AstroError({
|
||||
...UnknownContentCollectionError,
|
||||
message: `Collection "${collection}" is a live collection. Use getLiveCollection() instead of getCollection().`
|
||||
});
|
||||
}
|
||||
const hasFilter = typeof filter === "function";
|
||||
const store = await globalDataStore.get();
|
||||
let type;
|
||||
if (collection in contentCollectionToEntryMap) {
|
||||
type = "content";
|
||||
} else if (collection in dataCollectionToEntryMap) {
|
||||
type = "data";
|
||||
} else if (store.hasCollection(collection)) {
|
||||
const { default: imageAssetMap } = await import('./content-assets_DleWbedO.mjs');
|
||||
const result = [];
|
||||
for (const rawEntry of store.values(collection)) {
|
||||
const data = updateImageReferencesInData(rawEntry.data, rawEntry.filePath, imageAssetMap);
|
||||
let entry = {
|
||||
...rawEntry,
|
||||
data,
|
||||
collection
|
||||
};
|
||||
if (entry.legacyId) {
|
||||
entry = emulateLegacyEntry(entry);
|
||||
}
|
||||
if (hasFilter && !filter(entry)) {
|
||||
continue;
|
||||
}
|
||||
result.push(entry);
|
||||
}
|
||||
return result;
|
||||
} else {
|
||||
console.warn(
|
||||
`The collection ${JSON.stringify(
|
||||
collection
|
||||
)} does not exist or is empty. Please check your content config file for errors.`
|
||||
);
|
||||
return [];
|
||||
}
|
||||
const lazyImports = Object.values(
|
||||
type === "content" ? contentCollectionToEntryMap[collection] : dataCollectionToEntryMap[collection]
|
||||
);
|
||||
let entries = [];
|
||||
if (!Object.assign(__vite_import_meta_env__, { _: process.env._ })?.DEV && cacheEntriesByCollection.has(collection)) {
|
||||
entries = cacheEntriesByCollection.get(collection);
|
||||
} else {
|
||||
const limit = pLimit(10);
|
||||
entries = await Promise.all(
|
||||
lazyImports.map(
|
||||
(lazyImport) => limit(async () => {
|
||||
const entry = await lazyImport();
|
||||
return type === "content" ? {
|
||||
id: entry.id,
|
||||
slug: entry.slug,
|
||||
body: entry.body,
|
||||
collection: entry.collection,
|
||||
data: entry.data,
|
||||
async render() {
|
||||
return render({
|
||||
collection: entry.collection,
|
||||
id: entry.id,
|
||||
renderEntryImport: await getRenderEntryImport(collection, entry.slug)
|
||||
});
|
||||
}
|
||||
} : {
|
||||
id: entry.id,
|
||||
collection: entry.collection,
|
||||
data: entry.data
|
||||
};
|
||||
})
|
||||
)
|
||||
);
|
||||
cacheEntriesByCollection.set(collection, entries);
|
||||
}
|
||||
if (hasFilter) {
|
||||
return entries.filter(filter);
|
||||
} else {
|
||||
return entries.slice();
|
||||
}
|
||||
};
|
||||
}
|
||||
function emulateLegacyEntry({ legacyId, ...entry }) {
|
||||
const legacyEntry = {
|
||||
...entry,
|
||||
id: legacyId,
|
||||
slug: entry.id
|
||||
};
|
||||
return {
|
||||
...legacyEntry,
|
||||
// Define separately so the render function isn't included in the object passed to `renderEntry()`
|
||||
render: () => renderEntry(legacyEntry)
|
||||
};
|
||||
}
|
||||
const CONTENT_LAYER_IMAGE_REGEX = /__ASTRO_IMAGE_="([^"]+)"/g;
|
||||
async function updateImageReferencesInBody(html, fileName) {
|
||||
const { default: imageAssetMap } = await import('./content-assets_DleWbedO.mjs');
|
||||
const imageObjects = /* @__PURE__ */ new Map();
|
||||
const { getImage } = await import('./_astro_assets_omVwmtMY.mjs').then(n => n._);
|
||||
for (const [_full, imagePath] of html.matchAll(CONTENT_LAYER_IMAGE_REGEX)) {
|
||||
try {
|
||||
const decodedImagePath = JSON.parse(imagePath.replaceAll(""", '"'));
|
||||
let image;
|
||||
if (URL.canParse(decodedImagePath.src)) {
|
||||
image = await getImage(decodedImagePath);
|
||||
} else {
|
||||
const id = imageSrcToImportId(decodedImagePath.src, fileName);
|
||||
const imported = imageAssetMap.get(id);
|
||||
if (!id || imageObjects.has(id) || !imported) {
|
||||
continue;
|
||||
}
|
||||
image = await getImage({ ...decodedImagePath, src: imported });
|
||||
}
|
||||
imageObjects.set(imagePath, image);
|
||||
} catch {
|
||||
throw new Error(`Failed to parse image reference: ${imagePath}`);
|
||||
}
|
||||
}
|
||||
return html.replaceAll(CONTENT_LAYER_IMAGE_REGEX, (full, imagePath) => {
|
||||
const image = imageObjects.get(imagePath);
|
||||
if (!image) {
|
||||
return full;
|
||||
}
|
||||
const { index, ...attributes } = image.attributes;
|
||||
return Object.entries({
|
||||
...attributes,
|
||||
src: image.src,
|
||||
srcset: image.srcSet.attribute,
|
||||
// This attribute is used by the toolbar audit
|
||||
...Object.assign(__vite_import_meta_env__, { _: process.env._ }).DEV ? { "data-image-component": "true" } : {}
|
||||
}).map(([key, value]) => value ? `${key}="${escape(value)}"` : "").join(" ");
|
||||
});
|
||||
}
|
||||
function updateImageReferencesInData(data, fileName, imageAssetMap) {
|
||||
return new Traverse(data).map(function(ctx, val) {
|
||||
if (typeof val === "string" && val.startsWith(IMAGE_IMPORT_PREFIX)) {
|
||||
const src = val.replace(IMAGE_IMPORT_PREFIX, "");
|
||||
const id = imageSrcToImportId(src, fileName);
|
||||
if (!id) {
|
||||
ctx.update(src);
|
||||
return;
|
||||
}
|
||||
const imported = imageAssetMap?.get(id);
|
||||
if (imported) {
|
||||
ctx.update(imported);
|
||||
} else {
|
||||
ctx.update(src);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
async function renderEntry(entry) {
|
||||
if (!entry) {
|
||||
throw new AstroError(RenderUndefinedEntryError);
|
||||
}
|
||||
if ("render" in entry && !("legacyId" in entry)) {
|
||||
return entry.render();
|
||||
}
|
||||
if (entry.deferredRender) {
|
||||
try {
|
||||
const { default: contentModules } = await import('./content-modules_Dz-S_Wwv.mjs');
|
||||
const renderEntryImport = contentModules.get(entry.filePath);
|
||||
return render({
|
||||
collection: "",
|
||||
id: entry.id,
|
||||
renderEntryImport
|
||||
});
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
const html = entry?.rendered?.metadata?.imagePaths?.length && entry.filePath ? await updateImageReferencesInBody(entry.rendered.html, entry.filePath) : entry?.rendered?.html;
|
||||
const Content = createComponent(() => renderTemplate`${unescapeHTML(html)}`);
|
||||
return {
|
||||
Content,
|
||||
headings: entry?.rendered?.metadata?.headings ?? [],
|
||||
remarkPluginFrontmatter: entry?.rendered?.metadata?.frontmatter ?? {}
|
||||
};
|
||||
}
|
||||
async function render({
|
||||
collection,
|
||||
id,
|
||||
renderEntryImport
|
||||
}) {
|
||||
const UnexpectedRenderError = new AstroError({
|
||||
...UnknownContentCollectionError,
|
||||
message: `Unexpected error while rendering ${String(collection)} → ${String(id)}.`
|
||||
});
|
||||
if (typeof renderEntryImport !== "function") throw UnexpectedRenderError;
|
||||
const baseMod = await renderEntryImport();
|
||||
if (baseMod == null || typeof baseMod !== "object") throw UnexpectedRenderError;
|
||||
const { default: defaultMod } = baseMod;
|
||||
if (isPropagatedAssetsModule(defaultMod)) {
|
||||
const { collectedStyles, collectedLinks, collectedScripts, getMod } = defaultMod;
|
||||
if (typeof getMod !== "function") throw UnexpectedRenderError;
|
||||
const propagationMod = await getMod();
|
||||
if (propagationMod == null || typeof propagationMod !== "object") throw UnexpectedRenderError;
|
||||
const Content = createComponent({
|
||||
factory(result, baseProps, slots) {
|
||||
let styles = "", links = "", scripts = "";
|
||||
if (Array.isArray(collectedStyles)) {
|
||||
styles = collectedStyles.map((style) => {
|
||||
return renderUniqueStylesheet(result, {
|
||||
type: "inline",
|
||||
content: style
|
||||
});
|
||||
}).join("");
|
||||
}
|
||||
if (Array.isArray(collectedLinks)) {
|
||||
links = collectedLinks.map((link) => {
|
||||
return renderUniqueStylesheet(result, {
|
||||
type: "external",
|
||||
src: isRemotePath(link) ? link : prependForwardSlash(link)
|
||||
});
|
||||
}).join("");
|
||||
}
|
||||
if (Array.isArray(collectedScripts)) {
|
||||
scripts = collectedScripts.map((script) => renderScriptElement(script)).join("");
|
||||
}
|
||||
let props = baseProps;
|
||||
if (id.endsWith("mdx")) {
|
||||
props = {
|
||||
components: propagationMod.components ?? {},
|
||||
...baseProps
|
||||
};
|
||||
}
|
||||
return createHeadAndContent(
|
||||
unescapeHTML(styles + links + scripts),
|
||||
renderTemplate`${renderComponent(
|
||||
result,
|
||||
"Content",
|
||||
propagationMod.Content,
|
||||
props,
|
||||
slots
|
||||
)}`
|
||||
);
|
||||
},
|
||||
propagation: "self"
|
||||
});
|
||||
return {
|
||||
Content,
|
||||
headings: propagationMod.getHeadings?.() ?? [],
|
||||
remarkPluginFrontmatter: propagationMod.frontmatter ?? {}
|
||||
};
|
||||
} else if (baseMod.Content && typeof baseMod.Content === "function") {
|
||||
return {
|
||||
Content: baseMod.Content,
|
||||
headings: baseMod.getHeadings?.() ?? [],
|
||||
remarkPluginFrontmatter: baseMod.frontmatter ?? {}
|
||||
};
|
||||
} else {
|
||||
throw UnexpectedRenderError;
|
||||
}
|
||||
}
|
||||
function isPropagatedAssetsModule(module) {
|
||||
return typeof module === "object" && module != null && "__astroPropagation" in module;
|
||||
}
|
||||
|
||||
// astro-head-inject
|
||||
|
||||
const liveCollections = {};
|
||||
|
||||
const contentDir = '/src/content/';
|
||||
|
||||
const contentEntryGlob = "";
|
||||
const contentCollectionToEntryMap = createCollectionToGlobResultMap({
|
||||
globResult: contentEntryGlob,
|
||||
contentDir,
|
||||
});
|
||||
|
||||
const dataEntryGlob = "";
|
||||
const dataCollectionToEntryMap = createCollectionToGlobResultMap({
|
||||
globResult: dataEntryGlob,
|
||||
contentDir,
|
||||
});
|
||||
createCollectionToGlobResultMap({
|
||||
globResult: { ...contentEntryGlob, ...dataEntryGlob },
|
||||
contentDir,
|
||||
});
|
||||
|
||||
let lookupMap = {};
|
||||
lookupMap = {};
|
||||
|
||||
new Set(Object.keys(lookupMap));
|
||||
|
||||
function createGlobLookup(glob) {
|
||||
return async (collection, lookupId) => {
|
||||
const filePath = lookupMap[collection]?.entries[lookupId];
|
||||
|
||||
if (!filePath) return undefined;
|
||||
return glob[collection][filePath];
|
||||
};
|
||||
}
|
||||
|
||||
const renderEntryGlob = "";
|
||||
const collectionToRenderEntryMap = createCollectionToGlobResultMap({
|
||||
globResult: renderEntryGlob,
|
||||
contentDir,
|
||||
});
|
||||
|
||||
const cacheEntriesByCollection = new Map();
|
||||
const getCollection = createGetCollection({
|
||||
contentCollectionToEntryMap,
|
||||
dataCollectionToEntryMap,
|
||||
getRenderEntryImport: createGlobLookup(collectionToRenderEntryMap),
|
||||
cacheEntriesByCollection,
|
||||
liveCollections,
|
||||
});
|
||||
|
||||
export { DEFAULT_OUTPUT_FORMAT as D, VALID_SUPPORTED_FORMATS as V, DEFAULT_HASH_PROPS as a, getCollection as g, isRemotePath as i, joinPaths as j, renderEntry as r };
|
||||
3
dist/chunks/_astro_data-layer-content_BioYrs-L.mjs
vendored
Normal file
2072
dist/chunks/astro/server_i-dTRwm2.mjs
vendored
Normal file
3
dist/chunks/astro_519BkCxJ.mjs
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
import 'piccolore';
|
||||
import './astro/server_i-dTRwm2.mjs';
|
||||
import 'clsx';
|
||||
3
dist/chunks/content-assets_DleWbedO.mjs
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
const contentAssets = new Map();
|
||||
|
||||
export { contentAssets as default };
|
||||
3
dist/chunks/content-modules_Dz-S_Wwv.mjs
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
const contentModules = new Map();
|
||||
|
||||
export { contentModules as default };
|
||||
101
dist/chunks/sharp_DEdYiB4E.mjs
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
import { A as AstroError, B as MissingSharp } from './astro/server_i-dTRwm2.mjs';
|
||||
import { b as baseService, p as parseQuality } from './_astro_assets_omVwmtMY.mjs';
|
||||
|
||||
let sharp;
|
||||
const qualityTable = {
|
||||
low: 25,
|
||||
mid: 50,
|
||||
high: 80,
|
||||
max: 100
|
||||
};
|
||||
async function loadSharp() {
|
||||
let sharpImport;
|
||||
try {
|
||||
sharpImport = (await import('sharp')).default;
|
||||
} catch {
|
||||
throw new AstroError(MissingSharp);
|
||||
}
|
||||
sharpImport.cache(false);
|
||||
return sharpImport;
|
||||
}
|
||||
const fitMap = {
|
||||
fill: "fill",
|
||||
contain: "inside",
|
||||
cover: "cover",
|
||||
none: "outside",
|
||||
"scale-down": "inside",
|
||||
outside: "outside",
|
||||
inside: "inside"
|
||||
};
|
||||
const sharpService = {
|
||||
validateOptions: baseService.validateOptions,
|
||||
getURL: baseService.getURL,
|
||||
parseURL: baseService.parseURL,
|
||||
getHTMLAttributes: baseService.getHTMLAttributes,
|
||||
getSrcSet: baseService.getSrcSet,
|
||||
async transform(inputBuffer, transformOptions, config) {
|
||||
if (!sharp) sharp = await loadSharp();
|
||||
const transform = transformOptions;
|
||||
const kernel = config.service.config.kernel;
|
||||
if (transform.format === "svg") return { data: inputBuffer, format: "svg" };
|
||||
const result = sharp(inputBuffer, {
|
||||
failOnError: false,
|
||||
pages: -1,
|
||||
limitInputPixels: config.service.config.limitInputPixels
|
||||
});
|
||||
result.rotate();
|
||||
const { format } = await result.metadata();
|
||||
const withoutEnlargement = Boolean(transform.fit);
|
||||
if (transform.width && transform.height && transform.fit) {
|
||||
const fit = fitMap[transform.fit] ?? "inside";
|
||||
result.resize({
|
||||
width: Math.round(transform.width),
|
||||
height: Math.round(transform.height),
|
||||
kernel,
|
||||
fit,
|
||||
position: transform.position,
|
||||
withoutEnlargement
|
||||
});
|
||||
} else if (transform.height && !transform.width) {
|
||||
result.resize({
|
||||
height: Math.round(transform.height),
|
||||
kernel,
|
||||
withoutEnlargement
|
||||
});
|
||||
} else if (transform.width) {
|
||||
result.resize({
|
||||
width: Math.round(transform.width),
|
||||
kernel,
|
||||
withoutEnlargement
|
||||
});
|
||||
}
|
||||
if (transform.background) {
|
||||
result.flatten({ background: transform.background });
|
||||
}
|
||||
if (transform.format) {
|
||||
let quality = void 0;
|
||||
if (transform.quality) {
|
||||
const parsedQuality = parseQuality(transform.quality);
|
||||
if (typeof parsedQuality === "number") {
|
||||
quality = parsedQuality;
|
||||
} else {
|
||||
quality = transform.quality in qualityTable ? qualityTable[transform.quality] : void 0;
|
||||
}
|
||||
}
|
||||
if (transform.format === "webp" && format === "gif") {
|
||||
result.webp({ quality: typeof quality === "number" ? quality : void 0, loop: 0 });
|
||||
} else {
|
||||
result.toFormat(transform.format, { quality });
|
||||
}
|
||||
}
|
||||
const { data, info } = await result.toBuffer({ resolveWithObject: true });
|
||||
const needsCopy = "buffer" in data && data.buffer instanceof SharedArrayBuffer;
|
||||
return {
|
||||
data: needsCopy ? new Uint8Array(data) : data,
|
||||
format: info.format
|
||||
};
|
||||
}
|
||||
};
|
||||
var sharp_default = sharpService;
|
||||
|
||||
export { sharp_default as default };
|
||||
BIN
dist/favicon-512.jpg
vendored
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
dist/favicon.ico
vendored
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
1606
dist/favicon.svg
vendored
Normal file
BIN
dist/images-clean/ADJUSTABLE_CLEVIS_HANGER_cover_01.jpg
vendored
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
dist/images-clean/ADJUSTABLE_SPLIT_RING_HANGER_cover_01.jpg
vendored
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
dist/images-clean/Banner-HDPE-wel-1024x382.jpg
vendored
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
dist/images-clean/Grilles01logo.jpg
vendored
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
dist/images-clean/Hanger-Clamp-Bolt_000.jpg
vendored
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
dist/images-clean/IMG-cover-309251.png
vendored
Normal file
|
After Width: | Height: | Size: 439 KiB |
BIN
dist/images-clean/THREADED_ROD_cover_01.jpg
vendored
Normal file
|
After Width: | Height: | Size: 107 KiB |
BIN
dist/images-clean/Valve-KITZ.jpg
vendored
Normal file
|
After Width: | Height: | Size: 224 KiB |
BIN
dist/images-clean/balljet-cover_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
dist/images-clean/durgo_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
dist/images-clean/edited_1771652247.jpg
vendored
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
dist/images-clean/edited_1771652436.jpg
vendored
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
dist/images-clean/edited_1771652452.jpg
vendored
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
dist/images-clean/extinguishers_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 178 KiB |
BIN
dist/images-clean/fencing_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 385 KiB |
BIN
dist/images-clean/grilles_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 238 KiB |
BIN
dist/images-clean/hdpe-pipe_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 182 KiB |
BIN
dist/images-clean/hdpe-welding_000C-1.jpg
vendored
Normal file
|
After Width: | Height: | Size: 309 KiB |
BIN
dist/images-clean/pipe-and-other_000.jpg
vendored
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
dist/images-clean/pipe-coupling-machine_000.jpg
vendored
Normal file
|
After Width: | Height: | Size: 175 KiB |
BIN
dist/images-clean/poloplast_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
dist/images-clean/ppr-pipe_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 215 KiB |
BIN
dist/images-clean/pvc-pipe_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 160 KiB |
BIN
dist/images-clean/realflex_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 196 KiB |
BIN
dist/images-clean/syler_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 252 KiB |
BIN
dist/images-clean/thermobrek_cover_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 245 KiB |
BIN
dist/images-clean/upvc-pipe_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 172 KiB |
BIN
dist/images-clean/valve_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
dist/images-clean/water-pump_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
dist/images-clean/water-treatment_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 192 KiB |
BIN
dist/images-clean/xylent_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
dist/images/2021/02/13523630950840.png
vendored
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
dist/images/2021/02/3975300575915d3ebc051b.jpg
vendored
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
dist/images/2021/02/BG-SMC02.jpg
vendored
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
dist/images/2021/02/BG-SMC02.png
vendored
Normal file
|
After Width: | Height: | Size: 509 KiB |
BIN
dist/images/2021/02/Banner-HDPE-wel-1024x382.jpg
vendored
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
dist/images/2021/02/DURGO_028.jpg
vendored
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
dist/images/2021/02/Essilor1-horz.jpg
vendored
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
dist/images/2021/02/Grilles01logo.jpg
vendored
Normal file
|
After Width: | Height: | Size: 153 KiB |
BIN
dist/images/2021/02/Grooved01-1024x501.jpg
vendored
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
dist/images/2021/02/IMG_2226.jpg
vendored
Normal file
|
After Width: | Height: | Size: 196 KiB |
BIN
dist/images/2021/02/IMG_3089.jpg
vendored
Normal file
|
After Width: | Height: | Size: 167 KiB |
BIN
dist/images/2021/02/Image1.jpg
vendored
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
dist/images/2021/02/Valve-KITZ.jpg
vendored
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
dist/images/2021/02/Water-Pump1.jpg
vendored
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
dist/images/2021/02/dukelarrsen-43-987x1024.jpg
vendored
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
dist/images/2021/02/foot01.jpg
vendored
Normal file
|
After Width: | Height: | Size: 863 KiB |
BIN
dist/images/2021/02/original-1411656013669.jpg
vendored
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
dist/images/2021/02/original-1411656013669.png
vendored
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
dist/images/2021/02/vineman-fence.jpg
vendored
Normal file
|
After Width: | Height: | Size: 599 KiB |
BIN
dist/images/2021/02/บ.เอเชี่ยน1.jpg
vendored
Normal file
|
After Width: | Height: | Size: 190 KiB |
BIN
dist/images/2021/02/บางพลี1-horz.jpg
vendored
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
dist/images/2021/02/บางแค1.jpg
vendored
Normal file
|
After Width: | Height: | Size: 179 KiB |
BIN
dist/images/2021/02/บีกริม-จำกัด-e1503304339753.jpg
vendored
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
dist/images/2021/02/บ่อเงิน3.jpg
vendored
Normal file
|
After Width: | Height: | Size: 200 KiB |
BIN
dist/images/2021/02/ประชารัฐ1-e1503323597848.jpg
vendored
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
dist/images/2021/02/ลพบุรี5.jpg
vendored
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
dist/images/2021/02/ลาดกระบัง1.jpg
vendored
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
dist/images/2021/02/สมุทรสาคร2.jpg
vendored
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
dist/images/2021/02/เอฟแอนดืเอฟ2-horz.jpg
vendored
Normal file
|
After Width: | Height: | Size: 180 KiB |
BIN
dist/images/2021/02/ไทยน้ำทิพย์1-horz.jpg
vendored
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
dist/images/2021/03/MECH_001-1.jpg
vendored
Normal file
|
After Width: | Height: | Size: 169 KiB |
BIN
dist/images/2021/03/REALFLEX_001.png
vendored
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
dist/images/2021/03/TEVADA_001.png
vendored
Normal file
|
After Width: | Height: | Size: 933 KiB |
BIN
dist/images/2021/03/durgo_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
dist/images/2021/03/extinguishers_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 223 KiB |
BIN
dist/images/2021/03/grilles_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 268 KiB |
BIN
dist/images/2021/03/hdpe-pipe_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 252 KiB |
BIN
dist/images/2021/03/hdpe-welding_000C-1.jpg
vendored
Normal file
|
After Width: | Height: | Size: 390 KiB |
BIN
dist/images/2021/03/poloplast_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
dist/images/2021/03/ppr-pipe_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 244 KiB |
BIN
dist/images/2021/03/pvc-pipe_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 234 KiB |
BIN
dist/images/2021/03/realflex_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 258 KiB |
BIN
dist/images/2021/03/syler_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 279 KiB |
BIN
dist/images/2021/03/upvc-pipe_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 219 KiB |
BIN
dist/images/2021/03/valve_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 215 KiB |
BIN
dist/images/2021/03/water-pump_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 232 KiB |
BIN
dist/images/2021/03/water-treatment_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 290 KiB |
BIN
dist/images/2021/03/xylent_000C.jpg
vendored
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
dist/images/2024/02/ADJUSTABLE_BAND_HANGER_cover_01.jpg
vendored
Normal file
|
After Width: | Height: | Size: 144 KiB |