fix(armaflex): rename misspelled 'armflex' slug to 'armaflex' everywhere
- Route /armflex -> /armaflex (page file + nav/listing links) - Image folder public/images/armflex/ -> public/images/armaflex/ - Fix gallery alt-text 'Armflex' -> 'Armaflex' - Add nginx 301 redirect so old /armflex URL still works (SEO-safe) - Update engineering log + handoff Verified: npm run build (44 pages), tsc --noEmit, nginx -t, live probe /armaflex/ 200, zero stale 'armflex' refs.
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: Deal Plus Tech Engineering Handoff
|
title: Deal Plus Tech Engineering Handoff
|
||||||
updated: 2026-08-30
|
updated: 2026-09-08
|
||||||
---
|
---
|
||||||
# Engineering Handoff
|
# Engineering Handoff
|
||||||
|
|
||||||
@@ -8,13 +8,14 @@ updated: 2026-08-30
|
|||||||
|
|
||||||
- Repository: `/Users/kunthawat/Gitea/dealplustech-astroreal`
|
- Repository: `/Users/kunthawat/Gitea/dealplustech-astroreal`
|
||||||
- Branch: `main`
|
- Branch: `main`
|
||||||
- Code commit: `c0d8cacfbeb328424138b26e22cb31e82db453b6` (pushed and verified at `origin/main` before this handoff update)
|
- Code commit: `c0d8cacfbeb328424138b26e22cb31e82db453b6` (last pushed to `origin/main` on 2026-08-30); Armaflex rename changes staged and pending this handoff commit
|
||||||
- HEAD: current branch tip of `main`; verify with `git rev-parse HEAD` after the handoff update
|
- HEAD: current branch tip of `main`; verify with `git rev-parse HEAD` after the handoff update
|
||||||
- Remote target: `origin/main`
|
- Remote target: `origin/main`
|
||||||
- Working tree: clean after the verified code commit; this handoff metadata update is the only pending change
|
- Working tree: Armaflex slug/image rename + nginx 301 staged; handoff/log metadata is the only other pending change
|
||||||
|
|
||||||
## Completed
|
## Completed
|
||||||
|
|
||||||
|
- **Armaflex slug rename** — `armflex` → `armaflex` (route, image folder, nav/listing links, gallery alt-text) + nginx 301 for the old URL
|
||||||
- CcooL product page: `/ฉนวนหุ้มท่อ-ccool/`
|
- CcooL product page: `/ฉนวนหุ้มท่อ-ccool/`
|
||||||
- CcooL images and pricing PDF added under `public/`
|
- CcooL images and pricing PDF added under `public/`
|
||||||
- Navigation, product listing, breadcrumb, metadata, FAQ, Product JSON-LD, and CTA tracking updated
|
- Navigation, product listing, breadcrumb, metadata, FAQ, Product JSON-LD, and CTA tracking updated
|
||||||
@@ -25,12 +26,13 @@ updated: 2026-08-30
|
|||||||
|
|
||||||
## Verification
|
## Verification
|
||||||
|
|
||||||
- `npm run build` → **pass**, 44 pages
|
- `npm run build` → **pass**, 44 pages (Armaflex rename)
|
||||||
- `npx tsc --noEmit` → **pass**
|
- `npx tsc --noEmit` → **pass** (no errors)
|
||||||
- `git diff --cached --check` → **pass**
|
- `git diff --check` → **pass**
|
||||||
- Independent reviewer → **pass**, no security concerns or logic errors
|
- `nginx -t` on the edited config → **syntax ok** (301 `armflex → armaflex`)
|
||||||
- Static output → 44 HTML pages, JSON-LD parses, Umami attributes are well-formed, images have `alt`; baseline-only duplicate SVG ID and blank-target links remain
|
- Live static probe on `dist/` → `GET /armaflex/` 200, `GET /images/armaflex/gallery-1.jpg` 200, old `/armflex/` 404 at static layer (nginx 301 intercepts at deploy)
|
||||||
- Assets → five 1024×768 images; five-page A4 PDF; no PDF JavaScript/encryption
|
- Source/output scan → zero `armflex` references remain (all `armaflex`)
|
||||||
|
- Independent reviewer (prior CcooL/SEO work) → **pass**, no security concerns or logic errors
|
||||||
|
|
||||||
## Known Limitations / Blockers
|
## Known Limitations / Blockers
|
||||||
|
|
||||||
@@ -49,5 +51,6 @@ updated: 2026-08-30
|
|||||||
|
|
||||||
## Evidence Index
|
## Evidence Index
|
||||||
|
|
||||||
|
- [[2026-09-08-armaflex-slug-rename]]
|
||||||
- [[2026-08-30-seo-audit-fixes]]
|
- [[2026-08-30-seo-audit-fixes]]
|
||||||
- [[../test-evidence/2026-08-30-ccool-seo]]
|
- [[../test-evidence/2026-08-30-ccool-seo]]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: Deal Plus Tech Engineering Log
|
title: Deal Plus Tech Engineering Log
|
||||||
updated: 2026-08-30
|
updated: 2026-09-08
|
||||||
---
|
---
|
||||||
# Engineering Log
|
# Engineering Log
|
||||||
|
|
||||||
@@ -10,6 +10,7 @@ Latest verified code commit: `c0d8cacfbeb328424138b26e22cb31e82db453b6` pushed t
|
|||||||
|
|
||||||
| Milestone | Status | Last verified | Evidence | Next action |
|
| Milestone | Status | Last verified | Evidence | Next action |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
|
| Armaflex slug rename (armflex → armaflex) | complete | 2026-09-08 | `npm run build` 44 pages, `tsc --noEmit` clean, live probe `/armaflex/` 200, old slug 301 in nginx.conf | Push + EasyPanel rebuild; verify live 301 on production |
|
||||||
| CcooL product page and navigation | complete | 2026-08-30 | `npm run build` produced 44 static pages, including `/ฉนวนหุ้มท่อ-ccool/` | Confirm production domain before the next deploy/SEO change |
|
| CcooL product page and navigation | complete | 2026-08-30 | `npm run build` produced 44 static pages, including `/ฉนวนหุ้มท่อ-ccool/` | Confirm production domain before the next deploy/SEO change |
|
||||||
| SEO trust-layer fixes | complete | 2026-08-30 | robots/sitemap, internal links, metadata, legal-page headings, and claim wording checked in built output | Fix production soft-404 routing at the server layer |
|
| SEO trust-layer fixes | complete | 2026-08-30 | robots/sitemap, internal links, metadata, legal-page headings, and claim wording checked in built output | Fix production soft-404 routing at the server layer |
|
||||||
| Umami event convention | complete | 2026-08-30 | Source/output scan found no malformed `data-umami-event` attributes | Review event reports after real traffic arrives |
|
| Umami event convention | complete | 2026-08-30 | Source/output scan found no malformed `data-umami-event` attributes | Review event reports after real traffic arrives |
|
||||||
@@ -24,6 +25,7 @@ Latest verified code commit: `c0d8cacfbeb328424138b26e22cb31e82db453b6` pushed t
|
|||||||
|
|
||||||
## Entry Index
|
## Entry Index
|
||||||
|
|
||||||
|
- [[2026-09-08-armaflex-slug-rename]] — armflex → armaflex slug/image rename + nginx 301, verification, and push handoff.
|
||||||
- [[2026-08-30-seo-audit-fixes]] — CcooL page, SEO trust layer, Umami tracking, verification, and push handoff.
|
- [[2026-08-30-seo-audit-fixes]] — CcooL page, SEO trust layer, Umami tracking, verification, and push handoff.
|
||||||
|
|
||||||
## Plan Synchronization
|
## Plan Synchronization
|
||||||
|
|||||||
46
docs/engineering-log/2026-09-08-armaflex-slug-rename.md
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
title: Armaflex product slug rename (armflex → armaflex)
|
||||||
|
status: complete
|
||||||
|
verified: 2026-09-08
|
||||||
|
---
|
||||||
|
# Armaflex Product Slug Rename (armflex → armaflex)
|
||||||
|
|
||||||
|
## Plan Status
|
||||||
|
|
||||||
|
**complete** — the misspelled `armflex` product slug was renamed to `armaflex` (the correct Armaflex/Armacell brand spelling) across route, image folder, navigation, and alt-text, with an nginx 301 redirect added so the old URL does not break.
|
||||||
|
|
||||||
|
**Code commit:** (to be filled after commit) on `main`.
|
||||||
|
|
||||||
|
## Changed Scope
|
||||||
|
|
||||||
|
- Renamed page `src/pages/armflex.astro` → `src/pages/armaflex.astro` (route `/armflex` → `/armaflex`) via `git mv` (history preserved).
|
||||||
|
- Renamed image folder `public/images/armflex/` → `public/images/armaflex/` (all 12 assets) via `git mv`.
|
||||||
|
- Updated all route/image references: `src/components/common/Header.astro`, `src/layouts/BaseLayout.astro` (category slug + Armaflex subcategory slug), `src/pages/all-products.astro`, `src/pages/404.astro`, and the page's own image paths.
|
||||||
|
- Corrected gallery `alt="Armflex …"` → `alt="Armaflex …"` (5 images) in `src/pages/armaflex.astro`.
|
||||||
|
- Added a 301 redirect in `nginx.conf` for the old misspelled paths:
|
||||||
|
- `location = /armflex { return 301 /armaflex; }`
|
||||||
|
- `location = /armflex/ { return 301 /armaflex; }`
|
||||||
|
|
||||||
|
## Verification Evidence
|
||||||
|
|
||||||
|
- `npm run build` — **pass**, 44 static pages; `dist/armaflex/index.html` generated (70.8 KB); `dist/armflex/index.html` gone; `dist/images/armaflex/` populated; `dist/images/armflex/` gone.
|
||||||
|
- `npx tsc --noEmit` — **pass** (no errors).
|
||||||
|
- `git diff --check` — **pass**.
|
||||||
|
- Source scan — `grep -rn 'armflex' src | grep -v armaflex` returns nothing (clean); all 5 nav/listing links now point to `/armaflex`.
|
||||||
|
- Built output scan — no stale `/armflex` hrefs or `images/armflex/` paths; gallery alt-text reads "Armaflex ภาพที่ 1–5"; H1 reads "Armaflex Class 1 ชนิดม้วน".
|
||||||
|
- Live static probe (`python3 -m http.server` on `dist/`): `GET /armaflex/` → 200, `GET /images/armaflex/gallery-1.jpg` → 200, old `GET /armflex/` → 404 at the static layer (the nginx 301 intercepts it at deploy time).
|
||||||
|
- `nginx -t` on the edited config (wrapped in the required `events{}`/`http{}` blocks) — **syntax is ok / test is successful**.
|
||||||
|
|
||||||
|
## Tooling Limitations
|
||||||
|
|
||||||
|
- `npm test` unavailable (no `test` script in `package.json`).
|
||||||
|
- The nginx 301 was validated for syntax locally and by logic; it is served by EasyPanel's nginx container at deploy time, so the live `armflex → armaflex` redirect was not exercised against the production endpoint in this session.
|
||||||
|
|
||||||
|
## Risks and Remaining Work
|
||||||
|
|
||||||
|
1. After deploy, confirm the production `armflex` → `armaflex` 301 actually fires (EasyPanel must rebuild with the new `nginx.conf`).
|
||||||
|
2. Confirm the real production domain before any domain-dependent SEO action (existing known limitation, unchanged).
|
||||||
|
|
||||||
|
## Exact Next Action
|
||||||
|
|
||||||
|
Commit this change on `main`, then push and rebuild via EasyPanel; verify the `/armflex` → `/armaflex` 301 and the `/armaflex` page on the production domain.
|
||||||
@@ -35,6 +35,10 @@ server {
|
|||||||
try_files $uri =404;
|
try_files $uri =404;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 301 redirect: old misspelled product slug (armflex -> armaflex)
|
||||||
|
location = /armflex { return 301 /armaflex; }
|
||||||
|
location = /armflex/ { return 301 /armaflex; }
|
||||||
|
|
||||||
# Don't cache HTML
|
# Don't cache HTML
|
||||||
location ~* \.html$ {
|
location ~* \.html$ {
|
||||||
expires -1;
|
expires -1;
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 476 KiB After Width: | Height: | Size: 476 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 187 KiB After Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 195 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |
@@ -55,7 +55,7 @@ const productCategories = [
|
|||||||
{
|
{
|
||||||
title: "ฉนวนและรั้ว",
|
title: "ฉนวนและรั้ว",
|
||||||
items: [
|
items: [
|
||||||
{ label: "Armaflex", href: "/armflex" },
|
{ label: "Armaflex", href: "/armaflex" },
|
||||||
{ label: "Aeroflex", href: "/aeroflex" },
|
{ label: "Aeroflex", href: "/aeroflex" },
|
||||||
{ label: "Maxflex", href: "/maxflex" },
|
{ label: "Maxflex", href: "/maxflex" },
|
||||||
{ label: "Thermobreak", href: "/เทอร์โมเบรค-thermobreak" },
|
{ label: "Thermobreak", href: "/เทอร์โมเบรค-thermobreak" },
|
||||||
|
|||||||
@@ -136,9 +136,9 @@ const categories = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'ฉนวนหุ้มท่อ',
|
name: 'ฉนวนหุ้มท่อ',
|
||||||
slug: '/armflex',
|
slug: '/armaflex',
|
||||||
subcategories: [
|
subcategories: [
|
||||||
{ name: 'Armaflex', slug: '/armflex' },
|
{ name: 'Armaflex', slug: '/armaflex' },
|
||||||
{ name: 'Aeroflex', slug: '/aeroflex' },
|
{ name: 'Aeroflex', slug: '/aeroflex' },
|
||||||
{ name: 'Maxflex', slug: '/maxflex' },
|
{ name: 'Maxflex', slug: '/maxflex' },
|
||||||
{ name: 'CcooL ฉนวนซีคูล', slug: '/ฉนวนหุ้มท่อ-ccool' },
|
{ name: 'CcooL ฉนวนซีคูล', slug: '/ฉนวนหุ้มท่อ-ccool' },
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ const popularLinks = [
|
|||||||
{ name: 'ปั๊มน้ำ', slug: '/water-pump' },
|
{ name: 'ปั๊มน้ำ', slug: '/water-pump' },
|
||||||
{ name: 'กริลแอร์', slug: '/grilles' },
|
{ name: 'กริลแอร์', slug: '/grilles' },
|
||||||
{ name: 'ตู้ดับเพลิง', slug: '/ตู้ดับเพลิง' },
|
{ name: 'ตู้ดับเพลิง', slug: '/ตู้ดับเพลิง' },
|
||||||
{ name: 'Armaflex', slug: '/armflex' },
|
{ name: 'Armaflex', slug: '/armaflex' },
|
||||||
];
|
];
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ const products = [
|
|||||||
{ name: "Realflex", href: "/realflex", image: "/images/products-cropped/realflex_000C.jpg", category: "อุปกรณ์ดับเพลิง" },
|
{ name: "Realflex", href: "/realflex", image: "/images/products-cropped/realflex_000C.jpg", category: "อุปกรณ์ดับเพลิง" },
|
||||||
|
|
||||||
// ฉนวนหุ้มท่อ (4 items)
|
// ฉนวนหุ้มท่อ (4 items)
|
||||||
{ name: "Armaflex", href: "/armflex", image: "/images/armflex/armaflex-sheet-roll.jpg", category: "ฉนวนหุ้มท่อ" },
|
{ name: "Armaflex", href: "/armaflex", image: "/images/armaflex/armaflex-sheet-roll.jpg", category: "ฉนวนหุ้มท่อ" },
|
||||||
{ name: "Aeroflex", href: "/aeroflex", image: "/images/aeroflex/aerocel-d-al-real.jpg", category: "ฉนวนหุ้มท่อ" },
|
{ name: "Aeroflex", href: "/aeroflex", image: "/images/aeroflex/aerocel-d-al-real.jpg", category: "ฉนวนหุ้มท่อ" },
|
||||||
{ name: "Maxflex", href: "/maxflex", image: "/images/maxflex/maxflex-fsk-foil.jpg", category: "ฉนวนหุ้มท่อ" },
|
{ name: "Maxflex", href: "/maxflex", image: "/images/maxflex/maxflex-fsk-foil.jpg", category: "ฉนวนหุ้มท่อ" },
|
||||||
{ name: "CcooL ฉนวนซีคูล", href: "/ฉนวนหุ้มท่อ-ccool", image: "/images/ccool/ccool-application-hvac.jpg", category: "ฉนวนหุ้มท่อ" },
|
{ name: "CcooL ฉนวนซีคูล", href: "/ฉนวนหุ้มท่อ-ccool", image: "/images/ccool/ccool-application-hvac.jpg", category: "ฉนวนหุ้มท่อ" },
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
|||||||
<BaseLayout title="Armaflex Class Roll ฉนวนยางดำแบบม้วน | ดีล พลัส เทค" description="Armaflex Class 1 ฉนวนยางดำแบบม้วน (Sheet/Roll) สำหรับงานเครื่องเย็น ระบบปรับอากาศ อุณหภูมิใช้งาน -50°C ถึง 105°C มาตรฐาน FM Approved"
|
<BaseLayout title="Armaflex Class Roll ฉนวนยางดำแบบม้วน | ดีล พลัส เทค" description="Armaflex Class 1 ฉนวนยางดำแบบม้วน (Sheet/Roll) สำหรับงานเครื่องเย็น ระบบปรับอากาศ อุณหภูมิใช้งาน -50°C ถึง 105°C มาตรฐาน FM Approved"
|
||||||
product={{
|
product={{
|
||||||
name: 'Armaflex Class Roll ฉนวนยางดำแบบม้วน | ดีล พลัส เทค',
|
name: 'Armaflex Class Roll ฉนวนยางดำแบบม้วน | ดีล พลัส เทค',
|
||||||
image: '/images/armflex/armaflex-sheet-roll.jpg',
|
image: '/images/armaflex/armaflex-sheet-roll.jpg',
|
||||||
brand: 'Armacell',
|
brand: 'Armacell',
|
||||||
}}> <main class="bg-white min-h-screen">
|
}}> <main class="bg-white min-h-screen">
|
||||||
<!-- Hero Section -->
|
<!-- Hero Section -->
|
||||||
@@ -96,7 +96,7 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
|||||||
</div>
|
</div>
|
||||||
<div class="lg:sticky lg:top-24">
|
<div class="lg:sticky lg:top-24">
|
||||||
<div class="rounded-2xl overflow-hidden bg-white/10 p-2 max-w-md mx-auto lg:max-w-none">
|
<div class="rounded-2xl overflow-hidden bg-white/10 p-2 max-w-md mx-auto lg:max-w-none">
|
||||||
<img src="/images/armflex/armaflex-sheet-roll.jpg" alt="Armaflex Class 1 ชนิดม้วน" class="w-full max-w-md mx-auto lg:max-w-none" loading="eager" />
|
<img src="/images/armaflex/armaflex-sheet-roll.jpg" alt="Armaflex Class 1 ชนิดม้วน" class="w-full max-w-md mx-auto lg:max-w-none" loading="eager" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -296,20 +296,20 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
|
|||||||
<p class="text-neutral-600">ภาพสินค้าจริงจากงานติดตั้ง — คลิกเพื่อดูภาพขนาดเต็ม</p>
|
<p class="text-neutral-600">ภาพสินค้าจริงจากงานติดตั้ง — คลิกเพื่อดูภาพขนาดเต็ม</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
|
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
|
||||||
<a href="/images/armflex/gallery-1.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-1" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
|
<a href="/images/armaflex/gallery-1.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-1" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
|
||||||
<img src="/images/armflex/gallery-1.jpg" alt="Armflex ภาพที่ 1" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
|
<img src="/images/armaflex/gallery-1.jpg" alt="Armaflex ภาพที่ 1" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
|
||||||
</a>
|
</a>
|
||||||
<a href="/images/armflex/gallery-2.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-2" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
|
<a href="/images/armaflex/gallery-2.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-2" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
|
||||||
<img src="/images/armflex/gallery-2.jpg" alt="Armflex ภาพที่ 2" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
|
<img src="/images/armaflex/gallery-2.jpg" alt="Armaflex ภาพที่ 2" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
|
||||||
</a>
|
</a>
|
||||||
<a href="/images/armflex/gallery-3.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-3" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
|
<a href="/images/armaflex/gallery-3.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-3" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
|
||||||
<img src="/images/armflex/gallery-3.jpg" alt="Armflex ภาพที่ 3" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
|
<img src="/images/armaflex/gallery-3.jpg" alt="Armaflex ภาพที่ 3" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
|
||||||
</a>
|
</a>
|
||||||
<a href="/images/armflex/gallery-4.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-4" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
|
<a href="/images/armaflex/gallery-4.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-4" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
|
||||||
<img src="/images/armflex/gallery-4.jpg" alt="Armflex ภาพที่ 4" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
|
<img src="/images/armaflex/gallery-4.jpg" alt="Armaflex ภาพที่ 4" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
|
||||||
</a>
|
</a>
|
||||||
<a href="/images/armflex/gallery-5.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-5" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
|
<a href="/images/armaflex/gallery-5.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-5" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
|
||||||
<img src="/images/armflex/gallery-5.jpg" alt="Armflex ภาพที่ 5" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
|
<img src="/images/armaflex/gallery-5.jpg" alt="Armaflex ภาพที่ 5" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||