<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}BLO — Achat en ligne{% endblock %}</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700;800&display=swap" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css" rel="stylesheet">
<style>
:root {
--blo-bg: #f7f9f6;
--blo-bg-white: #ffffff;
--blo-header-bg: #ffffff;
--blo-header-search-bg: #5db85b;
--blo-header-search-hover: #4cae4c;
--blo-nav-bg: #388e3c;
--blo-text: #333333;
--blo-text-muted: #777777;
--blo-link: #388e3c;
--blo-link-hover: #2e7d32;
--blo-price: #e53935;
--blo-border: #e0e0e0;
--blo-card-bg: #fff;
--blo-bg-card: #fff;
--blo-bg-elevated: #f3f3f3;
--blo-radius: 6px;
}
* { box-sizing: border-box; }
body { font-family: 'Nunito', -apple-system, sans-serif; background: var(--blo-bg); color: var(--blo-text); min-height: 100vh; display: flex; flex-direction: column; margin: 0; }
main { flex: 1 0 auto; }
a { color: var(--blo-link); text-decoration: none; }
a:hover { color: var(--blo-link-hover); }
/* Header type Greenweez */
.blo-header-top {
background: var(--blo-header-bg);
color: var(--blo-text);
padding: 0.5rem 0;
border-bottom: 1px solid var(--blo-border);
}
.blo-header-top .container { display: flex; align-items: center; flex-wrap: wrap; gap: 0.75rem; }
.blo-logo { display: inline-flex; align-items: center; gap: 0.5rem; color: var(--blo-nav-bg) !important; font-weight: 700; font-size: 1.5rem; padding: 0.5rem 0.5rem 0.5rem 0; letter-spacing: 0.02em; }
.blo-logo:hover { color: var(--blo-link-hover) !important; opacity: 0.95; }
.blo-logo-icon { width: 36px; height: 36px; background: var(--blo-nav-bg); color: #fff; border-radius: 6px; display: flex; align-items: center; justify-content: center; font-size: 1.1rem; }
.blo-logo-text { line-height: 1; }
.blo-search-form { flex: 1; min-width: 200px; max-width: 600px; display: flex; border-radius: 50px; overflow: hidden; border: 2px solid var(--blo-header-search-bg); background: #fff;}
.blo-search-form .form-select { width: auto; min-width: 150px; border: none; border-radius: 50px 0 0 50px; background: transparent; font-size: 0.9rem; padding-right: 2rem; font-weight: 600; color: var(--blo-text-muted); }
.blo-search-form .form-select:focus { box-shadow: none; }
.blo-search-form .form-control { border: none; border-radius: 0; font-size: 0.95rem; box-shadow: none !important;}
.blo-search-form .btn-search { background: var(--blo-header-search-bg); border: none; padding: 0.5rem 1.25rem; color: #fff; border-radius: 0 50px 50px 0; font-weight: bold;}
.blo-search-form .btn-search:hover { background: var(--blo-header-search-hover); color: #fff; }
.blo-header-cart { color: var(--blo-text); display: flex; align-items: center; gap: 0.35rem; padding: 0.5rem; border-radius: var(--blo-radius); position: relative; }
.blo-header-cart:hover { color: var(--blo-link); outline: 1px solid var(--blo-border); }
.blo-header-cart i { font-size: 1.5rem; }
.blo-header-cart .blo-cart-badge { position: absolute; top: 2px; left: 50%; margin-left: 8px; min-width: 1.1rem; height: 1.1rem; padding: 0 0.25rem; font-size: 0.7rem; font-weight: 700; line-height: 1.1rem; text-align: center; background: var(--blo-header-search-bg); color: #fff; border-radius: 50%; }
.blo-header-cart .blo-cart-badge:empty { display: none; }
.blo-nav-bar { background: var(--blo-nav-bg); padding: 0.6rem 0; }
.blo-nav-bar .nav-link { color: rgba(255,255,255,0.95) !important; padding: 0.4rem 0.8rem !important; font-size: 0.95rem; font-weight: 600; transition: color 0.15s; }
.blo-nav-bar .nav-link:hover { color: #fff !important; background: rgba(255,255,255,0.1); border-radius: 20px;}
.blo-nav-bar .dropdown-menu { background: var(--blo-card-bg); border: 1px solid var(--blo-border); border-radius: var(--blo-radius); }
.blo-nav-bar .dropdown-item:hover { background: #f0f0f0; }
.blo-header-cat-btn { background: transparent !important; font-size: 0.9rem; font-weight: 600; letter-spacing: 0.01em; border-radius: var(--blo-radius); transition: background 0.15s; color: var(--blo-text) !important; }
.blo-header-cat-btn i { color: var(--blo-text); }
.blo-header-cat-btn:hover { background: rgba(0,0,0,0.05) !important; }
.blo-cat-dropdown .nav-link { background: rgba(255,255,255,0.1); border-radius: var(--blo-radius); font-weight: 600; }
.blo-cat-dropdown .nav-link:hover { background: rgba(255,255,255,0.2); }
.blo-cat-menu { min-width: 280px; padding: 0.5rem 0; max-height: 70vh; overflow-y: auto; box-shadow: 0 4px 16px rgba(0,0,0,0.15); }
.blo-cat-menu .dropdown-item { padding: 0.45rem 1rem; }
.blo-cat-menu .dropdown-item:active { background: var(--blo-header-search-bg); color: var(--blo-text); }
/* Cartes produit type Greenweez */
.blo-product-box {
background: var(--blo-card-bg);
padding: 1.5rem;
height: 100%;
border-radius: 12px;
transition: all 0.2s ease-in-out;
border: 1px solid #eaeaea;
position: relative;
}
.blo-product-box:hover { box-shadow: 0 8px 16px rgba(0,0,0,0.06); border-color: transparent; transform: translateY(-3px); }
.blo-product-box .img-wrap { aspect-ratio: 1; display: flex; align-items: center; justify-content: center; margin-bottom: 1rem; border-radius: 8px; position: relative; }
.blo-product-box .img-wrap img { max-width: 100%; max-height: 100%; object-fit: contain; }
.blo-product-box .img-wrap .bi-image { font-size: 2.5rem; opacity: 0.6; }
.blo-product-box { display: flex; flex-direction: column; }
.blo-product-box > a { display: flex !important; flex-direction: column; flex: 1; }
.blo-product-box .title { font-size: 0.95rem; line-height: 1.4; color: var(--blo-text); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; font-weight: 600; margin-bottom: 0.5rem; min-height: calc(0.95rem * 1.4 * 2); }
.blo-product-box .price { font-size: 1.15rem; font-weight: 800; color: var(--blo-text); margin: auto 0 0.5rem 0; padding-right: 60px; min-height: 40px; display: block; line-height: 1.2; white-space: normal; }
.blo-product-box .price del { display: block; font-size: 0.8rem; color: var(--blo-text-muted); font-weight: 500; margin: 0 0 2px 0; }
p.price, .blo-catalog-card .price { white-space: normal; }
.blo-product-add-btn {
display: flex; align-items: center; justify-content: center; width: 40px; height: 40px;
background: var(--blo-header-search-bg); color: #fff; border-radius: 50%;
border: none; position: absolute; bottom: 1.5rem; right: 1.5rem; transition: background 0.2s;
box-shadow: 0 4px 6px rgba(93,184,91,0.25);
}
.blo-product-add-btn:hover { background: var(--blo-header-search-hover); color: #fff; transform: scale(1.05); }
.blo-section-box { background: var(--blo-card-bg); padding: 1.25rem; border-radius: var(--blo-radius); margin-bottom: 1.5rem; }
.blo-section-box h2 { font-size: 1.25rem; font-weight: 700; margin-bottom: 1rem; color: var(--blo-text); }
.blo-footer { background: var(--blo-nav-bg); color: rgba(255,255,255,0.8); padding: 2rem 0 1rem; margin-top: 2rem; flex-shrink: 0; }
.blo-footer a { color: rgba(255,255,255,0.9); }
.blo-footer a:hover { color: #fff; text-decoration: underline; }
.blo-footer h6 { color: #fff; font-size: 1rem; font-weight: 600; margin-bottom: 0.75rem; }
.blo-footer ul { list-style: none; padding: 0; margin: 0; font-size: 0.85rem; }
.blo-footer ul li { margin-bottom: 0.35rem; }
.blo-footer-bottom { background: #131a22; padding: 1rem 0; margin-top: 1rem; font-size: 0.8rem; text-align: center; }
.form-control:focus, .form-select:focus { border-color: var(--blo-header-search-bg); box-shadow: 0 0 0 2px rgba(254,189,105,0.4); }
.btn-blo-primary { background: var(--blo-header-search-bg); color: var(--blo-text); border: none; font-weight: 600; padding: 0.5rem 1rem; border-radius: var(--blo-radius); }
.btn-blo-primary:hover { background: var(--blo-header-search-hover); color: var(--blo-text); }
.breadcrumb { background: transparent; font-size: 0.85rem; }
.breadcrumb-item a { color: var(--blo-link); }
.table thead th { background: #f3f3f3; font-weight: 600; }
.pagination .page-link { color: var(--blo-text); }
.pagination .page-item.active .page-link { background: var(--blo-header-bg); border-color: var(--blo-header-bg); }
.blo-card { background: var(--blo-card-bg); border: 1px solid var(--blo-border); border-radius: var(--blo-radius); }
.btn-blo-outline { background: transparent; color: var(--blo-text); border: 1px solid var(--blo-border); border-radius: var(--blo-radius); }
.btn-blo-outline:hover { border-color: var(--blo-header-search-bg); color: var(--blo-text); background: #fff8f0; }
.blo-section-label { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--blo-text-muted); }
.blo-section-title { font-size: 1.25rem; font-weight: 700; color: var(--blo-text); }
.blo-kpi-card { background: var(--blo-card-bg); border: 1px solid var(--blo-border); border-radius: var(--blo-radius); padding: 1rem; }
.blo-kpi-card .label { font-size: 0.8rem; color: var(--blo-text-muted); }
.blo-kpi-card .value { font-weight: 700; font-size: 1.25rem; }
/* ============================================
BOUTONS MULTI-COLOR 3D (BLO)
N'affecte PAS les menus (header, navbar, dropdowns, search)
Cible uniquement les boutons dans <main> et les formulaires
============================================ */
main .btn:not(.blo-product-add-btn):not(.btn-search),
main button.btn:not(.blo-product-add-btn):not(.btn-search),
main a.btn:not(.blo-product-add-btn):not(.btn-search),
main input.btn:not(.blo-product-add-btn):not(.btn-search),
main button[type="submit"]:not(.blo-product-add-btn):not(.btn-search),
main input[type="submit"]:not(.blo-product-add-btn):not(.btn-search),
.blo-card .btn:not(.blo-product-add-btn):not(.btn-search),
.blo-section-box .btn:not(.blo-product-add-btn):not(.btn-search),
.blo-product-box .btn:not(.blo-product-add-btn):not(.btn-search) {
background: linear-gradient(135deg, #4169E1 0%, #8B00FF 50%, #8B4513 100%) !important;
color: #FFFFFF !important;
border: none !important;
border-radius: 6px !important;
padding: 8px 18px !important;
font-weight: 600 !important;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.3) !important;
box-shadow:
0 4px 0 #2c3e50,
0 6px 8px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.4) !important;
transition: all 0.15s ease-in-out !important;
transform: translateY(0) !important;
position: relative !important;
}
main .btn:hover,
main button.btn:hover,
main a.btn:hover,
.blo-card .btn:hover,
.blo-section-box .btn:hover,
.blo-product-box .btn:hover {
background: linear-gradient(135deg, #5a7af0 0%, #a020f0 50%, #a0522d 100%) !important;
color: #FFFFFF !important;
transform: translateY(-2px) !important;
box-shadow:
0 6px 0 #2c3e50,
0 10px 14px rgba(0, 0, 0, 0.35),
inset 0 1px 0 rgba(255, 255, 255, 0.5) !important;
}
main .btn:active,
main button.btn:active,
main a.btn:active,
.blo-card .btn:active,
.blo-section-box .btn:active,
.blo-product-box .btn:active {
transform: translateY(3px) !important;
box-shadow:
0 1px 0 #2c3e50,
0 2px 4px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.3) !important;
}
/* Variantes de couleur 3D */
main .btn-success, .blo-card .btn-success {
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%) !important;
box-shadow: 0 4px 0 #0a5d56, 0 6px 8px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.4) !important;
}
main .btn-danger, .blo-card .btn-danger {
background: linear-gradient(135deg, #ff416c 0%, #ff4b2b 100%) !important;
box-shadow: 0 4px 0 #8b1a1a, 0 6px 8px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.4) !important;
}
main .btn-warning, .blo-card .btn-warning {
background: linear-gradient(135deg, #f7971e 0%, #ffd200 100%) !important;
box-shadow: 0 4px 0 #7a4a00, 0 6px 8px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.4) !important;
}
main .btn-info, .blo-card .btn-info {
background: linear-gradient(135deg, #00c6ff 0%, #0072ff 100%) !important;
box-shadow: 0 4px 0 #003a80, 0 6px 8px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.4) !important;
}
main .btn-primary, .blo-card .btn-primary {
background: linear-gradient(135deg, #4169E1 0%, #8B00FF 100%) !important;
box-shadow: 0 4px 0 #1d2d6b, 0 6px 8px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.4) !important;
}
main .btn-secondary, .blo-card .btn-secondary {
background: linear-gradient(135deg, #654ea3 0%, #eaafc8 100%) !important;
box-shadow: 0 4px 0 #3a2a60, 0 6px 8px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.4) !important;
}
/* Sécurité : annuler tout style 3D dans les menus / header / navbar / dropdowns */
.blo-header-top .btn,
.blo-header-top button,
.blo-nav-bar .btn,
.blo-nav-bar button,
.navbar .btn,
.navbar button,
.dropdown-menu .btn,
.dropdown-menu button,
.blo-search-form .btn,
.blo-search-form button,
.blo-header-cat-btn,
.blo-product-add-btn {
background-image: none;
box-shadow: none !important;
transform: none !important;
text-shadow: none !important;
}
/* Garder le bouton rond "+" vert des produits intact */
.blo-product-add-btn {
background: var(--blo-header-search-bg) !important;
color: #fff !important;
border-radius: 50% !important;
padding: 0 !important;
position: absolute !important;
bottom: 1.5rem !important;
right: 1.5rem !important;
left: auto !important;
top: auto !important;
width: 40px !important;
height: 40px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
border: none !important;
box-shadow: 0 4px 6px rgba(93,184,91,0.25) !important;
text-shadow: none !important;
font-weight: normal !important;
}
.blo-product-add-btn:hover {
background: var(--blo-header-search-hover) !important;
}
/* Garder le bouton de recherche vert */
.blo-search-form .btn-search {
background: var(--blo-header-search-bg) !important;
color: #fff !important;
border-radius: 0 50px 50px 0 !important;
}
.blo-search-form .btn-search:hover {
background: var(--blo-header-search-hover) !important;
}
/* ============================================
FOOTER MULTI-COLOR 3D (BLO)
============================================ */
.blo-footer {
background: linear-gradient(135deg, #4169E1 0%, #8B00FF 25%, #ff416c 50%, #f7971e 75%, #11998e 100%) !important;
background-size: 200% 200% !important;
animation: bloFooterGradient 8s ease infinite !important;
color: #FFFFFF !important;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5) !important;
border-top: 3px solid rgba(255, 255, 255, 0.3) !important;
box-shadow:
0 -4px 0 rgba(0, 0, 0, 0.3),
0 -8px 20px rgba(0, 0, 0, 0.4),
inset 0 2px 0 rgba(255, 255, 255, 0.4),
inset 0 -2px 0 rgba(0, 0, 0, 0.3) !important;
letter-spacing: 0.5px !important;
}
.blo-footer h6,
.blo-footer a,
.blo-footer ul li,
.blo-footer p,
.blo-footer span {
color: #FFFFFF !important;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5) !important;
}
.blo-footer-bottom {
background: rgba(0, 0, 0, 0.35) !important;
color: #FFFFFF !important;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5) !important;
}
@keyframes bloFooterGradient {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
</style>
{% block stylesheets %}{% endblock %}
</head>
<body>
<header class="blo-header-top">
<div class="container">
<a class="blo-logo" href="{{ path('app_blo_home_index') }}" aria-label="BLO Accueil">
{% set site_logo = blo_logo() %}
{% if site_logo %}
<img src="{{ site_logo }}" alt="BLO" style="max-height: 60px; max-width: 250px; object-fit: contain;">
{% else %}
<span class="blo-logo-icon"><i class="bi bi-bag-heart-fill"></i></span>
<span class="blo-logo-text">BLO</span>
{% endif %}
</a>
<div class="dropdown d-none d-md-inline-block">
<button class="btn btn-sm text-white border-0 dropdown-toggle py-1 px-2 blo-header-cat-btn" type="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-list" style="font-size: 1.2rem;"></i>
</button>
<ul class="dropdown-menu blo-cat-menu">
<li><a class="dropdown-item fw-semibold" href="{{ path('blo_catalog') }}"><i class="bi bi-grid me-2"></i>Toutes les catégories</a></li>
{% set headerCats = blo_nav_categories() %}
{% if headerCats|length > 0 %}
<li><hr class="dropdown-divider my-1"></li>
{% for cat in headerCats %}
<li>
<a class="dropdown-item d-flex align-items-center" href="{{ path('blo_catalog', { category: cat.id }) }}">
<strong>{{ cat.name }}</strong>
</a>
</li>
{% if cat.children|length > 0 %}
{% for sub in cat.children %}
<li>
<a class="dropdown-item text-muted" href="{{ path('blo_catalog', { category: sub.id }) }}" style="font-size: 0.85rem; padding-left: 2rem;">
{{ sub.name }}
</a>
</li>
{% endfor %}
{% endif %}
{% endfor %}
{% endif %}
</ul>
</div>
<form action="{{ path('blo_catalog') }}" method="get" class="blo-search-form">
<select name="category" class="form-select" aria-label="Catégorie">
<option value="" {{ app.request.query.get('category') == '' ? 'selected' }}>Toutes catégories</option>
{% for cat in blo_nav_categories() %}
<option value="{{ cat.id }}" {{ app.request.query.getInt('category') == cat.id ? 'selected' }}>{{ cat.name }}</option>
{% endfor %}
</select>
<input type="search" name="q" class="form-control" placeholder="Rechercher sur BLO" value="{{ app.request.query.get('q', '') }}" aria-label="Recherche">
<button type="submit" class="btn btn-search"><i class="bi bi-search"></i></button>
</form>
<div class="dropdown d-none d-md-inline-block">
<button class="btn btn-sm border-0 dropdown-toggle py-1 px-2" type="button" data-bs-toggle="dropdown" aria-expanded="false" style="background: transparent; font-size: 0.85rem; color: var(--blo-text);">
<i class="bi bi-currency-exchange me-1"></i>{{ blo_currency_label(blo_current_currency) }}
</button>
<ul class="dropdown-menu dropdown-menu-end" style="min-width: 220px;">
<li class="px-3 py-1"><small class="text-muted fw-semibold">Choisir une devise</small></li>
<li><hr class="dropdown-divider my-1"></li>
{% for code, label in blo_currencies %}
<li>
<form action="{{ path('blo_currency_switch') }}" method="post" class="d-inline w-100">
<input type="hidden" name="currency" value="{{ code }}">
<button type="submit" class="dropdown-item d-flex justify-content-between align-items-center{{ blo_current_currency == code ? ' active' : '' }}">
<span>{{ blo_currency_label(code) }} <small class="text-muted">— {{ label }}</small></span>
{% if blo_current_currency == code %}<i class="bi bi-check-lg"></i>{% endif %}
</button>
</form>
</li>
{% endfor %}
</ul>
</div>
{% set cart_count = blo_cart_count() %}
<a href="{{ path('blo_cart') }}" class="blo-header-cart" aria-label="Panier ({{ cart_count }} article{{ cart_count > 1 ? 's' : '' }})">
<span class="position-relative">
<i class="bi bi-cart3"></i>
{% if cart_count > 0 %}
<span class="blo-cart-badge">{{ cart_count > 99 ? '99+' : cart_count }}</span>
{% endif %}
</span>
<span class="d-none d-md-inline">Panier{% if cart_count > 0 %} ({{ cart_count }}){% endif %}</span>
</a>
</div>
</header>
<nav class="navbar navbar-expand-lg navbar-dark blo-nav-bar py-0">
<div class="container">
<button class="navbar-toggler border-light" type="button" data-bs-toggle="collapse" data-bs-target="#bloNav" aria-label="Menu"><span class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse" id="bloNav">
<ul class="navbar-nav me-auto">
<li class="nav-item"><a class="nav-link" href="{{ path('app_blo_home_index') }}">Accueil</a></li>
<li class="nav-item"><a class="nav-link" href="{{ path('blo_catalog') }}">Catalogue</a></li>
<li class="nav-item dropdown blo-cat-dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"><i class="bi bi-grid-fill me-1"></i>Toutes les catégories</a>
<ul class="dropdown-menu blo-cat-menu">
<li><a class="dropdown-item fw-semibold" href="{{ path('blo_catalog') }}"><i class="bi bi-grid me-2"></i>Toutes les catégories</a></li>
{% set navCats = blo_nav_categories() %}
{% if navCats|length > 0 %}
<li><hr class="dropdown-divider my-1"></li>
{% for cat in navCats %}
<li>
<a class="dropdown-item d-flex align-items-center" href="{{ path('blo_catalog', { category: cat.id }) }}">
<i class="bi bi-chevron-right me-2 text-muted" style="font-size: 0.7rem;"></i>
<strong>{{ cat.name }}</strong>
</a>
</li>
{% if cat.children|length > 0 %}
{% for sub in cat.children %}
<li>
<a class="dropdown-item ps-5 text-muted" href="{{ path('blo_catalog', { category: sub.id }) }}" style="font-size: 0.85rem;">
{{ sub.name }}
</a>
</li>
{% endfor %}
{% endif %}
{% endfor %}
{% endif %}
</ul>
</li>
<li class="nav-item"><a class="nav-link" href="{{ path('blo_catalog') }}?promo=1">Promotions</a></li>
<li class="nav-item"><a class="nav-link" href="{{ path('blo_catalog') }}?newest=1">Nouveautés</a></li>
{% if is_granted('ROLE_ADMIN') %}
<li class="nav-item"><a class="nav-link" href="{{ path('blo_admin_dashboard') }}">Admin</a></li>
{% endif %}
<li class="nav-item"><a class="nav-link" href="{{ path('blo_contact') }}">Contact</a></li>
<li class="nav-item"><a class="nav-link" href="{{ path('blo_faq') }}">FAQ</a></li>
</ul>
<ul class="navbar-nav">
<li class="nav-item dropdown d-md-none">
<a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown"><i class="bi bi-currency-exchange me-1"></i>{{ blo_currency_label(blo_current_currency) }}</a>
<ul class="dropdown-menu">
{% for code, label in blo_currencies %}
<li>
<form action="{{ path('blo_currency_switch') }}" method="post" class="d-inline w-100">
<input type="hidden" name="currency" value="{{ code }}">
<button type="submit" class="dropdown-item{{ blo_current_currency == code ? ' active' : '' }}">{{ blo_currency_label(code) }} — {{ label }}</button>
</form>
</li>
{% endfor %}
</ul>
</li>
{% if app.user %}
<li class="nav-item dropdown">
{% set displayName = (app.user.prenom|default('') ~ ' ' ~ app.user.name|default(''))|trim %}
{% if displayName == '' %}{% set displayName = app.user.userIdentifier %}{% endif %}
<a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown">{{ displayName }}</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="{{ path('blo_orders') }}">Mes commandes</a></li>
<li><a class="dropdown-item" href="{{ path('blo_account_change_password') }}"><i class="bi bi-key me-2"></i>Changer mon mot de passe</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="{{ path('app_logout') }}">Déconnexion</a></li>
</ul>
</li>
{% else %}
<li class="nav-item"><a class="nav-link" href="{{ path('login') }}">Connexion</a></li>
<li class="nav-item"><a class="nav-link" href="{{ path('blo_register') }}">Inscription</a></li>
{% endif %}
</ul>
</div>
</div>
</nav>
<main class="py-3">
{% for type, messages in app.flashes %}
{% for msg in messages %}
<div class="container mb-2">
<div class="alert alert-{{ type == 'error' ? 'danger' : type }} alert-dismissible fade show py-2" role="alert">
{{ msg }}
<button type="button" class="btn-close btn-close-sm" data-bs-dismiss="alert"></button>
</div>
</div>
{% endfor %}
{% endfor %}
{% block body %}{% endblock %}
</main>
<footer class="blo-footer">
<div class="container">
<div class="row g-4">
<div class="col-6 col-md-3">
<h6>À propos</h6>
<ul>
<li><a href="{{ path('blo_contact') }}">Contact</a></li>
<li><a href="{{ path('blo_faq') }}">FAQ</a></li>
<li><a href="{{ path('blo_cgu') }}">CGU</a></li>
<li><a href="{{ path('blo_confidentialite') }}">Confidentialité</a></li>
</ul>
</div>
<div class="col-6 col-md-3">
<h6>Compte</h6>
<ul>
<li><a href="{{ path('blo_orders') }}">Mes commandes</a></li>
<li><a href="{{ path('blo_cart') }}">Panier</a></li>
{% if not app.user %}<li><a href="{{ path('login') }}">Connexion</a></li>{% endif %}
</ul>
</div>
<div class="col-6 col-md-3">
<h6>Langue & devise</h6>
<p class="small mb-2">Français · {{ blo_currency_label(blo_current_currency) }}</p>
<form action="{{ path('blo_currency_switch') }}" method="post">
<select name="currency" class="form-select form-select-sm bg-dark text-white border-secondary" style="max-width: 180px; font-size: 0.8rem;" onchange="this.form.submit()">
{% for code, label in blo_currencies %}
<option value="{{ code }}" {{ blo_current_currency == code ? 'selected' : '' }}>{{ blo_currency_label(code) }} — {{ label }}</option>
{% endfor %}
</select>
</form>
</div>
</div>
<div class="blo-footer-bottom">
© {{ 'now'|date('Y') }} GLOBAL BUSINESS AFRICA. Tous droits réservés.
</div>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
{% block javascripts %}{% endblock %}
<!-- WhatsApp Chatbox Widget -->
<div style="position:fixed;bottom:24px;right:24px;z-index:999999;font-family:Segoe UI,sans-serif;">
<!-- Popup -->
<div id="wachat-popup" style="display:none;position:absolute;bottom:75px;right:0;width:320px;border-radius:16px;overflow:hidden;box-shadow:0 8px 30px rgba(0,0,0,0.25);">
<div style="background:#075E54;padding:14px 16px;display:flex;align-items:center;gap:12px;">
<div style="width:44px;height:44px;background:#25D366;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;">
<svg viewBox="0 0 24 24" style="width:26px;height:26px;fill:white;"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>
</div>
<div style="flex:1;">
<strong style="display:block;font-size:15px;color:white;">DONDONROU</strong>
<span style="font-size:12px;color:#b2dfdb;">● En ligne</span>
</div>
<span onclick="document.getElementById('wachat-popup').style.display='none'" style="cursor:pointer;font-size:22px;color:rgba(255,255,255,0.8);line-height:1;">×</span>
</div>
<div style="background:#ECE5DD;padding:16px;">
<div style="background:white;border-radius:0 10px 10px 10px;padding:10px 14px;font-size:13.5px;color:#333;line-height:1.5;box-shadow:0 1px 3px rgba(0,0,0,0.1);">
Bonjour !<br>Comment pouvons-nous vous aider ? Envoyez-nous un message sur WhatsApp.
</div>
<div style="text-align:right;font-size:11px;color:#888;margin-top:4px;">Maintenant</div>
<a href="https://wa.me/22378614333?text=Bonjour%2C%20je%20souhaite%20avoir%20plus%20d%27informations."
target="_blank" rel="noopener noreferrer"
style="display:block;margin-top:14px;background:#25D366;color:white;text-align:center;padding:10px;border-radius:8px;font-size:14px;font-weight:600;text-decoration:none;">
Demarrer la conversation
</a>
</div>
</div>
<!-- Bouton flottant -->
<div onclick="var p=document.getElementById('wachat-popup');var b=document.getElementById('wachat-badge');if(p.style.display==='block'){p.style.display='none'}else{p.style.display='block';if(b)b.style.display='none'}"
style="position:relative;width:60px;height:60px;background:#25D366;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 12px rgba(37,211,102,0.5);">
<div id="wachat-badge" style="position:absolute;top:-4px;right:-4px;background:#ff3b30;color:white;font-size:11px;font-weight:bold;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;">1</div>
<svg viewBox="0 0 24 24" style="width:34px;height:34px;fill:white;"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>
</div>
</div>
</body>
</html>