)}
@@ -252,10 +255,10 @@ function StepTwo({
}) {
return (
-
+
Lengkapi Informasi Bisnis
-
+
Masukkan informasi dasar mengenai usaha Anda.
@@ -363,10 +366,10 @@ function StepThree({
}) {
return (
-
+
Pilih Paket Profitra
-
+
Mulai gratis dan upgrade kapan saja sesuai perkembangan bisnis Anda.
@@ -375,31 +378,32 @@ function StepThree({
onSelect(plan.name)}
- className={`relative cursor-pointer transition-all duration-150 ${selected === plan.name
- ? "border-primary bg-primary/5 shadow-sm ring-1 ring-primary"
- : "hover:border-foreground/20 hover:bg-accent/50"
+ className={`relative cursor-pointer transition-all duration-150 rounded-lg ${selected === plan.name
+ ? "border-neutral-900 bg-neutral-50 shadow-sm ring-1 ring-neutral-900"
+ : "border-neutral-100 hover:border-neutral-300 hover:bg-neutral-50"
}`}
+ style={{ boxShadow: selected === plan.name ? '0 1px 2px rgba(0,0,0,.05), 0 4px 10px rgba(0,0,0,.04)' : undefined }}
>
{plan.popular && (
-
+
Paling Populer
)}
- {plan.name}
+ {plan.name}
-
+
{plan.price}
{plan.priceSub && (
-
+
{plan.priceSub}
)}
{plan.description && (
-
+
{plan.description}
)}
@@ -410,10 +414,10 @@ function StepThree({
{plan.features.map((feature) => (
{feature}
diff --git a/src/components/layout/header.tsx b/src/components/layout/header.tsx
new file mode 100644
index 0000000..6236415
--- /dev/null
+++ b/src/components/layout/header.tsx
@@ -0,0 +1,158 @@
+"use client";
+
+import { useState } from "react";
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+import {
+ Menu,
+ LayoutDashboard,
+ ShoppingCart,
+ Package,
+ Users,
+ BarChart3,
+ Settings,
+ LogOut,
+ Bell,
+ Calendar,
+ Search,
+} from "lucide-react";
+import { cn } from "@/lib/utils";
+import { Button } from "@/components/ui/button";
+import { Sheet, SheetContent, SheetTrigger, SheetTitle } from "@/components/ui/sheet";
+import { Input } from "@/components/ui/input";
+
+const NAV_ITEMS = [
+ {
+ label: "Dashboard",
+ href: "/dashboard",
+ icon: LayoutDashboard,
+ },
+ {
+ label: "POS",
+ href: "/dashboard/pos",
+ icon: ShoppingCart,
+ },
+ {
+ label: "Produk",
+ href: "/dashboard/products",
+ icon: Package,
+ },
+ {
+ label: "Pelanggan",
+ href: "/dashboard/customers",
+ icon: Users,
+ },
+ {
+ label: "Laporan",
+ href: "/dashboard/reports",
+ icon: BarChart3,
+ },
+ {
+ label: "Pengaturan",
+ href: "/dashboard/settings",
+ icon: Settings,
+ },
+];
+
+export function Header() {
+ const [open, setOpen] = useState(false);
+ const pathname = usePathname();
+
+ return (
+
+ {/* Left: Mobile Menu + Page Title */}
+
+ {/* Mobile Menu */}
+
+
+
+
+
+
+
+
+
+
+ Keluar
+
+
+
+
+
+ {/* Page Title */}
+
+
+ {NAV_ITEMS.find((item) => item.href === pathname)?.label || "Dashboard"}
+
+
+
+
+ {/* Right: Search, Date, Notifications, Profile */}
+
+ {/* Search - Hidden on mobile */}
+
+
+
+
+
+ {/* Date Filter */}
+
+
+ {/* Notifications */}
+
+
+ {/* User Profile */}
+
+
+ YP
+
+
+
Yoga Pangestu
+
Admin
+
+
+
+
+ );
+}
diff --git a/src/components/layout/sidebar.tsx b/src/components/layout/sidebar.tsx
new file mode 100644
index 0000000..5b850d2
--- /dev/null
+++ b/src/components/layout/sidebar.tsx
@@ -0,0 +1,123 @@
+"use client";
+
+import { useState } from "react";
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+import {
+ LayoutDashboard,
+ ShoppingCart,
+ Package,
+ Users,
+ BarChart3,
+ Settings,
+ ChevronLeft,
+ ChevronRight,
+ LogOut,
+} from "lucide-react";
+import { cn } from "@/lib/utils";
+import { Button } from "@/components/ui/button";
+
+const NAV_ITEMS = [
+ {
+ label: "Dashboard",
+ href: "/dashboard",
+ icon: LayoutDashboard,
+ },
+ {
+ label: "POS",
+ href: "/dashboard/pos",
+ icon: ShoppingCart,
+ },
+ {
+ label: "Produk",
+ href: "/dashboard/products",
+ icon: Package,
+ },
+ {
+ label: "Pelanggan",
+ href: "/dashboard/customers",
+ icon: Users,
+ },
+ {
+ label: "Laporan",
+ href: "/dashboard/reports",
+ icon: BarChart3,
+ },
+ {
+ label: "Pengaturan",
+ href: "/dashboard/settings",
+ icon: Settings,
+ },
+];
+
+export function Sidebar() {
+ const [collapsed, setCollapsed] = useState(false);
+ const pathname = usePathname();
+
+ return (
+
+ );
+}
diff --git a/src/data/dashboard.json b/src/data/dashboard.json
new file mode 100644
index 0000000..c238268
--- /dev/null
+++ b/src/data/dashboard.json
@@ -0,0 +1,80 @@
+{
+ "kpiCards": [
+ {
+ "title": "Total Penjualan",
+ "value": "Rp 12.450.000",
+ "change": "+12.5%",
+ "trend": "up",
+ "icon": "DollarSign",
+ "period": "vs bulan lalu"
+ },
+ {
+ "title": "Total Transaksi",
+ "value": "1.248",
+ "change": "+8.2%",
+ "trend": "up",
+ "icon": "ShoppingCart",
+ "period": "vs bulan lalu"
+ },
+ {
+ "title": "Produk Terjual",
+ "value": "3.456",
+ "change": "-2.4%",
+ "trend": "down",
+ "icon": "Package",
+ "period": "vs bulan lalu"
+ },
+ {
+ "title": "Total Pelanggan",
+ "value": "567",
+ "change": "+24.3%",
+ "trend": "up",
+ "icon": "Users",
+ "period": "vs bulan lalu"
+ }
+ ],
+ "recentTransactions": [
+ { "id": "TRX-001", "customer": "Budi Santoso", "items": 3, "total": "Rp 125.000", "status": "Selesai", "time": "10:30" },
+ { "id": "TRX-002", "customer": "Siti Rahayu", "items": 1, "total": "Rp 45.000", "status": "Selesai", "time": "10:15" },
+ { "id": "TRX-003", "customer": "Ahmad Hidayat", "items": 5, "total": "Rp 287.500", "status": "Pending", "time": "09:45" },
+ { "id": "TRX-004", "customer": "Dewi Lestari", "items": 2, "total": "Rp 98.000", "status": "Selesai", "time": "09:30" },
+ { "id": "TRX-005", "customer": "Rudi Hermawan", "items": 4, "total": "Rp 175.000", "status": "Selesai", "time": "09:00" },
+ { "id": "TRX-006", "customer": "Maya Putri", "items": 2, "total": "Rp 67.000", "status": "Dibatalkan", "time": "08:45" }
+ ],
+ "topProducts": [
+ { "name": "Kopi Arabica 250gr", "sold": 145, "revenue": "Rp 2.175.000" },
+ { "name": "Roti Tawar Gandum", "sold": 132, "revenue": "Rp 792.000" },
+ { "name": "Susu Fresh 1L", "sold": 98, "revenue": "Rp 686.000" },
+ { "name": "Mie Instan Pack", "sold": 87, "revenue": "Rp 435.000" },
+ { "name": "Air Mineral 600ml", "sold": 76, "revenue": "Rp 152.000" }
+ ],
+ "productCategories": [
+ { "name": "Makanan", "value": "45%", "color": "bg-neutral-900" },
+ { "name": "Minuman", "value": "30%", "color": "bg-neutral-600" },
+ { "name": "Snack", "value": "15%", "color": "bg-neutral-400" },
+ { "name": "Lainnya", "value": "10%", "color": "bg-neutral-200" }
+ ],
+ "chart": {
+ "months": ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des"],
+ "currentYear": [45, 52, 48, 65, 58, 72, 68, 75, 82, 78, 85, 90],
+ "previousYear": [35, 42, 38, 55, 48, 62, 58, 65, 72, 68, 75, 80]
+ },
+ "labels": {
+ "salesChart": "Grafik Penjualan",
+ "currentYear": "Tahun Ini",
+ "previousYear": "Tahun Lalu",
+ "productCategories": "Kategori Produk",
+ "recentTransactions": "Transaksi Terakhir",
+ "topProducts": "Produk Terlaris",
+ "viewAll": "Lihat Semua",
+ "vsLastMonth": "vs bulan lalu"
+ },
+ "tableHeaders": {
+ "id": "ID",
+ "customer": "Pelanggan",
+ "items": "Item",
+ "total": "Total",
+ "status": "Status",
+ "time": "Waktu"
+ }
+}