/* Motion · admin-panel illustrations
Faithful 1:1 mock of the real Motion admin (Filament-based).
Variants for the marketing site:
· products — Lista produktów (table with thumbnail, ID, Symbol, Kod kresk., Nazwa, Kategoria)
· productDetail — Podgląd Produkt (Symbol, Nazwa, Cechy, Status, Cena katalogowa/promocyjna, Omnibus)
· deliveries — Przyjęcia dostaw (Magazyn punktu select + Przyjmij wszystko + Dokumenty oczekujące / Ostatnio przyjęte)
· analytics — small reports panel (used in Hero/related places; full one lives in admin-analytics.jsx)
Data is invented across multiple industries (cosmetics, books, electronics, sport, hardware)
so nothing leaks from any real customer. */
const { useState: usePosState } = React;
/* ─── Shared admin chrome ────────────────────────────────────────────── */
const NAV = [
{ group: "Katalog", items: [
{ key: "products", icon: "package", label: "Produkty" },
{ key: "groups", icon: "layers", label: "Grupy" },
{ key: "attrs", icon: "tags", label: "Cechy" },
{ key: "prices", icon: "tag", label: "Ceny" },
{ key: "policies", icon: "shieldCheck", label: "Polityki cenowe" },
]},
{ group: "Sprzedaż", items: [
{ key: "pos", icon: "monitor", label: "POS" },
{ key: "pos-users", icon: "users", label: "Pracownicy POS" },
{ key: "sales", icon: "receipt", label: "Sprzedaż" },
{ key: "returns", icon: "rotateCcw", label: "Zwroty" },
{ key: "tickets", icon: "helpCircle", label: "Zgłoszenia POS" },
{ key: "deliveries", icon: "truck", label: "Przyjęcia dostaw" },
]},
{ group: "Analityka", items: [
{ key: "an-time", icon: "clock", label: "Przegląd czasowy" },
{ key: "an-emp", icon: "user", label: "Wg pracownika" },
{ key: "an-store", icon: "store", label: "Wg magazynu" },
{ key: "an-group", icon: "layers", label: "Wg grupy produktów" },
]},
];
function AdminSidebar({ active }) {
return (
);
}
function AdminChrome({ active, breadcrumb, title, actions, children }) {
return (
Motion · Panel administracyjny
webpos.motionpos.pl
{breadcrumb.map((b, i) => (
{b}
{i < breadcrumb.length - 1 && }
))}
{title}
{actions &&
{actions}
}
{children}
);
}
/* ─── Product thumbnail (stylised, not a real photo) ─────────────────── */
const THUMB_PRESETS = {
cosmetics: { bg: "linear-gradient(135deg, #fce7f3 0%, #fbcfe8 100%)", color: "#9d174d", icon: (
)},
book: { bg: "linear-gradient(135deg, #fef3c7 0%, #fde68a 100%)", color: "#92400e", icon: (
)},
electronics: { bg: "linear-gradient(135deg, #dbeafe 0%, #93c5fd 100%)", color: "#1e3a8a", icon: (
)},
hardware: { bg: "linear-gradient(135deg, #fee2e2 0%, #fca5a5 100%)", color: "#7f1d1d", icon: (
)},
toy: { bg: "linear-gradient(135deg, #d1fae5 0%, #86efac 100%)", color: "#065f46", icon: (
)},
sport: { bg: "linear-gradient(135deg, #e0e7ff 0%, #a5b4fc 100%)", color: "#3730a3", icon: (
)},
food: { bg: "linear-gradient(135deg, #fef9c3 0%, #fde047 100%)", color: "#854d0e", icon: (
)},
fashion: { bg: "linear-gradient(135deg, #f5f3ff 0%, #c4b5fd 100%)", color: "#5b21b6", icon: (
)},
};
function ProductThumb({ kind = "cosmetics", size = 32 }) {
const preset = THUMB_PRESETS[kind] || THUMB_PRESETS.cosmetics;
return (
);
}
/* ─── Mixed-industry product catalog (no NDA data) ───────────────────── */
const PRODUCTS = [
{ id: 8421, sym: "NC-KREM-DZ-50", ean: "5904180024681", name: "Krem dzienny nawilżający 50ml", cat: "Kosmetyki", kind: "cosmetics" },
{ id: 8420, sym: "NC-SER-WIT-30", ean: "5904180024674", name: "Serum z witaminą C 30ml", cat: "Kosmetyki", kind: "cosmetics", active: true },
{ id: 8419, sym: "KS-BES-SLO-TW", ean: "9788373783621", name: "Bestiariusz Słowiański — twarda opr.", cat: "Książki", kind: "book" },
{ id: 8418, sym: "ET-MUL-WM18", ean: "5901482018724", name: "Multimetr cyfrowy ETI WM-18", cat: "Elektronika", kind: "electronics" },
{ id: 8417, sym: "NK-AKU-12V", ean: "5901482018717", name: "Wkrętarka akumulatorowa 12V", cat: "Narzędzia", kind: "hardware" },
{ id: 8416, sym: "ZB-KLOC-100", ean: "5901620042108", name: "Klocki konstrukcyjne 100 elementów", cat: "Zabawki", kind: "toy" },
{ id: 8415, sym: "SP-ROL-INL-42", ean: "5901620042092", name: "Rolki inline rozmiar 42", cat: "Sport", kind: "sport" },
{ id: 8414, sym: "KS-ATL-SWI", ean: "9788373783614", name: "Atlas świata 2026 — wydanie XXL", cat: "Książki", kind: "book" },
{ id: 8413, sym: "FD-KAW-ETI-1KG", ean: "5904567823109", name: "Kawa ziarnista Etiopia Yirgacheffe 1kg", cat: "Spożywcze", kind: "food" },
];
/* ─── Variant: Products list ─────────────────────────────────────────── */
function POSPanelProducts() {
return (
|
|
Miniatura |
ID |
Symbol |
Kod kresk. |
Nazwa |
Kategoria |
{PRODUCTS.slice(0, 7).map((p) => (
|
|
{p.id} |
{p.sym} |
{p.ean} |
{p.name} |
{p.cat} |
))}
);
}
/* ─── Variant: Product detail (Podgląd Produkt) — compact marketing card ── */
function POSPanelProductDetail() {
return (
Karta produktu · Podgląd
NC-SER-WIT-30
Serum z witaminą C 30ml — formuła rozjaśniająca
NC-SER-WIT-30 · 5904180024674 · Pielęgnacja twarzy
{["serum", "witamina C", "30ml", "wegańskie"].map((t) => (
{t}
))}
active
Cena katalogowa
129,00 zł
104,88 zł netto
Cena promocyjna
103,20 zł
Rabat na wszystko −20%
Najniższa cena (30 dni)
99,00 zł
Omnibus · widoczne na paragonie
);
}
function Field({ label, value, muted = false, highlight = false, help }) {
return (
{label}
{value}
{help &&
{help}
}
);
}
/* ─── Variant: Deliveries (Przyjęcia dostaw) ─────────────────────────── */
function POSPanelDeliveries() {
const pending = [
{ type: "PZ", num: "PZ 4218/MG/05/2026", date: "14.05.2026", supplier: "Beauty Lab Distribution Sp. z o.o.", pos: 12, sum: 142 },
{ type: "MM", num: "MM 4217/MG/05/2026", date: "13.05.2026", supplier: "Magazyn centralny → Magazyn Główny", pos: 6, sum: 88 },
{ type: "PW", num: "PW 4216/MG/05/2026", date: "13.05.2026", supplier: "Zwrot z punktu sprzedaży", pos: 2, sum: 4 },
];
const accepted = [
{ num: "PZ 4215/MG/05/2026", date: "10.05.2026", time: "11:09:13", user: "Jan Kowalski (admin)", pos: 1, sum: 20 },
{ num: "MM 4214/MG/05/2026", date: "07.05.2026", time: "09:52:11", user: "Anna K. (manager)", pos: 14, sum: 200 },
{ num: "PZ 4213/MG/05/2026", date: "06.05.2026", time: "10:32:07", user: "Jan Kowalski (admin)", pos: 8, sum: 49 },
];
return (
Przyjęcia dostaw
Dokumenty MM, PZ i PW z Insert GT oczekujące na przyjęcie na wybranym magazynie punktu.
Magazyn punktu
Symbol magazynu z synchronizacji Insert GT; w nawiasie — liczba dokumentów oczekujących
na przyjęcie (MM, PZ, PW).
Dokumenty oczekujące
{pending.map((d) => (
Dokument: {d.date} 02:00:00 | {d.supplier} | Pozycji: {d.pos} | Suma: {d.sum}
))}
Ostatnio przyjęte (podgląd)
Dokumenty już zaakceptowane na tym magazynie — tylko do wglądu, bez akcji przyjęcia.
{accepted.map((d) => (
Dokument: {d.date} | Przyjęto: {d.date} {d.time} | {d.user} | Pozycji: {d.pos} | Suma: {d.sum}
))}
);
}
/* ─── Variant: Analytics preview (small bar chart) ──────────────────── */
function POSPanelAnalyticsSales() {
const groups = [
{ label: "Kosmetyki", pln: 12840, par: 78 },
{ label: "Książki", pln: 9420, par: 42 },
{ label: "Elektronika", pln: 6184, par: 24 },
{ label: "Sport", pln: 4260, par: 18 },
{ label: "Narzędzia", pln: 3120, par: 14 },
{ label: "Zabawki", pln: 1862, par: 9 },
];
const maxPln = Math.max(...groups.map((g) => g.pln));
return (
Grupy: wartość pozycji i liczba paragonów
Przychód brutto (PLN)
Paragony
{groups.map((g) => (
{g.label}
{g.pln.toLocaleString("pl-PL").replace(/,/g, " ")} zł
))}
);
}
/* ─── Variant: POS App (cashier UI — not the admin) ──────────────────── */
const POS_APP_PRODUCTS = [
{ sym: "NC-KREM-DZ-50", name: "Krem dzienny nawilżający 50ml", price: "89,00", kind: "cosmetics" },
{ sym: "NC-SER-WIT-30", name: "Serum z witaminą C 30ml", price: "129,00", kind: "cosmetics", highlight: true },
{ sym: "NC-PEEL-AHA-100", name: "Peeling AHA 8% — tonik 100ml", price: "69,00", kind: "cosmetics" },
{ sym: "KS-BES-SLO-TW", name: "Bestiariusz Słowiański (twarda opr.)", price: "79,90", kind: "book" },
{ sym: "KS-ATL-SWI", name: "Atlas świata 2026 — wydanie XXL", price: "149,00", kind: "book" },
{ sym: "ET-MUL-WM18", name: "Multimetr cyfrowy ETI WM-18", price: "189,00", kind: "electronics" },
{ sym: "NK-AKU-12V", name: "Wkrętarka akumulatorowa 12V", price: "249,00", kind: "hardware" },
];
const POS_APP_CART = [
{ qty: 2, name: "NC-SER-WIT-30 · Serum z witaminą C 30ml", total: "206,40", promo: true, unit: "129,00" },
{ qty: 1, name: "NC-KREM-DZ-50 · Krem dzienny 50ml", total: "71,20", promo: true, unit: "89,00" },
{ qty: 1, name: "KS-BES-SLO-TW · Bestiariusz Słowiański", total: "79,90", promo: false, unit: "79,90" },
];
const POS_APP_SHORTCUTS = [
{ label: "Dodaj pozycję", k: "Enter", primary: true },
{ label: "Towary", k: "F6" },
{ label: "Przyjęcia", k: "F7" },
{ label: "Transakcje", k: "" },
{ label: "Zwrot", k: "F4" },
{ label: "Promocje", k: "" },
{ label: "Synchronizuj", k: "F9" },
{ label: "Ustawienia", k: "F10" },
{ label: "Wyloguj", k: "F12" },
];
function POSAppPanel() {
return (
Motion
Piątek, 15.05.2026
14:32:07
{/* LEFT — operator + cart + pay */}
{POS_APP_CART.map((row, i) => (
{row.qty}
{row.name}
{row.promo && (
Promocja: Rabat na wszystko −20% · VAT 23%
)}
{row.total} zł
{row.qty} × {row.unit} zł
))}
Do zapłaty
Rabaty: 89,20 zł · Finalizuj sprzedaż [F8]
357,50
POS testowy 01
{/* MIDDLE — search + product list */}
{POS_APP_PRODUCTS.map((p, i) => (
))}
Wiersz: 1–7 / 2 735
Strona: 1 / 28
{/* RIGHT — keyboard shortcuts */}
{POS_APP_SHORTCUTS.map((s) => (
))}
Wersja v1.4.2
·
Drukarka OK
·
Lokalne API OK
·
Motion online
);
}
const POS_PANELS = {
posApp: POSAppPanel,
products: POSPanelProducts,
productDetail: POSPanelProductDetail,
deliveries: POSPanelDeliveries,
analytics: POSPanelAnalyticsSales,
// legacy aliases — kept so older feature pages don't break
inventory: POSPanelProducts,
reports: POSPanelAnalyticsSales,
sales: POSAppPanel,
payments: POSPanelDeliveries,
};
function POSPanel({ variant = "products" }) {
const C = POS_PANELS[variant] || POSPanelProducts;
return ;
}
Object.assign(window, { POSPanel, AdminChrome, ProductThumb });