// ============================================================= // FEATURE GRAPHICS — one detailed animated mock per feature. // Each component renders inside a "mock" frame with realistic UI. // ============================================================= // ---------- Helpers ---------- const useTick = (interval = 1800) => { const [t, setT] = React.useState(0); React.useEffect(() => { const id = setInterval(() => setT(x => x + 1), interval); return () => clearInterval(id); }, [interval]); return t; }; const MockBar = ({ url }) => (
{url}
); const Avatar = ({ s, color = 'var(--brand-500)', size = 28 }) => ( {s} ); // ============== HRMS · PAYROLL ============== const PayrollMock = () => { const [step, setStep] = React.useState(0); React.useEffect(() => { const id = setInterval(() => setStep(s => (s + 1) % 5), 1400); return () => clearInterval(id); }, []); const stages = ['Sync attendance', 'Calculate gross', 'Apply deductions', 'Generate payslips', 'Disburse']; return (
payroll run · april 2026
148 employees · ₹ 28,42,500
Auto-running
{/* Pipeline */}
{stages.map((s, i) => (
{s}
))}
{/* Table */}
EmployeeGrossPFTDSNet
{[ { n: 'Priya S.', c: 'var(--brand-500)', g: 75500, pf: 5400, tds: 3850 }, { n: 'Rahul K.', c: 'var(--accent-500)', g: 64200, pf: 4600, tds: 2900 }, { n: 'Meera J.', c: 'var(--warn-500)', g: 58000, pf: 4200, tds: 2400 }, { n: 'Anish M.', c: 'var(--rose-500)', g: 92000, pf: 6500, tds: 6800 }, ].map((r, i) => (
= 3 ? '#f0fdf4' : '#fff', transition: 'background 0.4s' }}> x[0]).join('')} color={r.c} size={22} /> {r.n} {r.g.toLocaleString('en-IN')} −{r.pf} −{r.tds} {(r.g - r.pf - r.tds).toLocaleString('en-IN')}
))}
PF challan ready TDS Form 24Q Tally synced
); }; // ============== HRMS · ATTENDANCE ============== const AttendanceMock = () => { const t = useTick(2000); const days = ['M', 'T', 'W', 'T', 'F', 'S', 'S']; return (
attendance · this week
96.4% on-time rate
142 in 6 leave
{/* Calendar grid */}
{Array.from({ length: 28 }).map((_, i) => { const status = [0, 6, 13, 20, 27].includes(i) ? 'off' : i === 24 ? 'leave' : i < 22 ? 'present' : 'future'; const colors = { present: '#10b981', off: '#cbd5e1', leave: '#f59e0b', future: '#e2e8f0' }; return (
{i + 1}
); })}
{/* Live clock-in feed */}
Live clock-ins
{[ { n: 'Rahul S.', loc: 'Vijay Nagar HQ · geo-fence ✓', t: '9:12 am', c: 'var(--accent-500)' }, { n: 'Priya M.', loc: 'WFH · selfie ✓', t: '9:08 am', c: 'var(--brand-500)' }, { n: 'Karthik V.', loc: 'Pithampur branch · IP ✓', t: '9:01 am', c: 'var(--warn-500)' }, ].map((r, i) => (
x[0]).join('')} color={r.c} size={26} />
{r.n}
{r.loc}
{r.t}
))}
); }; // ============== HRMS · LEAVE ============== const LeaveMock = () => { const t = useTick(1800); return (
leave management
Priya's balance
{[ { l: 'Casual', used: 4, total: 12, c: '#10b981' }, { l: 'Sick', used: 2, total: 8, c: '#f59e0b' }, { l: 'Earned', used: 6, total: 21, c: '#4f46e5' }, { l: 'Comp-off', used: 1, total: 4, c: '#f43f5e' }, ].map((b, i) => { const pct = (b.used / b.total) * 100; const r = 22, c = 2 * Math.PI * r; return (
{b.total - b.used}
{b.l}
{b.used} of {b.total} used
); })}
{/* Pending requests */}
Pending approvals
{[ { n: 'Anish M.', reason: 'Casual · 2 days · Wedding', d: 'Apr 24–25', s: 'pending' }, { n: 'Meera J.', reason: 'Sick · 1 day', d: 'Apr 30', s: 'approved' }, ].map((r, i) => (
x[0]).join('')} size={28} />
{r.n} · {r.reason}
{r.d}
{r.s === 'pending' ?
: Approved}
))}
); }; // ============== HRMS · REIMBURSEMENT ============== const ReimbursementMock = () => (
reimbursement claims
₹ 48,250 pending
12 to review
{[ { who: 'Rahul', cat: 'Travel', amt: 12400, item: 'Indore → Bhopal client visit', date: 'Apr 28', icon: '✈️' }, { who: 'Meera', cat: 'Meals', amt: 2400, item: 'Team dinner with client', date: 'Apr 26', icon: '🍽️' }, { who: 'Anish', cat: 'Telecom', amt: 1200, item: 'Mobile bill · April', date: 'Apr 25', icon: '📱' }, { who: 'Priya', cat: 'Office supplies', amt: 850, item: 'Stationery for offsite', date: 'Apr 24', icon: '📦' }, ].map((r, i) => (
{r.icon}
{r.who} · {r.cat}
{r.item} · {r.date}
₹ {r.amt.toLocaleString('en-IN')} receipt
))}
Approve all 4 above (₹ 16,850)
); // ============== HRMS · ASSETS ============== const AssetsMock = () => (
company assets
284 items tracked
261 allocated 23 in stock
{[ { i: '💻', l: 'Laptops', n: 142, c: '#4f46e5' }, { i: '📱', l: 'Phones', n: 86, c: '#10b981' }, { i: '🖥️', l: 'Monitors', n: 38, c: '#f59e0b' }, { i: '🚗', l: 'Vehicles', n: 18, c: '#f43f5e' }, ].map((c, i) => (
{c.i}
{c.n}
{c.l}
))}
AssetSerialAssigned toStatus
{[ { a: 'MacBook Pro 14"', s: 'C02XK9...', who: 'Priya S.', st: 'In use', c: '#10b981' }, { a: 'Dell Latitude 5420', s: 'DL5420...', who: 'Rahul K.', st: 'In use', c: '#10b981' }, { a: 'iPhone 14', s: 'IMEI 358...', who: 'Anish M.', st: 'In use', c: '#10b981' }, { a: 'ThinkPad X1', s: 'PF2X8...', who: '—', st: 'In stock', c: '#94a3b8' }, ].map((r, i) => (
{r.a} {r.s} {r.who} {r.st}
))}
); // ============== HRMS · TASKS ============== const TasksMock = () => { const t = useTick(2200); const tasks = [ { t: 'Send offer letter to Rahul', who: 'Priya', due: 'Today', done: t > 0 }, { t: 'Run PF challan for April', who: 'Anish', due: 'Apr 30', done: t > 1 }, { t: 'Schedule 1:1 with Meera', who: 'Karthik', due: 'May 2', done: false }, { t: 'Approve 4 expense claims', who: 'You', due: 'Apr 29', done: false, urgent: true }, { t: 'Onboard 3 new joiners', who: 'HR Team', due: 'May 5', done: false }, ]; return (
my todos · today
{tasks.filter(x => !x.done).length} open · {tasks.filter(x => x.done).length} done
+ Add task
{tasks.map((task, i) => (
{task.done && }
{task.t} {task.urgent && Urgent}
{task.who} {task.due}
))}
); }; // ============== HRMS · LETTERS ============== const LettersMock = () => (
letter type
{[ { n: 'Offer Letter', icon: '📨', active: true }, { n: 'Appointment Letter', icon: '✍️' }, { n: 'Appraisal Letter', icon: '📈' }, { n: 'Experience Letter', icon: '🎓' }, { n: 'Relieving Letter', icon: '🚪' }, { n: 'Salary Hike Letter', icon: '💰' }, ].map((l, i) => (
{l.icon}{l.n}
))}
auto-filled
Prime HR
Gopur Square, Indore 452009 · CIN U72200MP2023PTC
30 April 2026
Dear Rahul Sharma,
We are pleased to offer you the position of Senior Sales Lead at our Indore office.
Your CTC will be ₹ 12,00,000 per annum, with a joining date of 15 May 2026.
This offer is subject to background verification...
Sincerely,
HR Team
); Object.assign(window, { PayrollMock, AttendanceMock, LeaveMock, ReimbursementMock, AssetsMock, TasksMock, LettersMock });