📐 Layout Directory
const RATE=6.80;function usd(v){return(v/RATE).toLocaleString('en-US',{maximumFractionDigits:0})} function cny(v){return v.toLocaleString('en-US')}
const allItems=[{sec:"Basic Structure",model:"10ftD+75W",specs:"Dual-side · O:2.95×6.3×2.48m · P:2.95×2.2×2.48m · 18m² · Int:2790×6140mm · H:2260mm · 75mm wall · 4sets/40HC",price:23000,link:"/layout-pdfs/10ft-dual-wing.pdf"},{sec:"Basic Structure",model:"20ftD+75W",specs:"Dual-side · O:5.9×6.3×2.48m · P:5.9×2.2×2.48m · 37m² · Int:5740×6140mm · H:2260mm · 75mm wall · 2sets/40HC",price:25900,link:"/layout-pdfs/20ft-zhao-harmony.pdf"},{sec:"Basic Structure",model:"30ftD+75W",specs:"Dual-side · O:9×6.3×2.48m · P:9×2.2×2.48m · 54m² · Int:8840×6140mm · H:2260mm · 75mm wall · 1set/40HC",price:38900,link:"/layout-pdfs/30ft-2room.png"},{sec:"Basic Structure",model:"40ftD+75W",specs:"Dual-side · O:11.8×6.3×2.48m · P:11.8×2.2×2.48m · 74m² · Int:11640×6140mm · H:2260mm · 75mm wall · 1set/40HC",price:51700,link:"/layout-pdfs/40ft-tian-2bed1kitchen.pdf"},{sec:"Basic Structure",model:"20ftS+75W",specs:"Single-side · O:5.9×4.25×2.48m · P:5.9×2.2×2.48m · 24.8m² · Int:5740×4040mm · H:2260mm · 75mm wall · 2sets/40HC",price:21900,link:"/layout-pdfs/20ft-fu-single-wing.pdf"},{sec:"Basic Structure",model:"30ftS+75W",specs:"Single-side · O:9×4.25×2.48m · P:9×2.2×2.48m · 37.8m² · Int:8840×4040mm · H:2260mm · 75mm wall · 1set/40HC",price:33900,link:"/layout-pdfs/30ft-song-single-wing.pdf"},{sec:"Basic Structure",model:"40ftS+75W",specs:"Single-side · O:11.8×4.25×2.48m · P:11.8×2.2×2.48m · 49.5m² · Int:11640×4040mm · H:2260mm · 75mm wall · 1set/40HC",price:45700,link:"/layout-pdfs/40ft-single-wing.pdf"},{sec:"Basic Structure",model:"20ftDN(700)+75W",specs:"Dual 700mm · O:5.9×4.8×2.48m · P:5.9×0.7×2.48m · 49.5m² · Int:5740×4640mm · H:2260mm · 75mm wall · 6sets/40HC",price:24100,link:""},{sec:"Basic Structure",model:"30ftDN(700)+75W",specs:"Dual 700mm · O:9×4.8×2.48m · P:9×0.7×2.48m · 49.5m² · Int:5740×4640mm · H:2260mm · 75mm wall · 3sets/40HC",price:35400,link:"/layout-pdfs/30ft-yin-700mm.pdf"},{sec:"Basic Structure",model:"40ftDN(700)+75W",specs:"Dual 700mm · O:11.8×4.8×2.48m · P:9×0.7×2.48m · 49.5m² · Int:5740×4640mm · H:2260mm · 75mm wall · 3sets/40HC",price:48300,link:"/layout-pdfs/40ft-dual-700mm.pdf"},{sec:"Enhanced Insulation",model:"20ftD+100W",specs:"100mm wall · O:5.9×6.3×2.48m · P:5.9×2.2×2.48m · 37m² · Int:5740×6140mm · H:2260mm · 2sets/40HC",price:31600,link:"/layout-pdfs/100mm-20ft-dual.pdf"},{sec:"Enhanced Insulation",model:"30ftD+100W",specs:"100mm wall · O:9×6.3×2.48m · P:9×2.2×2.48m · 54m² · Int:8800×6100mm · H:2240mm · 1set/40HC",price:45800,link:"/layout-pdfs/100mm-30ft-dual.pdf"},{sec:"Enhanced Insulation",model:"40ftD+100W",specs:"100mm wall · O:11.8×6.3×2.48m · P:11.8×2.2×2.48m · 74m² · Int:11600×6100mm · H:2240mm · 1set/40HC",price:59800,link:""},{sec:"Enhanced Insulation",model:"20ftD++100PUW",specs:"100mm PU · O:11.8×6.3×2.48m · P:11.8×2.2×2.48m · 74m² · Int:11600×6100mm · H:2240mm · 1set/40HC",price:37400,link:"/layout-pdfs/100mm-20ft-dual.pdf"},{sec:"Enhanced Insulation",model:"30ftD++100PUW",specs:"100mm PU · O:9×6.3×2.48m · P:9×2.2×2.48m · 54m² · Int:8800×6100mm · H:2240mm · 1set/40HC",price:53800,link:"/layout-pdfs/100mm-30ft-dual.pdf"},{sec:"Enhanced Insulation",model:"40ftD++100PUW",specs:"100mm PU · O:11.8×6.3×2.48m · P:11.8×2.2×2.48m · 74m² · Int:11600×6100mm · H:2240mm · 1set/40HC",price:69000,link:""},{sec:"Enhanced Insulation",model:"20ftD+75PUW",specs:"75mm PU · O:5.9×6.3×2.48m · P:5.9×2.2×2.48m · 37m² · Int:5740×6140mm · H:2260mm · 2sets/40HC",price:32800,link:"/layout-pdfs/20ft-zhao-harmony.pdf"},{sec:"Enhanced Insulation",model:"30ftD+75PUW",specs:"75mm PU · O:9×6.3×2.48m · P:9×2.2×2.48m · 54m² · Int:8840×6140mm · H:2260mm · 1set/40HC",price:49200,link:"/layout-pdfs/30ft-2room.png"},{sec:"Enhanced Insulation",model:"40ftD+75PUW",specs:"75mm PU · O:11.8×6.3×2.48m · P:11.8×2.2×2.48m · 74m² · Int:11640×6140mm · H:2260mm · 1set/40HC",price:65600,link:"/layout-pdfs/40ft-tian-2bed1kitchen.pdf"},{sec:"Space Enhanced (Open-top)",model:"20ftD+75W+H",specs:"Open-top · O:5.6×6.79×2.99m · P:5.6×2×2.99m · 38m² · Int:5440×6630mm · H:2800mm · 75mm wall · 2sets/40OT",price:31600,link:"/layout-pdfs/20ft-open-top.pdf"},{sec:"Space Enhanced (Open-top)",model:"30ftD+75W+H",specs:"Open-top · O:9×6.79×2.99m · P:9×2×2.99m · 61m² · Int:8840×6630mm · H:2800mm · 75mm wall · 1set/40OT",price:47100,link:"/layout-pdfs/30ft-open-top.pdf"},{sec:"Space Enhanced (Open-top)",model:"40ftD+75W+H",specs:"Open-top · O:11.2×6.79×2.99m · P:11.2×2×2.99m · 76m² · Int:11040×6630mm · H:2800mm · 75mm wall · 1set/40OT",price:63300,link:"/layout-pdfs/40ft-open-top.pdf"},{sec:"Flat Roof Series",model:"20ft FR D-Wing",specs:"Dual-side · O:5.9×6.49×2.48m · P:5.9×2.2×2.48m · 38m² · Int:5740×6330mm · H:2300mm · 75mm wall · 2sets/40HC",price:28800,link:"/layout-pdfs/20ft-flat-dual-wing.pdf"},{sec:"Flat Roof Series",model:"30ft FR D-Wing",specs:"Dual-side · O:9×6.49×2.48m · P:9×2.2×2.48m · 58.4m² · Int:8840×6330mm · H:2300mm · 75mm wall · 1set/40HC",price:44000,link:"/layout-pdfs/30ft-flat-product.pdf"},{sec:"Flat Roof Series",model:"40ft FR D-Wing",specs:"Dual-side · O:11.8×6.49×2.48m · P:11.8×2.2×2.48m · 76.5m² · Int:11640×6330mm · H:2300mm · 75mm wall · 1set/40HC",price:57500,link:"/layout-pdfs/40ft-flat-office.pdf"},{sec:"Flat Roof Series",model:"20ft FR S-Wing",specs:"Single-side · O:5.9×4.34×2.48m · P:5.9×2.2×2.48m · 25.6m² · Int:5740×4185mm · H:2300mm · 75mm wall · 2sets/40HC",price:24800,link:"/layout-pdfs/20ft-han-flat-single.pdf"},{sec:"Flat Roof Series",model:"30ft FR S-Wing",specs:"Single-side · O:9×4.34×2.48m · P:9×2.2×2.48m · 39m² · Int:8840×4185mm · H:2300mm · 75mm wall · 1set/40HC",price:38200,link:"/layout-pdfs/30ft-hy-flat-single.pdf"},{sec:"Flat Roof Series",model:"40ft FR S-Wing",specs:"Single-side · O:11.8×4.34×2.48m · P:11.8×2.2×2.48m · 51m² · Int:11640×4185mm · H:2300mm · 75mm wall · 1set/40HC",price:49500,link:""},{sec:"Flat Roof Series",model:"20ft FR D-Wing H2.4",specs:"Dual-side · O:5.9×6.65×2.56m · P:5.9×2×2.56m · 39.2m² · Int:5740×6490mm · H:2400mm · 75mm wall · 2sets/40HC",price:31000,link:"/layout-pdfs/20ft-flat-2bed.pdf"},{sec:"Flat Roof Series",model:"30ft FR D-Wing H2.4",specs:"Dual-side · O:9×6.65×2.56m · P:9×2×2.56m · 60m² · Int:8840×6330mm · H:2400mm · 75mm wall · 1set/40HC",price:47400,link:"/layout-pdfs/30ft-2bed-2bath.pdf"},{sec:"Flat Roof Series",model:"40ft FR D-Wing H2.4",specs:"Dual-side · O:11.8×6.65×2.56m · P:11.8×2×2.56m · 78.5m² · Int:11640×6330mm · H:2400mm · 75mm wall · 1set/40HC",price:62100,link:"/layout-pdfs/40ft-flat-1floor.pdf"},];
function renderPanel(){const el=document.getElementById('panelBody');let html='';let cur='';for(const d of allItems){if(d.sec!==cur){cur=d.sec;html+='
'} const hl=!!d.link;html+='
'+'
'+'
'+(hl?'
':'
')+'
'} el.innerHTML=html}
let currentModel='';function selectItem(el){const link=el.dataset.link;const model=el.dataset.model;if(!link)return;document.querySelectorAll('.item').forEach(i=>i.classList.remove('active'));el.classList.add('active');showLayout(link,model);closePanel();hideHint()}
function hideHint(){document.getElementById('centerHint').classList.add('hidden');const fab=document.getElementById('catalogFab');if(fab){const d=fab.querySelector('.fab-dot');if(d)d.style.display='none';const p=fab.querySelector('.fab-pulse');if(p)p.style.display='none'}}
function showLayout(link,model){currentModel=model;document.getElementById('activeModel').textContent=model;const v=document.getElementById('viewer');const isImg=link.match(/\.(png|jpg|jpeg|gif|webp)/i);v.innerHTML='';const imgOrIframe=document.createElement(isImg?'img':'iframe');if(isImg){imgOrIframe.src=link;imgOrIframe.alt=model;imgOrIframe.style='width:100%;height:100%;object-fit:contain'}else{imgOrIframe.src=link;imgOrIframe.style='width:100%;height:100%;border:none'} v.appendChild(imgOrIframe);const d=allItems.find(x=>x.model===model&&x.link===link);const ov=document.createElement('div');ov.className='spec-overlay show';ov.id='specOverlay';ov.innerHTML='
'+'
'+'
'+'
';v.appendChild(ov)}
function togglePanel(){const p=document.getElementById('panel');const o=document.getElementById('panelOverlay');const open=p.classList.contains('open');p.classList.toggle('open',!open);o.classList.toggle('show',!open)}
function closePanel(){document.getElementById('panel').classList.remove('open');document.getElementById('panelOverlay').classList.remove('show')}
renderPanel();const first=document.querySelector('.item[data-link]:not([data-link=""])');if(first)selectItem(first);