/* 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 (
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.
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.
| Product | Category | Reliability | IRL | Battery | Price | Score | |
|---|---|---|---|---|---|---|---|
| {(i + 1).toString().padStart(2, '0')} |
{g.cat === 'Camera' &&
{g.name}
{g.badge &&
|
{g.cat} · {g.tier} |
|
|
{g.batt.toFixed(1)} | ${g.price.toLocaleString()} |