// ============================================================ // Series, Shop, Product, App, About pages // ============================================================ const { useState } = React; // ---- Product Card ---- function ProductCard({ product, onClick, onAdd }) { const series = getSeries(product.series); return (
{ e.currentTarget.style.transform = 'translateY(-3px)'; e.currentTarget.style.borderColor = 'var(--line-strong)'; }} onMouseLeave={(e) => { e.currentTarget.style.transform = 'translateY(0)'; e.currentTarget.style.borderColor = 'var(--line)'; }} >
{product.badge && ( {product.badge} )} {series.name} {product.name}
{product.sku}

{product.name}

{product.short}

{product.size} {product.color}
From {formatPrice(product.price)}
); } // ---- Series Page ---- function SeriesPage({ seriesId, navigate, onAdd }) { const s = getSeries(seriesId); const items = productsInSeries(seriesId); const [mode, setMode] = useState(seriesId === 'lumen' ? 'mono' : '12bit'); if (!s) return null; return ( <> {/* Hero */}
navigate('home')}>HOME / SERIES · {s.name.toUpperCase()}
{s.badge}

{s.name}

{s.tagline}

{s.description}

Size range{s.sizeRange}
Pitch{s.pitch}
Color{s.color.join(' / ')}
{/* Use cases */}

Where {s.name} shines

Recommended scenarios
{s.use.map((u, i) => (
0{i+1}
{u}
))}
{/* Models */}
In this series

{items.length} {items.length === 1 ? 'model' : 'models'} available

{items.map(p => navigate(`product-${p.id}`)} onAdd={onAdd}/>)}
); } function SeriesNav({ current, navigate }) { const idx = SERIES.findIndex(s => s.id === current); const prev = SERIES[(idx - 1 + SERIES.length) % SERIES.length]; const next = SERIES[(idx + 1) % SERIES.length]; return (
{[prev, next].map((s, i) => (
navigate(`series-${s.id}`)}> {i === 0 ? '← Previous' : 'Next →'}

{s.name}

{s.short}

{s.tagline}

))}
); } // ---- Shop Page ---- function ShopPage({ navigate, onAdd }) { const [seriesFilter, setSeriesFilter] = useState('all'); const [sort, setSort] = useState('default'); let items = seriesFilter === 'all' ? PRODUCTS : PRODUCTS.filter(p => p.series === seriesFilter); if (sort === 'low') items = [...items].sort((a,b) => a.price - b.price); if (sort === 'high') items = [...items].sort((a,b) => b.price - a.price); return ( <>
Shop

The full lineup.

Six displays across three series. Free shipping over ₹25,000. 2-year warranty on everything.

{/* Filter bar */}
{[ { id: 'all', label: 'All' }, { id: 'lumen', label: 'Lumen' }, { id: 'chroma', label: 'Chroma' }, { id: 'beacon', label: 'Beacon' }, ].map(f => ( ))}
Sort
{items.map(p => navigate(`product-${p.id}`)} onAdd={onAdd}/>)}
); } // ---- Product Detail ---- function ProductPage({ productId, navigate, onAdd }) { const p = getProduct(productId); const [imgIdx, setImgIdx] = useState(0); const [qty, setQty] = useState(1); const [previewMode, setPreviewMode] = useState(p?.color.includes('Monochrome') ? 'mono' : '12bit'); if (!p) return
Product not found.
; const series = getSeries(p.series); const related = PRODUCTS.filter(x => x.series === p.series && x.id !== p.id).concat(PRODUCTS.filter(x => x.series !== p.series)).slice(0, 3); return ( <>
navigate('shop')}>SHOP / navigate(`series-${p.series}`)}>{series.name.toUpperCase()} / {p.name.toUpperCase()}
{/* Gallery */}
{p.badge && {p.badge}} {series.name}
{p.name}
{p.images.map((img, i) => ( ))}
{/* Live preview */}
Live preview

See what it looks like

{p.color.includes('Monochrome') && setPreviewMode('mono')}>Mono} {(p.color.includes('3-bit color') || p.color === '3-bit color') && setPreviewMode('3bit')}>3-bit} {p.color.includes('full color') && setPreviewMode('12bit')}>12-bit}
{/* Buy column */}
{p.sku}

{p.name}

{p.short}

{formatPrice(p.price)} incl. GST · free shipping
{/* Key specs at a glance */}
{[ { k: 'Size', v: p.size }, { k: 'Resolution', v: p.resolution }, { k: 'Color depth', v: p.color }, { k: 'Pixel pitch', v: p.pitch }, ].map((s, i) => (
{s.k}
{s.v}
))}
{/* Quantity + add */}
{qty}
{/* Trust bar */}
{[ { i: , t: 'Free shipping pan-India over ₹25,000' }, { i: , t: '2-year manufacturer warranty + 7-day return' }, { i: , t: 'Android & web app included free for life' }, ].map((x, i) => (
{x.i}{x.t}
))}
{/* Full specs */}
Specifications

The full data sheet

{/* Related */}
Also worth a look

You may also like

{related.map(r => { navigate(`product-${r.id}`); window.scrollTo(0,0); }} onAdd={onAdd}/>)}
); } function PreviewModeBtn({ current, val, onClick, children }) { return ( ); } function SpecGroup({ title, rows }) { return (

{title}

{rows.map(([k, v], i) => )}
{k}{v}
); } // ---- App showcase ---- function AppPage({ navigate }) { const [pickedColor, setPickedColor] = useState('#E13F92'); const [text, setText] = useState('HELLO'); const [mode, setMode] = useState('12bit'); return ( <>
VividPix Control

One app.
Every display.

Type a message. Drop a GIF. Schedule it for next Tuesday at 6pm. The app pairs with every panel in your account and pushes content over Wi-Fi in under a second.

{['Text in 220+ languages with inline emoji', 'GIFs and images render natively, no transcoding', 'Schedule, loop, or trigger on a timer', 'Group displays into zones and push to all at once'].map((t, i) => (
{t}
))}
{/* Mock phone */}
Display
Counter · Chroma 30
● Live
Message
setText(e.target.value.toUpperCase())} maxLength={20}/>
Color
{['#E13F92', '#7AE0B0', '#F2B85A', '#6FB8F2', '#FFFFFF'].map(c => (
Mode
{[['mono', 'Mono'], ['3bit', '3-bit'], ['12bit', '12-bit']].map(([v, l]) => ( ))}
); } // ---- About ---- function AboutPage() { return ( <>
About VividPix

We build the displays
that small shops deserve.

VividPix is a Bengaluru-based hardware studio. Since 2019 we've shipped over 12,000 LED matrix displays to shopkeepers, restaurateurs, places of worship and event planners — most of whom had never owned a programmable sign before.

{[ { k: '12,000+', v: 'Displays shipped' }, { k: '8 yrs', v: 'Average uptime' }, { k: '220+', v: 'Languages supported' }, { k: '120', v: 'Service partners across India' }, ].map((s, i) => (
{s.k}
{s.v}
))}

Get in touch

Sales, installation, bulk orders or just a question — we're a small team and we read everything.

WhatsApp · fastest
{SITE.whatsappHours}
Sales
{SITE.email} · {SITE.phone}
Office
VividPix Technologies Pvt. Ltd.
{SITE.address}
GSTIN: {SITE.gstin}

Send us a message