// ============================================================ // Process page - materials, finishes, and how pieces are chosen // ============================================================ function ProcessPage() { const [activeMaterial, setActiveMaterial] = useState(null); const [activeFinish, setActiveFinish] = useState(null); return (
Materials + finishes

Pick the right glow, feel and finish.

Every piece starts with the material. The finish decides whether it stays paintable, arrives color-finished, or carries glow-in-the-dark features.

{MATERIAL_GUIDE.map((material) => ( ))}
Finish menu

What gets applied after printing.

The same model can stay paintable, arrive color-finished, or carry the FreshWave glow treatment.

{FINISH_GUIDE.map((finish) => ( ))}
Need help picking?

You can just tell us what it needs to survive.

Shelf display, fidget toy, gift, cosplay detail, moving hinge, tiny replica, full glow piece - that is enough for us to recommend the right material and finish.

{activeMaterial && setActiveMaterial(null)} />} {activeFinish && setActiveFinish(null)} />}
); } function MaterialGuideCard({ material, onOpen }) { const color = accentHsl(material.accent); return ( ); } function MaterialDetailModal({ material, onClose }) { useEffect(() => { const onKey = (e) => { if (e.key === 'Escape') onClose(); }; document.addEventListener('keydown', onKey); document.body.style.overflow = 'hidden'; return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = ''; }; }, [onClose]); const color = accentHsl(material.accent); return (
e.stopPropagation()} >
{material.feel}

{material.name}

{material.bestFor}

{material.finish}

{(material.details || []).map((detail, idx) => (
{String(idx + 1).padStart(2, '0')}

{detail}

))}
); } function FinishGuideCard({ finish, onOpen }) { const color = accentHsl(finish.accent); return ( ); } function FinishDetailModal({ finish, onClose }) { useEffect(() => { const onKey = (e) => { if (e.key === 'Escape') onClose(); }; document.addEventListener('keydown', onKey); document.body.style.overflow = 'hidden'; return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = ''; }; }, [onClose]); const color = accentHsl(finish.accent); return (
e.stopPropagation()} >
{finish.cost}

{finish.name}

{finish.description}

{(finish.details || []).map((detail, idx) => (
{String(idx + 1).padStart(2, '0')}

{detail}

))}
); } Object.assign(window, { ProcessPage });