From 7da45b4e24b38bd0cf08b6d77427b654f7a11f37 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 7 Dec 2025 20:08:31 +0000 Subject: [PATCH] qqqqqqqqqqqqqqqqqqqqqq --- about.php | 28 +- admin/api.php | 115 + admin/assets/css/admin_main.css | 347 --- admin/assets/css/admin_style.css | 437 ++-- admin/dashboard.php | 185 +- admin/footer.php | 34 +- admin/handler.php | 40 + admin/header.php | 24 +- admin/index.php | 25 +- admin/nav.php | 22 +- admin/orders.php | 6 +- admin/products.php | 4 +- admin/reports.php | 175 ++ admin/users.php | 136 ++ api/get_order_details.php | 204 +- assets/css/custom.css | 334 ++- assets/css/dark_luxury.css | 2276 -------------------- assets/css/theme.css | 325 +++ assets/js/main.js | 31 +- assets/pasted-20251207-145857-9f50f97d.png | Bin 0 -> 46404 bytes assets/pasted-20251207-191805-ff2e9ada.png | Bin 0 -> 51354 bytes cart.php | 167 +- checkout.php | 195 +- db/migrations/016_add_phone_to_users.sql | 1 + includes/header.php | 33 +- index.php | 12 +- login.php | 2 +- product.php | 69 +- profile.php | 476 ++-- shop.php | 10 +- track_order.php | 348 +-- 31 files changed, 2359 insertions(+), 3702 deletions(-) delete mode 100644 admin/assets/css/admin_main.css create mode 100644 admin/reports.php create mode 100644 admin/users.php delete mode 100644 assets/css/dark_luxury.css create mode 100644 assets/css/theme.css create mode 100644 assets/pasted-20251207-145857-9f50f97d.png create mode 100644 assets/pasted-20251207-191805-ff2e9ada.png create mode 100644 db/migrations/016_add_phone_to_users.sql diff --git a/about.php b/about.php index 646ba772..10436039 100644 --- a/about.php +++ b/about.php @@ -30,29 +30,29 @@ require_once 'includes/header.php';

ارزش‌های ما

-
-
-
- +
    +
  • +
    +

    تعهد به کیفیت

    استفاده از بهترین مواد اولیه و کنترل کیفی دقیق در تمام مراحل تولید.

    -
