/* global React, Icons, Badge, Btn, Pill, Meter, Score, Stat, Eyebrow */ const { useState } = React; /* ========================================================================= GEAR LAB — review listing + scorecard ========================================================================= */ const GEAR = [ { id: 1, name: 'DJI Osmo Pocket 3', cat: 'Camera', tier: 'Pro', price: 519, score: 9.1, rel: 9.4, heat: 8.0, batt: 8.6, ease: 9.2, irl: 9.5, badge: 'tested', date: 'May 12 ’26' }, { id: 2, name: 'Sony ZV-1F', cat: 'Camera', tier: 'Mid', price: 449, score: 8.2, rel: 8.0, heat: 6.5, batt: 7.0, ease: 8.4, irl: 8.0, badge: null, date: 'Apr 28 ’26' }, { id: 3, name: 'GoPro Hero 13', cat: 'Camera', tier: 'Mid', price: 399, score: 8.8, rel: 9.0, heat: 7.4, batt: 7.2, ease: 8.9, irl: 9.2, badge: 'tested', date: 'May 06 ’26' }, { id: 4, name: 'Rode Wireless GO 3', cat: 'Audio', tier: 'Pro', price: 349, score: 9.0, rel: 9.5, heat: 9.6, batt: 8.4, ease: 9.0, irl: 9.4, badge: 'tested', date: 'Apr 22 ’26' }, { id: 5, name: 'DJI Mic 2', cat: 'Audio', tier: 'Mid', price: 349, score: 8.7, rel: 8.8, heat: 9.2, batt: 8.0, ease: 9.4, irl: 9.0, badge: null, date: 'May 02 ’26' }, { id: 6, name: 'Peplink MAX BR1 5G', cat: 'Router', tier: 'Pro', price: 1499,score: 9.4, rel: 9.6, heat: 7.0, batt: 6.4, ease: 7.0, irl: 9.7, badge: 'tested', date: 'May 09 ’26' }, { id: 7, name: 'LiveU Solo Pro', cat: 'Router', tier: 'Pro', price: 1499,score: 9.2, rel: 9.3, heat: 6.8, batt: 6.0, ease: 8.5, irl: 9.5, badge: 'updated', date: 'May 10 ’26' }, { id: 8, name: 'GL.iNet Brume 2', cat: 'Router', tier: 'Budget',price: 159,score: 7.6, rel: 7.5, heat: 8.0, batt: 7.6, ease: 6.5, irl: 7.4, badge: null, date: 'Apr 14 ’26' }, { id: 9, name: 'Omnicharge Omni 20+', cat: 'Power', tier: 'Pro', price: 199, score: 8.8, rel: 9.0, heat: 8.4, batt: 9.6, ease: 9.0, irl: 9.0, badge: 'tested', date: 'Apr 30 ’26' }, { id: 10, name: 'Anker 737 PowerCore', cat: 'Power', tier: 'Mid', price: 149, score: 9.1, rel: 9.2, heat: 8.6, batt: 9.5, ease: 9.4, irl: 8.8, badge: 'updated', date: 'May 04 ’26' }, { id: 11, name: 'Gunrun Mark V backpack', cat: 'Pack', tier: 'Pro', price: 749, score: 9.6, rel: 9.7, heat: 9.0, batt: 9.0, ease: 8.8, irl: 9.8, badge: 'tested', date: 'May 08 ’26' }, { id: 12, name: 'DJI RS 4', cat: 'Gimbal', tier: 'Pro', price: 599, score: 8.9, rel: 9.0, heat: 8.5, batt: 7.6, ease: 8.0, irl: 8.4, badge: null, date: 'Apr 19 ’26' }, ]; const CATEGORIES = ['All', 'Camera', 'Audio', 'Router', 'Power', 'Pack', 'Gimbal']; const TIERS = ['All', 'Budget', 'Mid', 'Pro']; const GearLabPage = () => { const [cat, setCat] = useState('All'); const [tier, setTier] = useState('All'); const [sort, setSort] = useState('score'); const filtered = GEAR .filter(g => cat === 'All' || g.cat === cat) .filter(g => tier === 'All' || g.tier === tier) .sort((a, b) => { if (sort === 'score') return b.score - a.score; if (sort === 'price') return a.price - b.price; if (sort === 'name') return a.name.localeCompare(b.name); return 0; }); const featured = filtered[0]; return (
{/* HEADER */}
Reviews · Lab-tested · 184 items

The Gear Lab.

Every piece scored on the same six axes: reliability, heat, battery impact, setup difficulty, price-to-value, and IRL suitability. Affiliates disclosed on every line. Rankings never paid for.

Lab tested Weekly
{/* FILTER BAR */}
Category
{CATEGORIES.map(c => setCat(c)}>{c})}
Tier
{TIERS.map(t => setTier(t)}>{t})}
SORT
{/* FEATURED SCORECARD */} {featured && (
Lab pick Updated {featured.date} / {featured.cat.toUpperCase()}

{featured.name}

Best-in-class for what it does. We ran it through 18 lab cycles and 9 in-the-wild test logs. Notes below — not marketing copy.

{/* "Read full review" lands when MDX reviews ship in Phase 4. For now: scroll to the comparison table on the same page. */} document.querySelector('.tbl')?.scrollIntoView({ behavior: 'smooth' })}> See full scorecard View affiliate disclosure
{/* product placeholder */}
Lab scorecard
{featured.score} / 10
{[ ['Reliability', featured.rel], ['Heat under load', featured.heat], ['Battery impact', featured.batt], ['Setup difficulty', featured.ease], ['IRL suitability', featured.irl], ].map(([k, v]) => (
{k} {v.toFixed(1)}
= 8 ? '' : v >= 6.5 ? 'warn' : 'bad'} />
))}
Street price
${featured.price}
Test cycles
18
For
{featured.tier}
)} {/* COMPARISON TABLE */}
All {filtered.length} results {/* View toggle (Table / Cards) hidden until Phase 2 implements the cards layout — was a dead toggle before. */}
{filtered.map((g, i) => ( ))}
Product Category Reliability IRL Battery Price Score
{(i + 1).toString().padStart(2, '0')}
{g.cat === 'Camera' && } {g.cat === 'Audio' && } {g.cat === 'Router' && } {g.cat === 'Power' && } {g.cat === 'Pack' && } {g.cat === 'Gimbal' && }
{g.name}
{g.badge && {g.badge === 'tested' ? 'Tested' : 'Updated'}} {g.date.toUpperCase()}
{g.cat} · {g.tier}
= 8 ? '' : g.rel >= 7 ? 'warn' : 'bad'} /> {g.rel.toFixed(1)}
= 8 ? '' : g.irl >= 7 ? 'warn' : 'bad'} /> {g.irl.toFixed(1)}
{g.batt.toFixed(1)} ${g.price.toLocaleString()}
SHOWING 1–{filtered.length} OF {filtered.length} AFFILIATE DISCLOSURE → ALL LINKS / NO PAID PLACEMENT
); }; window.GearLabPage = GearLabPage;