/* ============================================================
NeuralScout — Feature Cards
Each card is a small "camera monitor" with looping animation
============================================================ */
function useTick(ms = 50) {
const [, setT] = React.useState(0);
React.useEffect(() => {
const id = setInterval(() => setT(t => t + 1), ms);
return () => clearInterval(id);
}, [ms]);
return Date.now();
}
const TRAFFIC_COUNTING_VIDEO = 'assets/videos/fish-shop-people-count.mp4';
/* ----------- 1. Traffic Counting ----------- */
function FeatTraffic() {
return (
);
}
const DWELL_TIME_VIDEO = 'assets/videos/Jewelllery-Shop_Person_dwell-time.mp4';
/* ----------- 2. Dwell Time ----------- */
function FeatDwell() {
return (
);
}
/* ----------- 3. Staff Time on Floor ----------- */
function FeatFace() {
const now = useTick();
const t = (now % 6000) / 6000;
const identified = t > 0.4;
const names = ['Priya K.', 'Marcus T.', 'Ayaan S.'];
const idx = Math.floor(now / 6000) % 3;
return (
{/* Face silhouette */}
{/* Scan grid */}
{!identified && (
)}
{/* Landmarks */}
{/* Detection frame */}
{/* Label */}
{identified && (
{names[idx]} · STAFF · 0.96
)}
);
}
const FEATURES_EXTRACTION_VIDEO = 'assets/videos/Highway_vehicle_Demographics.mp4';
/* ----------- 4. Features Extraction ----------- */
function FeatPlate() {
return (
);
}
const DEMOGRAPHICS_VIDEO = 'assets/videos/Jewelllery Shop Person In New Video.mp4';
/* ----------- 5. Demographics ----------- */
function FeatDemo() {
return (
);
}
const VLM_QUERY_VIDEO = 'assets/videos/construction-vlm-query.mp4';
/* ----------- 6. Custom AI Queries ----------- */
function FeatQuery() {
return (
);
}
/* ----------- Shared card frame ----------- */
function FeatureMonitor({ title, code, desc, accent, children }) {
return (
{children}
{/* Scanline */}
);
}
const featStyles = {
card: {
background: 'var(--ns-bg-1)',
border: '1px solid var(--ns-line)',
borderRadius: 'var(--ns-r-3)',
overflow: 'hidden',
display: 'flex', flexDirection: 'column',
},
cardHeader: {
padding: '10px 14px',
display: 'flex', justifyContent: 'space-between', alignItems: 'center',
borderBottom: '1px solid var(--ns-line)',
background: 'var(--ns-bg-2)',
},
monitor: {
position: 'relative',
aspectRatio: '16/10',
background: '#080b12',
overflow: 'hidden',
borderBottom: '1px solid var(--ns-line)',
},
scene: { position: 'absolute', inset: 0 },
roadBg: {
position: 'absolute', inset: 0,
background: 'linear-gradient(180deg, #141a24 0%, #141a24 45%, #0c1018 46%, #0c1018 100%)',
backgroundImage: `
linear-gradient(180deg, #141a24 0%, #141a24 45%, #0c1018 46%, #0c1018 100%),
repeating-linear-gradient(90deg, transparent 0 40px, #2a3240 40px 60px)`,
},
roomBg: {
position: 'absolute', inset: 0,
background: 'linear-gradient(180deg, #1a2030 0%, #0c1018 100%)',
},
counter: {
position: 'absolute', top: 10, right: 10,
padding: '6px 10px',
background: 'rgba(8,11,18,0.85)',
border: '1px solid var(--ns-line-2)',
display: 'flex', flexDirection: 'column', alignItems: 'flex-end',
gap: 1, minWidth: 52,
},
cardMeta: {
padding: '18px 20px 22px',
},
cardTitle: {
fontFamily: 'var(--ns-display)',
fontSize: 20, fontWeight: 500,
margin: '0 0 6px 0',
letterSpacing: '-0.01em',
color: 'var(--ns-fg)',
},
cardDesc: {
fontSize: 13.5, lineHeight: 1.55,
color: 'var(--ns-fg-dim)',
margin: 0,
textWrap: 'pretty',
},
};
Object.assign(window, {
FeatTraffic, FeatDwell, FeatFace, FeatPlate, FeatDemo, FeatQuery, FeatureMonitor, useTick,
});