-
-
- + +
  • +
    +

    هنر دست

    تمام محصولات ما با عشق و دقت توسط هنرمندان ماهر ساخته می‌شوند.

    -
  • -
    -
    - + +
  • +
    +

    طراحی ماندگار

    خلق آثاری مدرن و در عین حال کلاسیک که هیچ‌گاه از مد نمی‌افتند.

    -
  • -
    + +
    diff --git a/admin/api.php b/admin/api.php index f6e2f0e8..c58a5666 100644 --- a/admin/api.php +++ b/admin/api.php @@ -132,5 +132,120 @@ if ($action === 'get_stats') { exit; } +if ($action === 'get_reports_data') { + try { + // 1. General Stats + $stats_query = " + SELECT + (SELECT SUM(total_amount) FROM orders WHERE status = 'Delivered') as total_revenue, + (SELECT COUNT(*) FROM orders) as total_orders, + (SELECT COUNT(*) FROM users WHERE is_admin = 0) as total_users, + (SELECT COUNT(*) FROM products) as total_products + "; + $stats_stmt = $pdo->query($stats_query); + $stats = $stats_stmt->fetch(PDO::FETCH_ASSOC); + + // 2. Recent Orders + $recent_orders_query = " + SELECT o.id, o.total_amount, o.status, COALESCE(CONCAT(u.first_name, ' ', u.last_name), o.billing_name) AS customer_display_name + FROM orders o + LEFT JOIN users u ON o.user_id = u.id + ORDER BY o.created_at DESC + LIMIT 5 + "; + $recent_orders_stmt = $pdo->query($recent_orders_query); + $recent_orders = $recent_orders_stmt->fetchAll(PDO::FETCH_ASSOC); + + // 3. Top Selling Products (Calculated in PHP) + $orders_for_products_query = "SELECT items_json FROM orders WHERE status = 'Delivered'"; + $orders_for_products_stmt = $pdo->query($orders_for_products_query); + $all_orders_items = $orders_for_products_stmt->fetchAll(PDO::FETCH_ASSOC); + + $product_sales = []; + foreach ($all_orders_items as $order_items) { + $items = json_decode($order_items['items_json'], true); + if (is_array($items)) { + foreach ($items as $item) { + if (isset($item['name']) && isset($item['quantity'])) { + $product_name = $item['name']; + $quantity = (int)$item['quantity']; + if (!isset($product_sales[$product_name])) { + $product_sales[$product_name] = 0; + } + $product_sales[$product_name] += $quantity; + } + } + } + } + + arsort($product_sales); + $top_products = []; + $count = 0; + foreach ($product_sales as $name => $total_sold) { + $top_products[] = ['name' => $name, 'total_sold' => $total_sold]; + $count++; + if ($count >= 5) break; + } + + echo json_encode([ + 'stats' => [ + 'total_revenue' => (float)($stats['total_revenue'] ?? 0), + 'total_orders' => (int)($stats['total_orders'] ?? 0), + 'total_users' => (int)($stats['total_users'] ?? 0), + 'total_products' => (int)($stats['total_products'] ?? 0), + ], + 'recent_orders' => $recent_orders, + 'top_products' => $top_products + ]); + + } catch (PDOException $e) { + http_response_code(500); + error_log("API Error (get_reports_data): " . $e->getMessage()); + echo json_encode(['error' => 'Database error while fetching report data.']); + } + exit; +} + +if ($action === 'get_monthly_sales') { + require_once __DIR__ . '/../includes/jdf.php'; + try { + $stmt = $pdo->prepare(" + SELECT + YEAR(created_at) as year, + MONTH(created_at) as month, + SUM(total_amount) as total_sales + FROM orders + WHERE status = 'Delivered' + GROUP BY year, month + ORDER BY year ASC, month ASC + "); + $stmt->execute(); + $sales_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + $labels = []; + $values = []; + $jalali_months = [ + 1 => 'فروردین', 2 => 'اردیبهشت', 3 => 'خرداد', + 4 => 'تیر', 5 => 'مرداد', 6 => 'شهریور', + 7 => 'مهر', 8 => 'آبان', 9 => 'آذر', + 10 => 'دی', 11 => 'بهمن', 12 => 'اسفند' + ]; + + foreach ($sales_data as $row) { + $jalali_date = gregorian_to_jalali($row['year'], $row['month'], 1); + $labels[] = $jalali_months[(int)$jalali_date[1]] . ' ' . $jalali_date[0]; + $values[] = (float)$row['total_sales']; + } + + echo json_encode(['labels' => $labels, 'values' => $values]); + + } catch (PDOException $e) { + http_response_code(500); + error_log("API Error (get_monthly_sales): " . $e->getMessage()); + echo json_encode(['error' => 'Database error while fetching monthly sales.']); + } + exit; +} + http_response_code(400); echo json_encode(['error' => 'Invalid action']); diff --git a/admin/assets/css/admin_main.css b/admin/assets/css/admin_main.css deleted file mode 100644 index 8227edfd..00000000 --- a/admin/assets/css/admin_main.css +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Admin Panel Main Stylesheet - * A clean, modern, and professional light theme. - */ - -@import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@300;400;500;600;700&display=swap'); -@import url('https://cdn.jsdelivr.net/npm/remixicon@4.2.0/fonts/remixicon.css'); - -:root { - --admin-bg-light: #f4f7f9; /* Light gray background */ - --admin-surface-light: #ffffff; /* White surface for cards, sidebar */ - --admin-border-light: #e0e5ec; /* Soft border color */ - --admin-text-primary: #2d3748; /* Dark text for high contrast */ - --admin-text-secondary: #718096; /* Lighter text for muted info */ - --admin-primary: #4a5568; /* A neutral, professional primary color */ - --admin-primary-active: #2d3748; - --admin-success: #38a169; - --admin-danger: #e53e3e; - --admin-warning: #dd6b20; - --admin-info: #3182ce; -} - -body.admin-theme { - background-color: var(--admin-bg-light); - color: var(--admin-text-primary); - font-family: 'Vazirmatn', sans-serif; - line-height: 1.6; - margin: 0; - padding: 0; - display: flex; - min-height: 100vh; -} - -.admin-wrapper { - display: flex; - width: 100%; -} - -/* --- Sidebar / Navigation --- */ -.admin-sidebar { - width: 250px; - background-color: var(--admin-surface-light); - border-right: 1px solid var(--admin-border-light); - padding: 1.5rem 0; - display: flex; - flex-direction: column; - transition: width 0.3s ease; - box-shadow: 0 0 20px rgba(0,0,0,0.03); -} - -.sidebar-header { - padding: 0 1.5rem 1.5rem 1.5rem; - text-align: center; - border-bottom: 1px solid var(--admin-border-light); -} - -.sidebar-header h2 a { - color: var(--admin-text-primary); - text-decoration: none; - font-size: 1.5rem; - font-weight: 700; -} - -.sidebar-header h2 a span { - color: var(--admin-primary-active); -} - -.admin-nav { - flex-grow: 1; - list-style: none; - padding: 1.5rem 0 0 0; - margin: 0; -} - -.admin-nav-item { - margin: 0 1rem; -} - -.admin-nav-link { - display: flex; - align-items: center; - gap: 0.9rem; - padding: 0.8rem 1rem; - color: var(--admin-text-secondary); - text-decoration: none; - font-weight: 600; - font-size: 0.9rem; - border-radius: 8px; - transition: all 0.3s ease; -} - -.admin-nav-link i { - font-size: 1.2rem; - width: 20px; - text-align: center; -} - -.admin-nav-link:hover { - background-color: var(--admin-bg-light); - color: var(--admin-primary-active); -} - -.admin-nav-link.active { - background-color: var(--admin-primary); - color: #ffffff; - font-weight: 700; -} - -.admin-nav-link.active:hover { - color: #ffffff; - background-color: var(--admin-primary-active); -} -.admin-nav-link.active i { - color: #ffffff; -} - -.sidebar-footer { - padding: 1.5rem; - text-align: center; - border-top: 1px solid var(--admin-border-light); -} - -.sidebar-footer a { - color: var(--admin-text-secondary); - text-decoration: none; - font-size: 0.9rem; -} -.sidebar-footer a:hover { - color: var(--admin-primary-active); -} - -/* --- Main Content --- */ -.admin-main-content { - flex-grow: 1; - padding: 2rem; - overflow-y: auto; -} - -.admin-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 2rem; -} - -.admin-header h1 { - margin: 0; - font-size: 1.8rem; - font-weight: 700; -} - -/* --- General Components --- */ -.card { - background-color: var(--admin-surface-light); - border: 1px solid var(--admin-border-light); - border-radius: 12px; - margin-bottom: 2rem; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03); -} - -.card-header { - padding: 1rem 1.5rem; - border-bottom: 1px solid var(--admin-border-light); - font-size: 1.1rem; - font-weight: 600; -} - -.card-body { - padding: 1.5rem; -} - -.table { - width: 100%; - border-collapse: collapse; -} - -.table th, .table td { - padding: 1rem 1.2rem; - text-align: right; - border-bottom: 1px solid var(--admin-border-light); -} - -.table th { - font-weight: 700; - color: var(--admin-text-secondary); - font-size: 0.8rem; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.table tbody tr:last-child td { - border-bottom: none; -} - -.table tbody tr:hover { - background-color: var(--admin-bg-light); -} - -.btn { - padding: 0.6rem 1.2rem; - border-radius: 8px; - text-decoration: none; - font-weight: 600; - transition: all 0.3s ease; - border: 1px solid transparent; - cursor: pointer; - display: inline-flex; - align-items: center; - gap: 0.5rem; -} - -.btn-primary { - background-color: var(--admin-primary-active); - border-color: var(--admin-primary-active); - color: #fff; -} -.btn-primary:hover { - background-color: #2c3e50; /* Slightly darker */ -} - -.btn-danger { - background-color: var(--admin-danger); - color: #fff; -} - -/* --- Stat Cards --- */ -.stat-card { - background-color: var(--admin-surface-light); - border-radius: 12px; - padding: 1.5rem; - display: flex; - align-items: center; - gap: 1.5rem; - border: 1px solid var(--admin-border-light); - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03); -} - -.stat-card .icon { - font-size: 1.8rem; - padding: 1rem; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - color: #fff; -} - -.stat-card .stat-info p { - margin: 0; - font-size: 0.9rem; - color: var(--admin-text-secondary); -} - -.stat-card .stat-info h3 { - margin: 0; - font-size: 2rem; - font-weight: 700; -} - -.icon.bg-success { background-color: var(--admin-success); } -.icon.bg-danger { background-color: var(--admin-danger); } -.icon.bg-warning { background-color: var(--admin-warning); } -.icon.bg-info { background-color: var(--admin-info); } - - -/* --- Chart Container --- */ -.chart-container { - background-color: var(--admin-surface-light); - padding: 2rem; - border-radius: 12px; - border: 1px solid var(--admin-border-light); - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03); -} - -.chart-container h5 { - font-weight: 700; - margin-bottom: 1.5rem; - font-size: 1.2rem; -} - -/* --- Form styles --- */ -.form-group { - margin-bottom: 1.5rem; -} - -.form-label { - display: block; - margin-bottom: 0.5rem; - font-weight: 600; - color: var(--admin-text-primary); -} - -.form-control { - width: 100%; - padding: 0.8rem 1rem; - background-color: var(--admin-surface-light); - border: 1px solid var(--admin-border-light); - color: var(--admin-text-primary); - border-radius: 8px; - box-sizing: border-box; - transition: border-color 0.3s ease, box-shadow 0.3s ease; -} - -.form-control:focus { - outline: none; - border-color: var(--admin-primary); - box-shadow: 0 0 0 3px rgba(74, 85, 104, 0.1); -} - -textarea.form-control { - min-height: 120px; - resize: vertical; -} - -/* Admin Login Page */ -.admin-login-wrapper { - display: flex; - align-items: center; - justify-content: center; - width: 100%; - min-height: 100vh; - background-color: var(--admin-bg-light); -} - -.admin-login-box { - width: 100%; - max-width: 400px; - padding: 3rem; - background: var(--admin-surface-light); - border-radius: 12px; - box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.07), 0 4px 6px -2px rgba(0, 0, 0, 0.04); -} - -.admin-login-box h2 { - font-weight: 700; - text-align: center; - margin-bottom: 0.5rem; -} - -.admin-login-box p { - text-align: center; - color: var(--admin-text-secondary); - margin-bottom: 2rem; -} - -/* Responsive adjustments will be added later if needed */ - diff --git a/admin/assets/css/admin_style.css b/admin/assets/css/admin_style.css index 8121f4ee..846bd302 100644 --- a/admin/assets/css/admin_style.css +++ b/admin/assets/css/admin_style.css @@ -1,348 +1,331 @@ -@import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@300;400;600;700&display=swap'); -@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css'); +/* + * Admin Panel Luxury Redesign + * This file centralizes all styles for the admin panel. + */ +/* --- Variable Imports & Overrides --- +We can re-use variables from the main theme.css. Let's define some admin-specific ones. +*/ :root { - --admin-bg: #111214; - --admin-surface: #1a1b1e; - --admin-text: #eceff1; - --admin-text-muted: #90a4ae; - --admin-primary: #c09f80; /* Soft gold from luxury theme */ - --admin-border: #37474f; - --admin-success: #4caf50; - --admin-danger: #f44336; - --admin-warning: #ff9800; - --admin-info: #2196f3; + --admin-bg: #111111; /* Deep Dark */ + --admin-surface: #1a1a1a; /* Slightly lighter surface */ + --admin-card-bg: #242424; /* Card background */ + --admin-border: #333333; + --admin-text: #E0E0E0; + --admin-text-muted: #888; + --admin-gold: #e5b56e; + --admin-blue: #4a90e2; + --admin-success: #50e3c2; + --admin-danger: #e35050; + --admin-warning: #f5a623; + --admin-info: #4a90e2; + --sidebar-width: 260px; + --sidebar-width-collapsed: 80px; } -body.admin-dark-theme { +body.admin-body { background-color: var(--admin-bg); color: var(--admin-text); font-family: 'Vazirmatn', sans-serif; - line-height: 1.6; - margin: 0; - padding: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* --- Main Layout --- */ +.admin-wrapper { display: flex; min-height: 100vh; } -.admin-wrapper { - display: flex; - width: 100%; -} - -/* --- Sidebar / Navigation --- */ .admin-sidebar { - width: 260px; + width: var(--sidebar-width); background-color: var(--admin-surface); - border-right: 1px solid var(--admin-border); - padding: 1.5rem 0; + border-left: 1px solid var(--admin-border); display: flex; flex-direction: column; transition: width 0.3s ease; + position: fixed; + top: 0; + right: 0; + bottom: 0; + z-index: 1000; } +.admin-main-content { + flex-grow: 1; + padding: 2rem; + margin-right: var(--sidebar-width); + transition: margin-right 0.3s ease; + background-color: var(--admin-bg); +} + +/* Sidebar Header */ .sidebar-header { - padding: 0 1.5rem 1.5rem 1.5rem; + padding: 1.5rem; text-align: center; border-bottom: 1px solid var(--admin-border); } - .sidebar-header h2 a { - color: var(--admin-text); - text-decoration: none; - font-size: 1.5rem; + color: var(--admin-gold); font-weight: 700; + text-decoration: none; + font-size: 1.8rem; +} +.sidebar-header h2 span { + color: var(--admin-text); } -.sidebar-header h2 a span { - color: var(--admin-primary); -} - +/* Sidebar Navigation */ .admin-nav { - flex-grow: 1; + padding: 1rem 0; list-style: none; - padding: 1.5rem 0 0 0; - margin: 0; -} - -.admin-nav-item { - margin: 0; + flex-grow: 1; } .admin-nav-link { display: flex; align-items: center; - gap: 0.8rem; - padding: 0.9rem 1.5rem; + padding: 1rem 1.5rem; color: var(--admin-text-muted); text-decoration: none; - font-weight: 600; - font-size: 0.95rem; - border-left: 4px solid transparent; transition: all 0.3s ease; + font-weight: 500; + border-right: 4px solid transparent; } .admin-nav-link i { - font-size: 1.1rem; - width: 20px; + font-size: 1.2rem; + width: 30px; text-align: center; + margin-left: 0.8rem; } .admin-nav-link:hover { background-color: var(--admin-bg); - color: var(--admin-primary); - border-left-color: var(--admin-primary); + color: var(--admin-gold); } .admin-nav-link.active { - background-color: var(--admin-bg); - color: var(--admin-text); - border-left-color: var(--admin-primary); + color: var(--admin-gold); font-weight: 700; + background-color: var(--admin-bg); + border-right-color: var(--admin-gold); } +/* Sidebar Footer */ .sidebar-footer { padding: 1.5rem; - text-align: center; border-top: 1px solid var(--admin-border); } - .sidebar-footer a { + display: block; color: var(--admin-text-muted); text-decoration: none; - font-size: 0.9rem; + margin-bottom: 0.5rem; + transition: color 0.3s ease; } .sidebar-footer a:hover { - color: var(--admin-primary); + color: var(--admin-gold); } -/* --- Main Content --- */ -.admin-main-content { - flex-grow: 1; - padding: 2rem; - overflow-y: auto; -} - -.admin-header { +/* --- Header Bar --- */ +.admin-header-bar { display: flex; justify-content: space-between; align-items: center; - margin-bottom: 2rem; -} - -.admin-header h1 { - margin: 0; - font-size: 2rem; - font-weight: 700; -} - -/* --- General Components --- */ -.card { + padding: 1rem 2rem; background-color: var(--admin-surface); - border: 1px solid var(--admin-border); - border-radius: 12px; + border-bottom: 1px solid var(--admin-border); + position: sticky; + top: 0; + z-index: 999; margin-bottom: 2rem; } -.card-header { - padding: 1rem 1.5rem; - border-bottom: 1px solid var(--admin-border); - font-size: 1.1rem; - font-weight: 600; -} - -.card-body { - padding: 1.5rem; -} - -.table { - width: 100%; - border-collapse: collapse; -} - -.table th, .table td { - padding: 1rem; - text-align: right; - border-bottom: 1px solid var(--admin-border); -} - -.table th { - font-weight: 700; - color: var(--admin-text-muted); - font-size: 0.9rem; - text-transform: uppercase; -} - -.table tbody tr:last-child td { - border-bottom: none; -} - -.table tbody tr:hover { - background-color: var(--admin-bg); -} - -.btn { - padding: 0.6rem 1.2rem; - border-radius: 8px; - text-decoration: none; - font-weight: 600; - transition: all 0.3s ease; +#sidebar-toggle { + background: none; border: none; + color: var(--admin-text); + font-size: 1.5rem; cursor: pointer; } -.btn-primary { - background-color: var(--admin-primary); - color: var(--admin-bg); -} -.btn-primary:hover { - opacity: 0.9; -} - -.btn-danger { - background-color: var(--admin-danger); +.admin-header-title h1 { + font-size: 1.5rem; + margin: 0; color: var(--admin-text); } -/* --- Stat Cards (from dashboard) --- */ -.stat-card { - background-color: var(--admin-surface); - border-radius: 12px; - padding: 1.5rem; - display: flex; - align-items: center; - gap: 1.5rem; + +/* --- Main Content Styling --- */ + +/* Cards */ +.card { + background-color: var(--admin-card-bg); border: 1px solid var(--admin-border); - transition: transform 0.3s ease, box-shadow 0.3s ease; + border-radius: 12px; + box-shadow: 0 4px 20px rgba(0,0,0,0.2); +} +.card-header { + background-color: rgba(0,0,0,0.2); + border-bottom: 1px solid var(--admin-border); + font-weight: 600; + color: var(--admin-text); } +/* Stat Cards on Dashboard */ +.stat-cards-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + gap: 1.5rem; + margin-bottom: 2rem; +} + +.stat-card { + display: flex; + align-items: center; + padding: 1.5rem; + background-color: var(--admin-card-bg); + border-radius: 12px; + border: 1px solid var(--admin-border); + transition: transform 0.3s, box-shadow 0.3s; +} .stat-card:hover { transform: translateY(-5px); - box-shadow: 0 5px 15px rgba(0,0,0,0.2); + box-shadow: 0 8px 30px rgba(0,0,0,0.3); } .stat-card .icon { font-size: 2rem; padding: 1rem; border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - color: var(--admin-text); + margin-left: 1rem; + color: #fff; } +.stat-card .icon.bg-primary { background-color: var(--admin-blue); } +.stat-card .icon.bg-warning { background-color: var(--admin-warning); } +.stat-card .icon.bg-success { background-color: var(--admin-success); } +.stat-card .icon.bg-danger { background-color: var(--admin-danger); } + .stat-card .stat-info p { margin: 0; - font-size: 0.9rem; color: var(--admin-text-muted); } - .stat-card .stat-info h3 { margin: 0; font-size: 2rem; font-weight: 700; + color: var(--admin-text); } -.icon.bg-success { background-color: var(--admin-success); } -.icon.bg-danger { background-color: var(--admin-danger); } -.icon.bg-warning { background-color: var(--admin-warning); } -.icon.bg-info { background-color: var(--admin-info); } -.icon.bg-primary { background-color: var(--admin-primary); } - - -/* --- Chart Container --- */ -.chart-container { - background-color: var(--admin-surface); - padding: 2rem; - border-radius: 12px; - border: 1px solid var(--admin-border); +/* Tables */ +.table { + border-color: var(--admin-border); } - -.chart-container h5 { - font-weight: 700; - margin-bottom: 1.5rem; - font-size: 1.2rem; -} - -/* --- Form styles --- */ -.form-group { - margin-bottom: 1.5rem; -} - -.form-label { - display: block; - margin-bottom: 0.5rem; +.table th { + color: var(--admin-gold); font-weight: 600; - color: var(--admin-text-muted); + border-bottom-width: 2px; + border-color: var(--admin-border) !important; +} +.table td { + color: var(--admin-text); + vertical-align: middle; +} +.table-hover tbody tr:hover { + background-color: var(--admin-surface); + color: var(--admin-text); } -.form-control { - width: 100%; - padding: 0.8rem 1rem; - background-color: var(--admin-bg); - border: 1px solid var(--admin-border); +/* Status Badges */ +.status-badge { + padding: 0.4em 0.8em; + border-radius: 8px; + font-size: 0.85rem; + font-weight: 600; + color: #111; +} +.status-processing, .status-badge.bg-info { background-color: var(--admin-info); } +.status-shipped, .status-badge.bg-warning { background-color: var(--admin-warning); } +.status-completed, .status-badge.bg-success { background-color: var(--admin-success); } +.status-cancelled, .status-badge.bg-danger { background-color: var(--admin-danger); } +.status-pending, .status-badge.bg-secondary { background-color: var(--admin-text-muted); color: #fff; } + + +/* Forms */ +.form-control, .form-select { + background-color: var(--admin-surface); + border-color: var(--admin-border); color: var(--admin-text); border-radius: 8px; - box-sizing: border-box; +} +.form-control:focus, .form-select:focus { + background-color: var(--admin-surface); + border-color: var(--admin-gold); + color: var(--admin-text); + box-shadow: 0 0 0 0.2rem rgba(229, 181, 110, 0.2); } -.form-control:focus { - outline: none; - border-color: var(--admin-primary); - box-shadow: 0 0 0 2px rgba(192, 159, 128, 0.2); +.btn-primary { + background-color: var(--admin-gold); + border-color: var(--admin-gold); + color: #111; + font-weight: 600; +} +.btn-primary:hover { + background-color: #d4a55a; + border-color: #d4a55a; } -textarea.form-control { - min-height: 120px; - resize: vertical; -} +/* --- Responsive & Collapsed State --- */ -/* Responsive */ @media (max-width: 992px) { .admin-sidebar { - width: 70px; + position: fixed; + top: 0; + right: -100%; + height: 100vh; + z-index: 1050; /* Above bootstrap backdrop */ + transition: right 0.4s ease; } - .sidebar-header h2 { + .admin-sidebar.open { + right: 0; + } + .admin-main-content { + margin-right: 0; + } + .sidebar-backdrop { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0,0,0,0.5); + z-index: 1040; display: none; } - .admin-nav-link { - justify-content: center; - } - .admin-nav-link span { - display: none; + .sidebar-backdrop.show { + display: block; } } -@media (max-width: 768px) { - .admin-wrapper { - flex-direction: column; + +@media (min-width: 993px) { + .admin-wrapper.sidebar-collapsed .admin-sidebar { + width: var(--sidebar-width-collapsed); } - .admin-sidebar { - width: 100%; - height: auto; - border-right: none; - border-bottom: 1px solid var(--admin-border); - flex-direction: row; - align-items: center; - padding: 0; + .admin-wrapper.sidebar-collapsed .admin-main-content { + margin-right: var(--sidebar-width-collapsed); } - .sidebar-header { + .admin-wrapper.sidebar-collapsed .admin-sidebar .sidebar-header h2 a { + font-size: 1.5rem; + } + .admin-wrapper.sidebar-collapsed .admin-sidebar .sidebar-header h2 span, + .admin-wrapper.sidebar-collapsed .admin-sidebar .admin-nav-link span, + .admin-wrapper.sidebar-collapsed .admin-sidebar .sidebar-footer { display: none; } - .admin-nav { - display: flex; - justify-content: space-around; - flex-grow: 1; - padding: 0; + .admin-wrapper.sidebar-collapsed .admin-sidebar .admin-nav-link { + justify-content: center; } - .admin-nav-link { - border-left: none; - border-bottom: 4px solid transparent; - } - .admin-nav-link:hover, .admin-nav-link.active { - border-left-color: transparent; - border-bottom-color: var(--admin-primary); - } - .sidebar-footer { - display: none; - } -} \ No newline at end of file +} diff --git a/admin/dashboard.php b/admin/dashboard.php index fb340499..3101f34e 100644 --- a/admin/dashboard.php +++ b/admin/dashboard.php @@ -3,111 +3,88 @@ $page_title = 'داشبورد'; require_once __DIR__ . '/header.php'; ?> - - -

    -
    +
    + +
    +
    +

    گزارشات فروش

    +
    +
    +

    مجموع فروش (تکمیل شده)

    +

    ...

    +
    +
    +

    مجموع کاربران

    +

    ...

    +
    +
    +

    سفارشات در حال پردازش

    +

    ...

    +
    +
    -
    -
    -
    -
    -
    -

    مجموع فروش (تحویل شده)

    -

    ...

    +
    +
    نمودار فروش ماهانه (سفارشات تحویل شده)
    +
    + +
    -
    -
    -
    -

    مجموع کاربران

    -

    ...

    -
    -
    -
    -
    -
    -

    سفارشات در حال ارسال

    -

    ...

    -
    -
    -
    -
    -
    -

    سفارشات لغو شده

    -

    ...

    -
    -
    -
    -
    -
    -

    سفارشات در حال پردازش

    -

    ...

    -
    -
    -
    -
    -
    -

    کل بازدید صفحات

    -

    ...

    -
    +
    +

    تنظیمات

    +

    این بخش برای تنظیمات آینده در نظر گرفته شده است.

    - - -
    -
    نمودار فروش ماهانه (سفارشات تحویل شده)
    -
    diff --git a/admin/handler.php b/admin/handler.php index d484e426..4cb0231f 100644 --- a/admin/handler.php +++ b/admin/handler.php @@ -32,6 +32,46 @@ if ($action === 'update_order_status') { } } +if ($action === 'add_user') { + $first_name = filter_input(INPUT_POST, 'first_name', FILTER_SANITIZE_STRING); + $last_name = filter_input(INPUT_POST, 'last_name', FILTER_SANITIZE_STRING); + $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); + $phone = filter_input(INPUT_POST, 'phone', FILTER_SANITIZE_STRING); + $password = $_POST['password'] ?? ''; + $is_admin = filter_input(INPUT_POST, 'is_admin', FILTER_VALIDATE_INT) ? 1 : 0; + + if ($first_name && $last_name && $email && !empty($password)) { + try { + $pdo = db(); + + // Check if user already exists + $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?"); + $stmt->execute([$email]); + if ($stmt->fetch()) { + $_SESSION['error_message'] = "کاربری با این ایمیل از قبل وجود دارد."; + header('Location: users.php'); + exit; + } + + // Hash password + $hashed_password = password_hash($password, PASSWORD_DEFAULT); + + // Insert user + $stmt = $pdo->prepare("INSERT INTO users (first_name, last_name, email, phone, password, is_admin, created_at) VALUES (?, ?, ?, ?, ?, ?, NOW())"); + $stmt->execute([$first_name, $last_name, $email, $phone, $hashed_password, $is_admin]); + + $_SESSION['success_message'] = "کاربر جدید با موفقیت اضافه شد."; + } catch (PDOException $e) { + error_log("Add user failed: " . $e->getMessage()); + $_SESSION['error_message'] = "خطایی در افزودن کاربر جدید رخ داد."; + } + } else { + $_SESSION['error_message'] = "اطلاعات وارد شده نامعتبر است. لطفاً تمام فیلدهای ستاره‌دار را پر کنید."; + } + header('Location: users.php'); + exit; +} + header('Location: orders.php'); exit; ?> \ No newline at end of file diff --git a/admin/header.php b/admin/header.php index afa860d8..6778182e 100644 --- a/admin/header.php +++ b/admin/header.php @@ -5,8 +5,15 @@ <?php echo isset($page_title) ? $page_title . ' - ' : ''; ?>پنل مدیریت آتیمه + + + + + + + + - @@ -15,8 +22,17 @@ - +
    - -
    \ No newline at end of file + +
    +
    + +
    +

    +
    +
    +
    \ No newline at end of file diff --git a/admin/index.php b/admin/index.php index ffad9de9..487eed8a 100644 --- a/admin/index.php +++ b/admin/index.php @@ -2,6 +2,8 @@ session_start(); require_once __DIR__ . '/auth_check.php'; require_once __DIR__ . '/../db/config.php'; + +$page_title = 'داشبورد'; require_once __DIR__ . '/header.php'; $dashboard_error = null; @@ -48,30 +50,7 @@ function get_status_badge_class($status) { } ?> - -
    -

    داشبورد اصلی

    -
    + + + + \ No newline at end of file diff --git a/admin/users.php b/admin/users.php new file mode 100644 index 00000000..e4aaa576 --- /dev/null +++ b/admin/users.php @@ -0,0 +1,136 @@ +query("SELECT id, first_name, last_name, email, phone, created_at FROM users WHERE is_admin = 0 ORDER BY created_at DESC"); + $users = $stmt->fetchAll(PDO::FETCH_ASSOC); + $user_count = count($users); +} catch (PDOException $e) { + die("Error fetching users: " . $e->getMessage()); +} +?> + +
    +

    +
    + + تعداد کل کاربران: + +
    +
    + + +
    + + +
    + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    #نامایمیلشماره تلفنتاریخ عضویت
    هیچ کاربری یافت نشد.
    +
    +
    +
    + + \ No newline at end of file diff --git a/api/get_order_details.php b/api/get_order_details.php index 9dac021f..19ea9bbf 100644 --- a/api/get_order_details.php +++ b/api/get_order_details.php @@ -1,89 +1,143 @@ $message]); + exit(); } -$response = ['success' => false, 'message' => 'Invalid request']; +if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + send_error('Invalid request method.'); +} -if ($_SERVER['REQUEST_METHOD'] === 'POST') { - try { - // Read JSON from the request body - $json_data = file_get_contents('php://input'); - $data = json_decode($json_data, true); - $tracking_id = $data['tracking_id'] ?? ''; +$input_data = json_decode(file_get_contents('php://input'), true); - if (empty($tracking_id)) { - throw new Exception('کد رهگیری سفارش الزامی است.'); - } +if (!isset($input_data['tracking_id']) || empty($input_data['tracking_id'])) { + send_error('شناسه رهگیری مشخص نشده است.'); +} - $db = db(); - $stmt = $db->prepare( - "SELECT - o.*, - o.billing_name AS full_name - FROM orders o - WHERE o.tracking_id = :tracking_id" - ); - $stmt->execute([':tracking_id' => $tracking_id]); - $order = $stmt->fetch(PDO::FETCH_ASSOC); +$tracking_id = $input_data['tracking_id']; - if ($order) { - $items_json = $order['items_json']; - $items = json_decode($items_json, true); - $products = []; - - if (is_array($items)) { - $product_stmt = $db->prepare("SELECT name, price, image_url FROM products WHERE id = :product_id"); - foreach ($items as $item) { - $product_stmt->execute([':product_id' => $item['id']]); - $product_details = $product_stmt->fetch(PDO::FETCH_ASSOC); - - if ($product_details) { - $products[] = [ - 'name' => $product_details['name'], - 'price' => $product_details['price'], - 'image_url' => $product_details['image_url'], - 'quantity' => $item['quantity'], - 'color' => $item['color'] ?? null, - ]; - } - } - } - - // Format data for response - $order['created_at_jalali'] = jdate('Y/m/d H:i', strtotime($order['created_at'])); - $order['status_jalali'] = get_persian_status($order['status']); - - - $response['success'] = true; - $response['message'] = 'سفارش یافت شد.'; - $response['order'] = $order; - $response['products'] = $products; - } else { - $response['message'] = 'سفارشی با این مشخصات یافت نشد.'; - } - } catch (PDOException $e) { - error_log("Order tracking PDO error: " . $e->getMessage()); - $response['message'] = 'خطا در پایگاه داده رخ داد: ' . $e->getMessage(); - } catch (Exception $e) { - error_log("Order tracking general error: " . $e->getMessage()); - $response['message'] = $e->getMessage(); // Show the specific error message for now - } - - echo json_encode($response); +try { + $db = db(); + // 1. Fetch the order by tracking_id + $stmt = $db->prepare( + "SELECT id, billing_name, billing_email, billing_address, billing_city, billing_province, billing_postal_code, total_amount, items_json, created_at, status + FROM orders + WHERE tracking_id = :tracking_id" + ); + $stmt->bindParam(':tracking_id', $tracking_id, PDO::PARAM_STR); + $stmt->execute(); + + $order = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$order) { + send_error('سفارشی با این کد رهگیری یافت نشد.'); + } + + // 2. Decode items JSON and fetch product details + $items_from_db = json_decode($order['items_json'], true); + $products_response = []; + $product_ids = []; + + if (is_array($items_from_db)) { + foreach ($items_from_db as $item) { + if (isset($item['product_id'])) { + $product_ids[] = $item['product_id']; + } + } + } + + if (!empty($product_ids)) { + $placeholders = implode(',', array_fill(0, count($product_ids), '?')); + // Price is taken from items_json, not the products table, which is correct. + // The selected color is also in items_json. + $stmt_products = $db->prepare("SELECT id, name, image_url FROM products WHERE id IN ($placeholders)"); + $stmt_products->execute($product_ids); + $products_data = $stmt_products->fetchAll(PDO::FETCH_ASSOC); + $products_by_id = []; + foreach ($products_data as $product) { + $products_by_id[$product['id']] = $product; + } + + foreach ($items_from_db as $item) { + $product_id = $item['product_id']; + if (isset($products_by_id[$product_id])) { + $product = $products_by_id[$product_id]; + $products_response[] = [ + 'id' => $product['id'], + 'name' => $product['name'], + 'price' => number_format($item['price']) . ' تومان', + 'image_url' => $product['image_url'], + 'quantity' => $item['quantity'], + 'color' => $item['color'] ?? null // Add the selected color from the order + ]; + } + } + } + + + // 3. Format the response + $status_map = [ + 'pending' => 'در انتظار پرداخت', + 'processing' => 'در حال پردازش', + 'shipped' => 'ارسال شده', + 'completed' => 'تکمیل شده', + 'delivered' => 'تحویل شده', // Add mapping for Delivered + 'cancelled' => 'لغو شده', + 'refunded' => 'مسترد شده' + ]; + $status_persian = $status_map[strtolower($order['status'])] ?? $order['status']; + + // Robust date formatting to prevent errors + try { + // Create DateTime object to reliably parse the date from DB + $date = new DateTime($order['created_at']); + $timestamp = $date->getTimestamp(); + // Format the timestamp into Jalali date + $order_date_jalali = jdate('Y/m/d ساعت H:i', $timestamp); + } catch (Exception $e) { + // If parsing fails, log the error and return a safe value + error_log("Jalali date conversion failed for order ID {$order['id']}: " . $e->getMessage()); + $order_date_jalali = 'تاریخ نامعتبر'; + } + + $order_response = [ + 'id' => $order['id'], + 'order_date' => $order_date_jalali, + 'total_amount' => number_format($order['total_amount']) . ' تومان', + 'discount_amount' => '0 تومان', + 'status' => $order['status'], // Pass original status to JS for logic + 'status_persian' => $status_persian, // Pass Persian status for display + 'shipping_name' => $order['billing_name'], + 'shipping_address' => trim(implode(', ', array_filter([$order['billing_province'], $order['billing_city'], $order['billing_address']]))), + 'shipping_postal_code' => $order['billing_postal_code'] + ]; + + // Final JSON structure + $response = [ + 'success' => true, + 'order' => $order_response, + 'products' => $products_response + ]; + + echo json_encode($response, JSON_UNESCAPED_UNICODE); + +} catch (PDOException $e) { + error_log("API Error in get_order_details.php: " . $e->getMessage()); + send_error('خطای سرور: مشکل در ارتباط با پایگاه داده.'); +} catch (Exception $e) { + error_log("API Error in get_order_details.php: " . $e->getMessage()); + send_error('خطای سرور: یک مشکل پیش بینی نشده رخ داد.'); } + ?> \ No newline at end of file diff --git a/assets/css/custom.css b/assets/css/custom.css index 35870e74..66c6d7bf 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -1,3 +1,333 @@ -.empty-cart-container .btn-checkout i { - color: inherit !important; +/* Resetting styles for the new theme. */ + +.about-us-list { + width: 80vw; + display: grid; + list-style: none; + padding: 0; + grid-template-columns: repeat(3, 1fr); + justify-items: center; + margin: 0 auto; + gap: 20px; +} + +.about-us-item { + width: 20vw; + min-width: 200px; + border-radius: 20px; + text-align: center; + border: 1px solid #ebebeb; +} + +.inner { + position: relative; + inset: 0px; + overflow: hidden; + transition: inherit; +} + +.inner::before { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient(-65deg, #0000 40%, #fff7 50%, #0000 70%); + background-size: 200% 100%; + background-repeat: no-repeat; + animation: thing 1.5s ease infinite; + border-radius: 20px; +} + +@keyframes thing { + 0% { + background-position: 130%; + opacity: 1; + } + to { + background-position: -166%; + opacity: 0; + } +} + +@media (max-width: 768px) { + .about-us-list { + grid-template-columns: 1fr; + } + .about-us-item { + width: 80%; + } +} + +/* --- Order Tracking Modal Styles --- */ + +.tracking-modal-container { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1050; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + visibility: hidden; + transition: opacity 0.3s ease, visibility 0.3s ease; +} + +.tracking-modal-container.visible { + opacity: 1; + visibility: visible; +} + +.modal-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.6); + backdrop-filter: blur(5px); + -webkit-backdrop-filter: blur(5px); +} + +.modal-content { + position: relative; + background-color: #2c2c2c; + color: #f0f0f0; + border-radius: 15px; + width: 90%; + max-width: 800px; + max-height: 90vh; + overflow-y: auto; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); + border: 1px solid rgba(255, 255, 255, 0.1); + transform: scale(0.95); + transition: transform 0.3s ease; +} + +.tracking-modal-container.visible .modal-content { + transform: scale(1); +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.5rem; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); +} + +.modal-header h3 { + margin: 0; + font-size: 1.5rem; + font-weight: 500; +} + +#modal-order-id { + font-weight: bold; + color: var(--bs-primary); +} + +.modal-close-btn { + background: none; + border: none; + color: #f0f0f0; + font-size: 2rem; + line-height: 1; + cursor: pointer; + opacity: 0.7; + transition: opacity 0.2s; +} + +.modal-close-btn:hover { + opacity: 1; +} + +.modal-body { + padding: 1.5rem; + display: grid; + gap: 2rem; +} + +.order-summary, +.shipping-details, +.products-list, +.status-details { + background-color: rgba(255, 255, 255, 0.05); + padding: 1.5rem; + border-radius: 10px; +} + +.order-summary { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1rem; +} + +.modal-body h4 { + margin-top: 0; + margin-bottom: 1rem; + font-weight: 500; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + padding-bottom: 0.5rem; +} + +.detail-item { + font-size: 0.95rem; +} + +.detail-item strong { + color: #a0a0a0; + margin-left: 8px; +} + +/* --- Status Tracker --- */ +.status-tracker { + position: relative; + display: flex; + justify-content: space-between; + padding: 20px 0; + margin-top: 20px; +} + +.status-tracker::before { + content: ''; + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 0; + width: calc(100% - 40px); + margin: 0 20px; + height: 4px; + background-color: #444; + z-index: 1; +} + +.status-progress { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 20px; + height: 4px; + background-color: var(--bs-primary); + z-index: 2; + transition: width 0.5s ease; +} + +.status-step { + position: relative; + z-index: 3; + text-align: center; + width: 100px; +} + +.status-step .dot { + width: 20px; + height: 20px; + border-radius: 50%; + background-color: #444; + border: 3px solid #2c2c2c; + margin: 0 auto; + transform: translateY(-8px); + transition: background-color 0.5s ease; +} + +.status-step .label { + display: block; + margin-top: 10px; + font-size: 0.8rem; + color: #a0a0a0; + transition: color 0.5s ease; +} + +/* State Styling */ +.status-step.completed .dot { + background-color: var(--bs-primary); +} + +.status-step.active .dot { + background-color: #fff; + box-shadow: 0 0 10px var(--bs-primary); +} + +.status-step.completed .label { + color: #f0f0f0; + font-weight: 500; +} + +.status-tracker.is-cancelled ~ .status-step:not([data-status="cancelled"]) { + opacity: 0.3; +} +.status-tracker.is-cancelled .status-step[data-status="cancelled"] .dot { + background-color: var(--bs-danger); +} +.status-tracker.is-cancelled .status-step[data-status="cancelled"] .label { + color: var(--bs-danger); + font-weight: bold; +} + + +/* --- Products List --- */ +#modal-products-list { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.product-item { + display: flex; + align-items: center; + gap: 1rem; + background: rgba(255, 255, 255, 0.05); + padding: 10px; + border-radius: 8px; +} + +.product-item img { + width: 60px; + height: 60px; + object-fit: cover; + border-radius: 6px; +} + +.product-info { + flex-grow: 1; +} + +.product-name { + display: block; + font-weight: 500; +} + +.product-quantity { + font-size: 0.9rem; + color: #a0a0a0; +} + +.product-price { + font-weight: bold; +} + +/* --- Product Color Dot --- */ +.product-meta { + display: flex; + align-items: center; + gap: 1rem; + font-size: 0.9rem; + color: #a0a0a0; + margin-top: 4px; +} + +.product-color-wrapper { + display: inline-flex; + align-items: center; + gap: 0.5rem; +} + +.product-color-dot { + width: 16px; + height: 16px; + border-radius: 50%; + border: 1px solid rgba(255, 255, 255, 0.2); + display: inline-block; } \ No newline at end of file diff --git a/assets/css/dark_luxury.css b/assets/css/dark_luxury.css deleted file mode 100644 index 9e54d23e..00000000 --- a/assets/css/dark_luxury.css +++ /dev/null @@ -1,2276 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@300;400;600;700&display=swap'); - -:root { - --luxury-bg: #111214; - --luxury-surface: #1a1b1e; - --luxury-text: #eceff1; - --luxury-text-muted: #90a4ae; - --luxury-primary: #c09f80; /* A soft gold for a touch of luxury */ - --luxury-border: #37474f; -} - -body.dark-luxury { - background-color: var(--luxury-bg); - color: var(--luxury-text); - font-family: 'Vazirmatn', sans-serif; - line-height: 1.8; -} - -.dark-luxury h1, .dark-luxury h2, .dark-luxury h3, .dark-luxury h4, .dark-luxury h5, .dark-luxury h6 { - color: var(--luxury-text); - font-weight: 600; -} - -.dark-luxury .text-muted { - color: var(--luxury-text-muted) !important; -} - -.dark-luxury a { - color: var(--luxury-text); - text-decoration: none; - transition: color 0.3s ease; -} - -.dark-luxury a:hover { - color: var(--luxury-primary); -} - -.dark-luxury .section-title h1 { - font-size: 3rem; - font-weight: 700; - position: relative; - display: inline-block; - padding-bottom: 0.5rem; -} - -.dark-luxury .section-title h1::after { - content: ''; - position: absolute; - bottom: 0; - left: 50%; - transform: translateX(-50%); - width: 60px; - height: 3px; - background-color: var(--luxury-primary); -} - -.dark-luxury .contact-card, .dark-luxury .about-card { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - border-radius: 15px; - transition: transform 0.3s ease, box-shadow 0.3s ease; -} - -.dark-luxury .contact-card:hover, .dark-luxury .about-card:hover { - transform: translateY(-5px); - box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); -} - -.dark-luxury .form-control { - background-color: var(--luxury-bg); - border: 1px solid var(--luxury-border); - color: var(--luxury-text); - border-radius: 8px; - padding: 0.8rem 1rem; -} - -.dark-luxury .form-control:focus { - background-color: var(--luxury-bg); - color: var(--luxury-text); - border-color: var(--luxury-primary); - box-shadow: 0 0 0 0.2rem rgba(192, 159, 128, 0.25); -} - -.dark-luxury .form-label { - font-weight: 600; - color: var(--luxury-text-muted); -} - -.dark-luxury .btn-primary { - background-color: var(--luxury-primary); - border-color: var(--luxury-primary); - color: #111214; - font-weight: 700; - padding: 0.8rem 2rem; - border-radius: 50px; - transition: all 0.3s ease; -} - -.dark-luxury .btn-primary:hover { - background-color: #d4b090; - border-color: #d4b090; - transform: translateY(-2px); - box-shadow: 0 4px 15px rgba(192, 159, 128, 0.2); -} - -.dark-luxury .contact-info i { - color: var(--luxury-primary); - font-size: 1.5rem; -} - -.dark-luxury .contact-info a { - color: var(--luxury-text); - text-decoration: none; - transition: color 0.3s ease; -} - -.dark-luxury .contact-info a:hover { - color: var(--luxury-primary); -} - -.dark-luxury .about-image { - border-radius: 15px; - object-fit: cover; -} - -.dark-luxury .values-card { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - border-radius: 10px; - padding: 2rem; -} - -.dark-luxury .values-card i { - font-size: 2.5rem; - color: var(--luxury-primary); -} - -/* Product Grid Styles */ -.dark-luxury .product-card { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - border-radius: 15px; - overflow: hidden; - display: flex; - flex-direction: column; - transition: transform 0.3s ease, box-shadow 0.3s ease; -} - -.dark-luxury .product-card:hover { - transform: translateY(-5px); - box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); -} - -.dark-luxury .product-image { - width: 100%; - aspect-ratio: 3 / 4; /* Enforce 3:4 aspect ratio */ - overflow: hidden; -} - -.dark-luxury .product-image img { - width: 100%; - height: 100%; - object-fit: cover; /* Crop image to fit, don't distort */ - transition: transform 0.4s ease; -} - -.dark-luxury .product-card:hover .product-image img { - transform: scale(1.05); -} - -.dark-luxury .product-info { - padding: 1.25rem; - flex-grow: 1; - display: flex; - flex-direction: column; - justify-content: center; -} - -.dark-luxury .product-title { - font-size: 1.1rem; - font-weight: 600; - margin-bottom: 0.5rem; -} - -.dark-luxury .product-title a { - color: var(--luxury-text); -} - -.dark-luxury .product-title a:hover { - color: var(--luxury-primary); -} - -.dark-luxury .product-price { - font-size: 1.2rem; - font-weight: 700; - color: var(--luxury-primary); - margin-bottom: 0; -} - -/* Cart Page Styles */ -.dark-luxury .cart-page-wrapper { - padding: 4rem 0; -} - -.dark-luxury .empty-cart-container { - text-align: center; - background-color: var(--luxury-surface); - padding: 4rem 2rem; - border-radius: 20px; - border: 1px solid var(--luxury-border); -} - -.dark-luxury .empty-cart-container i { - font-size: 5rem; - color: var(--luxury-primary); - margin-bottom: 1.5rem; - display: block; -} - -.dark-luxury .empty-cart-container h2 { - font-size: 2.5rem; - font-weight: 700; - margin-bottom: 1rem; -} - -.dark-luxury .empty-cart-container p { - color: var(--luxury-text-muted); - font-size: 1.1rem; - max-width: 450px; - margin: 0 auto 2rem auto; -} - -.dark-luxury .cart-item-card { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - border-radius: 15px; - padding: 1.5rem; - margin-bottom: 1.5rem; - position: relative; -} - -.dark-luxury .remove-item-btn { - position: absolute; - top: 10px; - left: 10px; -} - -.dark-luxury .remove-item-btn .btn i { - font-size: 1.5rem; - color: var(--luxury-text-muted); - transition: color 0.3s ease; -} - -.dark-luxury .remove-item-btn .btn:hover i { - color: #ef5350; /* A soft red for delete */ -} - -.dark-luxury .cart-item-image img { - border-radius: 10px; - width: 100%; - height: auto; - object-fit: cover; -} - -.dark-luxury .cart-item-details h5 a { - font-weight: 600; - font-size: 1.1rem; - color: var(--luxury-text); -} -.dark-luxury .cart-item-details h5 a:hover { - color: var(--luxury-primary); -} - -.dark-luxury .cart-item-color-swatch { - display: inline-block; - width: 20px; - height: 20px; - border-radius: 50%; - border: 1px solid var(--luxury-border); - vertical-align: middle; -} - -.dark-luxury .quantity-selector { - display: flex; - align-items: center; - background-color: var(--luxury-bg); - border: 1px solid var(--luxury-border); - border-radius: 50px; - max-width: 120px; - justify-content: space-between; -} - -.dark-luxury .quantity-selector .btn { - color: var(--luxury-text); - font-size: 1.2rem; - padding: 0.2rem 0.8rem; -} - -.dark-luxury .quantity-selector .btn:disabled { - opacity: 0.5; -} - -.dark-luxury .quantity-selector .quantity-input { - background: transparent; - border: none; - color: var(--luxury-text); - text-align: center; - width: 40px; - font-weight: 700; - padding: 0; -} - -.dark-luxury .item-price { - font-size: 1.2rem; - font-weight: 700; - color: var(--luxury-text); -} - -.dark-luxury .order-summary-card { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - border-radius: 15px; - padding: 2rem; - position: sticky; - top: 120px; -} - -.dark-luxury .order-summary-card .card-title { - font-size: 1.8rem; - font-weight: 700; - margin-bottom: 2rem; - text-align: center; - border-bottom: 1px solid var(--luxury-border); - padding-bottom: 1rem; -} - -.dark-luxury .order-summary-card .summary-item { - display: flex; - justify-content: space-between; - margin-bottom: 1rem; - font-size: 1.1rem; -} - -.dark-luxury .order-summary-card .summary-item .label { - color: var(--luxury-text-muted); -} - -.dark-luxury .order-summary-card .summary-item .value { - font-weight: 600; -} - -.dark-luxury .order-summary-card .summary-total { - border-top: 1px solid var(--luxury-border); - padding-top: 1.5rem; - margin-top: 1.5rem; -} -.dark-luxury .order-summary-card .summary-total .label, -.dark-luxury .order-summary-card .summary-total .value { - font-size: 1.3rem; - font-weight: 700; - color: var(--luxury-primary); -} - -/* - * SweetAlert2 Dark Theme Customizations - * Moved from product.php for global use - */ -body.swal2-shown > [aria-hidden="true"] { - filter: blur(5px); - transition: filter 0.3s ease-out; -} -.swal2-popup.dark-theme-popup { - background-color: #2a2a2e !important; - border-radius: 20px; -} -.swal2-title.dark-theme-title { - color: #e8e6e3 !important; -} -.swal2-html-container.dark-theme-content { - color: #b0b0b0 !important; -} -.swal2-confirm.dark-theme-button { - background-color: var(--luxury-primary) !important; - border-radius: 10px; - padding: .6em 2em; - box-shadow: none !important; - transition: background-color 0.2s; -} - .swal2-confirm.dark-theme-button:hover { - background-color: #c89c6c !important; /* A slightly lighter shade of primary for hover */ -} - -/* Toast Styles */ -.swal2-toast.dark-theme-toast { - background-color: #2a2a2e !important; - color: #e8e6e3 !important; - border-radius: 10px; - box-shadow: 0 4px 15px rgba(0,0,0,0.2); -} -.swal2-toast.dark-theme-toast .swal2-title { - color: #e8e6e3 !important; - font-size: 1em; -} -.swal2-toast.dark-theme-toast .swal2-timer-progress-bar { - background-color: var(--luxury-primary); -} - - -/* - * Single Product Page Styles - */ -.product-image-gallery .img-fluid { - border-radius: 20px !important; - border: 1px solid var(--luxury-border); -} - -.dark-luxury .color-swatches { - display: flex; - flex-wrap: wrap; - gap: 0.75rem; - align-items: center; -} - -.dark-luxury .color-swatches .btn { - width: 32px; - height: 32px; - border-radius: 50%; - border: 2px solid var(--luxury-border); - padding: 0; - transition: all 0.3s ease; - cursor: pointer; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); -} - -.dark-luxury .color-swatches .btn:hover { - transform: scale(1.1); - border-color: var(--luxury-text-muted); -} - -.dark-luxury .color-swatches .btn-check:checked + .btn { - border-color: var(--luxury-primary); - transform: scale(1.1); - box-shadow: 0 0 0 3px var(--luxury-primary); - outline: none; -} - -.dark-luxury .form-control.quantity-input { - background-color: var(--luxury-surface); - max-width: 120px; - text-align: center; - font-size: 1.2rem; - font-weight: 700; - border-width: 1px; - padding: 0.5rem; -} - -.dark-luxury .add-to-cart-btn .btn { - width: 100%; - padding: 1rem; - font-size: 1.1rem; - display: flex; - align-items: center; - justify-content: center; - gap: 0.75rem; - border-radius: 10px; -} - -/* - * Contact Page Styles - */ -.dark-luxury .contact-info .social-btn { - width: 42px; - height: 42px; - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: 50%; - color: var(--luxury-text-muted); - border-color: var(--luxury-border); - transition: all 0.3s ease; - font-size: 1.2rem; -} - -.dark-luxury .contact-info .social-btn:hover { - background-color: var(--luxury-primary); - border-color: var(--luxury-primary); - color: var(--luxury-bg); - transform: translateY(-3px); -} - -/* Header Navbar Toggler */ -.dark-luxury .navbar-toggler { - border-color: var(--luxury-border); -} - -.dark-luxury .navbar-toggler:focus { - box-shadow: 0 0 0 0.25rem rgba(192, 159, 128, 0.25); -} - -.dark-luxury .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(236, 239, 241, 0.8)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -/* - * Checkout Page Styles - */ - -.dark-luxury .checkout-page-wrapper { - padding: 4rem 0; -} - -.dark-luxury .checkout-card { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - border-radius: 15px; - margin-bottom: 1.5rem; -} - -.dark-luxury .checkout-card .card-header { - background-color: transparent; - border-bottom: 1px solid var(--luxury-border); - padding: 1.5rem; - font-size: 1.25rem; - font-weight: 600; -} - -.dark-luxury .checkout-card .card-body { - padding: 1.5rem; -} - -.dark-luxury .form-select { - background-color: var(--luxury-bg); - border: 1px solid var(--luxury-border); - color: var(--luxury-text); - border-radius: 8px; - padding: 0.8rem 1rem; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%2390a4ae' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); -} - -.dark-luxury .form-select:focus { - background-color: var(--luxury-bg); - color: var(--luxury-text); - border-color: var(--luxury-primary); - box-shadow: 0 0 0 0.2rem rgba(192, 159, 128, 0.25); -} - -.dark-luxury .checkout-order-summary .summary-item-list { - list-style: none; - padding: 0; -} - -.dark-luxury .checkout-order-summary .summary-item-list li { - display: flex; - justify-content: space-between; - align-items: center; - padding: 0.75rem 0; - border-bottom: 1px solid var(--luxury-border); -} -.dark-luxury .checkout-order-summary .summary-item-list li:last-child { - border-bottom: none; -} - -.dark-luxury .checkout-order-summary .product-name { - font-weight: 600; -} - -.dark-luxury .checkout-order-summary .product-total { - font-weight: 600; - color: var(--luxury-text); -} - -.dark-luxury .checkout-order-summary .summary-totals { - border-top: 2px solid var(--luxury-border); - margin-top: 1rem; - padding-top: 1rem; -} - -.dark-luxury .checkout-order-summary .summary-totals .total-row { - display: flex; - justify-content: space-between; - font-size: 1.1rem; - margin-bottom: 0.5rem; -} - -.dark-luxury .checkout-order-summary .summary-totals .grand-total { - font-size: 1.4rem; - font-weight: 700; - color: var(--luxury-primary); -} - -/* - * Profile Page Styles - */ - -.dark-luxury .profile-container { - display: flex; - align-items: flex-start; - gap: 30px; -} - -.dark-luxury .profile-sidebar { - flex: 0 0 280px; - background-color: var(--luxury-surface); - border-radius: 15px; - border: 1px solid var(--luxury-border); - padding: 20px; - position: sticky; - top: 120px; -} - -.dark-luxury .profile-content { - flex: 1; -} - -.dark-luxury .user-card { - text-align: center; - padding: 20px 10px; - border-bottom: 1px solid var(--luxury-border); - margin-bottom: 20px; -} - -.dark-luxury .user-card .user-avatar { - width: 90px; - height: 90px; - border-radius: 50%; - background-color: var(--luxury-primary); - color: var(--luxury-bg); - display: flex; - align-items: center; - justify-content: center; - font-size: 2.5rem; - margin: 0 auto 15px auto; - font-weight: 700; -} - -.dark-luxury .user-card h5 { - font-weight: 600; - margin-bottom: 5px; - color: var(--luxury-text); -} - -.dark-luxury .user-card p { - color: var(--luxury-text-muted); - font-size: 0.9rem; -} - -.dark-luxury .profile-nav .nav-link { - display: flex; - align-items: center; - gap: 12px; - padding: 12px 15px; - border-radius: 10px; - color: var(--luxury-text-muted); - font-weight: 500; - transition: all 0.3s ease; - margin-bottom: 5px; -} - -.dark-luxury .profile-nav .nav-link i { - font-size: 1.3rem; - transition: all 0.3s ease; -} - -.dark-luxury .profile-nav .nav-link.active, -.dark-luxury .profile-nav .nav-link:hover { - background-color: var(--luxury-primary); - color: var(--luxury-bg); -} - -.dark-luxury .profile-nav .nav-link.active i, -.dark-luxury .profile-nav .nav-link:hover i { - color: var(--luxury-bg); -} - -.dark-luxury .tab-pane h3 { - font-weight: 700; - margin-bottom: 25px; - color: var(--luxury-text); - border-bottom: 1px solid var(--luxury-border); - padding-bottom: 1rem; -} - -.dark-luxury .order-accordion .accordion-item { - border: 1px solid var(--luxury-border); - border-radius: 15px !important; - margin-bottom: 20px; - background-color: var(--luxury-surface); - overflow: hidden; -} - -.dark-luxury .order-accordion .accordion-button { - border-radius: 0 !important; - background-color: var(--luxury-surface); - box-shadow: none; - padding: 20px; - color: var(--luxury-text); -} - -.dark-luxury .order-accordion .accordion-button:not(.collapsed) { - border-bottom: 1px solid var(--luxury-border); - background-color: var(--luxury-bg); -} - -.dark-luxury .order-accordion .accordion-button::after { - filter: brightness(0) invert(1); -} - -.dark-luxury .order-header { - display: flex; - justify-content: space-between; - width: 100%; - align-items: center; -} - -.dark-luxury .order-header-item { - flex: 1; - text-align: right; -} - -.dark-luxury .order-header-item:first-child { text-align: right; } - -.dark-luxury .order-header-item span { - display: block; - font-size: 0.8rem; - color: var(--luxury-text-muted); -} - -.dark-luxury .order-header-item strong { - font-weight: 600; - color: var(--luxury-text); - font-size: 1rem; -} - -.dark-luxury .order-status { - padding: 5px 12px; - border-radius: 20px; - font-weight: 500; - color: #fff; - font-size: 0.8rem; - text-shadow: 1px 1px 3px rgba(0,0,0,0.2); -} - -.dark-luxury .order-status.status-pending { background-color: #ffc107; color: #000; } -.dark-luxury .order-status.status-processing { background-color: #0dcaf0; color: #000; } -.dark-luxury .order-status.status-shipped { background-color: #0d6efd; } -.dark-luxury .order-status.status-completed { background-color: #198754; } -.dark-luxury .order-status.status-cancelled { background-color: #dc3545; } - - -.dark-luxury .order-details-table { - margin-top: 15px; -} - -.dark-luxury .order-details-table img { - width: 60px; - height: 60px; - object-fit: cover; - border-radius: 10px; -} - -.dark-luxury .order-details-table td { - vertical-align: middle; - border-color: var(--luxury-border); - color: var(--luxury-text-muted); -} -.dark-luxury .order-details-table tr:last-child td { - border-bottom: none; -} - -.dark-luxury .order-details-table .product-name-column { - - font-weight: 600; - - color: var(--luxury-text); - -} - -/* - * New Dashboard Styles - */ - -.dark-luxury .dashboard-title { - font-weight: 700; - margin-bottom: 0.5rem; -} - -.dark-luxury .dashboard-welcome { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - border-radius: 15px; - padding: 2rem; - margin-bottom: 2rem; -} - -.dark-luxury .dashboard-welcome p { - color: var(--luxury-text-muted); - margin-bottom: 0; - font-size: 1.1rem; -} - -.dark-luxury .summary-card { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - border-radius: 15px; - padding: 1.5rem; - display: flex; - align-items: center; - gap: 1.5rem; - transition: all 0.3s ease; -} - -.dark-luxury .summary-card:hover { - transform: translateY(-5px); - box-shadow: 0 8px 20px rgba(0,0,0,0.2); - border-color: var(--luxury-primary); -} - -.dark-luxury .summary-card i { - font-size: 2.5rem; - color: var(--luxury-primary); -} - -.dark-luxury .summary-card-info span { - display: block; - color: var(--luxury-text-muted); - font-size: 0.9rem; - margin-bottom: 0.25rem; -} - -.dark-luxury .summary-card-info strong { - font-size: 1.5rem; - font-weight: 700; - color: var(--luxury-text); -} - -.dark-luxury .dashboard-card { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - border-radius: 15px; - overflow: hidden; -} - -.dark-luxury .dashboard-card-header { - padding: 1.5rem; - border-bottom: 1px solid var(--luxury-border); - font-size: 1.25rem; - font-weight: 600; - margin: 0; -} - -.dark-luxury .dashboard-card-body { - padding: 1.5rem; -} - -.dark-luxury .modern-table { - width: 100%; - border-collapse: collapse; -} - -.dark-luxury .modern-table th { - text-align: right; - padding: 1rem 1.5rem; - font-weight: 600; - color: var(--luxury-text-muted); - border-bottom: 2px solid var(--luxury-border); - font-size: 0.9rem; - text-transform: uppercase; -} - -.dark-luxury .modern-table td { - text-align: right; - padding: 1rem 1.5rem; - vertical-align: middle; - border-bottom: 1px solid var(--luxury-border); - color: var(--luxury-text); -} - -.dark-luxury .modern-table tbody tr:last-child td { - border-bottom: none; -} - -.dark-luxury .modern-table tbody tr:hover { - background-color: var(--luxury-bg); -} - -.dark-luxury .btn-outline-primary { - border-color: var(--luxury-primary); - color: var(--luxury-primary); -} - -.dark-luxury .btn-outline-primary:hover { - background-color: var(--luxury-primary); - color: var(--luxury-bg); -} - - -/* - - - - * Index Page - Hero Section - - - - */ - - - -.dark-luxury .hero-section { - - - - position: relative; - - - - overflow: hidden; - - - -} - - - - - - - -.dark-luxury .video-background-wrapper { - - - - position: absolute; - - - - top: 0; - - - - left: 0; - - - - width: 100%; - - - - height: 100%; - - - - z-index: 0; - - - -} - - - - - - - -.dark-luxury .video-overlay { - - - - position: absolute; - - - - top: 0; - - - - left: 0; - - - - width: 100%; - - - - height: 100%; - - - - background: rgba(0, 0, 0, 0.5); - - - - z-index: 1; - - - -} - - - - - - - -.dark-luxury .video-background-wrapper video { - - - - min-width: 100%; - - - - min-height: 100%; - - - - width: auto; - - - - height: auto; - - - - position: absolute; - - - - top: 50%; - - - - left: 50%; - - - - transform: translate(-50%, -50%); - - - - object-fit: cover; - - - - opacity: 0.5; - - - -} - - - - - - - -.dark-luxury .hero-title { - - - - font-weight: 700; - - - - color: #fff; - - - - text-shadow: 2px 2px 8px rgba(0,0,0,0.6); - - - -} - - - - - - - -.dark-luxury .hero-subtitle { - - - - color: rgba(255,255,255,0.85); - - - - text-shadow: 1px 1px 4px rgba(0,0,0,0.5); - - - -} - - - - - - - -#about-us { - - - - background-color: var(--luxury-bg); - - - -} - - - - - - - -#about-us h1 { - - - - color: var(--luxury-text); - - - -} - - - - - - - -#about-us p { - - - - color: var(--luxury-text-muted) !important; - - - -} - - - - - - - -.dark-luxury #about-us .about-us-image { - - - - border-radius: 15px; - - - - object-fit: cover; - - - - box-shadow: 0 10px 30px rgba(0,0,0,0.2); - - - -} - -/* - - * Track Order Page Styles - - */ - -.dark-luxury .track-container { - - max-width: 600px; - - margin: 5rem auto; - - background-color: var(--luxury-surface); - - padding: 3rem; - - border-radius: 15px; - - border: 1px solid var(--luxury-border); - - text-align: center; - -} - - - -.dark-luxury .track-container h1 { - - margin-bottom: 1rem; - -} - - - -.dark-luxury .track-container p { - - color: var(--luxury-text-muted); - - margin-bottom: 2rem; - -} - - - -.dark-luxury #track-order-form .form-control { - - text-align: center; - - margin-bottom: 1rem; - -} - - - -/* Track Order Modal */ - -.dark-luxury .order-modal { - - display: none; /* Hidden by default */ - - position: fixed; /* Stay in place */ - - z-index: 1060; /* Sit on top */ - - left: 0; - - top: 0; - - width: 100%; /* Full width */ - - height: 100%; /* Full height */ - - overflow: auto; /* Enable scroll if needed */ - - background-color: rgba(0,0,0,0.7); /* Black w/ opacity */ - - backdrop-filter: blur(5px); - -} - - - -.dark-luxury .order-modal-content { - - background-color: var(--luxury-surface); - - margin: 10% auto; /* 10% from the top and centered */ - - padding: 30px; - - border: 1px solid var(--luxury-border); - - border-radius: 20px; - - width: 80%; /* Could be more or less, depending on screen size */ - - max-width: 800px; - - position: relative; - - animation: fadeIn 0.3s; - -} - - - -@keyframes fadeIn { - - from {opacity: 0; transform: scale(0.95);} - - to {opacity: 1; transform: scale(1);} - -} - - - -.dark-luxury .order-modal-close-btn { - - color: var(--luxury-text-muted); - - position: absolute; - - top: 15px; - - left: 25px; - - font-size: 28px; - - font-weight: bold; - - transition: color 0.3s ease; - -} - - - -.dark-luxury .order-modal-close-btn:hover, - -.dark-luxury .order-modal-close-btn:focus { - - color: var(--luxury-text); - - text-decoration: none; - - cursor: pointer; - -} - - - -.dark-luxury .order-modal-header { - - text-align: center; - - border-bottom: 1px solid var(--luxury-border); - - padding-bottom: 1rem; - - margin-bottom: 1.5rem; - -} - - - -.dark-luxury .order-modal-header h2 { - - font-size: 1.8rem; - - color: var(--luxury-primary); - -} - - - -.dark-luxury .order-details-grid { - - display: grid; - - grid-template-columns: 1fr 1fr; - - gap: 1.5rem; - - margin-bottom: 1.5rem; - -} - - - -.dark-luxury .detail-box h3 { - - font-size: 1.2rem; - - font-weight: 600; - - color: var(--luxury-text); - - border-bottom: 1px solid var(--luxury-border); - - padding-bottom: 0.5rem; - margin-bottom: 1rem; - -} - - - -.dark-luxury .detail-box p { - - margin-bottom: 0.5rem; - - font-size: 0.95rem; - -} - - - -.dark-luxury .products-table { - - width: 100%; - - border-collapse: collapse; - -} - - - -.dark-luxury .products-table th, .dark-luxury .products-table td { - - padding: 0.75rem; - - text-align: right; - - border-bottom: 1px solid var(--luxury-border); - -} - - - -.dark-luxury .products-table th { - - font-weight: 600; - - font-size: 0.9rem; - - color: var(--luxury-text-muted); - -} - - - -.dark-luxury .products-table img { - - width: 45px; - - height: 45px; - - border-radius: 8px; - - margin-left: 10px; - - vertical-align: middle; - -} - -/* -Auth Pages - Dark Luxury Theme -*/ - -.auth-wrapper { - display: flex; - min-height: 100vh; - width: 100%; -} - -.auth-bg { - flex: 1; - background: url('https://images.pexels.com/photos/244133/pexels-photo-244133.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2') no-repeat center center; - background-size: cover; - position: relative; - display: none; /* Hidden on small screens */ -} - -@media (min-width: 992px) { - .auth-bg { - display: flex; - align-items: center; - justify-content: center; - } -} - -.auth-bg::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(17, 18, 20, 0.7); - z-index: 1; -} - -.auth-bg-content { - position: relative; - z-index: 2; - text-align: center; - padding: 40px; - max-width: 450px; - color: var(--luxury-text); -} - -.auth-bg-content h1 { - font-size: 3rem; - font-weight: 700; - margin-bottom: 1rem; - text-shadow: 1px 1px 15px rgba(0,0,0,0.5); -} - -.auth-bg-content p { - font-size: 1.1rem; - line-height: 1.7; - color: var(--luxury-text-muted); -} - -.auth-form-wrapper { - flex-grow: 1; /* Take up all space on mobile */ - display: flex; - align-items: center; - justify-content: center; - padding: 30px; - background-color: var(--luxury-surface); -} - -@media (min-width: 992px) { - .auth-form-wrapper { - flex: 0 0 500px; /* Fixed width on larger screens */ - flex-grow: 0; - } -} - -.auth-form-container { - max-width: 400px; - width: 100%; -} - -.auth-form-container .form-header .logo { - font-size: 2rem; - font-weight: 700; - color: var(--luxury-primary); - margin-bottom: 1rem; - text-align: center; -} - -.auth-form-container .form-header h2 { - font-size: 1.8rem; - font-weight: 600; - color: var(--luxury-text); - margin-bottom: 0.5rem; - text-align: center; -} - -.auth-form-container .form-header p { - color: var(--luxury-text-muted); - margin-bottom: 2.5rem; - text-align: center; -} - -.auth-wrapper .form-group { - position: relative; - margin-bottom: 1.5rem; -} - -.auth-form-wrapper .form-control { - height: 52px; - padding: 0 20px; - font-size: 0.95rem; -} - - -.auth-form-wrapper .btn-primary { - height: 50px; - font-size: 1rem; -} - -.auth-footer { - text-align: center; - margin-top: 2rem; - font-size: 0.9rem; -} - -.auth-footer a { - color: var(--luxury-primary); - font-weight: 600; -} - -.auth-footer a:hover { - text-decoration: underline; -} - -.dark-luxury .alert-danger { - background-color: rgba(220, 53, 69, 0.1); - border-color: rgba(220, 53, 69, 0.3); - color: #f8d7da; -} - -.dark-luxury .alert-success { - background-color: rgba(25, 135, 84, 0.1); - border-color: rgba(25, 135, 84, 0.3); - color: #d1e7dd; -} - -.dark-luxury .alert-secondary { - background-color: rgba(144, 164, 174, 0.1); - border-color: rgba(144, 164, 174, 0.3); - color: #cfd8dc; -} - - - -.dark-luxury .otp-input { - - font-size: 1.5rem; - - letter-spacing: 0.5rem; - - text-align: center; - - font-weight: 700; - -} - - - - -/* General Responsive Styles */ - - - - - - - -/* On extra small screens, make the body text a bit smaller */ - - - - -@media (max-width: 575.98px) { - - - - - body { - - - - - font-size: 0.95rem; - - - - - } - - - - - .display-3 { - - - - - font-size: 2.8rem; - - - - - } - - - - - .display-4 { - - - - - font-size: 2.3rem; - - - - - } - - - - -} - - - - - - - - - - - - - - - -/* --- Header --- */ - - - - -@media (max-width: 991.98px) { - .dark-luxury .profile-container { - flex-direction: column; - } - - .dark-luxury .profile-sidebar { - position: static; - width: 100%; - margin-bottom: 2rem; - } - - - - - .dark-luxury .navbar-collapse { - - - - - background-color: var(--luxury-surface); - - - - - padding: 1.5rem; - - - - - border-radius: 15px; - - - - - margin-top: 1rem; - - - - - border: 1px solid var(--luxury-border); - - - - - box-shadow: 0 10px 25px rgba(0,0,0,0.3); - - - - - } - - - - - - - - .dark-luxury .navbar-nav .nav-item:not(:last-child) { - - - - - margin-bottom: 0.5rem; - - - - - } - - - - - - - - .dark-luxury .navbar-nav .nav-link { - - - - - padding: 0.5rem 0; - - - - - } - - - - - - - - .dark-luxury .navbar-collapse .d-flex { - - - - - margin-top: 1.5rem; - - - - - padding-top: 1.5rem; - - - - - border-top: 1px solid var(--luxury-border); - - - - - justify-content: center !important; /* Center the icons/buttons */ - - - - - } - - - - - - - - - - .dark-luxury .site-header { - - - - - background-color: rgba(17, 18, 20, 0.85); - - - - - backdrop-filter: blur(10px); - - - - - } - - - - -} - - - - - - - - - - - - - - - -/* --- Footer --- */ - - - - -@media (max-width: 767.98px) { - - - - - .dark-luxury .site-footer .row > div { - - - - - text-align: center; - - - - - margin-bottom: 2.5rem; /* Add more space between stacked columns */ - - - - - } - - - - - - - - .dark-luxury .site-footer .list-unstyled { - - - - - padding-right: 0; /* Remove default padding for RTL */ - - - - - text-align: center; - - - - - } - - - - - - - - - - .dark-luxury .site-footer .social-icons { - - - - - justify-content: center !important; - - - - - } - - - - - - - - - - .dark-luxury .site-footer .d-flex.align-items-center { - - - - - justify-content: center; - - - - - } - - - - -} - - - - - - - - - - - - - - - -/* --- Homepage Specific --- */ - - - - - - - -@media (max-width: 767.98px) { - - - - - - - - - - - - - - .dark-luxury .hero-section { - - - - - - - - - - - - - - min-height: 60vh; /* Reduce height on mobile */ - - - - - - - - - - - - - - height: auto; - - - - - - - - - - - - - - } - - - - - - - - - - - - - - .dark-luxury .hero-title { - - - - - - - - - - - - - - font-size: 2.5rem; - - - - - - - - - - - - - - } - - - - - - - - - - - - - - .dark-luxury .hero-subtitle { - - - - - - - - - - - - - - font-size: 1.1rem; - - - - - - - - - - - - - - } - - - - -} -.dark-luxury #about-us .text-md-end { - - - - - - - - text-align: center !important; - - - - - - - - } - -/* --- Profile Page Responsive --- */ - -@media (max-width: 991.98px) { - .dark-luxury .profile-container { - flex-direction: column; - } - - .dark-luxury .profile-sidebar { - flex: 0 0 auto; - width: 100%; - position: static; - margin-bottom: 30px; - } -} - -@media (max-width: 767.98px) { - .dark-luxury .order-header { - flex-direction: column; - align-items: flex-start; - gap: 15px; - } - - .dark-luxury .order-header-item { - text-align: right !important; - width: 100%; - } - - .dark-luxury .order-accordion .accordion-button { - padding: 15px; - } - - .dark-luxury .order-details-table .product-name-column { - max-width: 150px; - white-space: normal; - } -} - -@media (max-width: 575.98px) { - .dark-luxury .user-card { - padding: 15px 5px; - } - .dark-luxury .profile-nav .nav-link { - padding: 10px; - gap: 10px; - font-size: 0.9rem; - } - .dark-luxury .order-header-item strong { - font-size: 0.9rem; - } - .dark-luxury .order-header-item span { - font-size: 0.75rem; - } -} - - - - - -} - -/* - * FAQ Page - Accordion Styles - */ -.dark-luxury .accordion-item { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - border-radius: 10px !important; /* Use important to override bootstrap defaults */ - margin-bottom: 1rem; - overflow: hidden; /* Ensures the child elements adhere to the border radius */ -} - -.dark-luxury .accordion-header { - border-bottom: none; -} - -.dark-luxury .accordion-button { - background-color: var(--luxury-surface); - color: var(--luxury-text); - font-weight: 600; - padding: 1.5rem; - border-radius: 0; - box-shadow: none; /* Remove default focus shadow */ - transition: background-color 0.3s ease; -} - -.dark-luxury .accordion-button:not(.collapsed) { - background-color: var(--luxury-bg); - color: var(--luxury-primary); - border-bottom: 1px solid var(--luxury-border); -} - -.dark-luxury .accordion-button:focus { - box-shadow: 0 0 0 0.2rem rgba(192, 159, 128, 0.25); /* Custom focus ring */ -} - -/* Style the accordion icon (chevron) */ -.dark-luxury .accordion-button::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2390a4ae'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); - transition: transform 0.3s ease; -} - -.dark-luxury .accordion-button:not(.collapsed)::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23c09f80'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); -} - -.dark-luxury .accordion-body { - padding: 1.5rem; - color: var(--luxury-text-muted); - line-height: 1.8; -} - -/* Generic Card Style for static pages (e.g., Terms) */ -.dark-luxury main .card { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); - color: var(--luxury-text-muted); /* Fixing text color */ -} - -.dark-luxury main .card .card-body, -.dark-luxury main .card .card-text { - color: var(--luxury-text-muted); /* Ensuring all text within the card is readable */ -} - -.dark-luxury main .card .card-title, -.dark-luxury main .card h1, -.dark-luxury main .card h2, -.dark-luxury main .card h3, -.dark-luxury main .card h4, -.dark-luxury main .card h5, -.dark-luxury main .card h6 { - color: var(--luxury-text); /* Making titles more prominent */ -} - -/* Restore accordion styles to prevent conflicts */ -.dark-luxury .accordion-item { - background-color: var(--luxury-surface); - border: 1px solid var(--luxury-border); -} -.dark-luxury .accordion-button { - background-color: var(--luxury-surface); - color: var(--luxury-text); -} -.dark-luxury .accordion-button:not(.collapsed) { - background-color: var(--luxury-bg); - color: var(--luxury-primary); -} -.dark-luxury .accordion-body { - color: var(--luxury-text-muted); -} diff --git a/assets/css/theme.css b/assets/css/theme.css new file mode 100644 index 00000000..09681a2b --- /dev/null +++ b/assets/css/theme.css @@ -0,0 +1,325 @@ +/* + * Dark & Luxury Theme + * Palette: Black, Gray, Custom Blue + * Font: Vazirmatn + */ + +@import url('https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/Vazirmatn-font-face.css'); + +:root { + /* Color Palette */ + --color-dark-bg: #111111; /* پس‌زمینه اصلی (مشکی) */ + --color-surface: #1f2326; /* پس‌زمینه بخش‌ها (خاکستری تیره‌تر) */ + --color-card-bg: #2a2f34; /* پس‌زمینه کارت‌ها */ + --color-border: #333333; /* رنگ جداکننده‌ها و حاشیه‌ها */ + --color-gold: #e5b56e; /* رنگ شاخص (طلایی سفارشی) */ + --color-gold-hover: #e9bc7e; /* رنگ هاور طلایی سفارشی */ + + /* Text Colors */ + --color-text-primary: #F5F5F5; /* متن اصلی (سفید دودی) */ + --color-text-secondary: #E0E0E0; /* متن ثانویه (خاکستری روشن) */ + + /* Bootstrap Overrides */ + --bs-body-bg: var(--color-dark-bg); + --bs-body-color: var(--color-text-primary); + --bs-border-color: var(--color-border); + --bs-primary: var(--color-gold); + --bs-primary-rgb: 229, 181, 110; + + /* Spacing */ + --section-padding-lg: 6rem; + --section-padding-md: 4rem; +} + +/* --- Base & Typography --- */ +body { + font-family: 'Vazirmatn', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + background-color: var(--bs-body-bg); + color: var(--bs-body-color); + direction: rtl; + text-align: right; + line-height: 1.8; + font-weight: 400; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +html { + scroll-behavior: smooth; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: 700; /* فونت ضخیم‌تر برای عناوین */ + color: var(--color-text-primary); +} + +a { + color: var(--color-gold); + text-decoration: none; + transition: color 0.3s ease; +} + +a:hover { + color: var(--color-gold-hover); +} + +/* --- Layout & Spacing --- */ + +.section-padding { + padding-top: var(--section-padding-md); + padding-bottom: var(--section-padding-md); +} + +@media (min-width: 992px) { + .section-padding { + padding-top: var(--section-padding-lg); + padding-bottom: var(--section-padding-lg); + } +} + +.section-title { + position: relative; + padding-bottom: 15px; +} + +.section-title::after { + content: ''; + position: absolute; + display: block; + width: 60px; + height: 3px; + background: var(--color-gold); + bottom: 0; + left: 50%; + transform: translateX(-50%); +} + +/* For right-aligned titles */ +.text-md-end .section-title::after, +.text-end .section-title::after { + left: auto; + right: 0; + transform: none; +} + + +/* --- Page Specific --- */ + +/* Hero Section */ +.hero-section .hero-title { + font-weight: 800; + text-shadow: 0 2px 20px rgba(0,0,0,0.6); +} + +.hero-section .hero-subtitle { + text-shadow: 0 2px 15px rgba(0,0,0,0.5); + font-weight: 300; + letter-spacing: 0.5px; +} + +/* About Us Section */ +.about-us-image { + border-radius: 12px; + box-shadow: 0 15px 40px rgba(0,0,0,0.4); + transition: transform 0.4s ease; +} +.about-us-image:hover { + transform: scale(1.03); +} + + +/* --- General Components --- */ + +.card { + background-color: var(--color-card-bg); + border: 1px solid rgba(255, 255, 255, 0.05); + border-radius: 15px; /* کمی گردتر */ + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); + transition: all 0.4s ease; + overflow: hidden; +} + +.card:hover { + transform: translateY(-8px); + box-shadow: 0 12px 45px rgba(0, 0, 0, 0.5); + border-color: rgba(var(--bs-primary-rgb), 0.5); +} + +.card.card-static:hover { + transform: none; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); /* Keep original shadow */ + border-color: rgba(255, 255, 255, 0.05); /* Keep original border */ +} + + + +.card-header, .card-footer { + background-color: rgba(0,0,0,0.1); + border-bottom: 1px solid var(--color-border); +} + +.btn-primary { + background-color: var(--color-gold); + border-color: var(--color-gold); + color: #111; /* رنگ متن تیره برای کنتراست روی دکمه طلایی */ + font-weight: 600; + padding: 10px 25px; + border-radius: 8px; + transition: all 0.3s ease; +} + +.btn-primary:hover, .btn-primary:focus { + background-color: var(--color-gold-hover); + border-color: var(--color-gold-hover); + color: #000; + transform: translateY(-2px); + box-shadow: 0 4px 15px rgba(218, 165, 32, 0.2); +} + +.form-control { + background-color: var(--color-surface); + border-color: var(--color-border); + color: var(--color-text-primary); + border-radius: 8px; +} + +.form-control:focus { + background-color: var(--color-surface); + border-color: var(--color-gold); + color: var(--color-text-primary); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25); +} + +.form-control::placeholder { + color: var(--color-text-secondary); + opacity: 0.7; +} + +/* --- Utilities --- */ +.text-gold { + color: var(--color-gold) !important; +} + +.text-muted { + color: #bbbbbb !important; +} + +.bg-surface { + background-color: var(--color-surface) !important; +} + +/* --- Header --- */ +.site-header { + background-color: rgba(17, 17, 17, 0.85); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border-bottom: 1px solid transparent; + transition: border-color 0.3s ease; +} + +.site-header.header-scrolled { + border-color: var(--color-border); +} + +.site-header .navbar-brand { + color: var(--color-gold); +} + +.site-header .nav-link { + color: var(--color-text-secondary); + transition: color 0.3s ease; +} + +.site-header .nav-link:hover, .site-header .nav-link.active { + color: var(--color-gold); +} + +.navbar-toggler { + border-color: rgba(var(--bs-primary-rgb), 0.5) !important; +} + +.navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(229, 181, 110, 1)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") !important; +} + + +/* --- Product Card --- */ +.product-card { + /* This class is a specific implementation of the .card component. */ + /* It inherits border, background, shadow, etc. from .card */ + padding: 0; /* Remove card-body padding if any is added globally */ +} + +/* The hover effect for product-card is slightly different, so we override the transform */ +.product-card:hover { + transform: translateY(-8px); /* Keep the slightly larger lift */ +} + +.product-card .product-image { + aspect-ratio: 3 / 4; + overflow: hidden; +} + +.product-card .product-image img { + width: 100%; + height: 100%; + object-fit: cover; /* پوشش کامل کادر بدون تغییر نسبت */ + transition: transform 0.5s ease; +} + +.product-card:hover .product-image img { + transform: scale(1.08); /* افکت زوم روی هاور */ +} + +.product-card .product-info { + padding: 1.5rem 0.5rem; +} + +.product-card .product-title a { + font-size: 1.1rem; + font-weight: 600; + color: var(--color-text-primary); + text-decoration: none; +} + +.product-card .product-price { + color: var(--color-gold); + font-size: 1.2rem; + font-weight: 700; + margin-top: 0.5rem; +} + +/* --- Footer --- */ +.site-footer { + background-color: var(--color-surface); + border-top: 1px solid var(--color-border); +} + +.site-footer h5 { + color: var(--color-gold); +} + +.site-footer p, +.site-footer .text-white-50 { + color: var(--color-text-secondary) !important; +} + +.site-footer a, +.site-footer a.text-white-50 { + color: var(--color-text-secondary) !important; + transition: color 0.3s ease; +} + +.site-footer a:hover { + color: var(--color-gold) !important; +} + +.site-footer .social-icon { + font-size: 1.5rem; + color: var(--color-text-secondary); + transition: color 0.3s ease; +} + +.site-footer .social-icon:hover { + color: var(--color-gold); +} diff --git a/assets/js/main.js b/assets/js/main.js index fa0b40e5..4c105e38 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -1,11 +1,30 @@ -// Custom JavaScript will go here - document.addEventListener('DOMContentLoaded', () => { - // --- AOS Initialization --- + // Initialize AOS (Animate on Scroll) AOS.init({ - duration: 800, - once: true, + duration: 800, // Animation duration in ms + offset: 100, // Offset (in px) from the original trigger point + once: true, // Whether animation should happen only once - while scrolling down }); -}); + // Add a class to the header when the page is scrolled + const header = document.querySelector('.site-header'); + if (header) { + const scrollThreshold = 50; // Pixels to scroll before adding the class + + const handleScroll = () => { + if (window.scrollY > scrollThreshold) { + header.classList.add('header-scrolled'); + } else { + header.classList.remove('header-scrolled'); + } + }; + + // Listen for the scroll event + window.addEventListener('scroll', handleScroll); + + // Initial check in case the page is already scrolled on load + handleScroll(); + } + +}); \ No newline at end of file diff --git a/assets/pasted-20251207-145857-9f50f97d.png b/assets/pasted-20251207-145857-9f50f97d.png new file mode 100644 index 0000000000000000000000000000000000000000..efb5b39ed82b0e28d4d3895798549a02a39bfa67 GIT binary patch literal 46404 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 j0EPe8TzdBj*~GXfF6 -
    -
    +
    +
    +
    - -
    - -

    سبد خرید شما خالی است

    -

    به نظر می‌رسد هنوز محصولی به سبد خرید خود اضافه نکرده‌اید. همین حالا گشتی در فروشگاه بزنید.

    - - - رفتن به فروشگاه - -
    - -
    -

    سبد خرید شما

    -

    جزئیات سفارش خود را بررسی و نهایی کنید.

    -
    -
    -
    - $item): - $item_total = $item['price'] * $item['quantity']; - $total_price += $item_total; - ?> -
    -
    -
    - - - - -
    -
    -
    -
    - - <?php echo htmlspecialchars($item['name']); ?> - -
    -
    -
    - -
    - رنگ: - -
    - -
    -
    -
    + +
    +
    + +
    +

    سبد خرید شما خالی است

    +

    به نظر می‌رسد هنوز محصولی به سبد خرید خود اضافه نکرده‌اید. همین حالا گشتی در فروشگاه بزنید.

    + +
    + +
    +

    سبد خرید شما

    +

    جزئیات سفارش خود را بررسی و نهایی کنید.

    +
    + +
    +
    + $item): + $item_total = $item['price'] * $item['quantity']; + $total_price += $item_total; + ?> +
    +
    + - - - - - + +
    -
    - تومان +
    +
    + + <?php echo htmlspecialchars($item['name']); ?> + +
    +
    +
    + +
    + رنگ: + +
    + +
    +
    +
    + + + + + + + +
    +
    +
    + تومان +
    -
    - -
    + +
    -
    -
    -

    خلاصه سفارش

    -
    - جمع کل - تومان -
    -
    - هزینه ارسال - رایگان -
    -
    -
    - مبلغ نهایی +
    +
    +

    خلاصه سفارش

    +
    + جمع کل تومان
    -
    -
    - ادامه و پرداخت +
    + هزینه ارسال + رایگان +
    +
    +
    + مبلغ نهایی + تومان +
    +
    +
    -
    - -
    -
    + +
    +
    +
    \ No newline at end of file diff --git a/checkout.php b/checkout.php index fb9780d0..b21bafbf 100644 --- a/checkout.php +++ b/checkout.php @@ -72,114 +72,123 @@ $grand_total = $total_price + $shipping_cost; ?> -
    -
    - -
    -

    جزئیات صورتحساب

    +
    +
    +
    +
    +

    تکمیل سفارش و پرداخت

    +

    اطلاعات خود را برای ارسال سفارش وارد کنید.

    +
    -
      '; - foreach ($_SESSION['checkout_errors'] as $error) { - echo '
    • ' . htmlspecialchars($error) . '
    • '; - } - echo '
    '; - // Unset the session variable so it doesn't show again on refresh - unset($_SESSION['checkout_errors']); - } - ?> - -
    +
    + +
    +

    جزئیات صورتحساب

    -
    -
    اطلاعات تماس
    -
    -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - +
      '; + foreach ($_SESSION['checkout_errors'] as $error) { + echo '
    • ' . htmlspecialchars($error) . '
    • '; + } + echo '
    '; + // Unset the session variable so it doesn't show again on refresh + unset($_SESSION['checkout_errors']); + } + ?> + + + +
    +
    اطلاعات تماس
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    -
    -
    -
    -
    آدرس جهت ارسال
    -
    -
    - - -
    -
    -
    - - -
    -
    - - -
    -
    - - +
    +
    آدرس جهت ارسال
    +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    -
    + +
    - -
    + +
    +
    +

    خلاصه سفارش شما

    +
      + +
    • + (x) + T +
    • + +
    - -
    -
    -

    خلاصه سفارش شما

    -
      - -
    • - (x) - T -
    • - -
    +
    +
    + جمع کل + T +
    +
    + هزینه ارسال + T +
    +
    + مبلغ قابل پرداخت + T +
    +
    -
    -
    - جمع کل - T +
    + +
    -
    - هزینه ارسال - T -
    -
    - مبلغ قابل پرداخت - T -
    -
    - -
    -
    -
    +
    diff --git a/db/migrations/016_add_phone_to_users.sql b/db/migrations/016_add_phone_to_users.sql new file mode 100644 index 00000000..b1ba3161 --- /dev/null +++ b/db/migrations/016_add_phone_to_users.sql @@ -0,0 +1 @@ +ALTER TABLE `users` ADD COLUMN `phone` VARCHAR(255) NULL AFTER `email`; \ No newline at end of file diff --git a/includes/header.php b/includes/header.php index fb446bf9..7c484e07 100644 --- a/includes/header.php +++ b/includes/header.php @@ -34,32 +34,8 @@ $page_title = $page_title ?? 'فروشگاه آتیمه'; // Default title <?php echo htmlspecialchars($page_title); ?> - - - - - - - + + @@ -70,10 +46,11 @@ $page_title = $page_title ?? 'فروشگاه آتیمه'; // Default title + + + - - - - + + + \ No newline at end of file