// Statement (gray -> accent wipe), Solutions card stack, Work showcase
function StatementText({ duplicate }) {
const pill = duplicate
? Get instant quote
: Get instant quote ;
return (
We transform your idea{' '}
{' '}
into a reliable, fully functional live system, ready to{' '}
{' '}
launch, scale, and create impact. {pill}
);
}
function Statement() {
const reduced = useReducedMotion();
const sectionRef = React.useRef(null);
const stickyRef = React.useRef(null);
useScrollFrame(() => {
const section = sectionRef.current;
const sticky = stickyRef.current;
if (!section || !sticky) return;
const p = reduced ? 0 : pinProgress(section);
sticky.style.setProperty('--wipe', clamp01((p - 0.42) / 0.5).toFixed(4));
}, [reduced]);
return (
);
}
const SERVICES = [
{ t: 'Dashboards & Reporting', d: 'Live numbers for sales, operations and finance, plus daily, weekly and monthly reports that build themselves instead of waiting for an Excel update.' },
{ t: 'Internal Systems', d: 'Orders, purchasing, approvals and job tracking in one lightweight system built around how your team already works.' },
{ t: 'Inventory & Orders', d: 'Stock movement, orders, deliveries, barcode scans and reorder alerts in one place, across every branch or warehouse.' },
{ t: 'Booking & Payments', d: 'Online booking, payments, reminders and customer self-service that replace the WhatsApp-and-spreadsheet routine.' },
{ t: 'Workflow Automation', d: 'Forms, checklists, approvals and handovers moved off paper and chat groups, with a clear record of who did what.' },
{ t: 'Integrations', d: 'Connect accounting, e-commerce, WhatsApp Business and the tools you already pay for, so nobody re-types the same data.' },
{ t: 'AI Assistants', d: 'AI that reads documents, answers staff questions, drafts replies and checks photos, added where it removes real work.' },
];
// Original line illustrations, one per service. Drawn on a 400x220 canvas.
function ServiceArt({ i }) {
const a = 'var(--accent)';
const w = 'rgba(255,255,255,0.85)';
const m = 'rgba(255,255,255,0.22)';
const g = 'rgba(255,255,255,0.08)';
const arts = [
// 0 dashboard: bars + trend line
{[0, 1, 2, 3, 4, 5, 6, 7].map((k) => {
const h = [60, 92, 74, 120, 104, 138, 116, 150][k];
return ;
})}
,
// 1 ERP: connected modules
{[[60, 40], [60, 136], [170, 88], [280, 40], [280, 136]].map(([x, y], k) => (
))}
,
// 2 inventory: shelving with boxes
{[56, 118, 180].map((y) => )}
{[
[56, [[70, 40], [118, 30], [156, 46], [212, 36], [258, 28], [296, 38]]],
[118, [[74, 34], [116, 46], [172, 30], [212, 48], [270, 34]]],
[180, [[68, 38], [114, 30], [152, 44], [206, 34], [250, 48], [306, 28]]],
].map(([shelf, boxes], r) => boxes.map(([x, s], k) => {
const hot = r === 1 && k === 3;
return ;
}))}
,
// 3 booking: calendar with booked slots
PAID
{Array.from({ length: 21 }, (_, k) => {
const booked = [2, 5, 9, 10, 15, 19].includes(k);
return ;
})}
,
// 4 workflow: checklist
{[0, 1, 2, 3].map((k) => (
{k !== 2 && }
{k === 2 && }
))}
,
// 5 integrations: hub and spokes
{[[84, 56], [84, 164], [316, 56], [316, 164], [200, 30], [200, 190]].map(([x, y], k) => (
))}
,
// 6 AI assistant: chat exchange
{[146, 128, 84].map((wd, k) => )}
,
];
return (
{arts[i]}
);
}
function Solutions() {
const reduced = useReducedMotion();
const sectionRef = React.useRef(null);
const [active, setActive] = React.useState(0);
const n = SERVICES.length;
useScrollFrame(() => {
const section = sectionRef.current;
if (!section || reduced) return;
const p = pinProgress(section);
const idx = Math.min(n - 1, Math.floor(p * n * 0.999));
setActive((prev) => (prev === idx ? prev : idx));
}, [reduced]);
return (
Proven methods and streamlined processes that take your idea from first workshop to live system.
Start with the one that hurts most. Every module connects to the next when you are ready.
{!reduced && (
{String(active + 1).padStart(2, '0')} / {String(n).padStart(2, '0')}
)}
{SERVICES.map((s, i) => {
const d = i - active;
const cls = d < 0 ? ' is-gone' : '';
return (
3 ? 0 : undefined }}
>
{String(i + 1).padStart(2, '0')}.
);
})}
);
}
// Example builds: drawn sample screens, one per kind of system. Not client work; all figures are sample data.
function WsSide({ active }) {
return (
{[0, 1, 2, 3, 4].map((k) => )}
);
}
function WsTop({ title, chip }) {
return (
{title}
{chip}
);
}
function ScreenDashboard() {
const bars = [34, 52, 46, 70, 62, 84, 58, 76, 92, 66, 48, 30];
const branches = [['Branch A', 'On track', 'ok', 92], ['Branch B', 'Busy', 'warn', 71], ['Branch C', 'Delayed', 'bad', 48], ['Branch D', 'On track', 'ok', 88], ['Online store', 'On track', 'ok', 95]];
return (
<>
Orders 1,248 +8% vs last week
In progress 36 12 due today
Overdue 4 2 need follow-up
On time 94% Target 90%
Orders by hour Live
{bars.map((h, k) => )}
8am 12pm 4pm 7pm
Branch status
{branches.map(([n, s, c, v]) => (
{n} {s}
))}
>
);
}
function ScreenOrders() {
const cols = [
['New', 12, [['SO-2291', '24 items', ''], ['SO-2292', '6 items', ''], ['SO-2293', '11 items', '']]],
['Needs approval', 5, [['SO-2287', 'Discount 12%', 'approve'], ['SO-2288', 'Credit limit', 'approve']]],
['Packing', 8, [['SO-2280', 'Picked 18/24', 'warn', 75], ['SO-2283', 'Picked 9/9', 'ok', 100], ['SO-2284', 'Picked 3/12', 'warn', 25]]],
['Out for delivery', 6, [['SO-2276', 'ETA 3:40pm', 'ok', 100], ['SO-2278', 'ETA 5:10pm', 'ok', 100], ['SO-2279', 'ETA 6:00pm', 'ok', 100]]],
];
const stages = [['New', 12], ['Approval', 5], ['Packing', 8], ['On the road', 6], ['Delivered', 41]];
return (
<>
{stages.map(([s, n], k) =>
{n} {s}
)}
{cols.map(([name, total, cards]) => (
{name} {total}
{cards.map(([id, sub, state, pct]) => (
{id}
{sub}
{state === 'approve'
?
Awaiting manager Approve
: state &&
}
))}
))}
>
);
}
function ScreenBooking() {
const days = Array.from({ length: 35 }, (_, k) => k - 2);
const slots = [['9:00', 'taken'], ['9:30', ''], ['10:00', 'taken'], ['10:30', 'is-on'], ['11:00', ''], ['11:30', ''], ['2:00', 'taken'], ['2:30', ''], ['3:00', '']];
return (
<>
Service Date & time Pay deposit Confirmed
October ‹ ›
{['M', 'T', 'W', 'T', 'F', 'S', 'S'].map((d, k) => {d} )}
{days.map((d) => 31 ? 'is-off' : ''}>{d < 1 || d > 31 ? '' : d} )}
Thu, 23 Oct 6 open
{slots.map(([t, c]) => {t} )}
Reminder scheduled WhatsApp and email, 1 day before
Your booking
Service Consultation · 60 min
When Thu 23 Oct, 10:30am
Staff Any available
Deposit RM 50.00
Free to reschedule up to 24 hours before.
Pay deposit
FPX Card E-wallet
>
);
}
function ScreenInventory() {
const rows = [
['Packaging boxes (M)', 'PK-104', 1840, 82, 'ok', 'In stock'],
['Thermal labels', 'LB-220', 96, 18, 'bad', 'Reorder'],
['Cleaning kit', 'CL-031', 240, 46, 'warn', 'Low'],
['Printer toner', 'TN-512', 6, 9, 'bad', 'Reorder'],
['Shipping tape', 'TP-077', 610, 74, 'ok', 'In stock'],
['Gloves (box)', 'GL-210', 58, 14, 'bad', 'Reorder'],
['Bubble wrap roll', 'BW-118', 320, 66, 'ok', 'In stock'],
['Receipt paper', 'RP-045', 410, 58, 'ok', 'In stock'],
];
return (
<>
3 items below reorder point. Purchase orders drafted for review. Review POs
Active SKUs 842 Across 2 sites
Low stock 4 3 at reorder point
Incoming 5 POs 2 arrive today
Item SKU On hand Level Status
{rows.map(([n, sku, q, lvl, c, s]) => (
{n} {sku} {q.toLocaleString('en-US')}
{s}
))}
>
);
}
const WORK_ITEMS = [
{ t: 'Live operations view across branches', tag: 'Dashboard', bg: '/uploads/process_scale.webp', Screen: ScreenDashboard, label: 'Sample dashboard screen: orders, on-time rate, orders by hour and status for each branch' },
{ t: 'Order to delivery tracking with approvals', tag: 'Internal system', bg: '/uploads/process_design.webp', Screen: ScreenOrders, label: 'Sample internal system screen: orders moving from new to approval, packing and delivery' },
{ t: 'Online booking, payments and reminders', tag: 'Customer portal', bg: '/uploads/process_discover.webp', Screen: ScreenBooking, label: 'Sample customer portal screen: pick a date and time slot, pay a deposit and get a reminder' },
{ t: 'Stock levels with automatic reorder alerts', tag: 'Inventory', bg: '/uploads/process_build.webp', Screen: ScreenInventory, label: 'Sample inventory screen: stock levels per item with reorder alerts and drafted purchase orders' },
];
function WorkMedia({ children, className = '' }) {
const ref = React.useRef(null);
const reduced = useReducedMotion();
useScrollFrame(() => {
const el = ref.current;
if (!el) return;
const r = el.getBoundingClientRect();
const vh = window.innerHeight;
if (r.bottom < 0 || r.top > vh) return;
const centre = (r.top + r.height / 2 - vh / 2) / vh; // -1..1 roughly
el.style.setProperty('--par', reduced ? '0px' : `${(centre * -60).toFixed(1)}px`);
el.style.setProperty('--sc', reduced ? '1' : (1 - Math.min(0.06, Math.abs(centre) * 0.08)).toFixed(3));
}, [reduced]);
return {children}
;
}
function Work() {
return (
Discover our work.
What your system can look like
quote.nexthorizon.my
{WORK_ITEMS.map(({ t, tag, bg, Screen, label }) => (
{t}
{tag} · Example build
))}
Example builds are shown as sample screens with sample data to help you picture the scope. Client systems stay private.
);
}
Object.assign(window, { Statement, Solutions, Work });