/* ============================================================
TRYONME Landing — Shared components
============================================================ */
const { useState, useEffect, useRef, useCallback, useMemo } = React;
function Eyebrow({ children, color }) {
return
{children}
;
}
function Stamp({ text, size = 100, rotate = -1.5, color, under }) {
return (
{text}
);
}
function Misreg({ text, className = "", style, color = "blue" }) {
return (
{text}
);
}
/* Halftone portrait — canvas-rendered placeholder for the phone screen */
function HalftonePortrait({ w = 300, h = 380, highlight, shadow, seed = 7 }) {
const ref = useRef(null);
useEffect(() => {
const c = ref.current;
if (!c) return;
const dpr = window.devicePixelRatio || 1;
c.width = w * dpr;
c.height = h * dpr;
c.style.width = w + "px";
c.style.height = h + "px";
const ctx = c.getContext("2d");
ctx.scale(dpr, dpr);
ctx.clearRect(0, 0, w, h);
const cellSize = 6;
const cols = Math.floor(w / cellSize);
const rows = Math.floor(h / cellSize);
let s = seed;
const rand = () => { s = (s * 9301 + 49297) % 233280; return s / 233280; };
for (let r = 0; r < rows; r++) {
for (let c2 = 0; c2 < cols; c2++) {
const cx = c2 * cellSize + cellSize / 2;
const cy = r * cellSize + cellSize / 2;
const dx = (cx - w / 2) / w;
const dy = (cy - h * 0.42) / h;
const bodyY = (cy - h * 0.55) / h;
const headDist = Math.sqrt(dx * dx + (dy * 1.3) ** 2);
const head = Math.max(0, 1 - headDist * 3.4);
const torso = Math.max(0, 1 - Math.sqrt((dx * 1.4) ** 2 + (bodyY * 0.9) ** 2) * 2.4) * (cy > h * 0.45 ? 1 : 0.0);
const density = Math.min(1, head + torso * 0.85);
const radius = density * cellSize * 0.46;
if (radius > 0.4) {
const useShadow = rand() < density * 0.55;
ctx.fillStyle = useShadow ? shadow : highlight;
ctx.beginPath();
ctx.arc(cx, cy, radius, 0, Math.PI * 2);
ctx.fill();
}
}
}
}, [w, h, highlight, shadow, seed]);
return ;
}
window.Eyebrow = Eyebrow;
window.Stamp = Stamp;
window.Misreg = Misreg;
window.HalftonePortrait = HalftonePortrait;