// THE GUN CASE — Pelican-style hard case + THRAXEL App + Music Box const SCENE_PRESETS = [ { id:'everyday', name:'Everyday Warm', colors:['#FFB347'], pattern:'solid' }, { id:'gameday', name:'Game Day', colors:['#C8102E','#FFFFFF'], pattern:'alt' }, { id:'wedding', name:'Wedding', colors:['#FFE9C8'], pattern:'solid' }, { id:'christmas', name:'Christmas', colors:['#C8102E','#0E8C3A'], pattern:'alt' }, { id:'july4', name:'July 4th', colors:['#C8102E','#FFFFFF','#1A4DCF'], pattern:'march' }, { id:'halloween', name:'Halloween', colors:['#FF7A00','#7A2DCF'], pattern:'pulse' }, ]; // Pelican-style hard case rendered with CSS — long, flat, hinged function PelicanCase({ caseOpen, setCaseOpen, mode, color, brightness, warmth, dim, preset, audioLevels, beatPulse }){ const [t, setT] = useState(0); useEffect(() => { let raf; const tick = () => { setT(performance.now()); raf = requestAnimationFrame(tick); }; raf = requestAnimationFrame(tick); return () => cancelAnimationFrame(raf); }, []); const stripColor = (i) => { if (mode === 'solid') return { c: color, glow: brightness/100 }; if (mode === 'warm') { const k = warmth / 100; const r = Math.round(255*(1-k*0.4)); const g = Math.round(180 + k*70); const b = Math.round(95 + k*155); return { c: `rgb(${r},${g},${b})`, glow: dim/100 }; } if (mode === 'preset') { const p = SCENE_PRESETS.find(x=>x.id===preset) || SCENE_PRESETS[0]; const phase = Math.floor(t/450); let c; if (p.pattern==='solid') c = p.colors[0]; else if (p.pattern==='alt') c = p.colors[(i+phase)%p.colors.length]; else if (p.pattern==='march') c = p.colors[(i + Math.floor(t/300))%p.colors.length]; else c = p.colors[i%p.colors.length]; const a = p.pattern==='pulse' ? 0.5 + 0.5*Math.sin(t/300 + i) : 0.9; return { c, glow: a }; } if (mode === 'music') { const lvl = audioLevels[i] ?? beatPulse; const hue = 350 + lvl*30; return { c: `hsl(${hue}, 90%, ${30 + lvl*40}%)`, glow: 0.2 + lvl*0.9 }; } return { c:'#FFB347', glow:0.7 }; }; // Latches — Pelican press-and-pull style const Latch = ({ left, right }) => (
); const Wheel = ({ left, right }) => (
); return (
{/* atmospheric idle */} {!caseOpen && (
)} {mode==='music' && caseOpen && (
)} {/* CASE BODY — Pelican Air 1745 proportions */}
{/* Drop shadow under case */}
{/* Bottom shell */}
{/* Top edge highlight rim */}
{/* Vertical reinforcement ribs - more pelican-like */} {[0.12, 0.22, 0.32, 0.42, 0.58, 0.68, 0.78, 0.88].map((p,i) => (
))} {/* Bottom rib edge highlights between ribs */} {[0.17, 0.27, 0.37, 0.5, 0.63, 0.73, 0.83].map((p,i) => (
))} {/* Corner bumpers — pelican has rounded reinforced corners */}
{/* Wheels at base corners */} {/* INTERIOR */}
{/* egg-crate foam */}
{/* 4 strips */}
{[0,1,2,3].map(i => { const { c, glow } = stripColor(i); const visible = caseOpen; return (
{Array.from({length:32}).map((_,j)=>(
))}
); })}
{/* Top shell (lid) */}
{/* Top edge highlight */}
{/* Recessed center panel — perfectly centered THRAXEL with gold illumination */}
THRAXEL
{/* Vertical ribs on lid - skip the center panel zone (24%-76%) */} {[0.06, 0.12, 0.18, 0.82, 0.88, 0.94].map((p,i) => (
))} {/* Corner bumpers */}
{/* Recessed handle on top edge */}
{/* latches — 4 stainless press-and-pull */}
{/* hinge line */}
{/* tap to open */} {!caseOpen && ( )} {caseOpen && ( )}
); } // THRAXEL App in a phone frame function ThraxelApp({ mode, setMode, color, setColor, brightness, setBrightness, warmth, setWarmth, dim, setDim, preset, setPreset, micState, requestMic, beatTap }) { const tabs = [ { id:'solid', label:'Color' }, { id:'warm', label:'Warm' }, { id:'preset', label:'Scenes' }, { id:'music', label:'Music' }, ]; return (
{/* Phone bezel */}
{/* Notch */}
{/* Screen */}
{/* Status bar */}
9:41
{/* App header */}
THRAXEL
CONTROLLER
ONLINE
{/* Tabs */}
{tabs.map(t => ( ))}
{mode==='solid' && (
{['#FFB347','#FFFFFF','#C8102E','#FF7A00','#1A4DCF','#0E8C3A','#7A2DCF','#FFE9C8'].map(c=>(
setColor(e.target.value)} style={{width:'100%',height:32,padding:0,border:'1px solid #2a2a2e',background:'#0a0a0a'}}/>
)} {mode==='warm' && (
RGBWW PREVIEW
)} {mode==='preset' && (
{SCENE_PRESETS.map(p=>( ))}
)} {mode==='music' && (
{ micState==='live' ? 'Mic Live' : micState==='denied' ? 'Mic Denied' : micState==='requesting' ? 'Requesting…' : 'Tap to Enable' }
{ micState==='live' ? 'Strips reactive to ambient audio' : micState==='denied' ? 'Use TAP TO BEAT' : 'Allow mic in browser' }
{micState!=='live' && }
)}
4 STRIPS · 128 LEDs v3.2.1
iOS · Android · Web
); } function Slider({ label, value, onChange, unit='', hintLeft, hintRight }){ return (
onChange(+e.target.value)} style={{accentColor:'var(--thraxel-red)'}}/> {(hintLeft||hintRight) && (
{hintLeft}{hintRight}
)}
); } function GunCaseSection() { const [caseOpen, setCaseOpen] = useState(false); const [mode, setMode] = useState('preset'); const [color, setColor] = useState('#C8102E'); const [brightness, setBrightness] = useState(85); const [warmth, setWarmth] = useState(20); const [dim, setDim] = useState(80); const [preset, setPreset] = useState('everyday'); const [micState, setMicState] = useState('idle'); const [audioLevels, setAudioLevels] = useState([0,0,0,0]); const [beatPulse, setBeatPulse] = useState(0); const audioRef = useRef(null); const requestMic = async () => { setMicState('requesting'); try { const stream = await navigator.mediaDevices.getUserMedia({ audio:true }); const ctx = new (window.AudioContext||window.webkitAudioContext)(); const src = ctx.createMediaStreamSource(stream); const analyser = ctx.createAnalyser(); analyser.fftSize = 64; src.connect(analyser); audioRef.current = { ctx, analyser, data: new Uint8Array(analyser.frequencyBinCount) }; setMicState('live'); const tick = () => { if (!audioRef.current) return; analyser.getByteFrequencyData(audioRef.current.data); const bins = audioRef.current.data; const n = bins.length; const lvls = [0,1,2,3].map(i => { let s=0,c=0; for (let j=Math.floor(i*n/4); j { setBeatPulse(1); setAudioLevels([Math.random(),Math.random(),Math.random(),Math.random()]); setTimeout(()=>setBeatPulse(0.2),120); setTimeout(()=>setBeatPulse(0),350); }; return (
THE DEMO WE BRING TO YOUR DRIVEWAY
Open the case.
Light up your world.

This is the same hard case we walk into your driveway with. Four RGBWW strips, controlled live from the Thraxel app. Tap to open. Grant mic access for Music Box.

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