/* global React, PAPERS, QA_SAMPLES, PaperCard, BrandStamp, PaperTexture, Icon */ const { useState, useEffect, useMemo } = React; function ProductPage({ id, navigate, addToCart, addSample }) { const _LIST = (window._INDIE_CATALOG || window.PAPERS || []); const paper = _LIST.find(p => p.id === id) || _LIST[0]; const gsmOptions = Object.keys(paper.price || {}).filter(k => k !== 'default').sort((a,b) => parseInt(a)-parseInt(b)); const [selectedGsm, setSelectedGsm] = useState(gsmOptions[0] || 'default'); const [qty, setQty] = useState(Math.max(10, paper.moq)); const [activeThumb, setActiveThumb] = useState(0); const [openQa, setOpenQa] = useState(0); const unitPrice = (paper.price && paper.price[selectedGsm]) || paper.price_min || 0; const total = unitPrice * qty; const related = _LIST.filter(p => p.id !== paper.id && (p.brand === paper.brand || p.finish === paper.finish) ).slice(0, 3); return (
{/* Breadcrumb */}
{/* Main product layout */}
{/* LEFT — gallery */}
{paper.name.toUpperCase()} · {paper.gsm}GSM
{[0,1,2,3].map(i => ( ))}
{/* Seen in the wild — mini */}
「 Seen in the wild 」
{["Studio Tertier · Identity, 2025", "Kopikalyan · Packaging", "Selasar Books · Cover"].map((credit, i) => (
{credit}
))}
{/* RIGHT — meta */}
{paper.eco && Eco · FSC} {paper.brandTier === "premium" && Premium}

{paper.name.split(" ")[0]} {paper.name.split(" ").slice(1).join(" ")}

{paper.gsm}gsm · {paper.finish} · {paper.color}

{paper.description}

{/* Spec table */}
Weight
{paper.gsm} gsm
Finish
{paper.finish}
Color tone
{paper.color}
Grain
{paper.grain}
Print methods
Offset · Digital · Letterpress
Origin
{paper.origin}
MOQ
{paper.moq} lembar
{/* Format tabs */}
Gramatur · A3+
{gsmOptions.length > 0 ? gsmOptions.map(g => ( )) : ( )}
Format: A3+ (32 × 45 cm) · pre-cut
{/* Quantity calculator */}
Quantity
setQty(Math.max(paper.moq, Number(e.target.value) || paper.moq))} />
Min. {paper.moq} lembar · A3+ pre-cut
{qty} × Rp {unitPrice.toLocaleString("id-ID")} Rp {total.toLocaleString("id-ID")}
{/* Actions */}
{/* Trust row */}
Fedrigoni Authorized Reseller · paper sampling tersedia · invoice resmi PT. Indie Kreasi Media
{/* Tags */}
{paper.tags.map(t => #{t})}
Ask a question →
{/* PixelIndie cross-link */}
PixelIndie
SISTER COMPANY · PIXELINDIE PRINT SHOP
Mau langsung print {paper.name}? Order via PixelIndie — kertas pre-checked, lead time 2 hari kerja.
{/* Full tech specs expand */}
Full technical specs
Pulp source
{paper.eco ? "100% bamboo (FSC)" : "ECF wood pulp"}
Opacity
{paper.gsm >= 200 ? "98%" : paper.gsm >= 120 ? "94%" : "88%"}
Brightness (CIE)
{paper.color.includes("White") ? "145" : paper.color.includes("Cream") ? "118" : "90"}
Bulk (cm³/g)
1.2
Grain direction
Long grain (standard)
pH
Neutral, acid-free
ISO certification
9706 (long-life document)
Ink absorption
{paper.finish === "Uncoated" ? "High — ideal for offset / letterpress" : "Medium — for offset & digital"}
{/* Related */}

Papers that pair well

See all in {paper.brand} →
{related.map(p => ( navigate("/product/" + p.id)} onAddCart={() => addToCart(p)} onToggleCompare={() => {}} isComparing={false} onRequestSample={(paper) => { addSample(paper); navigate("/sample-request"); }} /> ))}
{/* Used by */}
Used by
studio·tertier KOPIKALYAN selasar. Pulang Books RUMA Atelier
{/* Customer Q&A */}

Customer Q&A

Ask your own →
{QA_SAMPLES.map((qa, i) => (
setOpenQa(openQa === i ? -1 : i)}> Q · {String(i+1).padStart(2, "0")} {qa.q} {openQa === i ? "−" : "+"}
{openQa === i && (
{qa.a} — {qa.by}
)}
))}
); } function shade2(hex, percent) { const h = hex.replace("#", ""); const num = parseInt(h, 16); let r = (num >> 16) + Math.round(255 * percent / 100); let g = ((num >> 8) & 0xff) + Math.round(255 * percent / 100); let b = (num & 0xff) + Math.round(255 * percent / 100); r = Math.max(0, Math.min(255, r)); g = Math.max(0, Math.min(255, g)); b = Math.max(0, Math.min(255, b)); return "#" + ((r << 16) | (g << 8) | b).toString(16).padStart(6, "0"); } window.ProductPage = ProductPage;