);
}
function shade(hex, amt){
// amt -1..1. Simple HSL-ish mix towards black/white via channel blending.
const c = hex.replace('#','');
const n = parseInt(c.length===3 ? c.split('').map(x=>x+x).join('') : c, 16);
let r = (n>>16)&255, g=(n>>8)&255, b=n&255;
if(amt >= 0){ r = Math.round(r + (255-r)*amt); g = Math.round(g + (255-g)*amt); b = Math.round(b + (255-b)*amt); }
else { const k = 1+amt; r = Math.round(r*k); g = Math.round(g*k); b = Math.round(b*k); }
return '#'+[r,g,b].map(v=>v.toString(16).padStart(2,'0')).join('');
}
// Simple striped placeholder for "photo not yet taken" cases
function PhotoPh({label='photo', aspect='4/5', tone='#ecdcc4'}){
return (