{% extends 'base.html.twig' %} {% block title %}{{ 'directory.title'|trans }} - {{ parent() }}{% endblock %} {% block head %} {% endblock %} {% set body_class = 'page-with-hero' %} {% block hero %}

Annuaire des Antiquaires

Découvrez les meilleurs professionnels des antiquités partout en France

{{ pagination.totalMembers }} Antiquaires
{{ countries|length }} Pays
{{ regions|length }} Régions
{{ specialties|length }} Spécialités
{% endblock %} {% block body %}
position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.1'%3E%3Ccircle cx='30' cy='30' r='2'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E") repeat; animation: patternMove 30s linear infinite; } @keyframes patternMove { 0% { background-position: 0 0; } 100% { background-position: 60px 60px; } } .hero-content { position: relative; z-index: 2; text-align: center; } .hero-title { font-size: 3.5rem; font-weight: 800; margin-bottom: 1rem; background: linear-gradient(45deg, #ffffff, #f8f9fa); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; text-shadow: 0 4px 8px rgba(0,0,0,0.2); position: relative; } .hero-title::after { content: ''; position: absolute; bottom: -10px; left: 50%; transform: translateX(-50%); width: 100px; height: 4px; background: var(--accent-gradient); border-radius: 2px; animation: shimmer 2s ease-in-out infinite; } @keyframes shimmer { 0%, 100% { opacity: 1; transform: translateX(-50%) scaleX(1); } 50% { opacity: 0.7; transform: translateX(-50%) scaleX(1.2); } } .hero-subtitle { font-size: 1.3rem; margin-bottom: 2rem; opacity: 0.95; font-weight: 300; } .hero-stats { display: flex; justify-content: center; gap: 3rem; margin-top: 2rem; } .hero-stat { text-align: center; padding: 1rem; background: rgba(255,255,255,0.1); border-radius: 15px; backdrop-filter: blur(10px); border: 1px solid rgba(255,255,255,0.2); transition: transform 0.3s ease; } .hero-stat:hover { transform: translateY(-5px); } .hero-stat-number { font-size: 2rem; font-weight: 700; display: block; } .hero-stat-label { font-size: 0.9rem; opacity: 0.8; } /* Filters Section */ .filters-section { margin-bottom: 3rem; } .filters-card { background: rgba(255,255,255,0.95); backdrop-filter: blur(20px); border-radius: 20px; padding: 2rem; box-shadow: 0 8px 32px rgba(0,0,0,0.1), inset 0 1px 0 rgba(255,255,255,0.8); border: 1px solid rgba(255,255,255,0.6); position: sticky; top: 2rem; z-index: 100; } .filters-title { background: var(--primary-gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; font-weight: 700; font-size: 1.4rem; margin-bottom: 1.5rem; display: flex; align-items: center; gap: 0.5rem; } .form-select, .form-control { border: 2px solid rgba(102, 126, 234, 0.2); border-radius: 12px; padding: 0.75rem 1rem; background: rgba(255,255,255,0.9); transition: all 0.3s ease; backdrop-filter: blur(10px); } .form-select:focus, .form-control:focus { border-color: #667eea; box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.2); background: white; } .btn-search { background: var(--primary-gradient); border: none; color: white; padding: 0.75rem 2rem; border-radius: 12px; font-weight: 600; transition: all 0.3s ease; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4); position: relative; overflow: hidden; } .btn-search::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent); transition: left 0.6s ease; } .btn-search:hover::before { left: 100%; } .btn-search:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(102, 126, 234, 0.6); } .btn-clear { background: var(--secondary-gradient); border: none; color: white; padding: 0.75rem 2rem; border-radius: 12px; font-weight: 600; transition: all 0.3s ease; box-shadow: 0 4px 15px rgba(240, 147, 251, 0.4); } .btn-clear:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(240, 147, 251, 0.6); } /* Results Section */ .results-header { background: rgba(255,255,255,0.9); backdrop-filter: blur(20px); border-radius: 15px; padding: 1.5rem 2rem; margin-bottom: 2rem; box-shadow: 0 4px 20px rgba(0,0,0,0.1); border: 1px solid rgba(255,255,255,0.6); } .results-count { font-size: 1.2rem; font-weight: 600; background: var(--dark-gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .pagination-info { color: #6c757d; font-weight: 500; } /* Member Cards */ .member-card { background: rgba(255,255,255,0.95); backdrop-filter: blur(20px); border-radius: 20px; padding: 0; margin-bottom: 2rem; box-shadow: 0 10px 40px rgba(0,0,0,0.1), inset 0 1px 0 rgba(255,255,255,0.8); border: 1px solid rgba(255,255,255,0.6); transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); position: relative; overflow: hidden; } .member-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--primary-gradient); transform: scaleX(0); transition: transform 0.3s ease; } .member-card:hover::before { transform: scaleX(1); } .member-card:hover { transform: translateY(-8px); box-shadow: 0 20px 60px rgba(0,0,0,0.15), inset 0 1px 0 rgba(255,255,255,0.9); } .member-card-header { padding: 2rem 2rem 1rem; display: flex; align-items: center; gap: 1.5rem; position: relative; } .member-avatar { width: 100px; height: 100px; border-radius: 20px; background: var(--primary-gradient); display: flex; align-items: center; justify-content: center; color: white; font-size: 2.5rem; box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3), inset 0 1px 0 rgba(255,255,255,0.3); position: relative; overflow: hidden; } .member-avatar::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: linear-gradient(45deg, transparent, rgba(255,255,255,0.3), transparent); transform: rotate(45deg); animation: avatarShine 3s ease-in-out infinite; } @keyframes avatarShine { 0%, 100% { transform: translateX(-200%) translateY(-200%) rotate(45deg); } 50% { transform: translateX(200%) translateY(200%) rotate(45deg); } } .member-basic-info { flex: 1; } .member-name { font-size: 1.6rem; font-weight: 700; margin-bottom: 0.5rem; background: var(--dark-gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .member-location { color: #6c757d; font-weight: 500; display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0; } .member-location i { color: #667eea; } .member-card-body { padding: 0 2rem 1rem; } .member-specialties { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1.5rem; } .specialty-tag { background: var(--accent-gradient); color: white; padding: 0.4rem 0.8rem; border-radius: 20px; font-size: 0.85rem; font-weight: 600; box-shadow: 0 2px 8px rgba(79, 172, 254, 0.3); transition: transform 0.2s ease; } .specialty-tag:hover { transform: translateY(-2px); } .specialty-tag.more { background: var(--secondary-gradient); box-shadow: 0 2px 8px rgba(240, 147, 251, 0.3); } .member-description { color: #5a6c7d; line-height: 1.6; margin-bottom: 1.5rem; font-size: 0.95rem; } .member-contact { margin-bottom: 1.5rem; } .contact-item { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.5rem; color: #5a6c7d; font-size: 0.9rem; } .contact-item i { width: 18px; color: #667eea; font-size: 1rem; } .contact-item a { color: #667eea; text-decoration: none; font-weight: 500; transition: color 0.2s ease; } .contact-item a:hover { color: #5a67d8; } .member-card-footer { padding: 1rem 2rem 2rem; display: flex; justify-content: space-between; align-items: center; border-top: 1px solid rgba(102, 126, 234, 0.1); margin-top: 1rem; } .member-stats { display: flex; gap: 1.5rem; } .stat-item { display: flex; align-items: center; gap: 0.5rem; color: #6c757d; font-size: 0.85rem; font-weight: 500; } .stat-item i { color: #667eea; } .btn-profile { background: var(--primary-gradient); border: none; color: white; padding: 0.6rem 1.5rem; border-radius: 12px; font-weight: 600; text-decoration: none; transition: all 0.3s ease; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4); position: relative; overflow: hidden; } .btn-profile::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent); transition: left 0.6s ease; } .btn-profile:hover::before { left: 100%; } .btn-profile:hover { color: white; transform: translateY(-2px); box-shadow: 0 8px 25px rgba(102, 126, 234, 0.6); } /* Pagination */ .pagination-custom { margin-top: 3rem; margin-bottom: 2rem; } .pagination { background: rgba(255,255,255,0.9); backdrop-filter: blur(20px); border-radius: 15px; padding: 1rem; box-shadow: 0 4px 20px rgba(0,0,0,0.1); border: 1px solid rgba(255,255,255,0.6); } .page-link { border: none; background: transparent; color: #667eea; font-weight: 500; padding: 0.75rem 1rem; border-radius: 8px; margin: 0 0.25rem; transition: all 0.3s ease; } .page-link:hover { background: var(--primary-gradient); color: white; transform: translateY(-2px); } .page-item.active .page-link { background: var(--primary-gradient); color: white; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4); } /* No Results */ .no-members { text-align: center; padding: 4rem 2rem; background: rgba(255,255,255,0.9); backdrop-filter: blur(20px); border-radius: 20px; box-shadow: 0 10px 40px rgba(0,0,0,0.1); border: 1px solid rgba(255,255,255,0.6); } .no-members i { color: #667eea; margin-bottom: 1.5rem; animation: float 3s ease-in-out infinite; } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } .no-members h4 { background: var(--dark-gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: 1rem; } .no-members p { color: #6c757d; margin-bottom: 2rem; } /* Floating Decorations */ .floating-decoration { position: fixed; pointer-events: none; z-index: -1; } .floating-decoration:nth-child(1) { top: 20%; left: 10%; width: 60px; height: 60px; background: var(--accent-gradient); border-radius: 50%; opacity: 0.1; animation: float1 6s ease-in-out infinite; } .floating-decoration:nth-child(2) { top: 60%; right: 15%; width: 80px; height: 80px; background: var(--secondary-gradient); border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; opacity: 0.1; animation: float2 8s ease-in-out infinite; } .floating-decoration:nth-child(3) { bottom: 20%; left: 20%; width: 40px; height: 40px; background: var(--gold-gradient); border-radius: 50%; opacity: 0.1; animation: float3 10s ease-in-out infinite; } @keyframes float1 { 0%, 100% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-20px) rotate(180deg); } } @keyframes float2 { 0%, 100% { transform: translateX(0) rotate(0deg); } 50% { transform: translateX(20px) rotate(90deg); } } @keyframes float3 { 0%, 100% { transform: translateY(0) translateX(0); } 33% { transform: translateY(-15px) translateX(15px); } 66% { transform: translateY(15px) translateX(-15px); } } /* Responsive Design */ @media (max-width: 768px) { .hero-title { font-size: 2.5rem; } .hero-stats { flex-direction: column; gap: 1rem; } .member-card-header { flex-direction: column; text-align: center; gap: 1rem; } .member-card-footer { flex-direction: column; gap: 1rem; align-items: stretch; } .member-stats { justify-content: center; } .filters-card { position: static; margin-bottom: 2rem; } } {% endblock %} {% set body_class = 'page-with-hero' %} {% block hero %}

