/* 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 (
{PRODUCTS.slice(0, 7).map((p) => ( ))}
Miniatura ID Symbol Kod kresk. Nazwa Kategoria
{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) => (
OCZEKUJE {d.num} e.preventDefault()}>PODGLĄ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) => (
PRZYJĘTE {d.num} e.preventDefault()}>PODGLĄ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 (
Okres *

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 */}
Operator: Jan Kowalski e.preventDefault()}>Raport dzienny
{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 */}
[Ctrl]
{POS_APP_PRODUCTS.map((p, i) => (
{p.name}
{p.sym} ::
{p.price} zł
))}
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 });