// KioskFrame — floor-standing kiosk device bezel for a 1080×1920 portrait screen. // Renders the kiosk screen inside a real-feeling enclosure with pedestal, shadow, // and optional ambient floor plane. Children are rendered at the native 1080×1920 // resolution; the frame scales with a CSS transform so everything stays crisp. function KioskFrame({ children, showPedestal=true, showFloor=true, scale=1, scene='lobby' }) { // Device dimensions (physical proportions) const screenW = 1080; const screenH = 1920; const bezel = 44; const deviceW = screenW + bezel*2; const deviceH = screenH + bezel*2; const pedestalH = showPedestal ? 520 : 0; const totalH = deviceH + pedestalH; const totalW = Math.max(deviceW + 200, 1400); const scenes = { lobby: { bg: 'radial-gradient(ellipse at 50% 20%, #2b2620 0%, #13100d 55%, #080706 100%)', floor: 'linear-gradient(180deg, #1a1613 0%, #0a0806 100%)', }, studio: { bg: 'radial-gradient(ellipse at 50% 30%, #1a2430 0%, #0b1118 60%, #05080c 100%)', floor: 'linear-gradient(180deg, #0d131b 0%, #05080c 100%)', }, light: { bg: 'radial-gradient(ellipse at 50% 25%, #e8e4de 0%, #c9c3bb 55%, #a6a098 100%)', floor: 'linear-gradient(180deg, #b8b2a8 0%, #8a857d 100%)', }, }; const palette = scenes[scene] || scenes.lobby; return (
{/* Ceiling wash */}
{/* Floor plane */} {showFloor && (
{/* subtle perspective grid */}
)} {/* Soft spotlight behind device */}
{/* Device stack */}
{/* Screen + bezel */}
{/* tiny camera */}
{/* screen */}
{children} {/* subtle screen glare */}
{/* Pedestal */} {showPedestal && ( <> {/* neck */}
{/* column */}
{/* base */}
{/* contact shadow */}
)}
); } Object.assign(window, { KioskFrame });