Annuaire des Antiquaires

Découvrez les meilleurs professionnels des antiquités partout en France

{{ pagination.totalMembers }} Antiquaires
{{ countries|length }} Pays
{{ regions|length }} Régions
{{ specialties|length }} Spécialités
{% endblock %} {% block body %}
Filtrer les résultats
{% if countries|length > 0 %}
{% endif %} {% if regions|length > 0 %}
{% endif %} {% if specialties|length > 0 %}
{% endif %}
{% if filters.search or filters.country or filters.region or filters.specialty %} Effacer les filtres {% endif %}
{% if filters.search %} {{ pagination.totalMembers }} résultat{{ pagination.totalMembers > 1 ? 's' : '' }} pour "{{ filters.search }}" {% else %} {{ pagination.totalMembers }} antiquaire{{ pagination.totalMembers > 1 ? 's' : '' }} référencé{{ pagination.totalMembers > 1 ? 's' : '' }} {% endif %}
{% if pagination.totalPages > 1 %}
Page {{ pagination.page }} sur {{ pagination.totalPages }}
{% endif %}
{% if members|length > 0 %} {% for member in members %}

{{ member.companyName }}

{{ member.city ? member.city.name : 'France' }}{% if member.region %}, {{ member.region.name }}{% endif %}

{% if member.specialties|length > 0 %}
{% for specialty in member.specialties|slice(0, 4) %} {{ specialty.name }} {% endfor %} {% if member.specialties|length > 4 %} +{{ member.specialties|length - 4 }} {% endif %}
{% endif %} {% if member.description %}

{{ member.description|length > 150 ? member.description|slice(0, 150) ~ '...' : member.description }}

{% endif %}
{% if member.phone %}
{{ member.phone }}
{% endif %} {% if member.website %} {% endif %}
{% endfor %} {% if pagination.totalPages > 1 %}
{% endif %} {% else %}

Aucun antiquaire trouvé

Essayez d'ajuster vos critères de recherche pour obtenir plus de résultats.

{% if filters.search or filters.country or filters.region or filters.specialty %} Effacer tous les filtres {% endif %}
{% endif %}
{% endblock %}