feat: Wabenhain Honig-Shop Anwendung

Vollstaendige Next.js/Prisma-E-Commerce-Anwendung fuer eine Imkerei:
Shop, Warenkorb, Stripe-Checkout, Kundenkonto mit 2FA, Admin-Bereich
(Produkte, Ernten, Chargen, Bestellungen, Gutscheine, admin-editierbare
Website-Inhalte), i18n (DE/EN), Rate-Limiting/CSP/Audit-Log-Haertung,
PostgreSQL- und MySQL-Unterstuetzung ueber austauschbare Prisma-
Treiber-Adapter, Unit-/Komponenten-/E2E-Tests.
This commit is contained in:
Nick Szaunig committed 2026-08-17 14:30:28 +02:00
1 parent 5c76fcc266
commit c7927f2883
240 files changed
+26096 -137

No files matched your search

+44
View File
@@ -0,0 +1,44 @@
/**
* Gemeinsamer Mengen-Steller (−/Zahl/+), bisher als Inline-Markup nur auf der
* Produktdetailseite vorhanden, waehrend Warenkorb-Drawer und Warenkorb-Seite
* noch ein natives <select> nutzten — vereinheitlicht das Bedienelement.
*/
export function QuantityStepper({
quantity,
onChange,
max = 10,
size = "md",
}: {
quantity: number;
onChange: (quantity: number) => void;
max?: number;
size?: "sm" | "md";
}) {
const buttonSize = size === "sm" ? "w-8 h-8 text-base" : "w-10 h-10 text-lg";
return (
<div className="inline-flex items-stretch border border-ink/20">
<button
type="button"
onClick={() => onChange(Math.max(1, quantity - 1))}
disabled={quantity <= 1}
aria-label="Menge verringern"
className={`${buttonSize} flex items-center justify-center text-ink/70 hover:text-forest disabled:opacity-30 disabled:hover:text-ink/70`}
>
−
</button>
<span className="w-8 flex items-center justify-center text-sm" aria-live="polite">
{quantity}
</span>
<button
type="button"
onClick={() => onChange(Math.min(max, quantity + 1))}
disabled={quantity >= max}
aria-label="Menge erhöhen"
className={`${buttonSize} flex items-center justify-center text-ink/70 hover:text-forest disabled:opacity-30 disabled:hover:text-ink/70`}
>
+
</button>
</div>
);
}