var/cache/dev/twig/ba/ba7d0602f8daf0b93d99ecac1b726ca3.php line 56

Open in your IDE?
  1. <?php
  2. use Twig\Environment;
  3. use Twig\Error\LoaderError;
  4. use Twig\Error\RuntimeError;
  5. use Twig\Extension\CoreExtension;
  6. use Twig\Extension\SandboxExtension;
  7. use Twig\Markup;
  8. use Twig\Sandbox\SecurityError;
  9. use Twig\Sandbox\SecurityNotAllowedTagError;
  10. use Twig\Sandbox\SecurityNotAllowedFilterError;
  11. use Twig\Sandbox\SecurityNotAllowedFunctionError;
  12. use Twig\Source;
  13. use Twig\Template;
  14. use Twig\TemplateWrapper;
  15. /* home/shop.html.twig */
  16. class __TwigTemplate_7992206d50dde9eda3e4c58b92b00147 extends Template
  17. {
  18.     private Source $source;
  19.     /**
  20.      * @var array<string, Template>
  21.      */
  22.     private array $macros = [];
  23.     public function __construct(Environment $env)
  24.     {
  25.         parent::__construct($env);
  26.         $this->source $this->getSourceContext();
  27.         $this->blocks = [
  28.             'title' => [$this'block_title'],
  29.             'stylesheets' => [$this'block_stylesheets'],
  30.             'body' => [$this'block_body'],
  31.             'javascripts' => [$this'block_javascripts'],
  32.         ];
  33.     }
  34.     protected function doGetParent(array $context): bool|string|Template|TemplateWrapper
  35.     {
  36.         // line 1
  37.         return "base_home.html.twig";
  38.     }
  39.     protected function doDisplay(array $context, array $blocks = []): iterable
  40.     {
  41.         $macros $this->macros;
  42.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  43.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""home/shop.html.twig"));
  44.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  45.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""home/shop.html.twig"));
  46.         $this->parent $this->load("base_home.html.twig"1);
  47.         yield from $this->parent->unwrap()->yield($contextarray_merge($this->blocks$blocks));
  48.         
  49.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  50.         
  51.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  52.     }
  53.     // line 3
  54.     /**
  55.      * @return iterable<null|scalar|\Stringable>
  56.      */
  57.     public function block_title(array $context, array $blocks = []): iterable
  58.     {
  59.         $macros $this->macros;
  60.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  61.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  62.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  63.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  64.         // line 4
  65.         yield "\t";
  66.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "name", [], "any"falsefalsefalse4), "html"nulltrue);
  67.         yield "
  68. \t| MaketOu
  69. ";
  70.         
  71.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  72.         
  73.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  74.         yield from [];
  75.     }
  76.     // line 8
  77.     /**
  78.      * @return iterable<null|scalar|\Stringable>
  79.      */
  80.     public function block_stylesheets(array $context, array $blocks = []): iterable
  81.     {
  82.         $macros $this->macros;
  83.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  84.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""stylesheets"));
  85.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  86.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""stylesheets"));
  87.         // line 9
  88.         yield "\t<style>
  89. \t\t/* Style pour la description formatée de la boutique */
  90. \t\t.shop-description-content {
  91. \t\t\tline-height: 1.6;
  92. \t\t\tcolor: #333;
  93. \t\t}
  94. \t\t
  95. \t\t.shop-description-content h1, 
  96. \t\t.shop-description-content h2, 
  97. \t\t.shop-description-content h3 {
  98. \t\t\tcolor: #ffa200;
  99. \t\t\tmargin-top: 1.5rem;
  100. \t\t\tmargin-bottom: 1rem;
  101. \t\t}
  102. \t\t
  103. \t\t.shop-description-content h1 { font-size: 1.75rem; }
  104. \t\t.shop-description-content h2 { font-size: 1.5rem; }
  105. \t\t.shop-description-content h3 { font-size: 1.25rem; }
  106. \t\t
  107. \t\t.shop-description-content ul, 
  108. \t\t.shop-description-content ol {
  109. \t\t\tmargin-left: 1.5rem;
  110. \t\t\tmargin-bottom: 1rem;
  111. \t\t}
  112. \t\t
  113. \t\t.shop-description-content li {
  114. \t\t\tmargin-bottom: 0.5rem;
  115. \t\t}
  116. \t\t
  117. \t\t.shop-description-content p {
  118. \t\t\tmargin-bottom: 1rem;
  119. \t\t}
  120. \t\t
  121. \t\t.shop-description-content a {
  122. \t\t\tcolor: #ffa200;
  123. \t\t\ttext-decoration: underline;
  124. \t\t}
  125. \t\t
  126. \t\t.shop-description-content a:hover {
  127. \t\t\tcolor: #e8910a;
  128. \t\t}
  129. \t\t
  130. \t\t.shop-description-content img {
  131. \t\t\tmax-width: 100%;
  132. \t\t\theight: auto;
  133. \t\t\tborder-radius: 8px;
  134. \t\t\tmargin: 1rem 0;
  135. \t\t}
  136. \t\t
  137. \t\t.shop-description-content blockquote {
  138. \t\t\tborder-left: 4px solid #ffa200;
  139. \t\t\tpadding-left: 1rem;
  140. \t\t\tmargin: 1rem 0;
  141. \t\t\tfont-style: italic;
  142. \t\t\tcolor: #666;
  143. \t\t}
  144. \t\t
  145. \t\t.shop-description-content table {
  146. \t\t\twidth: 100%;
  147. \t\t\tborder-collapse: collapse;
  148. \t\t\tmargin: 1rem 0;
  149. \t\t}
  150. \t\t
  151. \t\t.shop-description-content table th,
  152. \t\t.shop-description-content table td {
  153. \t\t\tborder: 1px solid #ddd;
  154. \t\t\tpadding: 0.5rem;
  155. \t\t}
  156. \t\t
  157. \t\t.shop-description-content table th {
  158. \t\t\tbackground-color: #f8f9fa;
  159. \t\t\tfont-weight: bold;
  160. \t\t}
  161. \t\t
  162. \t\t/* Design eBay-like intégré avec Karma - Pleine largeur */
  163. \t\t.shop-header {
  164. \t\t\tbackground: #f7f7f7;
  165. \t\t\tborder-bottom: 1px solid #e1e1e1;
  166. \t\t\tpadding: 0;
  167. \t\t\tmargin-bottom: 0;
  168. \t\t\twidth: 100%;
  169. \t\t\tposition: relative;
  170. \t\t}
  171. \t\t.shop-banner {
  172. \t\t\twidth: 100%;
  173. \t\t\theight: 350px;
  174. \t\t\tbackground-size: cover;
  175. \t\t\tbackground-position: center;
  176. \t\t\tbackground-repeat: no-repeat;
  177. \t\t\tposition: relative;
  178. \t\t\tdisplay: flex;
  179. \t\t\talign-items: center;
  180. \t\t\tjustify-content: center;
  181. \t\t}
  182. \t\t/* Carrousel eBay-style amélioré */
  183. \t\t.shop-carousel-ebay {
  184. \t\t\twidth: 100%;
  185. \t\t\theight: 450px;
  186. \t\t\tposition: relative;
  187. \t\t\toverflow: hidden;
  188. \t\t\tbackground: #f8f9fa;
  189. \t\t\tborder-radius: 8px;
  190. \t\t\tbox-sizing: border-box;
  191. \t\t\tmargin-bottom: 0;
  192. \t\t\ttransition: height 0.3s ease;
  193. \t\t}
  194. \t\t.carousel-container {
  195. \t\t\tposition: relative;
  196. \t\t\twidth: 100%;
  197. \t\t\theight: 100%;
  198. \t\t}
  199. \t\t.carousel-slide {
  200. \t\t\tposition: absolute;
  201. \t\t\ttop: 0;
  202. \t\t\tleft: 0;
  203. \t\t\twidth: 100%;
  204. \t\t\theight: 100%;
  205. \t\t\tbackground-size: cover;
  206. \t\t\tbackground-position: center;
  207. \t\t\tbackground-repeat: no-repeat;
  208. \t\t\topacity: 0;
  209. \t\t\ttransition: opacity 0.6s ease-in-out;
  210. \t\t}
  211. \t\t
  212. \t\t/* Amélioration responsive pour les images */
  213. \t\t@media (max-width: 768px) {
  214. \t\t\t.carousel-slide {
  215. \t\t\t\tbackground-size: cover;
  216. \t\t\t\tbackground-position: center center;
  217. \t\t\t}
  218. \t\t}
  219. \t\t.carousel-slide.active {
  220. \t\t\topacity: 1;
  221. \t\t}
  222. \t\t.carousel-controls {
  223. \t\t\tposition: absolute;
  224. \t\t\tbottom: 20px;
  225. \t\t\tleft: 50%;
  226. \t\t\ttransform: translateX(-50%);
  227. \t\t\tdisplay: flex;
  228. \t\t\tgap: 10px;
  229. \t\t\tz-index: 10;
  230. \t\t}
  231. \t\t.carousel-btn {
  232. \t\t\twidth: 40px;
  233. \t\t\theight: 40px;
  234. \t\t\tborder: none;
  235. \t\t\tborder-radius: 50%;
  236. \t\t\tbackground: rgba(255, 255, 255, 0.9);
  237. \t\t\tcolor: #333;
  238. \t\t\tfont-size: 16px;
  239. \t\t\tcursor: pointer;
  240. \t\t\tdisplay: flex;
  241. \t\t\talign-items: center;
  242. \t\t\tjustify-content: center;
  243. \t\t\ttransition: all 0.3s ease;
  244. \t\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
  245. \t\t}
  246. \t\t.carousel-btn:hover {
  247. \t\t\tbackground: white;
  248. \t\t\ttransform: scale(1.1);
  249. \t\t}
  250. \t\t.carousel-btn:disabled {
  251. \t\t\topacity: 0.5;
  252. \t\t\tcursor: not-allowed;
  253. \t\t\ttransform: none;
  254. \t\t}
  255. \t\t.carousel-pause {
  256. \t\t\tbackground: #dc3545;
  257. \t\t\tcolor: white;
  258. \t\t}
  259. \t\t.carousel-pause:hover {
  260. \t\t\tbackground: #c82333;
  261. \t\t}
  262. \t\t.carousel-indicators {
  263. \t\t\tposition: absolute;
  264. \t\t\tbottom: 70px;
  265. \t\t\tleft: 50%;
  266. \t\t\ttransform: translateX(-50%);
  267. \t\t\tdisplay: flex;
  268. \t\t\tgap: 8px;
  269. \t\t\tz-index: 10;
  270. \t\t}
  271. \t\t.carousel-indicator {
  272. \t\t\twidth: 12px;
  273. \t\t\theight: 12px;
  274. \t\t\tborder-radius: 50%;
  275. \t\t\tbackground: rgba(255, 255, 255, 0.5);
  276. \t\t\tborder: none;
  277. \t\t\tcursor: pointer;
  278. \t\t\ttransition: all 0.3s ease;
  279. \t\t}
  280. \t\t.carousel-indicator.active {
  281. \t\t\tbackground: white;
  282. \t\t\ttransform: scale(1.2);
  283. \t\t}
  284. \t\t/* Contrôles eBay-style améliorés - Positionnés en bas à droite */
  285. \t\t.carousel-controls-ebay {
  286. \t\t\tposition: absolute;
  287. \t\t\tbottom: 20px;
  288. \t\t\tright: 20px;
  289. \t\t\tdisplay: flex;
  290. \t\t\tgap: 12px;
  291. \t\t\talign-items: center;
  292. \t\t\tz-index: 10;
  293. \t\t\tpointer-events: none;
  294. \t\t}
  295. \t\t.carousel-btn-ebay {
  296. \t\t\twidth: 52px;
  297. \t\t\theight: 52px;
  298. \t\t\tborder: none;
  299. \t\t\tborder-radius: 50% !important;
  300. \t\t\tbackground: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.9) 100%);
  301. \t\t\tcolor: #333;
  302. \t\t\tfont-size: 22px;
  303. \t\t\tcursor: pointer;
  304. \t\t\tdisplay: flex;
  305. \t\t\talign-items: center;
  306. \t\t\tjustify-content: center;
  307. \t\t\ttransition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  308. \t\t\tpointer-events: all;
  309. \t\t\tbox-shadow: 0 4px 15px rgba(0, 0, 0, 0.25), 0 2px 8px rgba(0, 0, 0, 0.15);
  310. \t\t\tbackdrop-filter: blur(10px);
  311. \t\t\tposition: relative;
  312. \t\t\toverflow: visible;
  313. \t\t}
  314. \t\t.carousel-btn-ebay::before {
  315. \t\t\tcontent: '';
  316. \t\t\tposition: absolute;
  317. \t\t\ttop: 50%;
  318. \t\t\tleft: 50%;
  319. \t\t\twidth: 0;
  320. \t\t\theight: 0;
  321. \t\t\tborder-radius: 50%;
  322. \t\t\tbackground: rgba(255, 255, 255, 0.3);
  323. \t\t\ttransform: translate(-50%, -50%);
  324. \t\t\ttransition: width 0.6s ease, height 0.6s ease;
  325. \t\t}
  326. \t\t.carousel-btn-ebay:hover::before {
  327. \t\t\twidth: 100%;
  328. \t\t\theight: 100%;
  329. \t\t}
  330. \t\t.carousel-btn-ebay:hover {
  331. \t\t\ttransform: translateY(-3px) scale(1.1);
  332. \t\t\tbox-shadow: 0 8px 25px rgba(0, 0, 0, 0.35), 0 4px 12px rgba(0, 0, 0, 0.2);
  333. \t\t}
  334. \t\t
  335. \t\t/* Désactiver les effets hover sur mobile pour éviter les problèmes tactiles */
  336. \t\t@media (hover: none) and (pointer: coarse) {
  337. \t\t\t.carousel-btn-ebay:hover {
  338. \t\t\t\ttransform: none;
  339. \t\t\t}
  340. \t\t\t
  341. \t\t\t.carousel-btn-ebay:active {
  342. \t\t\t\ttransform: scale(0.95);
  343. \t\t\t}
  344. \t\t\t
  345. \t\t\t.carousel-indicator-ebay:hover {
  346. \t\t\t\ttransform: none;
  347. \t\t\t}
  348. \t\t}
  349. \t\t.carousel-btn-ebay:active {
  350. \t\t\ttransform: translateY(-1px) scale(1.05);
  351. \t\t\tbox-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
  352. \t\t}
  353. \t\t
  354. \t\t/* Désactiver les effets hover sur mobile pour éviter les problèmes tactiles */
  355. \t\t@media (hover: none) and (pointer: coarse) {
  356. \t\t\t.carousel-btn-ebay:hover {
  357. \t\t\t\ttransform: none;
  358. \t\t\t}
  359. \t\t\t
  360. \t\t\t.carousel-btn-ebay:active {
  361. \t\t\t\ttransform: scale(0.95);
  362. \t\t\t}
  363. \t\t\t
  364. \t\t\t.carousel-indicator-ebay:hover {
  365. \t\t\t\ttransform: none;
  366. \t\t\t}
  367. \t\t}
  368. \t\t.carousel-btn-ebay:disabled {
  369. \t\t\topacity: 0.4;
  370. \t\t\tcursor: not-allowed;
  371. \t\t\ttransform: none;
  372. \t\t}
  373. \t\t.carousel-btn-ebay i {
  374. \t\t\tposition: relative;
  375. \t\t\tz-index: 10;
  376. \t\t\ttransition: transform 0.3s ease;
  377. \t\t\tdisplay: inline-block;
  378. \t\t\tline-height: 1;
  379. \t\t}
  380. \t\t.carousel-btn-ebay:hover i {
  381. \t\t\ttransform: scale(1.15);
  382. \t\t}
  383. \t\t
  384. \t\t.carousel-btn-ebay.pause-btn i,
  385. \t\t.carousel-btn-ebay.pause-btn #pauseIcon {
  386. \t\t\tz-index: 10 !important;
  387. \t\t\tcolor: white !important;
  388. \t\t\tdisplay: inline-block !important;
  389. \t\t\tvisibility: visible !important;
  390. \t\t\topacity: 1 !important;
  391. \t\t}
  392. \t\t.carousel-btn-ebay.prev-btn,
  393. \t\t.carousel-btn-ebay.next-btn {
  394. \t\t\tbackground: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(255, 255, 255, 0.92) 100%);
  395. \t\t\tcolor: #333;
  396. \t\t}
  397. \t\t.carousel-btn-ebay.prev-btn:hover,
  398. \t\t.carousel-btn-ebay.next-btn:hover {
  399. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  400. \t\t\tcolor: white;
  401. \t\t}
  402. \t\t.carousel-btn-ebay.pause-btn {
  403. \t\t\tbackground: linear-gradient(135deg, rgba(220, 53, 69, 0.95) 0%, rgba(200, 35, 51, 0.95) 100%);
  404. \t\t\tcolor: white !important;
  405. \t\t}
  406. \t\t.carousel-btn-ebay.pause-btn:hover {
  407. \t\t\tbackground: linear-gradient(135deg, #dc3545 0%, #c82333 100%);
  408. \t\t\tcolor: white !important;
  409. \t\t}
  410. \t\t.carousel-btn-ebay.pause-btn.playing {
  411. \t\t\tbackground: linear-gradient(135deg, rgba(40, 167, 69, 0.95) 0%, rgba(33, 136, 56, 0.95) 100%);
  412. \t\t\tcolor: white !important;
  413. \t\t}
  414. \t\t.carousel-btn-ebay.pause-btn.playing:hover {
  415. \t\t\tbackground: linear-gradient(135deg, #28a745 0%, #218838 100%);
  416. \t\t\tcolor: white !important;
  417. \t\t}
  418. \t\t/* Style spécifique pour l'icône du bouton pause - Utilisation directe d'Unicode */
  419. \t\t.carousel-btn-ebay.pause-btn {
  420. \t\t\ttext-align: center;
  421. \t\t\tposition: relative;
  422. \t\t\tdisplay: flex;
  423. \t\t\talign-items: center;
  424. \t\t\tjustify-content: center;
  425. \t\t}
  426. \t\t
  427. \t\t.carousel-btn-ebay.pause-btn #pauseIcon,
  428. \t\t.carousel-btn-ebay.pause-btn .pause-icon-content {
  429. \t\t\tdisplay: block !important;
  430. \t\t\tcolor: white !important;
  431. \t\t\tfont-size: 24px !important;
  432. \t\t\tline-height: 1 !important;
  433. \t\t\twidth: auto !important;
  434. \t\t\theight: auto !important;
  435. \t\t\tposition: static !important;
  436. \t\t\ttext-align: center !important;
  437. \t\t\tz-index: 10 !important;
  438. \t\t\tvisibility: visible !important;
  439. \t\t\topacity: 1 !important;
  440. \t\t\tpointer-events: none !important;
  441. \t\t\tfont-family: Arial, \"Segoe UI\", sans-serif !important;
  442. \t\t\tfont-weight: normal !important;
  443. \t\t\tmargin: 0 !important;
  444. \t\t\tpadding: 0 !important;
  445. \t\t}
  446. \t\t/* Indicateurs eBay-style améliorés - Positionnés en bas à gauche */
  447. \t\t.carousel-indicators-ebay {
  448. \t\t\tposition: absolute;
  449. \t\t\tbottom: 20px;
  450. \t\t\tleft: 50%;
  451. \t\t\ttransform: translateX(-50%);
  452. \t\t\tdisplay: flex;
  453. \t\t\tgap: 10px;
  454. \t\t\tz-index: 10;
  455. \t\t\tbackground: rgba(0, 0, 0, 0.4);
  456. \t\t\tpadding: 8px 14px;
  457. \t\t\tborder-radius: 25px;
  458. \t\t\tbackdrop-filter: blur(8px);
  459. \t\t\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
  460. \t\t}
  461. \t\t.carousel-indicator-ebay {
  462. \t\t\twidth: 10px;
  463. \t\t\theight: 10px;
  464. \t\t\tborder-radius: 50%;
  465. \t\t\tbackground: rgba(255, 255, 255, 0.5);
  466. \t\t\tborder: 2px solid rgba(255, 255, 255, 0.8);
  467. \t\t\tcursor: pointer;
  468. \t\t\ttransition: all 0.3s ease;
  469. \t\t}
  470. \t\t.carousel-indicator-ebay.active {
  471. \t\t\tbackground: white !important;
  472. \t\t\tborder-color: #ffa200 !important;
  473. \t\t\ttransform: scale(1.3) !important;
  474. \t\t\tbox-shadow: 0 0 8px rgba(255, 162, 0, 0.6) !important;
  475. \t\t}
  476. \t\t.carousel-indicator-ebay:hover {
  477. \t\t\tbackground: rgba(255, 255, 255, 0.8);
  478. \t\t\ttransform: scale(1.1);
  479. \t\t}
  480. \t\t/* Styles eBay-style pour les détails de boutique */
  481. \t\t.shop-avatar-container-ebay {
  482. \t\t\tposition: relative;
  483. \t\t\tmargin-right: 20px;
  484. \t\t}
  485. \t\t.shop-avatar-ebay {
  486. \t\t\twidth: 100px;
  487. \t\t\theight: 100px;
  488. \t\t\tborder-radius: 12px;
  489. \t\t\tobject-fit: cover;
  490. \t\t\tborder: 3px solid white;
  491. \t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  492. \t\t\ttransition: transform 0.3s ease;
  493. \t\t}
  494. \t\t.shop-avatar-ebay:hover {
  495. \t\t\ttransform: scale(1.05);
  496. \t\t}
  497. \t\t.shop-avatar-placeholder {
  498. \t\t\tbackground: linear-gradient(135deg, #f0f0f0 0%, #e0e0e0 100%);
  499. \t\t\tdisplay: flex;
  500. \t\t\talign-items: center;
  501. \t\t\tjustify-content: center;
  502. \t\t\tfont-size: 2.5rem;
  503. \t\t\tcolor: #999;
  504. \t\t}
  505. \t\t.verified-badge-ebay {
  506. \t\t\tposition: absolute;
  507. \t\t\tbottom: -5px;
  508. \t\t\tright: -5px;
  509. \t\t\tbackground: #28a745;
  510. \t\t\tcolor: white;
  511. \t\t\twidth: 24px;
  512. \t\t\theight: 24px;
  513. \t\t\tborder-radius: 50%;
  514. \t\t\tdisplay: flex;
  515. \t\t\talign-items: center;
  516. \t\t\tjustify-content: center;
  517. \t\t\tfont-size: 12px;
  518. \t\t\tborder: 2px solid white;
  519. \t\t}
  520. \t\t.shop-info-ebay {
  521. \t\t\tpadding: 0;
  522. \t\t}
  523. \t\t.shop-name-section {
  524. \t\t\tmargin-bottom: 12px;
  525. \t\t}
  526. \t\t.shop-name-ebay {
  527. \t\t\tfont-size: 2.2rem;
  528. \t\t\tfont-weight: 800;
  529. \t\t\tbackground: linear-gradient(135deg, #333 0%, #555 100%);
  530. \t\t\t-webkit-background-clip: text;
  531. \t\t\t-webkit-text-fill-color: transparent;
  532. \t\t\tbackground-clip: text;
  533. \t\t\tmargin: 0;
  534. \t\t\tline-height: 1.2;
  535. \t\t\tword-wrap: break-word;
  536. \t\t\toverflow-wrap: break-word;
  537. \t\t\thyphens: auto;
  538. \t\t\tletter-spacing: -0.5px;
  539. \t\t}
  540. \t\t.verified-text {
  541. \t\t\tbackground: linear-gradient(135deg, #28a745 0%, #20c997 100%);
  542. \t\t\t-webkit-background-clip: text;
  543. \t\t\t-webkit-text-fill-color: transparent;
  544. \t\t\tbackground-clip: text;
  545. \t\t\tfont-size: 0.9rem;
  546. \t\t\tfont-weight: 600;
  547. \t\t\tdisplay: inline-flex;
  548. \t\t\talign-items: center;
  549. \t\t\tgap: 4px;
  550. \t\t\tword-wrap: break-word;
  551. \t\t\toverflow-wrap: break-word;
  552. \t\t\tline-height: 1.4;
  553. \t\t\twhite-space: normal;
  554. \t\t\tflex-wrap: wrap;
  555. \t\t\tmax-width: 100%;
  556. \t\t}
  557. \t\t.verified-text i {
  558. \t\t\t-webkit-text-fill-color: #28a745;
  559. \t\t\tcolor: #28a745;
  560. \t\t\tflex-shrink: 0;
  561. \t\t}
  562. \t\t.shop-category-ebay {
  563. \t\t\tbackground: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
  564. \t\t\tcolor: #666;
  565. \t\t\tpadding: 6px 14px;
  566. \t\t\tborder-radius: 20px;
  567. \t\t\tfont-size: 0.875rem;
  568. \t\t\tfont-weight: 500;
  569. \t\t\tdisplay: inline-block;
  570. \t\t\tborder: 1px solid #dee2e6;
  571. \t\t\tword-wrap: break-word;
  572. \t\t\toverflow-wrap: break-word;
  573. \t\t\tmax-width: 100%;
  574. \t\t\tline-height: 1.4;
  575. \t\t\twhite-space: normal;
  576. \t\t}
  577. \t\t.shop-stats-ebay {
  578. \t\t\tmargin-top: 16px;
  579. \t\t}
  580. \t\t.stat-row {
  581. \t\t\tdisplay: flex;
  582. \t\t\tgap: 32px;
  583. \t\t\tmargin-bottom: 12px;
  584. \t\t\tflex-wrap: wrap;
  585. \t\t}
  586. \t\t.stat-item-ebay {
  587. \t\t\tdisplay: flex;
  588. \t\t\tflex-direction: column;
  589. \t\t\talign-items: flex-start;
  590. \t\t\tmin-width: 100px;
  591. \t\t}
  592. \t\t.stat-percentage {
  593. \t\t\tfont-size: 1.4rem;
  594. \t\t\tfont-weight: 800;
  595. \t\t\tbackground: linear-gradient(135deg, #28a745 0%, #20c997 100%);
  596. \t\t\t-webkit-background-clip: text;
  597. \t\t\t-webkit-text-fill-color: transparent;
  598. \t\t\tbackground-clip: text;
  599. \t\t\tline-height: 1.1;
  600. \t\t\tmargin-bottom: 4px;
  601. \t\t\tword-wrap: break-word;
  602. \t\t\toverflow-wrap: break-word;
  603. \t\t}
  604. \t\t.stat-number-ebay {
  605. \t\t\tfont-size: 1.4rem;
  606. \t\t\tfont-weight: 800;
  607. \t\t\tbackground: linear-gradient(135deg, #333 0%, #555 100%);
  608. \t\t\t-webkit-background-clip: text;
  609. \t\t\t-webkit-text-fill-color: transparent;
  610. \t\t\tbackground-clip: text;
  611. \t\t\tline-height: 1.1;
  612. \t\t\tmargin-bottom: 4px;
  613. \t\t\tword-wrap: break-word;
  614. \t\t\toverflow-wrap: break-word;
  615. \t\t}
  616. \t\t.stat-label-ebay {
  617. \t\t\tfont-size: 0.75rem;
  618. \t\t\tcolor: #6c757d;
  619. \t\t\ttext-transform: uppercase;
  620. \t\t\tletter-spacing: 0.8px;
  621. \t\t\tfont-weight: 600;
  622. \t\t\tmargin-top: 0;
  623. \t\t\tline-height: 1.3;
  624. \t\t\tword-wrap: break-word;
  625. \t\t\toverflow-wrap: break-word;
  626. \t\t\ttext-align: left;
  627. \t\t\thyphens: auto;
  628. \t\t\tmax-width: 100%;
  629. \t\t}
  630. \t\t.shop-additional-info {
  631. \t\t\tdisplay: flex;
  632. \t\t\tflex-wrap: wrap;
  633. \t\t\tgap: 12px 20px;
  634. \t\t\tfont-size: 0.875rem;
  635. \t\t\tcolor: #495057;
  636. \t\t\tmargin-top: 12px;
  637. \t\t\tpadding-top: 16px;
  638. \t\t\tborder-top: 1px solid #e9ecef;
  639. \t\t\tline-height: 1.5;
  640. \t\t\tword-wrap: break-word;
  641. \t\t\toverflow-wrap: break-word;
  642. \t\t}
  643. \t\t.member-since {
  644. \t\t\tfont-weight: 500;
  645. \t\t\tdisplay: inline-flex;
  646. \t\t\talign-items: center;
  647. \t\t\twhite-space: normal;
  648. \t\t\tpadding: 6px 12px;
  649. \t\t\tbackground: #f8f9fa;
  650. \t\t\tborder-radius: 8px;
  651. \t\t\ttransition: all 0.3s ease;
  652. \t\t\tborder: 1px solid transparent;
  653. \t\t\tword-wrap: break-word;
  654. \t\t\toverflow-wrap: break-word;
  655. \t\t\tline-height: 1.4;
  656. \t\t\tmax-width: 100%;
  657. \t\t\tflex-wrap: wrap;
  658. \t\t\ttext-align: center;
  659. \t\t}
  660. \t\t.member-since:hover {
  661. \t\t\tbackground: #e9ecef;
  662. \t\t\tborder-color: #dee2e6;
  663. \t\t\ttransform: translateY(-1px);
  664. \t\t}
  665. \t\t.member-since i {
  666. \t\t\tcolor: #ffa200;
  667. \t\t\tmargin-right: 6px;
  668. \t\t\tfont-size: 0.95rem;
  669. \t\t\ttransition: transform 0.3s ease;
  670. \t\t\tflex-shrink: 0;
  671. \t\t}
  672. \t\t.member-since:hover i {
  673. \t\t\ttransform: scale(1.2);
  674. \t\t}
  675. \t\t.location {
  676. \t\t\tdisplay: flex;
  677. \t\t\talign-items: center;
  678. \t\t}
  679. \t\t.shop-actions-ebay {
  680. \t\t\tdisplay: flex;
  681. \t\t\tflex-direction: column;
  682. \t\t\tgap: 10px;
  683. \t\t\tmin-width: 160px;
  684. \t\t}
  685. \t\t.btn-ebay {
  686. \t\t\tpadding: 10px 18px;
  687. \t\t\tfont-size: 0.9rem;
  688. \t\t\tfont-weight: 500;
  689. \t\t\tborder-radius: 6px;
  690. \t\t\ttext-align: center;
  691. \t\t\ttransition: all 0.3s ease;
  692. \t\t\tborder-width: 1px;
  693. \t\t\twhite-space: normal;
  694. \t\t\tword-wrap: break-word;
  695. \t\t\toverflow-wrap: break-word;
  696. \t\t\tline-height: 1.4;
  697. \t\t}
  698. \t\t.btn-ebay:hover {
  699. \t\t\ttransform: translateY(-2px);
  700. \t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  701. \t\t}
  702. \t\t.btn-ebay i {
  703. \t\t\tvertical-align: middle;
  704. \t\t}
  705. \t\t.btn-ebay.following {
  706. \t\t\tbackground: #28a745;
  707. \t\t\tborder-color: #28a745;
  708. \t\t\tcolor: white;
  709. \t\t}
  710. \t\t/* Styles pour les avis */
  711. \t\t.review-stats {
  712. \t\t\tbackground: white;
  713. \t\t\tborder-radius: 12px;
  714. \t\t\tpadding: 20px;
  715. \t\t\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
  716. \t\t\tmargin-bottom: 20px;
  717. \t\t}
  718. \t\t.stat-card {
  719. \t\t\tpadding: 15px;
  720. \t\t}
  721. \t\t.stat-number {
  722. \t\t\tfont-size: 2.5rem;
  723. \t\t\tfont-weight: 700;
  724. \t\t\tcolor: #333;
  725. \t\t\tmargin: 0;
  726. \t\t}
  727. \t\t.stat-label {
  728. \t\t\tcolor: #666;
  729. \t\t\tfont-size: 0.9rem;
  730. \t\t\tmargin: 5px 0 0;
  731. \t\t}
  732. \t\t.rating-stars {
  733. \t\t\tcolor: #ffc107;
  734. \t\t\tfont-size: 1.2rem;
  735. \t\t\tmargin: 10px 0;
  736. \t\t}
  737. \t\t.reviews-preview {
  738. \t\t\tbackground: white;
  739. \t\t\tborder-radius: 12px;
  740. \t\t\tpadding: 20px;
  741. \t\t\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
  742. \t\t}
  743. \t\t.review-item {
  744. \t\t\tborder-bottom: 1px solid #f0f0f0;
  745. \t\t\tpadding: 15px 0;
  746. \t\t}
  747. \t\t.review-item:last-child {
  748. \t\t\tborder-bottom: none;
  749. \t\t}
  750. \t\t.review-header {
  751. \t\t\tdisplay: flex;
  752. \t\t\tjustify-content: space-between;
  753. \t\t\talign-items: flex-start;
  754. \t\t\tmargin-bottom: 10px;
  755. \t\t}
  756. \t\t.reviewer-info {
  757. \t\t\tdisplay: flex;
  758. \t\t\talign-items: center;
  759. \t\t\tgap: 10px;
  760. \t\t}
  761. \t\t.reviewer-avatar {
  762. \t\t\twidth: 40px;
  763. \t\t\theight: 40px;
  764. \t\t\tborder-radius: 50%;
  765. \t\t\tbackground: #f8f9fa;
  766. \t\t\tdisplay: flex;
  767. \t\t\talign-items: center;
  768. \t\t\tjustify-content: center;
  769. \t\t\tcolor: #666;
  770. \t\t}
  771. \t\t.reviewer-name {
  772. \t\t\tmargin: 0;
  773. \t\t\tfont-size: 1rem;
  774. \t\t\tfont-weight: 600;
  775. \t\t}
  776. \t\t.review-rating {
  777. \t\t\tcolor: #ffc107;
  778. \t\t\tfont-size: 0.9rem;
  779. \t\t}
  780. \t\t.review-meta {
  781. \t\t\ttext-align: right;
  782. \t\t}
  783. \t\t.review-date {
  784. \t\t\tcolor: #666;
  785. \t\t\tfont-size: 0.8rem;
  786. \t\t}
  787. \t\t.verified-badge {
  788. \t\t\tdisplay: inline-block;
  789. \t\t\tbackground: #28a745;
  790. \t\t\tcolor: white;
  791. \t\t\tpadding: 2px 8px;
  792. \t\t\tborder-radius: 12px;
  793. \t\t\tfont-size: 0.7rem;
  794. \t\t\tmargin-left: 10px;
  795. \t\t}
  796. \t\t.review-comment {
  797. \t\t\tmargin: 10px 0 0;
  798. \t\t\tline-height: 1.5;
  799. \t\t\tcolor: #333;
  800. \t\t}
  801. \t\t.review-actions-card {
  802. \t\t\tbackground: white;
  803. \t\t\tborder-radius: 12px;
  804. \t\t\tpadding: 20px;
  805. \t\t\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
  806. \t\t\ttext-align: center;
  807. \t\t}
  808. \t\t.shop-banner-overlay {
  809. \t\t\tposition: absolute;
  810. \t\t\ttop: 0;
  811. \t\t\tleft: 0;
  812. \t\t\tright: 0;
  813. \t\t\tbottom: 0;
  814. \t\t\tbackground: rgba(0, 0, 0, 0.3);
  815. \t\t\tz-index: 1;
  816. \t\t}
  817. \t\t.shop-header-content {
  818. \t\t\tbackground: white;
  819. \t\t\tborder: 1px solid #e1e1e1;
  820. \t\t\tborder-radius: 4px;
  821. \t\t\tpadding: 20px;
  822. \t\t\tmargin: 0 20px 20px;
  823. \t\t\tbox-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  824. \t\t\tposition: relative;
  825. \t\t\tz-index: 2;
  826. \t\t}
  827. \t\t.shop-avatar {
  828. \t\t\twidth: 80px;
  829. \t\t\theight: 80px;
  830. \t\t\tborder-radius: 4px;
  831. \t\t\tborder: 1px solid #e1e1e1;
  832. \t\t\tobject-fit: cover;
  833. \t\t\tposition: relative;
  834. \t\t\tz-index: 3;
  835. \t\t}
  836. \t\t.shop-title {
  837. \t\t\tfont-size: 1.5rem;
  838. \t\t\tfont-weight: 600;
  839. \t\t\tcolor: #333;
  840. \t\t\tmargin-bottom: 8px;
  841. \t\t}
  842. \t\t.shop-subtitle {
  843. \t\t\tcolor: #666;
  844. \t\t\tfont-size: 0.9rem;
  845. \t\t\tmargin-bottom: 15px;
  846. \t\t}
  847. \t\t.shop-stats-row {
  848. \t\t\tdisplay: flex;
  849. \t\t\talign-items: center;
  850. \t\t\tgap: 20px;
  851. \t\t\tflex-wrap: wrap;
  852. \t\t\tmargin-bottom: 15px;
  853. \t\t}
  854. \t\t.shop-stat-item {
  855. \t\t\tdisplay: flex;
  856. \t\t\talign-items: center;
  857. \t\t\tgap: 5px;
  858. \t\t\tfont-size: 0.9rem;
  859. \t\t}
  860. \t\t.positive-feedback {
  861. \t\t\tcolor: #007bff;
  862. \t\t\tfont-weight: 600;
  863. \t\t}
  864. \t\t.items-sold {
  865. \t\t\tcolor: #666;
  866. \t\t}
  867. \t\t.followers-count {
  868. \t\t\tcolor: #666;
  869. \t\t}
  870. \t\t.shop-badges {
  871. \t\t\tdisplay: flex;
  872. \t\t\tgap: 10px;
  873. \t\t\tmargin-bottom: 15px;
  874. \t\t}
  875. \t\t.shop-badge {
  876. \t\t\tbackground: #f0f0f0;
  877. \t\t\tcolor: #333;
  878. \t\t\tpadding: 4px 8px;
  879. \t\t\tborder-radius: 3px;
  880. \t\t\tfont-size: 0.8rem;
  881. \t\t\tfont-weight: 500;
  882. \t\t}
  883. \t\t.shop-badge.verified {
  884. \t\t\tbackground: #d4edda;
  885. \t\t\tcolor: #155724;
  886. \t\t}
  887. \t\t.shop-badge.premium {
  888. \t\t\tbackground: #fff3cd;
  889. \t\t\tcolor: #856404;
  890. \t\t}
  891. \t\t.shop-actions-row {
  892. \t\t\tdisplay: flex;
  893. \t\t\talign-items: center;
  894. \t\t\tgap: 15px;
  895. \t\t\tflex-wrap: wrap;
  896. \t\t}
  897. \t\t.shop-action-btn {
  898. \t\t\tbackground: #007bff;
  899. \t\t\tcolor: white;
  900. \t\t\tborder: none;
  901. \t\t\tpadding: 8px 16px;
  902. \t\t\tborder-radius: 3px;
  903. \t\t\tfont-size: 0.9rem;
  904. \t\t\tfont-weight: 500;
  905. \t\t\tcursor: pointer;
  906. \t\t\ttransition: background-color 0.2s;
  907. \t\t\ttext-decoration: none;
  908. \t\t\tdisplay: inline-flex;
  909. \t\t\talign-items: center;
  910. \t\t\tgap: 5px;
  911. \t\t}
  912. \t\t.shop-action-btn:hover {
  913. \t\t\tbackground: #0056b3;
  914. \t\t\tcolor: white;
  915. \t\t}
  916. \t\t.shop-action-btn.following {
  917. \t\t\tbackground: #28a745;
  918. \t\t}
  919. \t\t.shop-action-btn.following:hover {
  920. \t\t\tbackground: #1e7e34;
  921. \t\t}
  922. \t\t.shop-action-btn.secondary {
  923. \t\t\tbackground: #6c757d;
  924. \t\t}
  925. \t\t.shop-action-btn.secondary:hover {
  926. \t\t\tbackground: #545b62;
  927. \t\t}
  928. \t\t/* Onglets eBay-style avec classes Karma */
  929. \t\t.shop-tabs {
  930. \t\t\tbackground: white;
  931. \t\t\tborder: 1px solid #e1e1e1;
  932. \t\t\tborder-top: none;
  933. \t\t\tborder-radius: 0 0 4px 4px;
  934. \t\t\tmargin-top: 0;
  935. \t\t}
  936. \t\t.shop-tabs-nav {
  937. \t\t\tdisplay: flex;
  938. \t\t\tborder-bottom: 1px solid #e1e1e1;
  939. \t\t\tmargin: 0;
  940. \t\t\tpadding: 0;
  941. \t\t\tlist-style: none;
  942. \t\t\tbackground: #f8f9fa;
  943. \t\t}
  944. \t\t.shop-tab {
  945. \t\t\tmargin: 0;
  946. \t\t}
  947. \t\t.shop-tab-link {
  948. \t\t\tdisplay: block;
  949. \t\t\tpadding: 12px 20px;
  950. \t\t\tcolor: #000000;
  951. \t\t\ttext-decoration: none;
  952. \t\t\tborder-bottom: 2px solid transparent;
  953. \t\t\ttransition: all 0.2s;
  954. \t\t\tfont-weight: 500;
  955. \t\t\tfont-size: 1rem;
  956. \t\t}
  957. \t\t.shop-tab-link:hover,
  958. \t\t.shop-tab-link.active {
  959. \t\t\tcolor: #095ad3;
  960. \t\t\tborder-bottom-color: #095ad3;
  961. \t\t\tbackground: #ffa200;
  962. \t\t}
  963. \t\t.shop-tab-content {
  964. \t\t\tpadding: 30px;
  965. \t\t\tmin-height: 400px;
  966. \t\t}
  967. \t\t.shop-tab-content:not(.active) {
  968. \t\t\tdisplay: none;
  969. \t\t}
  970. \t\t.shop-tab-content.active {
  971. \t\t\tdisplay: block;
  972. \t\t}
  973. \t\t/* Cards d'information avec style Karma */
  974. \t\t.shop-info-card {
  975. \t\t\tbackground: #f8f9fa;
  976. \t\t\tborder: 1px solid #e1e1e1;
  977. \t\t\tborder-radius: 4px;
  978. \t\t\tpadding: 20px;
  979. \t\t\tmargin-bottom: 20px;
  980. \t\t}
  981. \t\t.shop-info-card h6 {
  982. \t\t\tcolor: #333;
  983. \t\t\tfont-weight: 600;
  984. \t\t\tmargin-bottom: 15px;
  985. \t\t\tfont-size: 1.1rem;
  986. \t\t}
  987. \t\t.shop-info-card p {
  988. \t\t\tcolor: #666;
  989. \t\t\tfont-size: 0.9rem;
  990. \t\t\tmargin: 0;
  991. \t\t\tline-height: 1.5;
  992. \t\t}
  993. \t\t.shop-contact-info {
  994. \t\t\tdisplay: flex;
  995. \t\t\tflex-direction: column;
  996. \t\t\tgap: 10px;
  997. \t\t}
  998. \t\t.shop-contact-item {
  999. \t\t\tdisplay: flex;
  1000. \t\t\talign-items: center;
  1001. \t\t\tgap: 10px;
  1002. \t\t\tfont-size: 0.9rem;
  1003. \t\t\tcolor: #666;
  1004. \t\t\tpadding: 5px 0;
  1005. \t\t}
  1006. \t\t.shop-contact-item i {
  1007. \t\t\twidth: 16px;
  1008. \t\t\tcolor: #007bff;
  1009. \t\t\ttext-align: center;
  1010. \t\t}
  1011. \t\t.shop-social-links {
  1012. \t\t\tdisplay: flex;
  1013. \t\t\tgap: 10px;
  1014. \t\t\tmargin-top: 15px;
  1015. \t\t\tflex-wrap: wrap;
  1016. \t\t}
  1017. \t\t.shop-social-link {
  1018. \t\t\tdisplay: inline-flex;
  1019. \t\t\talign-items: center;
  1020. \t\t\tjustify-content: center;
  1021. \t\t\twidth: 36px;
  1022. \t\t\theight: 36px;
  1023. \t\t\tbackground: #f0f0f0;
  1024. \t\t\tcolor: #666;
  1025. \t\t\tborder-radius: 4px;
  1026. \t\t\ttext-decoration: none;
  1027. \t\t\ttransition: all 0.2s;
  1028. \t\t\tfont-size: 1.1rem;
  1029. \t\t}
  1030. \t\t.shop-social-link:hover {
  1031. \t\t\tbackground: #007bff;
  1032. \t\t\tcolor: white;
  1033. \t\t\ttransform: translateY(-2px);
  1034. \t\t}
  1035. \t\t/* Produits avec style Karma */
  1036. \t\t.product-card {
  1037. \t\t\tbackground: white;
  1038. \t\t\tborder: 1px solid #e1e1e1;
  1039. \t\t\tborder-radius: 4px;
  1040. \t\t\toverflow: hidden;
  1041. \t\t\ttransition: all 0.3s ease;
  1042. \t\t\tmargin-bottom: 20px;
  1043. \t\t}
  1044. \t\t.product-card:hover {
  1045. \t\t\ttransform: translateY(-2px);
  1046. \t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  1047. \t\t}
  1048. \t\t/* Animation de tri des produits */
  1049. \t\t.product-item {
  1050. \t\t\ttransition: all 0.3s ease;
  1051. \t\t}
  1052. \t\t.product-item.sorting {
  1053. \t\t\topacity: 0;
  1054. \t\t\ttransform: translateY(20px);
  1055. \t\t}
  1056. \t\t.product-item.sorted {
  1057. \t\t\topacity: 1;
  1058. \t\t\ttransform: translateY(0);
  1059. \t\t}
  1060. \t\t.product-image {
  1061. \t\t\theight: 200px;
  1062. \t\t\tbackground-size: cover;
  1063. \t\t\tbackground-position: center;
  1064. \t\t\tposition: relative;
  1065. \t\t\toverflow: hidden;
  1066. \t\t}
  1067. \t\t.product-info {
  1068. \t\t\tpadding: 15px;
  1069. \t\t}
  1070. \t\t.product-title {
  1071. \t\t\tfont-size: 1rem;
  1072. \t\t\tfont-weight: 600;
  1073. \t\t\tmargin-bottom: 8px;
  1074. \t\t\tcolor: #333;
  1075. \t\t\tline-height: 1.3;
  1076. \t\t}
  1077. \t\t.product-title a {
  1078. \t\t\tcolor: #333;
  1079. \t\t\ttext-decoration: none;
  1080. \t\t}
  1081. \t\t.product-title a:hover {
  1082. \t\t\tcolor: #007bff;
  1083. \t\t}
  1084. \t\t.product-price {
  1085. \t\t\tfont-size: 1.2rem;
  1086. \t\t\tfont-weight: bold;
  1087. \t\t\tcolor: #ff6b35;
  1088. \t\t\tmargin-bottom: 10px;
  1089. \t\t}
  1090. \t\t.product-meta {
  1091. \t\t\tdisplay: flex;
  1092. \t\t\tjustify-content: space-between;
  1093. \t\t\talign-items: center;
  1094. \t\t\tfont-size: 0.85rem;
  1095. \t\t\tcolor: #666;
  1096. \t\t}
  1097. \t\t.rating {
  1098. \t\t\tcolor: #ffc107;
  1099. \t\t}
  1100. \t\t/* Responsive avec classes Karma */
  1101. \t\t/* Responsive amélioré pour la page shop */
  1102. \t\t/* Tablettes et écrans moyens */
  1103. \t\t@media(max-width: 1200px) {
  1104. \t\t\t.shop-carousel-ebay {
  1105. \t\t\t\theight: 400px;
  1106. \t\t\t}
  1107. \t\t\t
  1108. \t\t\t.carousel-controls-ebay {
  1109. \t\t\t\tbottom: 18px;
  1110. \t\t\t\tright: 18px;
  1111. \t\t\t\tgap: 11px;
  1112. \t\t\t}
  1113. \t\t\t
  1114. \t\t\t.carousel-btn-ebay {
  1115. \t\t\t\twidth: 48px;
  1116. \t\t\t\theight: 48px;
  1117. \t\t\t\tfont-size: 21px;
  1118. \t\t\t}
  1119. \t\t\t
  1120. \t\t\t.carousel-indicators-ebay {
  1121. \t\t\t\tbottom: 18px;
  1122. \t\t\t\tpadding: 7px 13px;
  1123. \t\t\t}
  1124. \t\t\t
  1125. \t\t\t.carousel-indicator-ebay {
  1126. \t\t\t\twidth: 9px;
  1127. \t\t\t\theight: 9px;
  1128. \t\t\t}
  1129. \t\t}
  1130. \t\t
  1131. \t\t@media(max-width: 991.98px) {
  1132. \t\t\t.shop-carousel-ebay {
  1133. \t\t\t\tmargin: 0 10px;
  1134. \t\t\t\theight: 380px;
  1135. \t\t\t}
  1136. \t\t\t
  1137. \t\t\t.carousel-controls-ebay {
  1138. \t\t\t\tbottom: 16px;
  1139. \t\t\t\tright: 16px;
  1140. \t\t\t\tgap: 10px;
  1141. \t\t\t}
  1142. \t\t\t
  1143. \t\t\t.carousel-btn-ebay {
  1144. \t\t\t\twidth: 46px;
  1145. \t\t\t\theight: 46px;
  1146. \t\t\t\tfont-size: 20px;
  1147. \t\t\t}
  1148. \t\t\t
  1149. \t\t\t.carousel-indicators-ebay {
  1150. \t\t\t\tbottom: 16px;
  1151. \t\t\t\tleft: 50%;
  1152. \t\t\t\ttransform: translateX(-50%);
  1153. \t\t\t\tpadding: 6px 12px;
  1154. \t\t\t}
  1155. \t\t\t
  1156. \t\t\t.carousel-indicator-ebay {
  1157. \t\t\t\twidth: 9px;
  1158. \t\t\t\theight: 9px;
  1159. \t\t\t}
  1160. \t\t\t
  1161. \t\t\t.shop-header-content {
  1162. \t\t\t\tpadding: 20px;
  1163. \t\t\t\tmargin: 0 10px 20px;
  1164. \t\t\t}
  1165. \t\t\t
  1166. \t\t\t.shop-header-content .row {
  1167. \t\t\t\tflex-wrap: wrap;
  1168. \t\t\t}
  1169. \t\t\t
  1170. \t\t\t.shop-info-ebay {
  1171. \t\t\t\tmargin-top: 0;
  1172. \t\t\t\ttext-align: center;
  1173. \t\t\t}
  1174. \t\t\t.shop-name-ebay {
  1175. \t\t\t\tfont-size: 1.75rem;
  1176. \t\t\t\tline-height: 1.3;
  1177. \t\t\t}
  1178. \t\t\t.verified-text {
  1179. \t\t\t\tfont-size: 0.85rem;
  1180. \t\t\t}
  1181. \t\t\t.shop-category-ebay {
  1182. \t\t\t\tfont-size: 0.8rem;
  1183. \t\t\t\tpadding: 5px 12px;
  1184. \t\t\t}
  1185. \t\t\t.stat-row {
  1186. \t\t\t\tjustify-content: center;
  1187. \t\t\t\tgap: 20px;
  1188. \t\t\t}
  1189. \t\t\t.stat-item-ebay {
  1190. \t\t\t\talign-items: center;
  1191. \t\t\t\tmin-width: 90px;
  1192. \t\t\t}
  1193. \t\t\t.stat-percentage,
  1194. \t\t\t.stat-number-ebay {
  1195. \t\t\t\tfont-size: 1.15rem;
  1196. \t\t\t}
  1197. \t\t\t.stat-label-ebay {
  1198. \t\t\t\tfont-size: 0.75rem;
  1199. \t\t\t\ttext-align: center;
  1200. \t\t\t}
  1201. \t\t\t.shop-additional-info {
  1202. \t\t\t\tjustify-content: center;
  1203. \t\t\t\tgap: 12px 18px;
  1204. \t\t\t\tfont-size: 0.8rem;
  1205. \t\t\t}
  1206. \t\t\t.member-since {
  1207. \t\t\t\tfont-size: 0.8rem;
  1208. \t\t\t}
  1209. \t\t\t.shop-actions-ebay {
  1210. \t\t\t\tmin-width: auto;
  1211. \t\t\t}
  1212. \t\t}
  1213. \t\t
  1214. \t\t@media(max-width: 768px) {
  1215. \t\t\t.shop-banner,
  1216. \t\t\t.shop-carousel-ebay {
  1217. \t\t\t\theight: 300px;
  1218. \t\t\t\tmargin: 0;
  1219. \t\t\t\tborder-radius: 0;
  1220. \t\t\t}
  1221. \t\t\t
  1222. \t\t\t.shop-carousel-ebay .carousel-container {
  1223. \t\t\t\tborder-radius: 0;
  1224. \t\t\t}
  1225. \t\t\t.carousel-controls-ebay {
  1226. \t\t\t\tbottom: 12px;
  1227. \t\t\t\tright: 12px;
  1228. \t\t\t\tgap: 8px;
  1229. \t\t\t}
  1230. \t\t\t.carousel-btn-ebay {
  1231. \t\t\t\twidth: 40px;
  1232. \t\t\t\theight: 40px;
  1233. \t\t\t\tfont-size: 16px;
  1234. \t\t\t}
  1235. \t\t\t
  1236. \t\t\t.carousel-btn-ebay #pauseIcon,
  1237. \t\t\t.carousel-btn-ebay .pause-icon-content {
  1238. \t\t\t\tfont-size: 18px !important;
  1239. \t\t\t}
  1240. \t\t\t.carousel-indicators-ebay {
  1241. \t\t\t\tbottom: 12px;
  1242. \t\t\t\tleft: 50%;
  1243. \t\t\t\ttransform: translateX(-50%);
  1244. \t\t\t\tgap: 6px;
  1245. \t\t\t\tpadding: 5px 10px;
  1246. \t\t\t}
  1247. \t\t\t
  1248. \t\t\t.carousel-indicator-ebay {
  1249. \t\t\t\twidth: 8px;
  1250. \t\t\t\theight: 8px;
  1251. \t\t\t}
  1252. \t\t\t.shop-header-content {
  1253. \t\t\t\tpadding: 20px 16px;
  1254. \t\t\t\tmargin: 0;
  1255. \t\t\t\tborder-radius: 0;
  1256. \t\t\t}
  1257. \t\t\t.shop-header-content .row {
  1258. \t\t\t\tflex-direction: column;
  1259. \t\t\t\ttext-align: center;
  1260. \t\t\t}
  1261. \t\t\t.shop-avatar-container-ebay {
  1262. \t\t\t\tmargin: 0 auto 16px;
  1263. \t\t\t}
  1264. \t\t\t.shop-avatar-ebay {
  1265. \t\t\t\twidth: 90px;
  1266. \t\t\t\theight: 90px;
  1267. \t\t\t}
  1268. \t\t\t.shop-name-ebay {
  1269. \t\t\t\tfont-size: 1.5rem;
  1270. \t\t\t\tmargin-bottom: 8px;
  1271. \t\t\t\tline-height: 1.3;
  1272. \t\t\t\tword-break: break-word;
  1273. \t\t\t\thyphens: auto;
  1274. \t\t\t\tmax-width: 100%;
  1275. \t\t\t}
  1276. \t\t\t.shop-name-section {
  1277. \t\t\t\tmargin-bottom: 10px;
  1278. \t\t\t}
  1279. \t\t\t.verified-text {
  1280. \t\t\t\tfont-size: 0.8rem;
  1281. \t\t\t\twhite-space: normal;
  1282. \t\t\t\tjustify-content: center;
  1283. \t\t\t\tflex-wrap: wrap;
  1284. \t\t\t\tline-height: 1.4;
  1285. \t\t\t}
  1286. \t\t\t.verified-text i {
  1287. \t\t\t\tfont-size: 0.85rem;
  1288. \t\t\t}
  1289. \t\t\t.shop-category-ebay {
  1290. \t\t\t\tfont-size: 0.75rem;
  1291. \t\t\t\tpadding: 5px 10px;
  1292. \t\t\t\tmax-width: 100%;
  1293. \t\t\t\tline-height: 1.3;
  1294. \t\t\t\tword-break: break-word;
  1295. \t\t\t}
  1296. \t\t\t.shop-info-ebay {
  1297. \t\t\t\ttext-align: center;
  1298. \t\t\t}
  1299. \t\t\t.stat-row {
  1300. \t\t\t\tjustify-content: center;
  1301. \t\t\t\tgap: 10px;
  1302. \t\t\t\tflex-wrap: wrap;
  1303. \t\t\t}
  1304. \t\t\t
  1305. \t\t\t.stat-item-ebay {
  1306. \t\t\t\talign-items: center;
  1307. \t\t\t\tmin-width: 75px;
  1308. \t\t\t\tflex: 0 1 auto;
  1309. \t\t\t\tpadding: 10px 8px;
  1310. \t\t\t}
  1311. \t\t\t.stat-percentage,
  1312. \t\t\t.stat-number-ebay {
  1313. \t\t\t\tfont-size: 1rem;
  1314. \t\t\t\tline-height: 1.1;
  1315. \t\t\t\tword-break: break-word;
  1316. \t\t\t}
  1317. \t\t\t.stat-label-ebay {
  1318. \t\t\t\tfont-size: 0.65rem;
  1319. \t\t\t\ttext-align: center;
  1320. \t\t\t\tline-height: 1.2;
  1321. \t\t\t\tletter-spacing: 0.3px;
  1322. \t\t\t\tword-break: break-word;
  1323. \t\t\t\thyphens: auto;
  1324. \t\t\t}
  1325. \t\t\t.shop-additional-info {
  1326. \t\t\t\tjustify-content: center;
  1327. \t\t\t\tflex-wrap: wrap;
  1328. \t\t\t\tgap: 8px 10px;
  1329. \t\t\t\tfont-size: 0.75rem;
  1330. \t\t\t\tline-height: 1.4;
  1331. \t\t\t}
  1332. \t\t\t.member-since {
  1333. \t\t\t\tflex-direction: row;
  1334. \t\t\t\ttext-align: center;
  1335. \t\t\t\tgap: 4px;
  1336. \t\t\t\twhite-space: normal;
  1337. \t\t\t\tfont-size: 0.75rem;
  1338. \t\t\t\tline-height: 1.4;
  1339. \t\t\t\tpadding: 5px 8px;
  1340. \t\t\t\tword-break: break-word;
  1341. \t\t\t}
  1342. \t\t\t.member-since i {
  1343. \t\t\t\tmargin-right: 4px;
  1344. \t\t\t\tfont-size: 0.85rem;
  1345. \t\t\t\tflex-shrink: 0;
  1346. \t\t\t}
  1347. \t\t\t.shop-actions-ebay {
  1348. \t\t\t\tflex-direction: column;
  1349. \t\t\t\tjustify-content: center;
  1350. \t\t\t\tmin-width: auto;
  1351. \t\t\t\tmargin-top: 20px;
  1352. \t\t\t\twidth: 100%;
  1353. \t\t\t}
  1354. \t\t\t.btn-ebay {
  1355. \t\t\t\twidth: 100%;
  1356. \t\t\t\tmin-width: auto;
  1357. \t\t\t}
  1358. \t\t\t.shop-actions-ebay .d-flex {
  1359. \t\t\t\twidth: 100%;
  1360. \t\t\t}
  1361. \t\t\t.btn-shop,
  1362. \t\t\t.shop-action-btn {
  1363. \t\t\t\twidth: 100%;
  1364. \t\t\t\tmin-width: auto;
  1365. \t\t\t\theight: 45px;
  1366. \t\t\t\tfont-size: 0.9rem;
  1367. \t\t\t\tpadding: 12px 20px;
  1368. \t\t\t}
  1369. \t\t\t.shop-tabs-nav {
  1370. \t\t\t\tflex-wrap: wrap;
  1371. \t\t\t\tjustify-content: center;
  1372. \t\t\t}
  1373. \t\t\t
  1374. \t\t\t.shop-tab-link {
  1375. \t\t\t\tfont-size: 0.85rem;
  1376. \t\t\t\tpadding: 0.5rem 0.75rem;
  1377. \t\t\t\tflex: 1;
  1378. \t\t\t\tmin-width: auto;
  1379. \t\t\t}
  1380. \t\t\t
  1381. \t\t\t/* Produits responsive */
  1382. \t\t\t#products-container .product-item {
  1383. \t\t\t\tmargin-bottom: 20px;
  1384. \t\t\t}
  1385. \t\t\t
  1386. \t\t\t.product-card {
  1387. \t\t\t\tpadding: 15px;
  1388. \t\t\t}
  1389. \t\t\t
  1390. \t\t\t.product-title {
  1391. \t\t\t\tfont-size: 0.95rem;
  1392. \t\t\t}
  1393. \t\t\t
  1394. \t\t\t.product-price {
  1395. \t\t\t\tfont-size: 1.1rem;
  1396. \t\t\t}
  1397. \t\t\t
  1398. \t\t\t/* Détails de la boutique responsive */
  1399. \t\t\t.shop-info-ebay {
  1400. \t\t\t\ttext-align: center;
  1401. \t\t\t}
  1402. \t\t}
  1403. \t\t
  1404. \t\t@media(max-width: 575.98px) {
  1405. \t\t\t.shop-banner,
  1406. \t\t\t.shop-carousel-ebay {
  1407. \t\t\t\theight: 280px;
  1408. \t\t\t\tmargin: 0;
  1409. \t\t\t}
  1410. \t\t\t
  1411. \t\t\t.carousel-controls-ebay {
  1412. \t\t\t\tbottom: 10px;
  1413. \t\t\t\tright: 10px;
  1414. \t\t\t\tgap: 6px;
  1415. \t\t\t}
  1416. \t\t\t
  1417. \t\t\t.carousel-btn-ebay {
  1418. \t\t\t\twidth: 36px;
  1419. \t\t\t\theight: 36px;
  1420. \t\t\t\tfont-size: 14px;
  1421. \t\t\t}
  1422. \t\t\t
  1423. \t\t\t.carousel-btn-ebay #pauseIcon,
  1424. \t\t\t.carousel-btn-ebay .pause-icon-content {
  1425. \t\t\t\tfont-size: 16px !important;
  1426. \t\t\t}
  1427. \t\t\t
  1428. \t\t\t.carousel-indicators-ebay {
  1429. \t\t\t\tbottom: 10px;
  1430. \t\t\t\tleft: 50%;
  1431. \t\t\t\ttransform: translateX(-50%);
  1432. \t\t\t\tpadding: 4px 8px;
  1433. \t\t\t\tgap: 5px;
  1434. \t\t\t}
  1435. \t\t\t
  1436. \t\t\t.carousel-indicator-ebay {
  1437. \t\t\t\twidth: 7px;
  1438. \t\t\t\theight: 7px;
  1439. \t\t\t}
  1440. \t\t\t
  1441. \t\t\t.shop-header-content {
  1442. \t\t\t\tmargin: 0;
  1443. \t\t\t\tpadding: 16px 12px;
  1444. \t\t\t}
  1445. \t\t\t
  1446. \t\t\t.shop-avatar-ebay {
  1447. \t\t\t\twidth: 80px;
  1448. \t\t\t\theight: 80px;
  1449. \t\t\t}
  1450. \t\t\t
  1451. \t\t\t.shop-name-ebay {
  1452. \t\t\t\tfont-size: 1.3rem;
  1453. \t\t\t\tline-height: 1.3;
  1454. \t\t\t\tword-break: break-word;
  1455. \t\t\t\tletter-spacing: -0.1px;
  1456. \t\t\t\thyphens: auto;
  1457. \t\t\t\tmax-width: 100%;
  1458. \t\t\t}
  1459. \t\t\t.shop-name-section {
  1460. \t\t\t\tmargin-bottom: 8px;
  1461. \t\t\t}
  1462. \t\t\t.verified-text {
  1463. \t\t\t\tfont-size: 0.7rem;
  1464. \t\t\t\twhite-space: normal;
  1465. \t\t\t\tline-height: 1.4;
  1466. \t\t\t\tflex-wrap: wrap;
  1467. \t\t\t\tjustify-content: center;
  1468. \t\t\t\tword-break: break-word;
  1469. \t\t\t}
  1470. \t\t\t.verified-text i {
  1471. \t\t\t\tfont-size: 0.75rem;
  1472. \t\t\t\tflex-shrink: 0;
  1473. \t\t\t}
  1474. \t\t\t.shop-category-ebay {
  1475. \t\t\t\tfont-size: 0.65rem;
  1476. \t\t\t\tpadding: 4px 8px;
  1477. \t\t\t\tmax-width: 100%;
  1478. \t\t\t\tline-height: 1.3;
  1479. \t\t\t\tword-break: break-word;
  1480. \t\t\t}
  1481. \t\t\t
  1482. \t\t\t.stat-row {
  1483. \t\t\t\tgap: 6px;
  1484. \t\t\t\tflex-direction: row;
  1485. \t\t\t\tjustify-content: space-around;
  1486. \t\t\t}
  1487. \t\t\t
  1488. \t\t\t.stat-item-ebay {
  1489. \t\t\t\tflex: 1;
  1490. \t\t\t\tmin-width: 0;
  1491. \t\t\t\talign-items: center;
  1492. \t\t\t\tpadding: 8px 4px;
  1493. \t\t\t}
  1494. \t\t\t.stat-percentage,
  1495. \t\t\t.stat-number-ebay {
  1496. \t\t\t\tfont-size: 0.95rem;
  1497. \t\t\t\tline-height: 1.1;
  1498. \t\t\t\tword-break: break-word;
  1499. \t\t\t}
  1500. \t\t\t.stat-label-ebay {
  1501. \t\t\t\tfont-size: 0.6rem;
  1502. \t\t\t\ttext-align: center;
  1503. \t\t\t\tline-height: 1.2;
  1504. \t\t\t\tletter-spacing: 0.2px;
  1505. \t\t\t\tpadding: 0 2px;
  1506. \t\t\t\tword-break: break-word;
  1507. \t\t\t\thyphens: auto;
  1508. \t\t\t}
  1509. \t\t\t.shop-additional-info {
  1510. \t\t\t\tflex-direction: column;
  1511. \t\t\t\tgap: 8px;
  1512. \t\t\t\tfont-size: 0.7rem;
  1513. \t\t\t\talign-items: center;
  1514. \t\t\t\tline-height: 1.5;
  1515. \t\t\t}
  1516. \t\t\t.member-since {
  1517. \t\t\t\tfont-size: 0.7rem;
  1518. \t\t\t\tpadding: 4px 8px;
  1519. \t\t\t\tline-height: 1.4;
  1520. \t\t\t\tword-break: break-word;
  1521. \t\t\t\ttext-align: center;
  1522. \t\t\t\twidth: 100%;
  1523. \t\t\t\tmax-width: 100%;
  1524. \t\t\t\tjustify-content: center;
  1525. \t\t\t\twhite-space: normal;
  1526. \t\t\t}
  1527. \t\t\t.member-since i {
  1528. \t\t\t\tfont-size: 0.8rem;
  1529. \t\t\t\tmargin-right: 3px;
  1530. \t\t\t\tflex-shrink: 0;
  1531. \t\t\t}
  1532. \t\t\t.btn-ebay {
  1533. \t\t\t\tfont-size: 0.8rem;
  1534. \t\t\t\tpadding: 10px 14px;
  1535. \t\t\t\tline-height: 1.3;
  1536. \t\t\t}
  1537. \t\t\t.member-since i {
  1538. \t\t\t\tmargin-right: 4px;
  1539. \t\t\t\tfont-size: 0.8rem;
  1540. \t\t\t}
  1541. \t\t\t
  1542. \t\t\t.btn-ebay {
  1543. \t\t\t\tfont-size: 0.85rem;
  1544. \t\t\t\tpadding: 10px 16px;
  1545. \t\t\t}
  1546. \t\t\t
  1547. \t\t\t.member-since {
  1548. \t\t\t\tfont-size: 0.75rem;
  1549. \t\t\t}
  1550. \t\t\t
  1551. \t\t\t.shop-tab-content {
  1552. \t\t\t\tpadding: 15px 10px;
  1553. \t\t\t}
  1554. \t\t\t.shop-stats-row {
  1555. \t\t\t\tflex-direction: column;
  1556. \t\t\t\tgap: 10px;
  1557. \t\t\t\talign-items: flex-start;
  1558. \t\t\t}
  1559. \t\t}
  1560. \t\t.follow-button {
  1561. \t\t\tbackground: #ffa200;
  1562. \t\t\tborder: none;
  1563. \t\t\tcolor: white;
  1564. \t\t\tpadding: 12px 30px;
  1565. \t\t\tborder-radius: 25px;
  1566. \t\t\tfont-weight: 600;
  1567. \t\t\ttransition: all 0.3s ease;
  1568. \t\t\tcursor: pointer;
  1569. \t\t\tdisplay: inline-flex;
  1570. \t\t\talign-items: center;
  1571. \t\t\tgap: 8px;
  1572. \t\t}
  1573. \t\t.follow-button:hover {
  1574. \t\t\tbackground: #e8910a;
  1575. \t\t\ttransform: translateY(-2px);
  1576. \t\t\tbox-shadow: 0 5px 15px rgba(255, 162, 0, 0.3);
  1577. \t\t}
  1578. \t\t.follow-button.following {
  1579. \t\t\tbackground: #28a745;
  1580. \t\t}
  1581. \t\t.follow-button.following:hover {
  1582. \t\t\tbackground: #218838;
  1583. \t\t}
  1584. \t\t.follow-button:disabled {
  1585. \t\t\topacity: 0.6;
  1586. \t\t\tcursor: not-allowed;
  1587. \t\t\ttransform: none;
  1588. \t\t}
  1589. \t\t.follow-stats {
  1590. \t\t\tdisplay: flex;
  1591. \t\t\tgap: 30px;
  1592. \t\t\tmargin-top: 20px;
  1593. \t\t\tflex-wrap: wrap;
  1594. \t\t}
  1595. \t\t.follow-stat {
  1596. \t\t\ttext-align: center;
  1597. \t\t\tpadding: 15px;
  1598. \t\t\tbackground: #f8f9fa;
  1599. \t\t\tborder-radius: 10px;
  1600. \t\t\tmin-width: 120px;
  1601. \t\t}
  1602. \t\t.follow-stat-number {
  1603. \t\t\tfont-size: 1.8rem;
  1604. \t\t\tfont-weight: bold;
  1605. \t\t\tcolor: #ffa200;
  1606. \t\t\tdisplay: block;
  1607. \t\t}
  1608. \t\t.follow-stat-label {
  1609. \t\t\tcolor: #666;
  1610. \t\t\tfont-size: 0.9rem;
  1611. \t\t\ttext-transform: uppercase;
  1612. \t\t\tletter-spacing: 0.5px;
  1613. \t\t}
  1614. \t\t.shop-actions {
  1615. \t\t\tdisplay: flex;
  1616. \t\t\tgap: 15px;
  1617. \t\t\talign-items: center;
  1618. \t\t\tflex-wrap: wrap;
  1619. \t\t\tmargin-top: 20px;
  1620. \t\t}
  1621. \t\t.action-button {
  1622. \t\t\tbackground: white;
  1623. \t\t\tborder: 2px solid #ffa200;
  1624. \t\t\tcolor: #ffa200;
  1625. \t\t\tpadding: 10px 20px;
  1626. \t\t\tborder-radius: 20px;
  1627. \t\t\ttext-decoration: none;
  1628. \t\t\tfont-weight: 500;
  1629. \t\t\ttransition: all 0.3s ease;
  1630. \t\t\tdisplay: inline-flex;
  1631. \t\t\talign-items: center;
  1632. \t\t\tgap: 8px;
  1633. \t\t}
  1634. \t\t.action-button:hover {
  1635. \t\t\tbackground: #ffa200;
  1636. \t\t\tcolor: white;
  1637. \t\t\ttransform: translateY(-2px);
  1638. \t\t\tbox-shadow: 0 5px 15px rgba(255, 162, 0, 0.3);
  1639. \t\t}
  1640. \t\t.positive-feedback {
  1641. \t\t\tcolor: #28a745;
  1642. \t\t\tfont-weight: bold;
  1643. \t\t}
  1644. \t\t.items-sold {
  1645. \t\t\tcolor: #666;
  1646. \t\t\tfont-size: 0.9rem;
  1647. \t\t}
  1648. \t\t.followers-count {
  1649. \t\t\tcolor: #666;
  1650. \t\t\tfont-size: 0.9rem;
  1651. \t\t}
  1652. \t\t.shop-avatar {
  1653. \t\t\twidth: 120px;
  1654. \t\t\theight: 120px;
  1655. \t\t\tborder-radius: 50%;
  1656. \t\t\tborder: 4px solid white;
  1657. \t\t\tobject-fit: cover;
  1658. \t\t\tmargin-bottom: 20px;
  1659. \t\t}
  1660. \t\t.shop-stats {
  1661. \t\t\tbackground: white;
  1662. \t\t\tborder-radius: 10px;
  1663. \t\t\tpadding: 30px;
  1664. \t\t\tbox-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
  1665. \t\t\tmargin-top: -50px;
  1666. \t\t\tposition: relative;
  1667. \t\t\tz-index: 10;
  1668. \t\t}
  1669. \t\t.stat-item {
  1670. \t\t\ttext-align: center;
  1671. \t\t\tpadding: 20px;
  1672. \t\t}
  1673. \t\t.stat-number {
  1674. \t\t\tfont-size: 2.5rem;
  1675. \t\t\tfont-weight: bold;
  1676. \t\t\tcolor: #ffa200;
  1677. \t\t\tdisplay: block;
  1678. \t\t}
  1679. \t\t.stat-label {
  1680. \t\t\tcolor: #666;
  1681. \t\t\tfont-size: 0.9rem;
  1682. \t\t\ttext-transform: uppercase;
  1683. \t\t\tletter-spacing: 1px;
  1684. \t\t}
  1685. \t\t.shop-description {
  1686. \t\t\tbackground: #f8f9fa;
  1687. \t\t\tpadding: 30px;
  1688. \t\t\tborder-radius: 10px;
  1689. \t\t\tmargin-bottom: 40px;
  1690. \t\t}
  1691. \t\t.shop-contact {
  1692. \t\t\tbackground: white;
  1693. \t\t\tborder: 1px solid #e9ecef;
  1694. \t\t\tborder-radius: 10px;
  1695. \t\t\tpadding: 25px;
  1696. \t\t\tmargin-bottom: 40px;
  1697. \t\t}
  1698. \t\t.contact-item {
  1699. \t\t\tdisplay: flex;
  1700. \t\t\talign-items: center;
  1701. \t\t\tmargin-bottom: 15px;
  1702. \t\t}
  1703. \t\t.contact-item i {
  1704. \t\t\tcolor: #ffa200;
  1705. \t\t\tmargin-right: 15px;
  1706. \t\t\twidth: 20px;
  1707. \t\t}
  1708. \t\t.product-card {
  1709. \t\t\tbackground: white;
  1710. \t\t\tborder-radius: 10px;
  1711. \t\t\toverflow: hidden;
  1712. \t\t\tbox-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
  1713. \t\t\ttransition: transform 0.3s ease, box-shadow 0.3s ease;
  1714. \t\t\tmargin-bottom: 30px;
  1715. \t\t}
  1716. \t\t.product-card:hover {
  1717. \t\t\ttransform: translateY(-5px);
  1718. \t\t\tbox-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
  1719. \t\t}
  1720. \t\t.product-image {
  1721. \t\t\theight: 200px;
  1722. \t\t\tbackground-size: cover;
  1723. \t\t\tbackground-position: center;
  1724. \t\t\tposition: relative;
  1725. \t\t}
  1726. \t\t.product-info {
  1727. \t\t\tpadding: 20px;
  1728. \t\t}
  1729. \t\t.product-title {
  1730. \t\t\tfont-size: 1.1rem;
  1731. \t\t\tfont-weight: 600;
  1732. \t\t\tmargin-bottom: 10px;
  1733. \t\t\tcolor: #333;
  1734. \t\t}
  1735. \t\t.product-price {
  1736. \t\t\tfont-size: 1.3rem;
  1737. \t\t\tfont-weight: bold;
  1738. \t\t\tcolor: #ffa200;
  1739. \t\t\tmargin-bottom: 15px;
  1740. \t\t}
  1741. \t\t.product-meta {
  1742. \t\t\tdisplay: flex;
  1743. \t\t\tjustify-content: space-between;
  1744. \t\t\talign-items: center;
  1745. \t\t\tfont-size: 0.9rem;
  1746. \t\t\tcolor: #666;
  1747. \t\t}
  1748. \t\t.rating {
  1749. \t\t\tcolor: #ffa200;
  1750. \t\t}
  1751. \t\t/* Boutons d'action uniformes */
  1752. \t\t.btn-shop,
  1753. \t\t.shop-action-btn {
  1754. \t\t\tbackground: #ffa200;
  1755. \t\t\tborder: 1px solid #ffa200;
  1756. \t\t\tcolor: white;
  1757. \t\t\tpadding: 12px 24px;
  1758. \t\t\tborder-radius: 6px;
  1759. \t\t\tfont-weight: 500;
  1760. \t\t\tfont-size: 0.9rem;
  1761. \t\t\ttransition: all 0.3s ease;
  1762. \t\t\ttext-decoration: none;
  1763. \t\t\tdisplay: inline-flex;
  1764. \t\t\talign-items: center;
  1765. \t\t\tjustify-content: center;
  1766. \t\t\tgap: 8px;
  1767. \t\t\tmin-width: 120px;
  1768. \t\t\theight: 44px;
  1769. \t\t\twhite-space: nowrap;
  1770. \t\t}
  1771. \t\t.btn-shop:hover,
  1772. \t\t.shop-action-btn:hover {
  1773. \t\t\tbackground: #e8910a;
  1774. \t\t\tborder-color: #e8910a;
  1775. \t\t\tcolor: white;
  1776. \t\t\ttransform: translateY(-1px);
  1777. \t\t\tbox-shadow: 0 4px 12px rgba(255, 162, 0, 0.3);
  1778. \t\t}
  1779. \t\t/* Boutons secondaires */
  1780. \t\t.shop-action-btn.secondary {
  1781. \t\t\tbackground: transparent;
  1782. \t\t\tborder: 1px solid #6c757d;
  1783. \t\t\tcolor: #6c757d;
  1784. \t\t}
  1785. \t\t.shop-action-btn.secondary:hover {
  1786. \t\t\tbackground: #6c757d;
  1787. \t\t\tborder-color: #6c757d;
  1788. \t\t\tcolor: white;
  1789. \t\t\ttransform: translateY(-1px);
  1790. \t\t\tbox-shadow: 0 4px 12px rgba(108, 117, 125, 0.3);
  1791. \t\t}
  1792. \t\t/* Responsive */
  1793. \t\t@media(max-width: 768px) {
  1794. \t\t\t.shop-header {
  1795. \t\t\t\tpadding: 100px 0 40px;
  1796. \t\t\t}
  1797. \t\t\t.shop-avatar {
  1798. \t\t\t\twidth: 80px;
  1799. \t\t\t\theight: 80px;
  1800. \t\t\t}
  1801. \t\t\t.shop-stats {
  1802. \t\t\t\tmargin-top: -30px;
  1803. \t\t\t\tpadding: 20px;
  1804. \t\t\t}
  1805. \t\t\t.stat-number {
  1806. \t\t\t\tfont-size: 2rem;
  1807. \t\t\t}
  1808. \t\t}
  1809. \t\t/* Très petits écrans */
  1810. \t\t@media(max-width: 480px) {
  1811. \t\t\t.btn-shop,
  1812. \t\t\t.shop-action-btn {
  1813. \t\t\t\tmin-width: 90px;
  1814. \t\t\t\theight: 38px;
  1815. \t\t\t\tfont-size: 0.8rem;
  1816. \t\t\t\tpadding: 8px 16px;
  1817. \t\t\t}
  1818. \t\t\t.shop-actions-row {
  1819. \t\t\t\tgap: 8px;
  1820. \t\t\t}
  1821. \t\t}
  1822. \t\t/* Styles pour la section des avis */
  1823. \t\t.review-stats-card {
  1824. \t\t\tbackground: white;
  1825. \t\t\tborder-radius: 10px;
  1826. \t\t\tpadding: 20px;
  1827. \t\t\tbox-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  1828. \t\t\tmargin-bottom: 20px;
  1829. \t\t}
  1830. \t\t.stats-header {
  1831. \t\t\tdisplay: flex;
  1832. \t\t\talign-items: center;
  1833. \t\t\tmargin-bottom: 20px;
  1834. \t\t}
  1835. \t\t.overall-rating {
  1836. \t\t\ttext-align: center;
  1837. \t\t\tmargin-right: 20px;
  1838. \t\t}
  1839. \t\t.rating-number {
  1840. \t\t\tfont-size: 36px;
  1841. \t\t\tfont-weight: bold;
  1842. \t\t\tcolor: #333;
  1843. \t\t\tdisplay: block;
  1844. \t\t}
  1845. \t\t.stars {
  1846. \t\t\tcolor: #ffc107;
  1847. \t\t\tfont-size: 18px;
  1848. \t\t\tmargin-top: 5px;
  1849. \t\t}
  1850. \t\t.rating-summary p {
  1851. \t\t\tmargin: 0;
  1852. \t\t\tcolor: #666;
  1853. \t\t}
  1854. \t\t.rating-breakdown {
  1855. \t\t\tmargin-top: 15px;
  1856. \t\t}
  1857. \t\t.rating-bar {
  1858. \t\t\tdisplay: flex;
  1859. \t\t\talign-items: center;
  1860. \t\t\tmargin-bottom: 8px;
  1861. \t\t}
  1862. \t\t.rating-label {
  1863. \t\t\twidth: 40px;
  1864. \t\t\tfont-size: 14px;
  1865. \t\t\tcolor: #666;
  1866. \t\t}
  1867. \t\t.rating-progress {
  1868. \t\t\tflex: 1;
  1869. \t\t\theight: 6px;
  1870. \t\t\tbackground: #e9ecef;
  1871. \t\t\tborder-radius: 3px;
  1872. \t\t\tmargin: 0 10px;
  1873. \t\t\toverflow: hidden;
  1874. \t\t}
  1875. \t\t.rating-fill {
  1876. \t\t\theight: 100%;
  1877. \t\t\tbackground: linear-gradient(45deg, #ffc107, #ff8c00);
  1878. \t\t\ttransition: width 0.3s ease;
  1879. \t\t}
  1880. \t\t.rating-count {
  1881. \t\t\twidth: 30px;
  1882. \t\t\ttext-align: right;
  1883. \t\t\tfont-size: 14px;
  1884. \t\t\tcolor: #666;
  1885. \t\t}
  1886. \t\t.reviews-preview {
  1887. \t\t\tbackground: white;
  1888. \t\t\tborder-radius: 10px;
  1889. \t\t\tpadding: 20px;
  1890. \t\t\tbox-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  1891. \t\t}
  1892. \t\t.review-card-preview {
  1893. \t\t\tborder-bottom: 1px solid #f0f0f0;
  1894. \t\t\tpadding-bottom: 15px;
  1895. \t\t\tmargin-bottom: 15px;
  1896. \t\t}
  1897. \t\t.review-card-preview:last-child {
  1898. \t\t\tborder-bottom: none;
  1899. \t\t\tmargin-bottom: 0;
  1900. \t\t}
  1901. \t\t.review-header {
  1902. \t\t\tdisplay: flex;
  1903. \t\t\tjustify-content: space-between;
  1904. \t\t\talign-items: center;
  1905. \t\t\tmargin-bottom: 10px;
  1906. \t\t}
  1907. \t\t.review-user {
  1908. \t\t\tdisplay: flex;
  1909. \t\t\talign-items: center;
  1910. \t\t}
  1911. \t\t.user-avatar {
  1912. \t\t\twidth: 35px;
  1913. \t\t\theight: 35px;
  1914. \t\t\tborder-radius: 50%;
  1915. \t\t\tbackground: linear-gradient(45deg, #667eea, #764ba2);
  1916. \t\t\tdisplay: flex;
  1917. \t\t\talign-items: center;
  1918. \t\t\tjustify-content: center;
  1919. \t\t\tcolor: white;
  1920. \t\t\tfont-weight: bold;
  1921. \t\t\tmargin-right: 10px;
  1922. \t\t}
  1923. \t\t.user-info h6 {
  1924. \t\t\tmargin: 0;
  1925. \t\t\tfont-size: 14px;
  1926. \t\t\tfont-weight: 600;
  1927. \t\t\tcolor: #333;
  1928. \t\t}
  1929. \t\t.user-info small {
  1930. \t\t\tcolor: #666;
  1931. \t\t\tfont-size: 12px;
  1932. \t\t}
  1933. \t\t.review-rating {
  1934. \t\t\tdisplay: flex;
  1935. \t\t\talign-items: center;
  1936. \t\t\tgap: 5px;
  1937. \t\t}
  1938. \t\t.verified-badge {
  1939. \t\t\tbackground: #28a745;
  1940. \t\t\tcolor: white;
  1941. \t\t\tpadding: 2px 4px;
  1942. \t\t\tborder-radius: 3px;
  1943. \t\t\tfont-size: 10px;
  1944. \t\t\tfont-weight: bold;
  1945. \t\t}
  1946. \t\t.review-content {
  1947. \t\t\tcolor: #666;
  1948. \t\t\tfont-size: 14px;
  1949. \t\t\tline-height: 1.5;
  1950. \t\t}
  1951. \t\t.empty-reviews {
  1952. \t\t\ttext-align: center;
  1953. \t\t\tpadding: 40px 20px;
  1954. \t\t\tcolor: #666;
  1955. \t\t}
  1956. \t\t.empty-reviews i {
  1957. \t\t\tfont-size: 48px;
  1958. \t\t\tcolor: #ddd;
  1959. \t\t\tmargin-bottom: 15px;
  1960. \t\t}
  1961. \t\t.empty-reviews h4 {
  1962. \t\t\tcolor: #333;
  1963. \t\t\tmargin-bottom: 10px;
  1964. \t\t}
  1965. \t\t.section-title h2 {
  1966. \t\t\tcolor: #333;
  1967. \t\t\tmargin-bottom: 10px;
  1968. \t\t}
  1969. \t\t.section-title p {
  1970. \t\t\tcolor: #666;
  1971. \t\t\tmargin-bottom: 30px;
  1972. \t\t}
  1973. \t\t@media(max-width: 768px) {
  1974. \t\t\t.stats-header {
  1975. \t\t\t\tflex-direction: column;
  1976. \t\t\t\ttext-align: center;
  1977. \t\t\t}
  1978. \t\t\t.overall-rating {
  1979. \t\t\t\tmargin-right: 0;
  1980. \t\t\t\tmargin-bottom: 15px;
  1981. \t\t\t}
  1982. \t\t\t.review-header {
  1983. \t\t\t\tflex-direction: column;
  1984. \t\t\t\talign-items: flex-start;
  1985. \t\t\t}
  1986. \t\t\t.review-rating {
  1987. \t\t\t\tmargin-top: 5px;
  1988. \t\t\t}
  1989. \t\t}
  1990. \t</style>
  1991. ";
  1992.         
  1993.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1994.         
  1995.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1996.         yield from [];
  1997.     }
  1998.     // line 2166
  1999.     /**
  2000.      * @return iterable<null|scalar|\Stringable>
  2001.      */
  2002.     public function block_body(array $context, array $blocks = []): iterable
  2003.     {
  2004.         $macros $this->macros;
  2005.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  2006.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""body"));
  2007.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  2008.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""body"));
  2009.         // line 2167
  2010.         yield "
  2011. \t<!-- Shop Header eBay-style avec Karma - Pleine largeur -->
  2012. \t<section
  2013. \t\tclass=\"shop-header\">
  2014. \t\t<!-- Carrousel eBay-style -->
  2015. \t\t<div class=\"shop-carousel-ebay\">
  2016. \t\t\t<div class=\"carousel-container\">
  2017. \t\t\t\t";
  2018.         // line 2174
  2019.         $context["allBannerImages"] = CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "getAllBannerImages", [], "method"falsefalsefalse2174);
  2020.         // line 2175
  2021.         yield "\t\t\t\t";
  2022.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["allBannerImages"] ?? null)) > 0)) {
  2023.             // line 2176
  2024.             yield "\t\t\t\t\t";
  2025.             $context['_parent'] = $context;
  2026.             $context['_seq'] = CoreExtension::ensureTraversable(($context["allBannerImages"] ?? null));
  2027.             $context['loop'] = [
  2028.               'parent' => $context['_parent'],
  2029.               'index0' => 0,
  2030.               'index'  => 1,
  2031.               'first'  => true,
  2032.             ];
  2033.             if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  2034.                 $length count($context['_seq']);
  2035.                 $context['loop']['revindex0'] = $length 1;
  2036.                 $context['loop']['revindex'] = $length;
  2037.                 $context['loop']['length'] = $length;
  2038.                 $context['loop']['last'] = === $length;
  2039.             }
  2040.             foreach ($context['_seq'] as $context["_key"] => $context["image"]) {
  2041.                 // line 2177
  2042.                 yield "\t\t\t\t\t\t<div class=\"carousel-slide ";
  2043.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["loop"], "first", [], "any"falsefalsefalse2177)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2044.                     yield "active";
  2045.                 }
  2046.                 yield "\" style=\"background-image: url('";
  2047.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl($context["image"]), "html"nulltrue);
  2048.                 yield "')\">
  2049. \t\t\t\t\t\t\t<div class=\"shop-banner-overlay\"></div>
  2050. \t\t\t\t\t\t</div>
  2051. \t\t\t\t\t";
  2052.                 ++$context['loop']['index0'];
  2053.                 ++$context['loop']['index'];
  2054.                 $context['loop']['first'] = false;
  2055.                 if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  2056.                     --$context['loop']['revindex0'];
  2057.                     --$context['loop']['revindex'];
  2058.                     $context['loop']['last'] = === $context['loop']['revindex0'];
  2059.                 }
  2060.             }
  2061.             $_parent $context['_parent'];
  2062.             unset($context['_seq'], $context['_key'], $context['image'], $context['_parent'], $context['loop']);
  2063.             $context array_intersect_key($context$_parent) + $_parent;
  2064.             // line 2181
  2065.             yield "\t\t\t\t";
  2066.         } else {
  2067.             // line 2182
  2068.             yield "\t\t\t\t\t<!-- Slide par défaut avec dégradé si aucune image de bannière -->
  2069. \t\t\t\t\t<div class=\"carousel-slide active\" style=\"background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);\">
  2070. \t\t\t\t\t\t<div class=\"shop-banner-overlay\"></div>
  2071. \t\t\t\t\t</div>
  2072. \t\t\t\t";
  2073.         }
  2074.         // line 2187
  2075.         yield "\t\t\t</div>
  2076. \t\t\t<!-- Contrôles eBay-style améliorés - toujours affichés si plusieurs images -->
  2077. \t\t\t";
  2078.         // line 2190
  2079.         $context["totalBannerImages"] = Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["allBannerImages"] ?? null));
  2080.         // line 2191
  2081.         yield "\t\t\t";
  2082.         if ((($context["totalBannerImages"] ?? null) > 1)) {
  2083.             // line 2192
  2084.             yield "\t\t\t\t<div class=\"carousel-controls-ebay\">
  2085. \t\t\t\t\t<button class=\"carousel-btn-ebay prev-btn\" onclick=\"previousSlide()\" id=\"prevBtn\" title=\"Image précédente\" aria-label=\"Image précédente\">
  2086. \t\t\t\t\t\t<i class=\"lnr lnr-chevron-left\"></i>
  2087. \t\t\t\t\t</button>
  2088. \t\t\t\t\t<button class=\"carousel-btn-ebay pause-btn\" onclick=\"toggleCarousel()\" id=\"pauseBtn\" title=\"Pause/Reprendre\" aria-label=\"Pause/Reprendre\">
  2089. \t\t\t\t\t\t<span id=\"pauseIcon\" class=\"pause-icon-content\">⏸</span>
  2090. \t\t\t\t\t</button>
  2091. \t\t\t\t\t<button class=\"carousel-btn-ebay next-btn\" onclick=\"nextSlide()\" id=\"nextBtn\" title=\"Image suivante\" aria-label=\"Image suivante\">
  2092. \t\t\t\t\t\t<i class=\"lnr lnr-chevron-right\"></i>
  2093. \t\t\t\t\t</button>
  2094. \t\t\t\t</div>
  2095. \t\t\t\t<!-- Indicateurs eBay-style améliorés -->
  2096. \t\t\t\t<div class=\"carousel-indicators-ebay\">
  2097. \t\t\t\t\t";
  2098.             // line 2206
  2099.             $context['_parent'] = $context;
  2100.             $context['_seq'] = CoreExtension::ensureTraversable(($context["allBannerImages"] ?? null));
  2101.             $context['loop'] = [
  2102.               'parent' => $context['_parent'],
  2103.               'index0' => 0,
  2104.               'index'  => 1,
  2105.               'first'  => true,
  2106.             ];
  2107.             if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  2108.                 $length count($context['_seq']);
  2109.                 $context['loop']['revindex0'] = $length 1;
  2110.                 $context['loop']['revindex'] = $length;
  2111.                 $context['loop']['length'] = $length;
  2112.                 $context['loop']['last'] = === $length;
  2113.             }
  2114.             foreach ($context['_seq'] as $context["_key"] => $context["image"]) {
  2115.                 // line 2207
  2116.                 yield "\t\t\t\t\t\t<button class=\"carousel-indicator-ebay ";
  2117.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["loop"], "first", [], "any"falsefalsefalse2207)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2118.                     yield "active";
  2119.                 }
  2120.                 yield "\" onclick=\"goToSlide(";
  2121.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index0", [], "any"falsefalsefalse2207), "html"nulltrue);
  2122.                 yield ")\" title=\"Image ";
  2123.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse2207), "html"nulltrue);
  2124.                 yield "\" aria-label=\"Aller à l'image ";
  2125.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse2207), "html"nulltrue);
  2126.                 yield "\"></button>
  2127. \t\t\t\t\t";
  2128.                 ++$context['loop']['index0'];
  2129.                 ++$context['loop']['index'];
  2130.                 $context['loop']['first'] = false;
  2131.                 if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  2132.                     --$context['loop']['revindex0'];
  2133.                     --$context['loop']['revindex'];
  2134.                     $context['loop']['last'] = === $context['loop']['revindex0'];
  2135.                 }
  2136.             }
  2137.             $_parent $context['_parent'];
  2138.             unset($context['_seq'], $context['_key'], $context['image'], $context['_parent'], $context['loop']);
  2139.             $context array_intersect_key($context$_parent) + $_parent;
  2140.             // line 2209
  2141.             yield "\t\t\t\t</div>
  2142. \t\t\t";
  2143.         }
  2144.         // line 2211
  2145.         yield "\t\t</div>
  2146. \t\t<!-- Contenu de la boutique eBay-style -->
  2147. \t\t<div class=\"shop-header-content\">
  2148. \t\t\t<div class=\"row g-3 g-md-4 align-items-start align-items-md-center\">
  2149. \t\t\t\t<!-- Logo de la boutique -->
  2150. \t\t\t\t<div class=\"col-12 col-md-auto text-center text-md-start\">
  2151. \t\t\t\t\t<div class=\"shop-avatar-container-ebay\">
  2152. \t\t\t\t\t\t";
  2153.         // line 2219
  2154.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "logo", [], "any"falsefalsefalse2219)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2155.             // line 2220
  2156.             yield "\t\t\t\t\t\t\t<img src=\"";
  2157.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "logo", [], "any"falsefalsefalse2220)), "html"nulltrue);
  2158.             yield "\" alt=\"";
  2159.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "name", [], "any"falsefalsefalse2220), "html"nulltrue);
  2160.             yield "\" class=\"shop-avatar-ebay\">
  2161. \t\t\t\t\t\t";
  2162.         } else {
  2163.             // line 2222
  2164.             yield "\t\t\t\t\t\t\t<div class=\"shop-avatar-ebay shop-avatar-placeholder\">
  2165. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\"></i>
  2166. \t\t\t\t\t\t\t</div>
  2167. \t\t\t\t\t\t";
  2168.         }
  2169.         // line 2226
  2170.         yield "\t\t\t\t\t\t";
  2171.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "isVerified", [], "any"falsefalsefalse2226)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2172.             // line 2227
  2173.             yield "\t\t\t\t\t\t\t<div class=\"verified-badge-ebay\">
  2174. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
  2175. \t\t\t\t\t\t\t</div>
  2176. \t\t\t\t\t\t";
  2177.         }
  2178.         // line 2231
  2179.         yield "\t\t\t\t\t</div>
  2180. \t\t\t\t</div>
  2181. \t\t\t\t<!-- Informations principales -->
  2182. \t\t\t\t<div class=\"col-12 col-md\">
  2183. \t\t\t\t\t<div class=\"shop-info-ebay\">
  2184. \t\t\t\t\t\t<!-- Nom de la boutique -->
  2185. \t\t\t\t\t\t<div class=\"shop-name-section mb-2\">
  2186. \t\t\t\t\t\t\t<h1 class=\"shop-name-ebay mb-1\">";
  2187.         // line 2239
  2188.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "name", [], "any"falsefalsefalse2239), "html"nulltrue);
  2189.         yield "</h1>
  2190. \t\t\t\t\t\t\t<div class=\"d-flex flex-wrap align-items-center gap-2\">
  2191. \t\t\t\t\t\t\t";
  2192.         // line 2241
  2193.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "isVerified", [], "any"falsefalsefalse2241)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2194.             // line 2242
  2195.             yield "\t\t\t\t\t\t\t\t<span class=\"verified-text\">
  2196. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle me-1\"></i>Vendeur vérifié
  2197. \t\t\t\t\t\t\t\t</span>
  2198. \t\t\t\t\t\t\t";
  2199.         }
  2200.         // line 2246
  2201.         yield "\t\t\t\t\t\t";
  2202.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "shopCategory", [], "any"falsefalsefalse2246)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2203.             // line 2247
  2204.             yield "\t\t\t\t\t\t\t\t<span class=\"shop-category-ebay\">";
  2205.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "shopCategory", [], "any"falsefalsefalse2247), "name", [], "any"falsefalsefalse2247), "html"nulltrue);
  2206.             yield "</span>
  2207. \t\t\t\t\t\t";
  2208.         }
  2209.         // line 2249
  2210.         yield "\t\t\t\t\t\t\t</div>
  2211. \t\t\t\t\t\t</div>
  2212. \t\t\t\t\t\t<!-- Statistiques principales -->
  2213. \t\t\t\t\t\t<div class=\"shop-stats-ebay\">
  2214. \t\t\t\t\t\t\t<div class=\"stat-row mb-2\">
  2215. \t\t\t\t\t\t\t\t";
  2216.         // line 2255
  2217.         if ((CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "averageRating", [], "any"falsefalsefalse2255) > 0)) {
  2218.             // line 2256
  2219.             yield "\t\t\t\t\t\t\t\t\t<div class=\"stat-item-ebay\">
  2220. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-percentage\">";
  2221.             // line 2257
  2222.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "averageRating", [], "any"falsefalsefalse2257), 1), "html"nulltrue);
  2223.             yield "%</span>
  2224. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-label-ebay\">Évaluations positives</span>
  2225. \t\t\t\t\t\t\t\t\t</div>
  2226. \t\t\t\t\t\t\t\t";
  2227.         }
  2228.         // line 2261
  2229.         yield "
  2230. \t\t\t\t\t\t\t\t";
  2231.         // line 2262
  2232.         if ((CoreExtension::getAttribute($this->env$this->source, ($context["stats"] ?? null), "totalProductSales", [], "any"falsefalsefalse2262) > 0)) {
  2233.             // line 2263
  2234.             yield "\t\t\t\t\t\t\t\t\t<div class=\"stat-item-ebay\">
  2235. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-number-ebay\">";
  2236.             // line 2264
  2237.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source, ($context["stats"] ?? null), "totalProductSales", [], "any"falsefalsefalse2264)), "html"nulltrue);
  2238.             yield "</span>
  2239. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-label-ebay\">Articles vendus</span>
  2240. \t\t\t\t\t\t\t\t\t</div>
  2241. \t\t\t\t\t\t\t\t";
  2242.         }
  2243.         // line 2268
  2244.         yield "
  2245. \t\t\t\t\t\t\t\t";
  2246.         // line 2269
  2247.         if ((CoreExtension::getAttribute($this->env$this->source, ($context["followStats"] ?? null), "active_follows", [], "any"falsefalsefalse2269) > 0)) {
  2248.             // line 2270
  2249.             yield "\t\t\t\t\t\t\t\t\t<div class=\"stat-item-ebay\">
  2250. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-number-ebay\">";
  2251.             // line 2271
  2252.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source, ($context["followStats"] ?? null), "active_follows", [], "any"falsefalsefalse2271)), "html"nulltrue);
  2253.             yield "</span>
  2254. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-label-ebay\">Suiveurs</span>
  2255. \t\t\t\t\t\t\t\t\t</div>
  2256. \t\t\t\t\t\t\t\t";
  2257.         }
  2258.         // line 2275
  2259.         yield "\t\t\t\t\t\t\t</div>
  2260. \t\t\t\t\t\t\t<!-- Informations supplémentaires -->
  2261. \t\t\t\t\t\t\t<div class=\"shop-additional-info\">
  2262. \t\t\t\t\t\t\t\t<div class=\"d-flex flex-wrap gap-3 gap-md-4\">
  2263. \t\t\t\t\t\t\t\t\t";
  2264.         // line 2280
  2265.         if ((CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "averageRating", [], "any"falsefalsefalse2280) > 0)) {
  2266.             // line 2281
  2267.             yield "\t\t\t\t\t\t\t\t\t\t<span class=\"member-since\">
  2268. \t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-thumbs-up me-1\"></i>
  2269. \t\t\t\t\t\t\t\t\t\t\t";
  2270.             // line 2283
  2271.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "averageRating", [], "any"falsefalsefalse2283), 1), "html"nulltrue);
  2272.             yield "% positive feedback
  2273. \t\t\t\t\t\t\t\t\t\t</span>
  2274. \t\t\t\t\t\t\t\t\t";
  2275.         }
  2276.         // line 2286
  2277.         yield "\t\t\t\t\t\t\t\t\t";
  2278.         if ((CoreExtension::getAttribute($this->env$this->source, ($context["stats"] ?? null), "totalProductSales", [], "any"falsefalsefalse2286) > 0)) {
  2279.             // line 2287
  2280.             yield "\t\t\t\t\t\t\t\t\t\t<span class=\"member-since\">
  2281. \t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-cart me-1\"></i>
  2282. \t\t\t\t\t\t\t\t\t\t\t";
  2283.             // line 2289
  2284.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source, ($context["stats"] ?? null), "totalProductSales", [], "any"falsefalsefalse2289)), "html"nulltrue);
  2285.             yield " produit";
  2286.             yield (((CoreExtension::getAttribute($this->env$this->source, ($context["stats"] ?? null), "totalProductSales", [], "any"falsefalsefalse2289) > 1)) ? ("s") : (""));
  2287.             yield " vendu";
  2288.             yield (((CoreExtension::getAttribute($this->env$this->source, ($context["stats"] ?? null), "totalProductSales", [], "any"falsefalsefalse2289) > 1)) ? ("s") : (""));
  2289.             yield "
  2290. \t\t\t\t\t\t\t\t\t\t</span>
  2291. \t\t\t\t\t\t\t\t\t";
  2292.         }
  2293.         // line 2292
  2294.         yield "\t\t\t\t\t\t\t\t\t<span class=\"member-since\">
  2295. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-history me-1\"></i>
  2296. \t\t\t\t\t\t\t\t\t\tCréé depuis ";
  2297.         // line 2294
  2298.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatDate(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "createdAt", [], "any"falsefalsefalse2294), "M Y"), "html"nulltrue);
  2299.         yield "
  2300. \t\t\t\t\t\t\t\t\t</span>
  2301. \t\t\t\t\t\t\t\t</div>
  2302. \t\t\t\t\t\t\t</div>
  2303. \t\t\t\t\t\t</div>
  2304. \t\t\t\t\t</div>
  2305. \t\t\t\t</div>
  2306. \t\t\t\t<!-- Actions eBay-style -->
  2307. \t\t\t\t<div class=\"col-12 col-md-auto\">
  2308. \t\t\t\t\t<div class=\"shop-actions-ebay\">
  2309. \t\t\t\t\t\t";
  2310.         // line 2305
  2311.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse2305)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2312.             // line 2306
  2313.             yield "\t\t\t\t\t\t\t<button id=\"follow-button\" class=\"btn btn-primary btn-ebay w-100 ";
  2314.             if ((($tmp = ($context["isFollowing"] ?? null)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2315.                 yield "following";
  2316.             }
  2317.             yield "\" data-shop-id=\"";
  2318.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "id", [], "any"falsefalsefalse2306), "html"nulltrue);
  2319.             yield "\" data-following=\"";
  2320.             yield (((($tmp = ($context["isFollowing"] ?? null)) && $tmp instanceof Markup ? (string) $tmp $tmp)) ? ("true") : ("false"));
  2321.             yield "\">
  2322. \t\t\t\t\t\t\t\t<span id=\"follow-text\">
  2323. \t\t\t\t\t\t\t\t\t";
  2324.             // line 2308
  2325.             if ((($tmp = ($context["isFollowing"] ?? null)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2326.                 // line 2309
  2327.                 yield "\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle me-1\"></i> Suivi
  2328. \t\t\t\t\t\t\t\t\t";
  2329.             } else {
  2330.                 // line 2311
  2331.                 yield "\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-plus me-1\"></i> Suivre
  2332. \t\t\t\t\t\t\t\t\t";
  2333.             }
  2334.             // line 2313
  2335.             yield "\t\t\t\t\t\t\t\t</span>
  2336. \t\t\t\t\t\t\t</button>
  2337. \t\t\t\t\t\t";
  2338.         } else {
  2339.             // line 2316
  2340.             yield "\t\t\t\t\t\t\t<a href=\"";
  2341.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_login");
  2342.             yield "\" class=\"btn btn-primary btn-ebay w-100\">
  2343. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-user me-1\"></i> Se connecter pour suivre
  2344. \t\t\t\t\t\t\t</a>
  2345. \t\t\t\t\t\t";
  2346.         }
  2347.         // line 2320
  2348.         yield "
  2349. \t\t\t\t\t\t<div class=\"d-flex gap-2 mt-2\">
  2350. \t\t\t\t\t\t\t<button class=\"btn btn-outline-secondary btn-ebay flex-fill\" onclick=\"shareShop()\" title=\"Partager\">
  2351. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-bubble\"></i>
  2352. \t\t\t\t\t\t\t\t<span class=\"d-none d-md-inline ms-1\">Partager</span>
  2353. \t\t\t\t\t\t</button>
  2354. \t\t\t\t\t\t\t<button class=\"btn btn-outline-danger btn-ebay flex-fill\" onclick=\"reportShop()\" title=\"Signaler\">
  2355. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-flag\"></i>
  2356. \t\t\t\t\t\t\t\t<span class=\"d-none d-md-inline ms-1\">Signaler</span>
  2357. \t\t\t\t\t\t</button>
  2358. \t\t\t\t\t\t</div>
  2359. \t\t\t\t\t\t";
  2360.         // line 2333
  2361.         if ((($tmp = ($context["canEdit"] ?? null)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2362.             // line 2334
  2363.             yield "\t\t\t\t\t\t\t<a href=\"";
  2364.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("seller_shop_edit", ["slug" => CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "slug", [], "any"falsefalsefalse2334)]), "html"nulltrue);
  2365.             yield "\" class=\"btn btn-outline-primary btn-ebay w-100 mt-2\">
  2366. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-pencil me-1\"></i> Modifier la boutique
  2367. \t\t\t\t\t\t\t</a>
  2368. \t\t\t\t\t\t";
  2369.         }
  2370.         // line 2338
  2371.         yield "\t\t\t\t\t</div>
  2372. \t\t\t\t</div>
  2373. \t\t\t</div>
  2374. \t\t</div>
  2375. \t</section>
  2376. \t<!-- Shop Tabs eBay-style avec Karma -->
  2377. \t<section class=\"container\">
  2378. \t\t<div class=\"shop-tabs\">
  2379. \t\t\t<ul class=\"nav nav-tabs shop-tabs-nav\" role=\"tablist\">
  2380. \t\t\t\t<li class=\"nav-item shop-tab\">
  2381. \t\t\t\t\t<a href=\"#shop-items\" class=\"nav-link shop-tab-link active\" data-tab=\"items\" role=\"tab\">
  2382. \t\t\t\t\t\tBoutique
  2383. \t\t\t\t\t</a>
  2384. \t\t\t\t</li>
  2385. \t\t\t\t<li class=\"nav-item shop-tab\">
  2386. \t\t\t\t\t<a href=\"#shop-sale\" class=\"nav-link shop-tab-link\" data-tab=\"sale\" role=\"tab\">
  2387. \t\t\t\t\t\tPromotions
  2388. \t\t\t\t\t</a>
  2389. \t\t\t\t</li>
  2390. \t\t\t\t<li class=\"nav-item shop-tab\">
  2391. \t\t\t\t\t<a href=\"#shop-about\" class=\"nav-link shop-tab-link\" data-tab=\"about\" role=\"tab\">
  2392. \t\t\t\t\t\tÀ propos
  2393. \t\t\t\t\t</a>
  2394. \t\t\t\t</li>
  2395. \t\t\t\t<li class=\"nav-item shop-tab\">
  2396. \t\t\t\t\t<a href=\"#shop-feedback\" class=\"nav-link shop-tab-link\" data-tab=\"feedback\" role=\"tab\">
  2397. \t\t\t\t\t\tAvis (";
  2398.         // line 2365
  2399.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "getVisibleReviewsCount", [], "method"falsefalsefalse2365), "html"nulltrue);
  2400.         yield ")
  2401. \t\t\t\t\t</a>
  2402. \t\t\t\t</li>
  2403. \t\t\t</ul>
  2404. \t\t\t<!-- Tab Content: Shop Items avec Karma -->
  2405. \t\t\t<div id=\"shop-items\" class=\"tab-content shop-tab-content active\">
  2406. \t\t\t\t<div class=\"row\">
  2407. \t\t\t\t\t<div class=\"col-lg-12\">
  2408. \t\t\t\t\t\t<div class=\"d-flex justify-content-between align-items-center mb-4\">
  2409. \t\t\t\t\t\t\t<h4 class=\"mb-0\">Produits de
  2410. \t\t\t\t\t\t\t\t";
  2411.         // line 2376
  2412.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "name", [], "any"falsefalsefalse2376), "html"nulltrue);
  2413.         yield "</h4>
  2414. \t\t\t\t\t\t\t<div class=\"d-flex align-items-center gap-3\">
  2415. \t\t\t\t\t\t\t\t<span style=\"font-size: 2rem; font-weight: 600; min-width: 100px; display: inline-block; text-align: center;\">
  2416. \t\t\t\t\t\t\t\t\t<span class=\"product-count\">";
  2417.         // line 2379
  2418.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["products"] ?? null))), "html"nulltrue);
  2419.         yield "</span>
  2420. \t\t\t\t\t\t\t\t\t<span style=\"font-size: 1rem; font-weight: 400;\">produits</span>
  2421. \t\t\t\t\t\t\t\t</span>
  2422. \t\t\t\t\t\t\t\t<select class=\"form-select\" id=\"product-sort\" style=\"width: auto;\" onchange=\"if(window.sortProducts) window.sortProducts(this.value);\">
  2423. \t\t\t\t\t\t\t\t\t<option value=\"\">Trier par</option>
  2424. \t\t\t\t\t\t\t\t\t<option value=\"price_asc\">Prix : Croissant</option>
  2425. \t\t\t\t\t\t\t\t\t<option value=\"price_desc\">Prix : Décroissant</option>
  2426. \t\t\t\t\t\t\t\t\t<option value=\"newest\">Plus récents</option>
  2427. \t\t\t\t\t\t\t\t\t<option value=\"popular\">Plus populaires</option>
  2428. \t\t\t\t\t\t\t\t\t<option value=\"name_asc\">Nom : A-Z</option>
  2429. \t\t\t\t\t\t\t\t\t<option value=\"name_desc\">Nom : Z-A</option>
  2430. \t\t\t\t\t\t\t\t</select>
  2431. \t\t\t\t\t\t\t</div>
  2432. \t\t\t\t\t\t</div>
  2433. \t\t\t\t\t\t";
  2434.         // line 2395
  2435.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["products"] ?? null)) > 0)) {
  2436.             // line 2396
  2437.             yield "\t\t\t\t\t\t\t<div class=\"row\" id=\"products-container\">
  2438. \t\t\t\t\t\t\t\t";
  2439.             // line 2397
  2440.             $context['_parent'] = $context;
  2441.             $context['_seq'] = CoreExtension::ensureTraversable(($context["products"] ?? null));
  2442.             foreach ($context['_seq'] as $context["_key"] => $context["product"]) {
  2443.                 // line 2398
  2444.                 yield "\t\t\t\t\t\t\t\t\t<div class=\"col-lg-3 col-md-4 col-sm-6 mb-4 product-item\" data-price=\"";
  2445.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "price", [], "any"falsefalsefalse2398), "html"nulltrue);
  2446.                 yield "\" data-name=\"";
  2447.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::lower($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2398)), "html"nulltrue);
  2448.                 yield "\" data-views=\"";
  2449.                 yield (((CoreExtension::getAttribute($this->env$this->source$context["product"], "viewCount", [], "any"truetruefalse2398) &&  !(null === CoreExtension::getAttribute($this->env$this->source$context["product"], "viewCount", [], "any"falsefalsefalse2398)))) ? ($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "viewCount", [], "any"falsefalsefalse2398), "html"nulltrue)) : (0));
  2450.                 yield "\" data-created=\"";
  2451.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatDate(CoreExtension::getAttribute($this->env$this->source$context["product"], "publishedAt", [], "any"falsefalsefalse2398), "Y-m-d"), "html"nulltrue);
  2452.                 yield "\">
  2453. \t\t\t\t\t\t\t\t\t\t<div class=\"product-card\">
  2454. \t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2455.                 // line 2400
  2456.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2400)]), "html"nulltrue);
  2457.                 yield "\">
  2458. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"product-image\" style=\"background-image: url('";
  2459.                 // line 2401
  2460.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse2401) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2401)) > 0))) {
  2461.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((($_v0 CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2401)) && is_array($_v0) || $_v0 instanceof ArrayAccess ? ($_v0[0] ?? null) : null)), "html"nulltrue);
  2462.                 } else {
  2463.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/img/product/p1.jpg"), "html"nulltrue);
  2464.                 }
  2465.                 yield "')\"></div>
  2466. \t\t\t\t\t\t\t\t\t\t\t</a>
  2467. \t\t\t\t\t\t\t\t\t\t\t<div class=\"product-info\">
  2468. \t\t\t\t\t\t\t\t\t\t\t\t<h6 class=\"product-title\">
  2469. \t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2470.                 // line 2405
  2471.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2405)]), "html"nulltrue);
  2472.                 yield "\" class=\"text-decoration-none\">
  2473. \t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2474.                 // line 2406
  2475.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2406), "html"nulltrue);
  2476.                 yield "
  2477. \t\t\t\t\t\t\t\t\t\t\t\t\t</a>
  2478. \t\t\t\t\t\t\t\t\t\t\t\t</h6>
  2479. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"product-price\">";
  2480.                 // line 2409
  2481.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source$context["product"], "price", [], "any"falsefalsefalse2409), 2"."" "), "html"nulltrue);
  2482.                 yield "
  2483. \t\t\t\t\t\t\t\t\t\t\t\t\tHTG</div>
  2484. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"product-meta\">
  2485. \t\t\t\t\t\t\t\t\t\t\t\t\t<span>
  2486. \t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2487.                 // line 2413
  2488.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["product"], "averageRating", [], "any"falsefalsefalse2413)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2489.                     // line 2414
  2490.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"rating\">
  2491. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2492.                     // line 2415
  2493.                     $context['_parent'] = $context;
  2494.                     $context['_seq'] = CoreExtension::ensureTraversable(range(15));
  2495.                     foreach ($context['_seq'] as $context["_key"] => $context["i"]) {
  2496.                         // line 2416
  2497.                         yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-star";
  2498.                         if (($context["i"] <= CoreExtension::getAttribute($this->env$this->source$context["product"], "averageRating", [], "any"falsefalsefalse2416))) {
  2499.                         } else {
  2500.                             yield "-o";
  2501.                         }
  2502.                         yield "\"></i>
  2503. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2504.                     }
  2505.                     $_parent $context['_parent'];
  2506.                     unset($context['_seq'], $context['_key'], $context['i'], $context['_parent']);
  2507.                     $context array_intersect_key($context$_parent) + $_parent;
  2508.                     // line 2418
  2509.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  2510. \t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2511.                 }
  2512.                 // line 2420
  2513.                 yield "\t\t\t\t\t\t\t\t\t\t\t\t\t</span>
  2514. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-muted\">";
  2515.                 // line 2421
  2516.                 yield (((CoreExtension::getAttribute($this->env$this->source$context["product"], "viewCount", [], "any"truetruefalse2421) &&  !(null === CoreExtension::getAttribute($this->env$this->source$context["product"], "viewCount", [], "any"falsefalsefalse2421)))) ? ($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "viewCount", [], "any"falsefalsefalse2421), "html"nulltrue)) : (0));
  2517.                 yield "
  2518. \t\t\t\t\t\t\t\t\t\t\t\t\t\tvues</span>
  2519. \t\t\t\t\t\t\t\t\t\t\t\t</div>
  2520. \t\t\t\t\t\t\t\t\t\t\t</div>
  2521. \t\t\t\t\t\t\t\t\t\t</div>
  2522. \t\t\t\t\t\t\t\t\t</div>
  2523. \t\t\t\t\t\t\t\t";
  2524.             }
  2525.             $_parent $context['_parent'];
  2526.             unset($context['_seq'], $context['_key'], $context['product'], $context['_parent']);
  2527.             $context array_intersect_key($context$_parent) + $_parent;
  2528.             // line 2428
  2529.             yield "\t\t\t\t\t\t\t</div>
  2530. \t\t\t\t\t\t";
  2531.         } else {
  2532.             // line 2430
  2533.             yield "\t\t\t\t\t\t\t<div class=\"text-center py-5\">
  2534. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-package\" style=\"font-size: 4rem; color: #ccc;\"></i>
  2535. \t\t\t\t\t\t\t\t<h4 class=\"mt-3\">Aucun produit disponible</h4>
  2536. \t\t\t\t\t\t\t\t<p class=\"text-muted\">Cette boutique n'a pas encore de produits en vente.</p>
  2537. \t\t\t\t\t\t\t</div>
  2538. \t\t\t\t\t\t";
  2539.         }
  2540.         // line 2436
  2541.         yield "\t\t\t\t\t</div>
  2542. \t\t\t\t</div>
  2543. \t\t\t</div>
  2544. \t\t\t<!-- Tab Content: Sale avec Karma -->
  2545. \t\t\t<div id=\"shop-sale\" class=\"tab-content shop-tab-content\">
  2546. \t\t\t\t<div class=\"text-center py-5\">
  2547. \t\t\t\t\t<i class=\"lnr lnr-tag\" style=\"font-size: 4rem; color: #ccc;\"></i>
  2548. \t\t\t\t\t<h4 class=\"mt-3\">Aucune promotion actuellement</h4>
  2549. \t\t\t\t\t<p class=\"text-muted\">Cette boutique n'a pas de promotions actives pour le moment.</p>
  2550. \t\t\t\t</div>
  2551. \t\t\t</div>
  2552. \t\t\t<!-- Tab Content: About avec Karma -->
  2553. \t\t\t<div id=\"shop-about\" class=\"tab-content shop-tab-content\">
  2554. \t\t\t\t<div class=\"row\">
  2555. \t\t\t\t\t<div class=\"col-lg-8\">
  2556. \t\t\t\t\t\t<div class=\"card\">
  2557. \t\t\t\t\t\t\t<div class=\"card-header\">
  2558. \t\t\t\t\t\t\t\t<h5 class=\"mb-0\">
  2559. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-user me-2\"></i>À propos de
  2560. \t\t\t\t\t\t\t\t\t";
  2561.         // line 2458
  2562.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "name", [], "any"falsefalsefalse2458), "html"nulltrue);
  2563.         yield "
  2564. \t\t\t\t\t\t\t\t</h5>
  2565. \t\t\t\t\t\t\t</div>
  2566. \t\t\t\t\t\t\t<div class=\"card-body\">
  2567. \t\t\t\t\t\t\t\t";
  2568.         // line 2462
  2569.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "description", [], "any"falsefalsefalse2462)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2570.             // line 2463
  2571.             yield "\t\t\t\t\t\t\t\t\t<div class=\"card-text shop-description-content\">";
  2572.             yield CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "description", [], "any"falsefalsefalse2463);
  2573.             yield "</div>
  2574. \t\t\t\t\t\t\t\t";
  2575.         } else {
  2576.             // line 2465
  2577.             yield "\t\t\t\t\t\t\t\t\t<p class=\"text-muted\">Aucune description disponible.</p>
  2578. \t\t\t\t\t\t\t\t";
  2579.         }
  2580.         // line 2467
  2581.         yield "
  2582. \t\t\t\t\t\t\t\t";
  2583.         // line 2468
  2584.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "businessHours", [], "any"falsefalsefalse2468)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2585.             // line 2469
  2586.             yield "\t\t\t\t\t\t\t\t\t<h6 class=\"mt-4\">
  2587. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-clock me-2\"></i>Heures d'ouverture
  2588. \t\t\t\t\t\t\t\t\t</h6>
  2589. \t\t\t\t\t\t\t\t\t<p>";
  2590.             // line 2472
  2591.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "businessHours", [], "any"falsefalsefalse2472), "html"nulltrue);
  2592.             yield "</p>
  2593. \t\t\t\t\t\t\t\t";
  2594.         }
  2595.         // line 2474
  2596.         yield "
  2597. \t\t\t\t\t\t\t\t";
  2598.         // line 2475
  2599.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "returnPolicy", [], "any"falsefalsefalse2475)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2600.             // line 2476
  2601.             yield "\t\t\t\t\t\t\t\t\t<h6 class=\"mt-4\">
  2602. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-undo me-2\"></i>Politique de retour
  2603. \t\t\t\t\t\t\t\t\t</h6>
  2604. \t\t\t\t\t\t\t\t\t<p>";
  2605.             // line 2479
  2606.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "returnPolicy", [], "any"falsefalsefalse2479), "html"nulltrue);
  2607.             yield "</p>
  2608. \t\t\t\t\t\t\t\t";
  2609.         }
  2610.         // line 2481
  2611.         yield "\t\t\t\t\t\t\t</div>
  2612. \t\t\t\t\t\t</div>
  2613. \t\t\t\t\t</div>
  2614. \t\t\t\t\t<div class=\"col-lg-4\">
  2615. \t\t\t\t\t\t<div class=\"card shop-info-card\">
  2616. \t\t\t\t\t\t\t<div class=\"card-header\">
  2617. \t\t\t\t\t\t\t\t<h6 class=\"mb-0\">
  2618. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-chart me-2\"></i>Statistiques de la boutique
  2619. \t\t\t\t\t\t\t\t</h6>
  2620. \t\t\t\t\t\t\t</div>
  2621. \t\t\t\t\t\t\t<div class=\"card-body\">
  2622. \t\t\t\t\t\t\t\t<div class=\"row text-center\">
  2623. \t\t\t\t\t\t\t\t\t<div class=\"col-6\">
  2624. \t\t\t\t\t\t\t\t\t\t<div class=\"shop-stat-item\">
  2625. \t\t\t\t\t\t\t\t\t\t\t<span class=\"stat-number h4 text-primary\">";
  2626.         // line 2495
  2627.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["stats"] ?? null), "activeProducts", [], "any"falsefalsefalse2495), "html"nulltrue);
  2628.         yield "</span>
  2629. \t\t\t\t\t\t\t\t\t\t\t<span class=\"stat-label d-block\">Produits actifs</span>
  2630. \t\t\t\t\t\t\t\t\t\t</div>
  2631. \t\t\t\t\t\t\t\t\t</div>
  2632. \t\t\t\t\t\t\t\t\t<div class=\"col-6\">
  2633. \t\t\t\t\t\t\t\t\t\t<div class=\"shop-stat-item\">
  2634. \t\t\t\t\t\t\t\t\t\t\t<span class=\"stat-number h4 text-info\">";
  2635.         // line 2501
  2636.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["stats"] ?? null), "shopViews", [], "any"falsefalsefalse2501), "html"nulltrue);
  2637.         yield "</span>
  2638. \t\t\t\t\t\t\t\t\t\t\t<span class=\"stat-label d-block\">Vues boutique</span>
  2639. \t\t\t\t\t\t\t\t\t\t</div>
  2640. \t\t\t\t\t\t\t\t\t</div>
  2641. \t\t\t\t\t\t\t\t</div>
  2642. \t\t\t\t\t\t\t</div>
  2643. \t\t\t\t\t\t</div>
  2644. \t\t\t\t\t</div>
  2645. \t\t\t\t</div>
  2646. \t\t\t</div>
  2647. \t\t\t<!-- Tab Content: Feedback avec Karma -->
  2648. \t\t\t<div id=\"shop-feedback\" class=\"tab-content shop-tab-content\">
  2649. \t\t\t\t<div class=\"row\">
  2650. \t\t\t\t\t<div
  2651. \t\t\t\t\t\tclass=\"col-lg-8\">
  2652. \t\t\t\t\t\t<!-- Statistiques des avis -->
  2653. \t\t\t\t\t\t<div class=\"review-stats mb-4\">
  2654. \t\t\t\t\t\t\t<div class=\"row\">
  2655. \t\t\t\t\t\t\t\t<div class=\"col-md-4\">
  2656. \t\t\t\t\t\t\t\t\t<div class=\"stat-card text-center\">
  2657. \t\t\t\t\t\t\t\t\t\t<h3 class=\"stat-number\">";
  2658.         // line 2522
  2659.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "getAverageRating", [], "method"falsefalsefalse2522), "html"nulltrue);
  2660.         yield "</h3>
  2661. \t\t\t\t\t\t\t\t\t\t<div class=\"rating-stars\">
  2662. \t\t\t\t\t\t\t\t\t\t\t";
  2663.         // line 2524
  2664.         $context['_parent'] = $context;
  2665.         $context['_seq'] = CoreExtension::ensureTraversable(range(15));
  2666.         foreach ($context['_seq'] as $context["_key"] => $context["i"]) {
  2667.             // line 2525
  2668.             yield "\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-star";
  2669.             if (($context["i"] <= CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "getAverageRating", [], "method"falsefalsefalse2525))) {
  2670.             } else {
  2671.                 yield "-empty";
  2672.             }
  2673.             yield "\"></i>
  2674. \t\t\t\t\t\t\t\t\t\t\t";
  2675.         }
  2676.         $_parent $context['_parent'];
  2677.         unset($context['_seq'], $context['_key'], $context['i'], $context['_parent']);
  2678.         $context array_intersect_key($context$_parent) + $_parent;
  2679.         // line 2527
  2680.         yield "\t\t\t\t\t\t\t\t\t\t</div>
  2681. \t\t\t\t\t\t\t\t\t\t<p class=\"stat-label\">Note moyenne</p>
  2682. \t\t\t\t\t\t\t\t\t</div>
  2683. \t\t\t\t\t\t\t\t</div>
  2684. \t\t\t\t\t\t\t\t<div class=\"col-md-4\">
  2685. \t\t\t\t\t\t\t\t\t<div class=\"stat-card text-center\">
  2686. \t\t\t\t\t\t\t\t\t\t<h3 class=\"stat-number\">";
  2687.         // line 2533
  2688.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "getVisibleReviewsCount", [], "method"falsefalsefalse2533), "html"nulltrue);
  2689.         yield "</h3>
  2690. \t\t\t\t\t\t\t\t\t\t<p class=\"stat-label\">Avis clients</p>
  2691. \t\t\t\t\t\t\t\t\t</div>
  2692. \t\t\t\t\t\t\t\t</div>
  2693. \t\t\t\t\t\t\t\t<div class=\"col-md-4\">
  2694. \t\t\t\t\t\t\t\t\t<div class=\"stat-card text-center\">
  2695. \t\t\t\t\t\t\t\t\t\t<h3 class=\"stat-number\">";
  2696.         // line 2539
  2697.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::round(((CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "getVisibleReviewsCount", [], "method"falsefalsefalse2539) / 100) * 100)), "html"nulltrue);
  2698.         yield "%</h3>
  2699. \t\t\t\t\t\t\t\t\t\t<p class=\"stat-label\">Satisfaction</p>
  2700. \t\t\t\t\t\t\t\t\t</div>
  2701. \t\t\t\t\t\t\t\t</div>
  2702. \t\t\t\t\t\t\t</div>
  2703. \t\t\t\t\t\t</div>
  2704. \t\t\t\t\t\t<!-- Liste des avis récents -->
  2705. \t\t\t\t\t\t<div class=\"reviews-preview\">
  2706. \t\t\t\t\t\t\t<h5 class=\"mb-3\">Avis récents</h5>
  2707. \t\t\t\t\t\t\t";
  2708.         // line 2549
  2709.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2549)) > 0)) {
  2710.             // line 2550
  2711.             yield "\t\t\t\t\t\t\t\t<div class=\"reviews-list\">
  2712. \t\t\t\t\t\t\t\t\t";
  2713.             // line 2551
  2714.             $context['_parent'] = $context;
  2715.             $context['_seq'] = CoreExtension::ensureTraversable(Twig\Extension\CoreExtension::slice($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2551), 05));
  2716.             foreach ($context['_seq'] as $context["_key"] => $context["review"]) {
  2717.                 // line 2552
  2718.                 yield "\t\t\t\t\t\t\t\t\t\t";
  2719.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["review"], "isVisible", [], "any"falsefalsefalse2552)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2720.                     // line 2553
  2721.                     yield "\t\t\t\t\t\t\t\t\t\t\t<div class=\"review-item\">
  2722. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"review-header\">
  2723. \t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"reviewer-info\">
  2724. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"reviewer-avatar\">
  2725. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-user\"></i>
  2726. \t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  2727. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"reviewer-details\">
  2728. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h6 class=\"reviewer-name\">";
  2729.                     // line 2560
  2730.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["review"], "user", [], "any"falsefalsefalse2560), "userIdentifier", [], "any"falsefalsefalse2560), "html"nulltrue);
  2731.                     yield "</h6>
  2732. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"review-rating\">
  2733. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2734.                     // line 2562
  2735.                     $context['_parent'] = $context;
  2736.                     $context['_seq'] = CoreExtension::ensureTraversable(range(15));
  2737.                     foreach ($context['_seq'] as $context["_key"] => $context["i"]) {
  2738.                         // line 2563
  2739.                         yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-star";
  2740.                         if (($context["i"] <= CoreExtension::getAttribute($this->env$this->source$context["review"], "rating", [], "any"falsefalsefalse2563))) {
  2741.                         } else {
  2742.                             yield "-empty";
  2743.                         }
  2744.                         yield "\"></i>
  2745. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2746.                     }
  2747.                     $_parent $context['_parent'];
  2748.                     unset($context['_seq'], $context['_key'], $context['i'], $context['_parent']);
  2749.                     $context array_intersect_key($context$_parent) + $_parent;
  2750.                     // line 2565
  2751.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  2752. \t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  2753. \t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  2754. \t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"review-meta\">
  2755. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"review-date\">";
  2756.                     // line 2569
  2757.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatDate(CoreExtension::getAttribute($this->env$this->source$context["review"], "createdAt", [], "any"falsefalsefalse2569), "d/m/Y"), "html"nulltrue);
  2758.                     yield "</span>
  2759. \t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2760.                     // line 2570
  2761.                     if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["review"], "isVerified", [], "any"falsefalsefalse2570)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2762.                         // line 2571
  2763.                         yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"verified-badge\">
  2764. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
  2765. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tVérifié
  2766. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>
  2767. \t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2768.                     }
  2769.                     // line 2576
  2770.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  2771. \t\t\t\t\t\t\t\t\t\t\t\t</div>
  2772. \t\t\t\t\t\t\t\t\t\t\t\t";
  2773.                     // line 2579
  2774.                     if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["review"], "comment", [], "any"falsefalsefalse2579)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2775.                         // line 2580
  2776.                         yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"review-comment\">
  2777. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>";
  2778.                         // line 2581
  2779.                         yield (((Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["review"], "comment", [], "any"falsefalsefalse2581)) > 150)) ? ($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((Twig\Extension\CoreExtension::slice($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["review"], "comment", [], "any"falsefalsefalse2581), 0150) . "..."), "html"nulltrue)) : ($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["review"], "comment", [], "any"falsefalsefalse2581), "html"nulltrue)));
  2780.                         yield "</p>
  2781. \t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  2782. \t\t\t\t\t\t\t\t\t\t\t\t";
  2783.                     }
  2784.                     // line 2584
  2785.                     yield "\t\t\t\t\t\t\t\t\t\t\t</div>
  2786. \t\t\t\t\t\t\t\t\t\t";
  2787.                 }
  2788.                 // line 2586
  2789.                 yield "\t\t\t\t\t\t\t\t\t";
  2790.             }
  2791.             $_parent $context['_parent'];
  2792.             unset($context['_seq'], $context['_key'], $context['review'], $context['_parent']);
  2793.             $context array_intersect_key($context$_parent) + $_parent;
  2794.             // line 2587
  2795.             yield "\t\t\t\t\t\t\t\t</div>
  2796. \t\t\t\t\t\t\t\t<div class=\"text-center mt-4\">
  2797. \t\t\t\t\t\t\t\t\t<a href=\"";
  2798.             // line 2590
  2799.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("shop_reviews_index", ["slug" => CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "slug", [], "any"falsefalsefalse2590)]), "html"nulltrue);
  2800.             yield "\" class=\"btn btn-primary\">
  2801. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-star me-1\"></i>Voir tous les avis
  2802. \t\t\t\t\t\t\t\t\t</a>
  2803. \t\t\t\t\t\t\t\t</div>
  2804. \t\t\t\t\t\t\t";
  2805.         } else {
  2806.             // line 2595
  2807.             yield "\t\t\t\t\t\t\t\t<div class=\"text-center py-4\">
  2808. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-star\" style=\"font-size: 3rem; color: #ccc;\"></i>
  2809. \t\t\t\t\t\t\t\t\t<h5 class=\"mt-3\">Aucun avis pour le moment</h5>
  2810. \t\t\t\t\t\t\t\t\t<p class=\"text-muted\">Cette boutique n'a pas encore reçu d'avis clients.</p>
  2811. \t\t\t\t\t\t\t\t</div>
  2812. \t\t\t\t\t\t\t";
  2813.         }
  2814.         // line 2601
  2815.         yield "\t\t\t\t\t\t</div>
  2816. \t\t\t\t\t</div>
  2817. \t\t\t\t\t<div
  2818. \t\t\t\t\t\tclass=\"col-lg-4\">
  2819. \t\t\t\t\t\t<!-- Lien vers la page complète des avis -->
  2820. \t\t\t\t\t\t<div class=\"review-actions-card\">
  2821. \t\t\t\t\t\t\t<h5>Évaluer cette boutique</h5>
  2822. \t\t\t\t\t\t\t<p class=\"text-muted\">Partagez votre expérience avec cette boutique.</p>
  2823. \t\t\t\t\t\t\t<a href=\"";
  2824.         // line 2610
  2825.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("shop_reviews_new", ["slug" => CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "slug", [], "any"falsefalsefalse2610)]), "html"nulltrue);
  2826.         yield "\" class=\"btn btn-primary w-100\">
  2827. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-star me-1\"></i>Laisser un avis
  2828. \t\t\t\t\t\t\t</a>
  2829. \t\t\t\t\t\t</div>
  2830. \t\t\t\t\t</div>
  2831. \t\t\t\t</div>
  2832. \t\t\t</div>
  2833. \t\t</div>
  2834. \t</section>
  2835. \t<!-- Modal de signalement -->
  2836. \t<div class=\"modal fade\" id=\"reportModal\" tabindex=\"-1\" aria-labelledby=\"reportModalLabel\" aria-hidden=\"true\">
  2837. \t\t<div class=\"modal-dialog\">
  2838. \t\t\t<div class=\"modal-content\">
  2839. \t\t\t\t<div class=\"modal-header\">
  2840. \t\t\t\t\t<h5 class=\"modal-title\" id=\"reportModalLabel\">
  2841. \t\t\t\t\t\t<i class=\"lnr lnr-flag me-2\"></i>&nbsp;Signaler cette boutique
  2842. \t\t\t\t\t</h5>
  2843. \t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>
  2844. \t\t\t\t</div>
  2845. \t\t\t\t<div class=\"modal-body\">
  2846. \t\t\t\t\t<form id=\"reportForm\">
  2847. \t\t\t\t\t\t<div class=\"mb-3\">
  2848. \t\t\t\t\t\t\t<label for=\"reportReason\" class=\"form-label\">Motif du signalement *</label>
  2849. \t\t\t\t\t\t\t<select class=\"form-select\" id=\"reportReason\" required>
  2850. \t\t\t\t\t\t\t\t<option value=\"\">Sélectionnez un motif</option>
  2851. \t\t\t\t\t\t\t\t<option value=\"fake_products\">Produits contrefaits</option>
  2852. \t\t\t\t\t\t\t\t<option value=\"inappropriate_content\">Contenu inapproprié</option>
  2853. \t\t\t\t\t\t\t\t<option value=\"spam\">Spam ou publicité abusive</option>
  2854. \t\t\t\t\t\t\t\t<option value=\"fraud\">Fraude ou escroquerie</option>
  2855. \t\t\t\t\t\t\t\t<option value=\"harassment\">Harcèlement</option>
  2856. \t\t\t\t\t\t\t\t<option value=\"other\">Autre</option>
  2857. \t\t\t\t\t\t\t</select>
  2858. \t\t\t\t\t\t</div>
  2859. \t\t\t\t\t\t<div class=\"mb-3\">
  2860. \t\t\t\t\t\t\t<label for=\"reportDescription\" class=\"form-label\">Description détaillée *</label>
  2861. \t\t\t\t\t\t\t<textarea class=\"form-control\" id=\"reportDescription\" rows=\"4\" placeholder=\"Décrivez le problème rencontré...\" required></textarea>
  2862. \t\t\t\t\t\t</div>
  2863. \t\t\t\t\t\t<div class=\"mb-3\">
  2864. \t\t\t\t\t\t\t<label for=\"reportEmail\" class=\"form-label\">Votre email (optionnel)</label>
  2865. \t\t\t\t\t\t\t<input type=\"email\" class=\"form-control\" id=\"reportEmail\" placeholder=\"votre@email.com\">
  2866. \t\t\t\t\t\t\t<div class=\"form-text\">Nous pourrons vous contacter pour plus d'informations</div>
  2867. \t\t\t\t\t\t</div>
  2868. \t\t\t\t\t</form>
  2869. \t\t\t\t</div>
  2870. \t\t\t\t<div class=\"modal-footer\">
  2871. \t\t\t\t\t<button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Annuler</button>
  2872. \t\t\t\t\t<button type=\"button\" class=\"btn btn-danger\" onclick=\"submitReport()\">
  2873. \t\t\t\t\t\t<i class=\"lnr lnr-flag  me-2\"></i>Envoyer le signalement
  2874. \t\t\t\t\t</button>
  2875. \t\t\t\t</div>
  2876. \t\t\t</div>
  2877. \t\t</div>
  2878. \t</div>
  2879. \t<!-- Section des avis -->
  2880. \t<div class=\"container my-5\">
  2881. \t\t<div class=\"row\">
  2882. \t\t\t<div class=\"col-12\">
  2883. \t\t\t\t<div class=\"section-title text-center\">
  2884. \t\t\t\t\t<h2>Avis clients</h2>
  2885. \t\t\t\t\t<p>Découvrez ce que pensent nos clients de cette boutique</p>
  2886. \t\t\t\t</div>
  2887. \t\t\t</div>
  2888. \t\t</div>
  2889. \t\t<div
  2890. \t\t\tclass=\"row\">
  2891. \t\t\t<!-- Statistiques des avis -->
  2892. \t\t\t<div class=\"col-md-4\">
  2893. \t\t\t\t<div class=\"review-stats-card\">
  2894. \t\t\t\t\t<div class=\"stats-header\">
  2895. \t\t\t\t\t\t<div class=\"overall-rating\">
  2896. \t\t\t\t\t\t\t<span class=\"rating-number\">";
  2897.         // line 2683
  2898.         yield (((Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2683)) > 0)) ? ($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber((Twig\Extension\CoreExtension::reduce($this->envTwig\Extension\CoreExtension::map($this->envCoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2683), function ($__r__) use ($context$macros) { $context["r"] = $__r__; return CoreExtension::getAttribute($this->env$this->source, ($context["r"] ?? null), "rating", [], "any"falsefalsefalse2683); }), function ($__a__$__b__) use ($context$macros) { $context["a"] = $__a__$context["b"] = $__b__; return (($context["a"] ?? null) + ($context["b"] ?? null)); }) / Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2683))), 1), "html"nulltrue)) : ("0.0"));
  2899.         yield "</span>
  2900. \t\t\t\t\t\t\t<div class=\"stars\">
  2901. \t\t\t\t\t\t\t\t";
  2902.         // line 2685
  2903.         $context["avgRating"] = (((Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2685)) > 0)) ? ((Twig\Extension\CoreExtension::reduce($this->envTwig\Extension\CoreExtension::map($this->envCoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2685), function ($__r__) use ($context$macros) { $context["r"] = $__r__; return CoreExtension::getAttribute($this->env$this->source, ($context["r"] ?? null), "rating", [], "any"falsefalsefalse2685); }), function ($__a__$__b__) use ($context$macros) { $context["a"] = $__a__$context["b"] = $__b__; return (($context["a"] ?? null) + ($context["b"] ?? null)); }) / Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2685)))) : (0));
  2904.         // line 2686
  2905.         yield "\t\t\t\t\t\t\t\t";
  2906.         $context['_parent'] = $context;
  2907.         $context['_seq'] = CoreExtension::ensureTraversable(range(15));
  2908.         foreach ($context['_seq'] as $context["_key"] => $context["i"]) {
  2909.             // line 2687
  2910.             yield "\t\t\t\t\t\t\t\t\t";
  2911.             if (($context["i"] <= ($context["avgRating"] ?? null))) {
  2912.                 // line 2688
  2913.                 yield "\t\t\t\t\t\t\t\t\t\t★
  2914. \t\t\t\t\t\t\t\t\t";
  2915.             } elseif (((            // line 2689
  2916. $context["i"] - ($context["avgRating"] ?? null)) < 1)) {
  2917.                 // line 2690
  2918.                 yield "\t\t\t\t\t\t\t\t\t\t☆
  2919. \t\t\t\t\t\t\t\t\t";
  2920.             } else {
  2921.                 // line 2692
  2922.                 yield "\t\t\t\t\t\t\t\t\t\t☆
  2923. \t\t\t\t\t\t\t\t\t";
  2924.             }
  2925.             // line 2694
  2926.             yield "\t\t\t\t\t\t\t\t";
  2927.         }
  2928.         $_parent $context['_parent'];
  2929.         unset($context['_seq'], $context['_key'], $context['i'], $context['_parent']);
  2930.         $context array_intersect_key($context$_parent) + $_parent;
  2931.         // line 2695
  2932.         yield "\t\t\t\t\t\t\t</div>
  2933. \t\t\t\t\t\t</div>
  2934. \t\t\t\t\t\t<div class=\"rating-summary\">
  2935. \t\t\t\t\t\t\t<p class=\"mb-1\">";
  2936.         // line 2698
  2937.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2698)), "html"nulltrue);
  2938.         yield "
  2939. \t\t\t\t\t\t\t\tavis</p>
  2940. \t\t\t\t\t\t\t<p class=\"text-muted small\">Basé sur
  2941. \t\t\t\t\t\t\t\t";
  2942.         // line 2701
  2943.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::length($this->env->getCharset(), Twig\Extension\CoreExtension::filter($this->envCoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2701), function ($__r__) use ($context$macros) { $context["r"] = $__r__; return CoreExtension::getAttribute($this->env$this->source, ($context["r"] ?? null), "isVerified", [], "any"falsefalsefalse2701); })), "html"nulltrue);
  2944.         yield "
  2945. \t\t\t\t\t\t\t\tavis vérifiés</p>
  2946. \t\t\t\t\t\t</div>
  2947. \t\t\t\t\t</div>
  2948. \t\t\t\t\t<div class=\"rating-breakdown\">
  2949. \t\t\t\t\t\t";
  2950.         // line 2707
  2951.         $context['_parent'] = $context;
  2952.         $context['_seq'] = CoreExtension::ensureTraversable(range(51));
  2953.         foreach ($context['_seq'] as $context["_key"] => $context["rating"]) {
  2954.             // line 2708
  2955.             yield "\t\t\t\t\t\t\t";
  2956.             $context["count"] = Twig\Extension\CoreExtension::length($this->env->getCharset(), Twig\Extension\CoreExtension::filter($this->envCoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2708), function ($__r__) use ($context$macros) { $context["r"] = $__r__; return (CoreExtension::getAttribute($this->env$this->source, ($context["r"] ?? null), "rating", [], "any"falsefalsefalse2708) == $context["rating"]); }));
  2957.             // line 2709
  2958.             yield "\t\t\t\t\t\t\t";
  2959.             $context["percentage"] = (((Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2709)) > 0)) ? (((($context["count"] ?? null) / Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2709))) * 100)) : (0));
  2960.             // line 2710
  2961.             yield "\t\t\t\t\t\t\t<div class=\"rating-bar\">
  2962. \t\t\t\t\t\t\t\t<span class=\"rating-label\">";
  2963.             // line 2711
  2964.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["rating"], "html"nulltrue);
  2965.             yield "★</span>
  2966. \t\t\t\t\t\t\t\t<div class=\"rating-progress\">
  2967. \t\t\t\t\t\t\t\t\t<div class=\"rating-fill\" style=\"width: ";
  2968.             // line 2713
  2969.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(($context["percentage"] ?? null), "html"nulltrue);
  2970.             yield "%\"></div>
  2971. \t\t\t\t\t\t\t\t</div>
  2972. \t\t\t\t\t\t\t\t<span class=\"rating-count\">";
  2973.             // line 2715
  2974.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(($context["count"] ?? null), "html"nulltrue);
  2975.             yield "</span>
  2976. \t\t\t\t\t\t\t</div>
  2977. \t\t\t\t\t\t";
  2978.         }
  2979.         $_parent $context['_parent'];
  2980.         unset($context['_seq'], $context['_key'], $context['rating'], $context['_parent']);
  2981.         $context array_intersect_key($context$_parent) + $_parent;
  2982.         // line 2718
  2983.         yield "\t\t\t\t\t</div>
  2984. \t\t\t\t</div>
  2985. \t\t\t</div>
  2986. \t\t\t<!-- Aperçu des avis -->
  2987. \t\t\t<div class=\"col-md-8\">
  2988. \t\t\t\t<div class=\"reviews-preview\">
  2989. \t\t\t\t\t";
  2990.         // line 2725
  2991.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2725)) > 0)) {
  2992.             // line 2726
  2993.             yield "\t\t\t\t\t\t";
  2994.             $context['_parent'] = $context;
  2995.             $context['_seq'] = CoreExtension::ensureTraversable(Twig\Extension\CoreExtension::slice($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2726), 03));
  2996.             foreach ($context['_seq'] as $context["_key"] => $context["review"]) {
  2997.                 // line 2727
  2998.                 yield "\t\t\t\t\t\t\t<div class=\"review-card-preview\">
  2999. \t\t\t\t\t\t\t\t<div class=\"review-header\">
  3000. \t\t\t\t\t\t\t\t\t<div class=\"review-user\">
  3001. \t\t\t\t\t\t\t\t\t\t<div class=\"user-avatar\">
  3002. \t\t\t\t\t\t\t\t\t\t\t";
  3003.                 // line 2731
  3004.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::default(Twig\Extension\CoreExtension::upper($this->env->getCharset(), Twig\Extension\CoreExtension::first($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["review"], "user", [], "any"falsefalsefalse2731), "firstName", [], "any"falsefalsefalse2731))), Twig\Extension\CoreExtension::upper($this->env->getCharset(), Twig\Extension\CoreExtension::first($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["review"], "user", [], "any"falsefalsefalse2731), "email", [], "any"falsefalsefalse2731)))), "html"nulltrue);
  3005.                 yield "
  3006. \t\t\t\t\t\t\t\t\t\t</div>
  3007. \t\t\t\t\t\t\t\t\t\t<div class=\"user-info\">
  3008. \t\t\t\t\t\t\t\t\t\t\t<h6>";
  3009.                 // line 2734
  3010.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["review"], "user", [], "any"falsetruefalse2734), "firstName", [], "any"truetruefalse2734)) ? (Twig\Extension\CoreExtension::default(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["review"], "user", [], "any"falsefalsefalse2734), "firstName", [], "any"falsefalsefalse2734), "Utilisateur")) : ("Utilisateur")), "html"nulltrue);
  3011.                 yield "</h6>
  3012. \t\t\t\t\t\t\t\t\t\t\t<small>";
  3013.                 // line 2735
  3014.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["review"], "getTimeAgo", [], "method"falsefalsefalse2735), "html"nulltrue);
  3015.                 yield "</small>
  3016. \t\t\t\t\t\t\t\t\t\t</div>
  3017. \t\t\t\t\t\t\t\t\t</div>
  3018. \t\t\t\t\t\t\t\t\t<div class=\"review-rating\">
  3019. \t\t\t\t\t\t\t\t\t\t<div class=\"stars\">";
  3020.                 // line 2739
  3021.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["review"], "getRatingStars", [], "method"falsefalsefalse2739), "html"nulltrue);
  3022.                 yield "</div>
  3023. \t\t\t\t\t\t\t\t\t\t";
  3024.                 // line 2740
  3025.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["review"], "isVerified", [], "any"falsefalsefalse2740)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  3026.                     // line 2741
  3027.                     yield "\t\t\t\t\t\t\t\t\t\t\t<span class=\"verified-badge\">✓</span>
  3028. \t\t\t\t\t\t\t\t\t\t";
  3029.                 }
  3030.                 // line 2743
  3031.                 yield "\t\t\t\t\t\t\t\t\t</div>
  3032. \t\t\t\t\t\t\t\t</div>
  3033. \t\t\t\t\t\t\t\t<div class=\"review-content\">
  3034. \t\t\t\t\t\t\t\t\t";
  3035.                 // line 2746
  3036.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::slice($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["review"], "comment", [], "any"falsefalsefalse2746), 0150), "html"nulltrue);
  3037.                 yield "
  3038. \t\t\t\t\t\t\t\t\t";
  3039.                 // line 2747
  3040.                 if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["review"], "comment", [], "any"falsefalsefalse2747)) > 150)) {
  3041.                     yield "...
  3042. \t\t\t\t\t\t\t\t\t";
  3043.                 }
  3044.                 // line 2749
  3045.                 yield "\t\t\t\t\t\t\t\t</div>
  3046. \t\t\t\t\t\t\t</div>
  3047. \t\t\t\t\t\t";
  3048.             }
  3049.             $_parent $context['_parent'];
  3050.             unset($context['_seq'], $context['_key'], $context['review'], $context['_parent']);
  3051.             $context array_intersect_key($context$_parent) + $_parent;
  3052.             // line 2752
  3053.             yield "
  3054. \t\t\t\t\t\t<div class=\"text-center mt-3\">
  3055. \t\t\t\t\t\t\t<a href=\"";
  3056.             // line 2754
  3057.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("shop_reviews_index", ["slug" => CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "slug", [], "any"falsefalsefalse2754)]), "html"nulltrue);
  3058.             yield "\" class=\"btn btn-outline-primary\">
  3059. \t\t\t\t\t\t\t\tVoir tous les avis (";
  3060.             // line 2755
  3061.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "reviews", [], "any"falsefalsefalse2755)), "html"nulltrue);
  3062.             yield ")
  3063. \t\t\t\t\t\t\t</a>
  3064. \t\t\t\t\t\t</div>
  3065. \t\t\t\t\t";
  3066.         } else {
  3067.             // line 2759
  3068.             yield "\t\t\t\t\t\t<div class=\"empty-reviews\">
  3069. \t\t\t\t\t\t\t<i class=\"lnr lnr-star\"></i>
  3070. \t\t\t\t\t\t\t<h4>Aucun avis pour le moment</h4>
  3071. \t\t\t\t\t\t\t<p>Soyez le premier à laisser un avis sur cette boutique !</p>
  3072. \t\t\t\t\t\t\t";
  3073.             // line 2763
  3074.             if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse2763)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  3075.                 // line 2764
  3076.                 yield "\t\t\t\t\t\t\t\t<a href=\"";
  3077.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("shop_reviews_new", ["slug" => CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "slug", [], "any"falsefalsefalse2764)]), "html"nulltrue);
  3078.                 yield "\" class=\"btn btn-primary\">
  3079. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnraccount_recently_viewed-star\"></i>
  3080. \t\t\t\t\t\t\t\t\tLaisser un avis
  3081. \t\t\t\t\t\t\t\t</a>
  3082. \t\t\t\t\t\t\t";
  3083.             }
  3084.             // line 2769
  3085.             yield "\t\t\t\t\t\t</div>
  3086. \t\t\t\t\t";
  3087.         }
  3088.         // line 2771
  3089.         yield "\t\t\t\t</div>
  3090. \t\t\t</div>
  3091. \t\t</div>
  3092. \t</div>
  3093. ";
  3094.         
  3095.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  3096.         
  3097.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  3098.         yield from [];
  3099.     }
  3100.     // line 2778
  3101.     /**
  3102.      * @return iterable<null|scalar|\Stringable>
  3103.      */
  3104.     public function block_javascripts(array $context, array $blocks = []): iterable
  3105.     {
  3106.         $macros $this->macros;
  3107.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  3108.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""javascripts"));
  3109.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  3110.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""javascripts"));
  3111.         // line 2779
  3112.         yield "\t<script>
  3113. \t\tdocument.addEventListener('DOMContentLoaded', function () {
  3114. \t\t\t// Initialisation du carrousel
  3115. \t\t\tconsole.log('DOM Content Loaded - Initializing carousel...');
  3116. \t\t\tsetTimeout(function() {
  3117. initCarousel();
  3118. \t\t\t}, 100);
  3119. // Gestion des onglets eBay-style avec Bootstrap
  3120. const tabLinks = document.querySelectorAll('.shop-tab-link');
  3121. const tabContents = document.querySelectorAll('.shop-tab-content');
  3122. tabLinks.forEach(link => {
  3123. link.addEventListener('click', function (e) {
  3124. e.preventDefault();
  3125. // Retirer la classe active de tous les liens et contenus
  3126. tabLinks.forEach(l => {
  3127. l.classList.remove('active');
  3128. l.setAttribute('aria-selected', 'false');
  3129. });
  3130. tabContents.forEach(c => c.classList.remove('active'));
  3131. // Ajouter la classe active au lien cliqué
  3132. this.classList.add('active');
  3133. this.setAttribute('aria-selected', 'true');
  3134. // Afficher le contenu correspondant
  3135. const targetTab = this.dataset.tab;
  3136. const targetContent = document.getElementById (`shop-\${targetTab}`);
  3137. if (targetContent) {
  3138. targetContent.classList.add('active');
  3139. }
  3140. });
  3141. });
  3142. // Gestion du système de follow
  3143. const followButton = document.getElementById('follow-button');
  3144. if (followButton) {
  3145. followButton.addEventListener('click', function () {
  3146. const shopId = this.dataset.shopId;
  3147. const isFollowing = this.dataset.following === 'true';
  3148. // Désactiver le bouton pendant la requête
  3149. this.disabled = true;
  3150. const originalText = this.innerHTML;
  3151. this.innerHTML = '<i class=\"lnr lnr-spinner\"></i> Loading...';
  3152. // Envoyer la requête
  3153. fetch(\"";
  3154.         // line 2829
  3155.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_shop_toggle_follow", ["id" => "__SHOP_ID__"]);
  3156.         yield "\".replace('__SHOP_ID__', shopId), {
  3157. method: 'POST',
  3158. headers: {
  3159. 'Content-Type': 'application/json',
  3160. 'X-Requested-With': 'XMLHttpRequest'
  3161. }
  3162. }).then(response => response.json()).then(data => {
  3163. if (data.success) { // Mettre à jour l'interface
  3164. this.dataset.following = data.isFollowing;
  3165. if (data.isFollowing) {
  3166. this.classList.add('following');
  3167. this.innerHTML = '<i class=\"lnr lnr-checkmark\"></i> Suivi';
  3168. } else {
  3169. this.classList.remove('following');
  3170. this.innerHTML = '<i class=\"lnr lnr-plus\"></i> Suivre';
  3171. }
  3172. // Mettre à jour le compteur de followers
  3173. if (followersCount && data.followersCount !== undefined) {
  3174. followersCount.textContent = data.followersCount.toLocaleString();
  3175. }
  3176. // Afficher un message de confirmation
  3177. showNotification(data.message, 'success');
  3178. } else {
  3179. showNotification(data.message, 'error');
  3180. }
  3181. }).catch(error => {
  3182. console.error('Erreur:', error);
  3183. showNotification('Une erreur est survenue', 'error');
  3184. }). finally(() => {
  3185. this.disabled = false;
  3186. });
  3187. });
  3188. }
  3189. // Fonction pour afficher les notifications
  3190. function showNotification(message, type = 'info') { // Créer l'élément de notification
  3191. const notification = document.createElement('div');
  3192. notification.className = `alert alert-\${
  3193. type === 'success' ? 'success' : type === 'error' ? 'danger' : 'info'
  3194. } alert-dismissible fade show position-fixed`;
  3195. notification.style.cssText = 'top: 20px; right: 20px; z-index: 9999; min-width: 300px;';
  3196. notification.innerHTML = `
  3197.             \${message}
  3198.             <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\"></button>
  3199.         `;
  3200. document.body.appendChild(notification);
  3201. // Supprimer automatiquement après 5 secondes
  3202. setTimeout(() => {
  3203. if (notification.parentNode) {
  3204. notification.remove();
  3205. }
  3206. }, 5000);
  3207. }
  3208. // Fonctions pour les actions de boutique
  3209. window.shareShop = function () { // Vérifier si l'API Web Share est disponible et si on est sur mobile
  3210. if (navigator.share && /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
  3211. navigator.share({title: '";
  3212.         // line 2891
  3213.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "name", [], "any"falsefalsefalse2891), "html"nulltrue);
  3214.         yield "- Boutique sur MaketOu', text: 'Découvrez cette boutique et ses produits sur MaketOu', url: window.location.href}).then(() => {
  3215. console.log('Partage réussi');
  3216. showNotification('Lien partagé avec succès !', 'success');
  3217. }).catch((error) => {
  3218. console.log('Erreur lors du partage:', error);
  3219. // Fallback vers la copie
  3220. copyToClipboard();
  3221. });
  3222. } else { // Sur desktop ou si Web Share n'est pas disponible, copier directement
  3223. copyToClipboard();
  3224. }
  3225. };
  3226. // Fonction pour copier le lien dans le presse-papiers
  3227. function copyToClipboard() {
  3228. const shopUrl = window.location.href;
  3229. const shopName = '";
  3230.         // line 2907
  3231.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "name", [], "any"falsefalsefalse2907), "html"nulltrue);
  3232.         yield "';
  3233. const shareText = `Découvrez la boutique \"\${shopName}\" sur MaketOu : \${shopUrl}`;
  3234. // Utiliser directement le fallback pour éviter les conflits
  3235. fallbackCopyToClipboard(shareText);
  3236. }
  3237. // Fallback pour copier le texte
  3238. function fallbackCopyToClipboard(text) {
  3239. const textArea = document.createElement('textarea');
  3240. textArea.value = text;
  3241. textArea.style.position = 'fixed';
  3242. textArea.style.left = '-999999px';
  3243. textArea.style.top = '-999999px';
  3244. document.body.appendChild(textArea);
  3245. textArea.focus();
  3246. textArea.select();
  3247. try {
  3248. document.execCommand('copy');
  3249. showNotification('Lien copié dans le presse-papiers !', 'success');
  3250. } catch (err) {
  3251. console.error('Impossible de copier:', err);
  3252. showNotification('Impossible de copier le lien', 'error');
  3253. }
  3254. document.body.removeChild(textArea);
  3255. }
  3256. window.contactShop = function () { // Ouvrir un modal de signalement
  3257. openReportModal();
  3258. };
  3259. window.saveShop = function () { // Sauvegarder la boutique dans les favoris
  3260. showNotification('Boutique sauvegardée dans vos favoris', 'success');
  3261. };
  3262. // Fonction pour ouvrir le modal de signalement
  3263. window.openReportModal = function () {
  3264. const modal = new bootstrap.Modal(document.getElementById('reportModal'));
  3265. modal.show();
  3266. };
  3267. // Fonction pour soumettre le signalement
  3268. window.submitReport = function () {
  3269. const reason = document.getElementById('reportReason').value;
  3270. const description = document.getElementById('reportDescription').value;
  3271. const email = document.getElementById('reportEmail').value;
  3272. if (! reason || ! description) {
  3273. showNotification('Veuillez remplir tous les champs obligatoires', 'error');
  3274. return;
  3275. }
  3276. // Simuler l'envoi du signalement
  3277. const reportData = {
  3278. shopId: ";
  3279.         // line 2963
  3280.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "id", [], "any"falsefalsefalse2963), "html"nulltrue);
  3281.         yield ",
  3282. reason: reason,
  3283. description: description,
  3284. email: email,
  3285. reportedAt: new Date().toISOString()
  3286. };
  3287. console.log('Signalement envoyé:', reportData);
  3288. // Fermer le modal
  3289. const modal = bootstrap.Modal.getInstance(document.getElementById('reportModal'));
  3290. modal.hide();
  3291. // Réinitialiser le formulaire
  3292. document.getElementById('reportForm').reset();
  3293. // Afficher la confirmation
  3294. showNotification('Signalement envoyé avec succès. Nous examinerons votre demande.', 'success');
  3295. };
  3296. // Gestion du carrousel eBay-style - Variables globales
  3297. let currentSlide = 0;
  3298. let carouselInterval = null;
  3299. let isPaused = false;
  3300. let slides = [];
  3301. let indicators = [];
  3302. let carouselInitialized = false;
  3303. let autoSlideDelay = 5000; // Délai par défaut : 5 secondes
  3304. let userInteractionTimeout = null; // Timeout pour reprendre après interaction utilisateur
  3305. let isUserInteracting = false; // Flag pour savoir si l'utilisateur interagit
  3306. let pageVisibilityHidden = false; // Flag pour savoir si la page est cachée
  3307. // Définir les fonctions globales immédiatement pour qu'elles soient disponibles pour onclick
  3308. window.nextSlide = function() {
  3309.     if (slides.length === 0) {
  3310.         console.warn('nextSlide: No slides available, initializing...');
  3311.         initCarousel();
  3312.         return;
  3313.     }
  3314.     // Marquer comme interaction utilisateur
  3315.     handleUserInteraction();
  3316.     currentSlide = (currentSlide + 1) % slides.length;
  3317.     console.log('nextSlide: Moving to slide', currentSlide);
  3318.     updateCarousel();
  3319. };
  3320. window.previousSlide = function() {
  3321.     if (slides.length === 0) {
  3322.         console.warn('previousSlide: No slides available, initializing...');
  3323.         initCarousel();
  3324.         return;
  3325.     }
  3326.     // Marquer comme interaction utilisateur
  3327.     handleUserInteraction();
  3328.     currentSlide = (currentSlide - 1 + slides.length) % slides.length;
  3329.     console.log('previousSlide: Moving to slide', currentSlide);
  3330.     updateCarousel();
  3331. };
  3332. window.goToSlide = function(index) {
  3333.     if (slides.length === 0) {
  3334.         console.warn('goToSlide: No slides available, initializing...');
  3335.         initCarousel();
  3336.         // Attendre que l'initialisation soit terminée
  3337.         setTimeout(() => {
  3338.             if (index >= 0 && index < slides.length) {
  3339.                 currentSlide = index;
  3340.                 updateCarousel();
  3341.                 // Réinitialiser le carrousel automatique
  3342.                 handleUserInteraction();
  3343.             }
  3344.         }, 150);
  3345.         return;
  3346.     }
  3347.     if (index < 0 || index >= slides.length) {
  3348.         console.warn('goToSlide: Invalid index', index, '. Valid range: 0 to', slides.length - 1);
  3349.         return;
  3350.     }
  3351.     // Marquer comme interaction utilisateur
  3352.     handleUserInteraction();
  3353.     currentSlide = index;
  3354.     console.log('goToSlide: Moving to slide', currentSlide, 'of', slides.length);
  3355.     updateCarousel();
  3356. };
  3357. window.toggleCarousel = function() {
  3358.     if (slides.length === 0) {
  3359.         console.warn('toggleCarousel: No slides available, initializing...');
  3360.         initCarousel();
  3361.         return;
  3362.     }
  3363.     if (isPaused) {
  3364.         resumeCarousel();
  3365.     } else {
  3366.         pauseCarousel();
  3367.     }
  3368. };
  3369. function initCarousel() {
  3370.     if (carouselInitialized) {
  3371.         console.log('Carousel already initialized');
  3372.         return;
  3373.     }
  3374.     // Réinitialiser les variables
  3375.     currentSlide = 0;
  3376.     isPaused = false;
  3377.     
  3378.     // Récupérer les slides et indicateurs à nouveau
  3379.     const carouselContainer = document.querySelector('.shop-carousel-ebay');
  3380.     if (!carouselContainer) {
  3381.         console.log('Carousel container not found');
  3382.         return;
  3383.     }
  3384.     
  3385.     const allSlides = carouselContainer.querySelectorAll('.carousel-slide');
  3386.     const allIndicators = carouselContainer.querySelectorAll('.carousel-indicator-ebay');
  3387.     
  3388.     if (allSlides.length === 0) {
  3389.         // Masquer les contrôles si aucune image
  3390.         const controls = carouselContainer.querySelector('.carousel-controls-ebay');
  3391.         const indicatorsContainer = carouselContainer.querySelector('.carousel-indicators-ebay');
  3392.         if (controls) controls.style.display = 'none';
  3393.         if (indicatorsContainer) indicatorsContainer.style.display = 'none';
  3394.         return;
  3395.     }
  3396.     
  3397.     // Si une seule image, masquer les contrôles
  3398.     if (allSlides.length <= 1) {
  3399.         const controls = carouselContainer.querySelector('.carousel-controls-ebay');
  3400.         const indicatorsContainer = carouselContainer.querySelector('.carousel-indicators-ebay');
  3401.         if (controls) controls.style.display = 'none';
  3402.         if (indicatorsContainer) indicatorsContainer.style.display = 'none';
  3403.         // S'assurer que la slide unique est active
  3404.         allSlides[0].classList.add('active');
  3405.         return;
  3406.     }
  3407.     
  3408.     // Afficher les contrôles si plusieurs images
  3409.     const controls = carouselContainer.querySelector('.carousel-controls-ebay');
  3410.     const indicatorsContainer = carouselContainer.querySelector('.carousel-indicators-ebay');
  3411.     if (controls) controls.style.display = 'flex';
  3412.     if (indicatorsContainer) indicatorsContainer.style.display = 'flex';
  3413.     
  3414.     // Mettre à jour les références globales - convertir NodeList en Array
  3415.     slides = Array.from(allSlides);
  3416.     indicators = Array.from(allIndicators);
  3417.     
  3418.     console.log('initCarousel: Found', slides.length, 'slides and', indicators.length, 'indicators');
  3419.     
  3420.     // S'assurer que la première slide est active immédiatement
  3421.     currentSlide = 0;
  3422.     slides.forEach((slide, index) => {
  3423.         if (index === 0) {
  3424.             slide.classList.add('active');
  3425.             slide.style.opacity = '1';
  3426.             slide.style.zIndex = '2';
  3427.         } else {
  3428.             slide.classList.remove('active');
  3429.             slide.style.opacity = '0';
  3430.             slide.style.zIndex = '1';
  3431.         }
  3432.     });
  3433.     if (indicators.length > 0) {
  3434.         indicators.forEach((indicator, index) => {
  3435.             if (index === 0) {
  3436.                 indicator.classList.add('active');
  3437.             } else {
  3438.                 indicator.classList.remove('active');
  3439.             }
  3440.         });
  3441.     }
  3442.     
  3443.     // Démarrer le carrousel automatique immédiatement
  3444.     console.log('Initializing carousel - starting automatic rotation...');
  3445.     isPaused = false; // S'assurer que le carrousel n'est pas en pause
  3446.     startCarousel();
  3447.     
  3448.     // Gérer les événements de survol (une seule fois)
  3449.     carouselContainer.addEventListener('mouseenter', function() {
  3450.         if (!isPaused) {
  3451.             pauseCarousel();
  3452.         }
  3453.     });
  3454.     carouselContainer.addEventListener('mouseleave', function() {
  3455.         // Ne reprendre que si l'utilisateur n'a pas mis en pause manuellement
  3456.         if (!isPaused && !isUserInteracting && !pageVisibilityHidden) {
  3457.             startCarousel();
  3458.         }
  3459.     });
  3460.     
  3461.     // Gérer la visibilité de la page (pause quand la page est cachée)
  3462.     document.addEventListener('visibilitychange', function() {
  3463.         if (document.hidden) {
  3464.             pageVisibilityHidden = true;
  3465.             if (!isPaused) {
  3466.                 pauseCarousel();
  3467.             }
  3468.         } else {
  3469.             pageVisibilityHidden = false;
  3470.             // Reprendre seulement si l'utilisateur n'a pas mis en pause manuellement
  3471.             if (!isPaused && !isUserInteracting) {
  3472.                 startCarousel();
  3473.             }
  3474.         }
  3475.     });
  3476.     
  3477.     carouselInitialized = true;
  3478.     console.log('Carousel initialized with', slides.length, 'slides');
  3479. }
  3480. function startCarousel() {
  3481.     // Nettoyer l'intervalle existant
  3482.     clearInterval(carouselInterval);
  3483.     
  3484.     // Ne pas démarrer si la page est cachée ou si l'utilisateur interagit
  3485.     if (pageVisibilityHidden || isUserInteracting) {
  3486.         return;
  3487.     }
  3488.     
  3489.     if (slides.length <= 1) {
  3490.         console.log('Not enough slides to start carousel');
  3491.         return;
  3492.     }
  3493.     
  3494.     // S'assurer que isPaused est false pour démarrer
  3495.     isPaused = false;
  3496.     
  3497.     const pauseBtn = document.getElementById('pauseBtn');
  3498.     const pauseIcon = document.getElementById('pauseIcon');
  3499.     if (pauseBtn) {
  3500.         pauseBtn.classList.remove('playing');
  3501.         if (pauseIcon) {
  3502.             pauseIcon.textContent = '⏸';
  3503.             pauseIcon.className = 'pause-icon-content';
  3504.             pauseIcon.style.display = 'inline-block';
  3505.             pauseIcon.style.color = 'white';
  3506.             pauseIcon.style.fontSize = '22px';
  3507.             pauseIcon.style.visibility = 'visible';
  3508.             pauseIcon.style.opacity = '1';
  3509.         }
  3510.     }
  3511.     
  3512.     console.log('Starting carousel automatically...');
  3513.     carouselInterval = setInterval(() => {
  3514.         // Vérifier les conditions avant de changer de slide
  3515.         if (!isPaused && !isUserInteracting && !pageVisibilityHidden && slides.length > 0) {
  3516.             // Utiliser la fonction interne nextSlide pour éviter de déclencher handleUserInteraction
  3517.             currentSlide = (currentSlide + 1) % slides.length;
  3518.             console.log('Auto slide:', currentSlide);
  3519.             updateCarousel();
  3520.         }
  3521.     }, autoSlideDelay);
  3522. }
  3523. // Fonction pour gérer les interactions utilisateur
  3524. function handleUserInteraction() {
  3525.     isUserInteracting = true;
  3526.     
  3527.     // Nettoyer le timeout précédent s'il existe
  3528.     if (userInteractionTimeout) {
  3529.         clearTimeout(userInteractionTimeout);
  3530.     }
  3531.     
  3532.     // Reprendre le carrousel automatique après 3 secondes d'inactivité
  3533.     userInteractionTimeout = setTimeout(() => {
  3534.         isUserInteracting = false;
  3535.         // Reprendre seulement si l'utilisateur n'a pas mis en pause manuellement
  3536.         if (!isPaused && !pageVisibilityHidden) {
  3537.             startCarousel();
  3538.         }
  3539.     }, 3000);
  3540. }
  3541. function pauseCarousel() {
  3542. isPaused = true;
  3543. clearInterval(carouselInterval);
  3544.     
  3545.     // Nettoyer le timeout d'interaction utilisateur
  3546.     if (userInteractionTimeout) {
  3547.         clearTimeout(userInteractionTimeout);
  3548.         userInteractionTimeout = null;
  3549.     }
  3550.     
  3551.     const pauseBtn = document.getElementById('pauseBtn');
  3552. const pauseIcon = document.getElementById('pauseIcon');
  3553.     if (pauseBtn) {
  3554.         pauseBtn.classList.add('playing');
  3555. if (pauseIcon) {
  3556.             pauseIcon.textContent = '▶';
  3557.             pauseIcon.className = 'pause-icon-content';
  3558.             pauseIcon.style.display = 'inline-block';
  3559.             pauseIcon.style.color = 'white';
  3560.             pauseIcon.style.fontSize = '22px';
  3561.             pauseIcon.style.visibility = 'visible';
  3562.             pauseIcon.style.opacity = '1';
  3563.         }
  3564. }
  3565. }
  3566. function resumeCarousel() {
  3567. isPaused = false;
  3568.     isUserInteracting = false; // Réinitialiser le flag d'interaction
  3569.     
  3570.     // Nettoyer le timeout d'interaction utilisateur
  3571.     if (userInteractionTimeout) {
  3572.         clearTimeout(userInteractionTimeout);
  3573.         userInteractionTimeout = null;
  3574.     }
  3575.     
  3576.     const pauseBtn = document.getElementById('pauseBtn');
  3577. const pauseIcon = document.getElementById('pauseIcon');
  3578.     if (pauseBtn) {
  3579.         pauseBtn.classList.remove('playing');
  3580. if (pauseIcon) {
  3581.             pauseIcon.textContent = '⏸';
  3582.             pauseIcon.className = 'pause-icon-content';
  3583.             pauseIcon.style.display = 'inline-block';
  3584.             pauseIcon.style.color = 'white';
  3585.             pauseIcon.style.fontSize = '22px';
  3586.             pauseIcon.style.visibility = 'visible';
  3587.             pauseIcon.style.opacity = '1';
  3588. }
  3589.     }
  3590.     
  3591.     // Ne reprendre que si la page est visible
  3592.     if (!pageVisibilityHidden) {
  3593. startCarousel();
  3594.     }
  3595. }
  3596. function toggleCarousel() {
  3597.     const pauseBtn = document.getElementById('pauseBtn');
  3598.     const pauseIcon = document.getElementById('pauseIcon');
  3599.     
  3600. if (isPaused) {
  3601. resumeCarousel();
  3602. } else {
  3603. pauseCarousel();
  3604. }
  3605. }
  3606. function nextSlide() {
  3607.     if (slides.length === 0) {
  3608.         console.warn('No slides available');
  3609.         return;
  3610.     }
  3611. currentSlide = (currentSlide + 1) % slides.length;
  3612.     console.log('Next slide:', currentSlide);
  3613. updateCarousel();
  3614. }
  3615. function previousSlide() {
  3616.     if (slides.length === 0) {
  3617.         console.warn('No slides available');
  3618.         return;
  3619.     }
  3620. currentSlide = (currentSlide - 1 + slides.length) % slides.length;
  3621.     console.log('Previous slide:', currentSlide);
  3622. updateCarousel();
  3623. }
  3624. // Fonction interne goToSlide (utilisée par window.goToSlide)
  3625. function goToSlide(index) {
  3626.     if (slides.length === 0) {
  3627.         console.warn('goToSlide: No slides available');
  3628.         return;
  3629.     }
  3630.     if (index < 0 || index >= slides.length) {
  3631.         console.warn('goToSlide: Invalid index', index, '. Valid range: 0 to', slides.length - 1);
  3632.         return;
  3633.     }
  3634.     // Marquer comme interaction utilisateur
  3635.     handleUserInteraction();
  3636. currentSlide = index;
  3637.     console.log('goToSlide: Moving to slide', currentSlide, 'of', slides.length);
  3638. updateCarousel();
  3639. }
  3640. function updateCarousel() {
  3641.     if (slides.length === 0) {
  3642.         console.warn('No slides to update');
  3643.         return;
  3644.     }
  3645.     
  3646.     console.log('updateCarousel: Updating to slide', currentSlide, 'of', slides.length, 'slides');
  3647.     console.log('updateCarousel: Total indicators:', indicators.length);
  3648.     
  3649.     // Masquer toutes les slides et réinitialiser leurs styles
  3650.     slides.forEach((slide, index) => {
  3651.         slide.classList.remove('active');
  3652.         if (index === currentSlide) {
  3653.             slide.classList.add('active');
  3654.             slide.style.opacity = '1';
  3655.             slide.style.zIndex = '2';
  3656.         } else {
  3657.             slide.style.opacity = '0';
  3658.             slide.style.zIndex = '1';
  3659.         }
  3660.     });
  3661.     
  3662.     // Mettre à jour tous les indicateurs - FORCER la mise à jour en deux passes distinctes
  3663.     if (indicators.length > 0) {
  3664.         console.log('updateCarousel: Updating', indicators.length, 'indicators, currentSlide:', currentSlide);
  3665.         
  3666.         // Première passe : retirer active de TOUS les indicateurs
  3667.         indicators.forEach((indicator) => {
  3668.             indicator.classList.remove('active');
  3669.         });
  3670.         
  3671.         // Deuxième passe : ajouter active à l'indicateur correspondant à currentSlide
  3672.         if (currentSlide >= 0 && currentSlide < indicators.length && indicators[currentSlide]) {
  3673.             const activeIndicator = indicators[currentSlide];
  3674.             activeIndicator.classList.add('active');
  3675.             console.log('updateCarousel: Activated indicator', currentSlide);
  3676.             
  3677.             // Vérification et forcer si nécessaire
  3678.             if (!activeIndicator.classList.contains('active')) {
  3679.                 console.warn('updateCarousel: Class not added, forcing with setAttribute');
  3680.                 activeIndicator.setAttribute('class', activeIndicator.className + ' active');
  3681.             }
  3682.         } else {
  3683.             console.error('updateCarousel: Invalid currentSlide', currentSlide, 'or indicator not found. Total indicators:', indicators.length);
  3684.         }
  3685.     } else {
  3686.         console.warn('updateCarousel: No indicators available');
  3687.     }
  3688.     
  3689.     // Afficher la slide active
  3690.     if (slides[currentSlide]) {
  3691.         slides[currentSlide].classList.add('active');
  3692.         slides[currentSlide].style.opacity = '1';
  3693.         slides[currentSlide].style.zIndex = '2';
  3694.         console.log('updateCarousel: Showing slide', currentSlide);
  3695.     } else {
  3696.         console.error('updateCarousel: Slide', currentSlide, 'not found. Total slides:', slides.length);
  3697.     }
  3698. }
  3699. // Les fonctions globales sont définies au début du script
  3700. // Gestion du tri des produits via API Symfony
  3701. console.log('=== INITIALIZING PRODUCT SORTING ===');
  3702. console.log('Shop ID:', ";
  3703.         // line 3410
  3704.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "id", [], "any"falsefalsefalse3410), "html"nulltrue);
  3705.         yield ");
  3706. // Fonction de tri via AJAX - RENDUE GLOBALE
  3707. window.sortProducts = function (sortValue) {
  3708. console.log('=== SORT PRODUCTS CALLED ===');
  3709. console.log('Sort value:', sortValue);
  3710. const productsContainer = document.getElementById('products-container');
  3711. console.log('Products container:', productsContainer);
  3712. if (! productsContainer) {
  3713. console.error('Products container not found!');
  3714. return;
  3715. }
  3716. if (! sortValue) {
  3717. console.log('Resetting to original order');
  3718. // Recharger la page pour revenir à l'ordre original
  3719. window.location.reload();
  3720. return;
  3721. }
  3722. console.log('Showing loading spinner...');
  3723. // Afficher un indicateur de chargement
  3724. productsContainer.innerHTML = '<div class=\"col-12 text-center py-5\"><div class=\"spinner-border text-primary\" role=\"status\"><span class=\"visually-hidden\">Chargement...</span></div><p class=\"mt-3\">Tri des produits en cours...</p></div>';
  3725. // Récupérer l'ID de la boutique
  3726. const shopId = ";
  3727.         // line 3437
  3728.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, ($context["shop"] ?? null), "id", [], "any"falsefalsefalse3437), "html"nulltrue);
  3729.         yield ";
  3730. console.log('Shop ID for request:', shopId);
  3731. const url = \"";
  3732.         // line 3440
  3733.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_shop_products_sort", ["id" => "__SHOP_ID__"]);
  3734.         yield "\".replace('__SHOP_ID__', shopId);
  3735. console.log('Request URL:', url);
  3736. const requestData = {
  3737. sortBy: sortValue
  3738. };
  3739. console.log('Request data:', requestData);
  3740. // Envoyer la requête AJAX
  3741. console.log('Sending AJAX request...');
  3742. fetch(url, {
  3743. method: 'POST',
  3744. headers: {
  3745. 'Content-Type': 'application/json',
  3746. 'X-Requested-With': 'XMLHttpRequest'
  3747. },
  3748. body: JSON.stringify(requestData)
  3749. }).then(response => {
  3750. console.log('Response received:', response);
  3751. console.log('Response status:', response.status);
  3752. return response.json();
  3753. }).then(data => {
  3754. console.log('Sort response data:', data);
  3755. if (data.success) {
  3756. console.log('Sort successful, updating content...');
  3757. // Mettre à jour le contenu avec le HTML retourné
  3758. productsContainer.innerHTML = data.html;
  3759. // Mettre à jour le compteur de produits
  3760. const productCount = document.querySelector('.product-count');
  3761. if (productCount) {
  3762. productCount.textContent = data.count;
  3763. }
  3764. console.log('Products sorted successfully!');
  3765. } else {
  3766. console.error('Sort failed:', data.message);
  3767. showNotification('Erreur lors du tri: ' + data.message, 'error');
  3768. // Recharger la page en cas d'erreur
  3769. window.location.reload();
  3770. }
  3771. }).catch(error => {
  3772. console.error('Sort request failed:', error);
  3773. showNotification('Erreur de connexion lors du tri', 'error');
  3774. // Recharger la page en cas d'erreur
  3775. window.location.reload();
  3776. });
  3777. };
  3778. // Attendre que le DOM soit chargé
  3779. console.log('Setting up event listeners...');
  3780. setTimeout(() => {
  3781. const sortSelect = document.getElementById('product-sort');
  3782. console.log('Sort select element:', sortSelect);
  3783. if (sortSelect) {
  3784. console.log('Adding change event listener...');
  3785. sortSelect.addEventListener('change', function () {
  3786. console.log('=== SELECT CHANGE EVENT TRIGGERED ===');
  3787. console.log('Selected value:', this.value);
  3788. console.log('Calling sortProducts...');
  3789. window.sortProducts(this.value);
  3790. });
  3791. console.log('Event listener added successfully');
  3792. } else {
  3793. console.error('Sort select element not found!');
  3794. console.log('Available elements with ID containing \"sort\":', document.querySelectorAll('[id*=\"sort\"]'));
  3795. console.log('Available elements with class containing \"form-select\":', document.querySelectorAll('.form-select'));
  3796. }
  3797. }, 100);
  3798. // Gestion du bouton \"Suivre\"
  3799. const followBtn = document.querySelector('.btn-shop');
  3800. if (followBtn) {
  3801. followBtn.addEventListener('click', function () {
  3802. if (this.innerHTML.includes('Suivre')) {
  3803. this.innerHTML = '<i class=\"lnr lnr-heart me-1\"></i> Suivi';
  3804. this.classList.remove('btn-shop');
  3805. this.classList.add('btn-success');
  3806. } else {
  3807. this.innerHTML = '<i class=\"lnr lnr-heart me-1\"></i> Suivre';
  3808. this.classList.remove('btn-success');
  3809. this.classList.add('btn-shop');
  3810. }
  3811. });
  3812. }
  3813. });
  3814. \t</script>
  3815. ";
  3816.         
  3817.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  3818.         
  3819.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  3820.         yield from [];
  3821.     }
  3822.     /**
  3823.      * @codeCoverageIgnore
  3824.      */
  3825.     public function getTemplateName(): string
  3826.     {
  3827.         return "home/shop.html.twig";
  3828.     }
  3829.     /**
  3830.      * @codeCoverageIgnore
  3831.      */
  3832.     public function isTraitable(): bool
  3833.     {
  3834.         return false;
  3835.     }
  3836.     /**
  3837.      * @codeCoverageIgnore
  3838.      */
  3839.     public function getDebugInfo(): array
  3840.     {
  3841.         return array (  4101 => 3440,  4095 => 3437,  4065 => 3410,  3615 => 2963,  3556 => 2907,  3537 => 2891,  3472 => 2829,  3420 => 2779,  3407 => 2778,  3391 => 2771,  3387 => 2769,  3378 => 2764,  3376 => 2763,  3370 => 2759,  3363 => 2755,  3359 => 2754,  3355 => 2752,  3347 => 2749,  3342 => 2747,  3338 => 2746,  3333 => 2743,  3329 => 2741,  3327 => 2740,  3323 => 2739,  3316 => 2735,  3312 => 2734,  3306 => 2731,  3300 => 2727,  3295 => 2726,  3293 => 2725,  3284 => 2718,  3275 => 2715,  3270 => 2713,  3265 => 2711,  3262 => 2710,  3259 => 2709,  3256 => 2708,  3252 => 2707,  3243 => 2701,  3237 => 2698,  3232 => 2695,  3226 => 2694,  3222 => 2692,  3218 => 2690,  3216 => 2689,  3213 => 2688,  3210 => 2687,  3205 => 2686,  3203 => 2685,  3198 => 2683,  3122 => 2610,  3111 => 2601,  3103 => 2595,  3095 => 2590,  3090 => 2587,  3084 => 2586,  3080 => 2584,  3074 => 2581,  3071 => 2580,  3069 => 2579,  3064 => 2576,  3057 => 2571,  3055 => 2570,  3051 => 2569,  3045 => 2565,  3033 => 2563,  3029 => 2562,  3024 => 2560,  3015 => 2553,  3012 => 2552,  3008 => 2551,  3005 => 2550,  3003 => 2549,  2990 => 2539,  2981 => 2533,  2973 => 2527,  2961 => 2525,  2957 => 2524,  2952 => 2522,  2928 => 2501,  2919 => 2495,  2903 => 2481,  2898 => 2479,  2893 => 2476,  2891 => 2475,  2888 => 2474,  2883 => 2472,  2878 => 2469,  2876 => 2468,  2873 => 2467,  2869 => 2465,  2863 => 2463,  2861 => 2462,  2854 => 2458,  2830 => 2436,  2822 => 2430,  2818 => 2428,  2805 => 2421,  2802 => 2420,  2798 => 2418,  2786 => 2416,  2782 => 2415,  2779 => 2414,  2777 => 2413,  2770 => 2409,  2764 => 2406,  2760 => 2405,  2749 => 2401,  2745 => 2400,  2733 => 2398,  2729 => 2397,  2726 => 2396,  2724 => 2395,  2705 => 2379,  2699 => 2376,  2685 => 2365,  2656 => 2338,  2648 => 2334,  2646 => 2333,  2631 => 2320,  2623 => 2316,  2618 => 2313,  2614 => 2311,  2610 => 2309,  2608 => 2308,  2596 => 2306,  2594 => 2305,  2580 => 2294,  2576 => 2292,  2566 => 2289,  2562 => 2287,  2559 => 2286,  2553 => 2283,  2549 => 2281,  2547 => 2280,  2540 => 2275,  2533 => 2271,  2530 => 2270,  2528 => 2269,  2525 => 2268,  2518 => 2264,  2515 => 2263,  2513 => 2262,  2510 => 2261,  2503 => 2257,  2500 => 2256,  2498 => 2255,  2490 => 2249,  2484 => 2247,  2481 => 2246,  2475 => 2242,  2473 => 2241,  2468 => 2239,  2458 => 2231,  2452 => 2227,  2449 => 2226,  2443 => 2222,  2435 => 2220,  2433 => 2219,  2423 => 2211,  2419 => 2209,  2394 => 2207,  2377 => 2206,  2361 => 2192,  2358 => 2191,  2356 => 2190,  2351 => 2187,  2344 => 2182,  2341 => 2181,  2318 => 2177,  2300 => 2176,  2297 => 2175,  2295 => 2174,  2286 => 2167,  2273 => 2166,  107 => 9,  94 => 8,  79 => 4,  66 => 3,  43 => 1,);
  3842.     }
  3843.     public function getSourceContext(): Source
  3844.     {
  3845.         return new Source("{% extends 'base_home.html.twig' %}
  3846. {% block title %}
  3847. \t{{ shop.name }}
  3848. \t| MaketOu
  3849. {% endblock %}
  3850. {% block stylesheets %}
  3851. \t<style>
  3852. \t\t/* Style pour la description formatée de la boutique */
  3853. \t\t.shop-description-content {
  3854. \t\t\tline-height: 1.6;
  3855. \t\t\tcolor: #333;
  3856. \t\t}
  3857. \t\t
  3858. \t\t.shop-description-content h1, 
  3859. \t\t.shop-description-content h2, 
  3860. \t\t.shop-description-content h3 {
  3861. \t\t\tcolor: #ffa200;
  3862. \t\t\tmargin-top: 1.5rem;
  3863. \t\t\tmargin-bottom: 1rem;
  3864. \t\t}
  3865. \t\t
  3866. \t\t.shop-description-content h1 { font-size: 1.75rem; }
  3867. \t\t.shop-description-content h2 { font-size: 1.5rem; }
  3868. \t\t.shop-description-content h3 { font-size: 1.25rem; }
  3869. \t\t
  3870. \t\t.shop-description-content ul, 
  3871. \t\t.shop-description-content ol {
  3872. \t\t\tmargin-left: 1.5rem;
  3873. \t\t\tmargin-bottom: 1rem;
  3874. \t\t}
  3875. \t\t
  3876. \t\t.shop-description-content li {
  3877. \t\t\tmargin-bottom: 0.5rem;
  3878. \t\t}
  3879. \t\t
  3880. \t\t.shop-description-content p {
  3881. \t\t\tmargin-bottom: 1rem;
  3882. \t\t}
  3883. \t\t
  3884. \t\t.shop-description-content a {
  3885. \t\t\tcolor: #ffa200;
  3886. \t\t\ttext-decoration: underline;
  3887. \t\t}
  3888. \t\t
  3889. \t\t.shop-description-content a:hover {
  3890. \t\t\tcolor: #e8910a;
  3891. \t\t}
  3892. \t\t
  3893. \t\t.shop-description-content img {
  3894. \t\t\tmax-width: 100%;
  3895. \t\t\theight: auto;
  3896. \t\t\tborder-radius: 8px;
  3897. \t\t\tmargin: 1rem 0;
  3898. \t\t}
  3899. \t\t
  3900. \t\t.shop-description-content blockquote {
  3901. \t\t\tborder-left: 4px solid #ffa200;
  3902. \t\t\tpadding-left: 1rem;
  3903. \t\t\tmargin: 1rem 0;
  3904. \t\t\tfont-style: italic;
  3905. \t\t\tcolor: #666;
  3906. \t\t}
  3907. \t\t
  3908. \t\t.shop-description-content table {
  3909. \t\t\twidth: 100%;
  3910. \t\t\tborder-collapse: collapse;
  3911. \t\t\tmargin: 1rem 0;
  3912. \t\t}
  3913. \t\t
  3914. \t\t.shop-description-content table th,
  3915. \t\t.shop-description-content table td {
  3916. \t\t\tborder: 1px solid #ddd;
  3917. \t\t\tpadding: 0.5rem;
  3918. \t\t}
  3919. \t\t
  3920. \t\t.shop-description-content table th {
  3921. \t\t\tbackground-color: #f8f9fa;
  3922. \t\t\tfont-weight: bold;
  3923. \t\t}
  3924. \t\t
  3925. \t\t/* Design eBay-like intégré avec Karma - Pleine largeur */
  3926. \t\t.shop-header {
  3927. \t\t\tbackground: #f7f7f7;
  3928. \t\t\tborder-bottom: 1px solid #e1e1e1;
  3929. \t\t\tpadding: 0;
  3930. \t\t\tmargin-bottom: 0;
  3931. \t\t\twidth: 100%;
  3932. \t\t\tposition: relative;
  3933. \t\t}
  3934. \t\t.shop-banner {
  3935. \t\t\twidth: 100%;
  3936. \t\t\theight: 350px;
  3937. \t\t\tbackground-size: cover;
  3938. \t\t\tbackground-position: center;
  3939. \t\t\tbackground-repeat: no-repeat;
  3940. \t\t\tposition: relative;
  3941. \t\t\tdisplay: flex;
  3942. \t\t\talign-items: center;
  3943. \t\t\tjustify-content: center;
  3944. \t\t}
  3945. \t\t/* Carrousel eBay-style amélioré */
  3946. \t\t.shop-carousel-ebay {
  3947. \t\t\twidth: 100%;
  3948. \t\t\theight: 450px;
  3949. \t\t\tposition: relative;
  3950. \t\t\toverflow: hidden;
  3951. \t\t\tbackground: #f8f9fa;
  3952. \t\t\tborder-radius: 8px;
  3953. \t\t\tbox-sizing: border-box;
  3954. \t\t\tmargin-bottom: 0;
  3955. \t\t\ttransition: height 0.3s ease;
  3956. \t\t}
  3957. \t\t.carousel-container {
  3958. \t\t\tposition: relative;
  3959. \t\t\twidth: 100%;
  3960. \t\t\theight: 100%;
  3961. \t\t}
  3962. \t\t.carousel-slide {
  3963. \t\t\tposition: absolute;
  3964. \t\t\ttop: 0;
  3965. \t\t\tleft: 0;
  3966. \t\t\twidth: 100%;
  3967. \t\t\theight: 100%;
  3968. \t\t\tbackground-size: cover;
  3969. \t\t\tbackground-position: center;
  3970. \t\t\tbackground-repeat: no-repeat;
  3971. \t\t\topacity: 0;
  3972. \t\t\ttransition: opacity 0.6s ease-in-out;
  3973. \t\t}
  3974. \t\t
  3975. \t\t/* Amélioration responsive pour les images */
  3976. \t\t@media (max-width: 768px) {
  3977. \t\t\t.carousel-slide {
  3978. \t\t\t\tbackground-size: cover;
  3979. \t\t\t\tbackground-position: center center;
  3980. \t\t\t}
  3981. \t\t}
  3982. \t\t.carousel-slide.active {
  3983. \t\t\topacity: 1;
  3984. \t\t}
  3985. \t\t.carousel-controls {
  3986. \t\t\tposition: absolute;
  3987. \t\t\tbottom: 20px;
  3988. \t\t\tleft: 50%;
  3989. \t\t\ttransform: translateX(-50%);
  3990. \t\t\tdisplay: flex;
  3991. \t\t\tgap: 10px;
  3992. \t\t\tz-index: 10;
  3993. \t\t}
  3994. \t\t.carousel-btn {
  3995. \t\t\twidth: 40px;
  3996. \t\t\theight: 40px;
  3997. \t\t\tborder: none;
  3998. \t\t\tborder-radius: 50%;
  3999. \t\t\tbackground: rgba(255, 255, 255, 0.9);
  4000. \t\t\tcolor: #333;
  4001. \t\t\tfont-size: 16px;
  4002. \t\t\tcursor: pointer;
  4003. \t\t\tdisplay: flex;
  4004. \t\t\talign-items: center;
  4005. \t\t\tjustify-content: center;
  4006. \t\t\ttransition: all 0.3s ease;
  4007. \t\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
  4008. \t\t}
  4009. \t\t.carousel-btn:hover {
  4010. \t\t\tbackground: white;
  4011. \t\t\ttransform: scale(1.1);
  4012. \t\t}
  4013. \t\t.carousel-btn:disabled {
  4014. \t\t\topacity: 0.5;
  4015. \t\t\tcursor: not-allowed;
  4016. \t\t\ttransform: none;
  4017. \t\t}
  4018. \t\t.carousel-pause {
  4019. \t\t\tbackground: #dc3545;
  4020. \t\t\tcolor: white;
  4021. \t\t}
  4022. \t\t.carousel-pause:hover {
  4023. \t\t\tbackground: #c82333;
  4024. \t\t}
  4025. \t\t.carousel-indicators {
  4026. \t\t\tposition: absolute;
  4027. \t\t\tbottom: 70px;
  4028. \t\t\tleft: 50%;
  4029. \t\t\ttransform: translateX(-50%);
  4030. \t\t\tdisplay: flex;
  4031. \t\t\tgap: 8px;
  4032. \t\t\tz-index: 10;
  4033. \t\t}
  4034. \t\t.carousel-indicator {
  4035. \t\t\twidth: 12px;
  4036. \t\t\theight: 12px;
  4037. \t\t\tborder-radius: 50%;
  4038. \t\t\tbackground: rgba(255, 255, 255, 0.5);
  4039. \t\t\tborder: none;
  4040. \t\t\tcursor: pointer;
  4041. \t\t\ttransition: all 0.3s ease;
  4042. \t\t}
  4043. \t\t.carousel-indicator.active {
  4044. \t\t\tbackground: white;
  4045. \t\t\ttransform: scale(1.2);
  4046. \t\t}
  4047. \t\t/* Contrôles eBay-style améliorés - Positionnés en bas à droite */
  4048. \t\t.carousel-controls-ebay {
  4049. \t\t\tposition: absolute;
  4050. \t\t\tbottom: 20px;
  4051. \t\t\tright: 20px;
  4052. \t\t\tdisplay: flex;
  4053. \t\t\tgap: 12px;
  4054. \t\t\talign-items: center;
  4055. \t\t\tz-index: 10;
  4056. \t\t\tpointer-events: none;
  4057. \t\t}
  4058. \t\t.carousel-btn-ebay {
  4059. \t\t\twidth: 52px;
  4060. \t\t\theight: 52px;
  4061. \t\t\tborder: none;
  4062. \t\t\tborder-radius: 50% !important;
  4063. \t\t\tbackground: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.9) 100%);
  4064. \t\t\tcolor: #333;
  4065. \t\t\tfont-size: 22px;
  4066. \t\t\tcursor: pointer;
  4067. \t\t\tdisplay: flex;
  4068. \t\t\talign-items: center;
  4069. \t\t\tjustify-content: center;
  4070. \t\t\ttransition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  4071. \t\t\tpointer-events: all;
  4072. \t\t\tbox-shadow: 0 4px 15px rgba(0, 0, 0, 0.25), 0 2px 8px rgba(0, 0, 0, 0.15);
  4073. \t\t\tbackdrop-filter: blur(10px);
  4074. \t\t\tposition: relative;
  4075. \t\t\toverflow: visible;
  4076. \t\t}
  4077. \t\t.carousel-btn-ebay::before {
  4078. \t\t\tcontent: '';
  4079. \t\t\tposition: absolute;
  4080. \t\t\ttop: 50%;
  4081. \t\t\tleft: 50%;
  4082. \t\t\twidth: 0;
  4083. \t\t\theight: 0;
  4084. \t\t\tborder-radius: 50%;
  4085. \t\t\tbackground: rgba(255, 255, 255, 0.3);
  4086. \t\t\ttransform: translate(-50%, -50%);
  4087. \t\t\ttransition: width 0.6s ease, height 0.6s ease;
  4088. \t\t}
  4089. \t\t.carousel-btn-ebay:hover::before {
  4090. \t\t\twidth: 100%;
  4091. \t\t\theight: 100%;
  4092. \t\t}
  4093. \t\t.carousel-btn-ebay:hover {
  4094. \t\t\ttransform: translateY(-3px) scale(1.1);
  4095. \t\t\tbox-shadow: 0 8px 25px rgba(0, 0, 0, 0.35), 0 4px 12px rgba(0, 0, 0, 0.2);
  4096. \t\t}
  4097. \t\t
  4098. \t\t/* Désactiver les effets hover sur mobile pour éviter les problèmes tactiles */
  4099. \t\t@media (hover: none) and (pointer: coarse) {
  4100. \t\t\t.carousel-btn-ebay:hover {
  4101. \t\t\t\ttransform: none;
  4102. \t\t\t}
  4103. \t\t\t
  4104. \t\t\t.carousel-btn-ebay:active {
  4105. \t\t\t\ttransform: scale(0.95);
  4106. \t\t\t}
  4107. \t\t\t
  4108. \t\t\t.carousel-indicator-ebay:hover {
  4109. \t\t\t\ttransform: none;
  4110. \t\t\t}
  4111. \t\t}
  4112. \t\t.carousel-btn-ebay:active {
  4113. \t\t\ttransform: translateY(-1px) scale(1.05);
  4114. \t\t\tbox-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
  4115. \t\t}
  4116. \t\t
  4117. \t\t/* Désactiver les effets hover sur mobile pour éviter les problèmes tactiles */
  4118. \t\t@media (hover: none) and (pointer: coarse) {
  4119. \t\t\t.carousel-btn-ebay:hover {
  4120. \t\t\t\ttransform: none;
  4121. \t\t\t}
  4122. \t\t\t
  4123. \t\t\t.carousel-btn-ebay:active {
  4124. \t\t\t\ttransform: scale(0.95);
  4125. \t\t\t}
  4126. \t\t\t
  4127. \t\t\t.carousel-indicator-ebay:hover {
  4128. \t\t\t\ttransform: none;
  4129. \t\t\t}
  4130. \t\t}
  4131. \t\t.carousel-btn-ebay:disabled {
  4132. \t\t\topacity: 0.4;
  4133. \t\t\tcursor: not-allowed;
  4134. \t\t\ttransform: none;
  4135. \t\t}
  4136. \t\t.carousel-btn-ebay i {
  4137. \t\t\tposition: relative;
  4138. \t\t\tz-index: 10;
  4139. \t\t\ttransition: transform 0.3s ease;
  4140. \t\t\tdisplay: inline-block;
  4141. \t\t\tline-height: 1;
  4142. \t\t}
  4143. \t\t.carousel-btn-ebay:hover i {
  4144. \t\t\ttransform: scale(1.15);
  4145. \t\t}
  4146. \t\t
  4147. \t\t.carousel-btn-ebay.pause-btn i,
  4148. \t\t.carousel-btn-ebay.pause-btn #pauseIcon {
  4149. \t\t\tz-index: 10 !important;
  4150. \t\t\tcolor: white !important;
  4151. \t\t\tdisplay: inline-block !important;
  4152. \t\t\tvisibility: visible !important;
  4153. \t\t\topacity: 1 !important;
  4154. \t\t}
  4155. \t\t.carousel-btn-ebay.prev-btn,
  4156. \t\t.carousel-btn-ebay.next-btn {
  4157. \t\t\tbackground: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(255, 255, 255, 0.92) 100%);
  4158. \t\t\tcolor: #333;
  4159. \t\t}
  4160. \t\t.carousel-btn-ebay.prev-btn:hover,
  4161. \t\t.carousel-btn-ebay.next-btn:hover {
  4162. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  4163. \t\t\tcolor: white;
  4164. \t\t}
  4165. \t\t.carousel-btn-ebay.pause-btn {
  4166. \t\t\tbackground: linear-gradient(135deg, rgba(220, 53, 69, 0.95) 0%, rgba(200, 35, 51, 0.95) 100%);
  4167. \t\t\tcolor: white !important;
  4168. \t\t}
  4169. \t\t.carousel-btn-ebay.pause-btn:hover {
  4170. \t\t\tbackground: linear-gradient(135deg, #dc3545 0%, #c82333 100%);
  4171. \t\t\tcolor: white !important;
  4172. \t\t}
  4173. \t\t.carousel-btn-ebay.pause-btn.playing {
  4174. \t\t\tbackground: linear-gradient(135deg, rgba(40, 167, 69, 0.95) 0%, rgba(33, 136, 56, 0.95) 100%);
  4175. \t\t\tcolor: white !important;
  4176. \t\t}
  4177. \t\t.carousel-btn-ebay.pause-btn.playing:hover {
  4178. \t\t\tbackground: linear-gradient(135deg, #28a745 0%, #218838 100%);
  4179. \t\t\tcolor: white !important;
  4180. \t\t}
  4181. \t\t/* Style spécifique pour l'icône du bouton pause - Utilisation directe d'Unicode */
  4182. \t\t.carousel-btn-ebay.pause-btn {
  4183. \t\t\ttext-align: center;
  4184. \t\t\tposition: relative;
  4185. \t\t\tdisplay: flex;
  4186. \t\t\talign-items: center;
  4187. \t\t\tjustify-content: center;
  4188. \t\t}
  4189. \t\t
  4190. \t\t.carousel-btn-ebay.pause-btn #pauseIcon,
  4191. \t\t.carousel-btn-ebay.pause-btn .pause-icon-content {
  4192. \t\t\tdisplay: block !important;
  4193. \t\t\tcolor: white !important;
  4194. \t\t\tfont-size: 24px !important;
  4195. \t\t\tline-height: 1 !important;
  4196. \t\t\twidth: auto !important;
  4197. \t\t\theight: auto !important;
  4198. \t\t\tposition: static !important;
  4199. \t\t\ttext-align: center !important;
  4200. \t\t\tz-index: 10 !important;
  4201. \t\t\tvisibility: visible !important;
  4202. \t\t\topacity: 1 !important;
  4203. \t\t\tpointer-events: none !important;
  4204. \t\t\tfont-family: Arial, \"Segoe UI\", sans-serif !important;
  4205. \t\t\tfont-weight: normal !important;
  4206. \t\t\tmargin: 0 !important;
  4207. \t\t\tpadding: 0 !important;
  4208. \t\t}
  4209. \t\t/* Indicateurs eBay-style améliorés - Positionnés en bas à gauche */
  4210. \t\t.carousel-indicators-ebay {
  4211. \t\t\tposition: absolute;
  4212. \t\t\tbottom: 20px;
  4213. \t\t\tleft: 50%;
  4214. \t\t\ttransform: translateX(-50%);
  4215. \t\t\tdisplay: flex;
  4216. \t\t\tgap: 10px;
  4217. \t\t\tz-index: 10;
  4218. \t\t\tbackground: rgba(0, 0, 0, 0.4);
  4219. \t\t\tpadding: 8px 14px;
  4220. \t\t\tborder-radius: 25px;
  4221. \t\t\tbackdrop-filter: blur(8px);
  4222. \t\t\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
  4223. \t\t}
  4224. \t\t.carousel-indicator-ebay {
  4225. \t\t\twidth: 10px;
  4226. \t\t\theight: 10px;
  4227. \t\t\tborder-radius: 50%;
  4228. \t\t\tbackground: rgba(255, 255, 255, 0.5);
  4229. \t\t\tborder: 2px solid rgba(255, 255, 255, 0.8);
  4230. \t\t\tcursor: pointer;
  4231. \t\t\ttransition: all 0.3s ease;
  4232. \t\t}
  4233. \t\t.carousel-indicator-ebay.active {
  4234. \t\t\tbackground: white !important;
  4235. \t\t\tborder-color: #ffa200 !important;
  4236. \t\t\ttransform: scale(1.3) !important;
  4237. \t\t\tbox-shadow: 0 0 8px rgba(255, 162, 0, 0.6) !important;
  4238. \t\t}
  4239. \t\t.carousel-indicator-ebay:hover {
  4240. \t\t\tbackground: rgba(255, 255, 255, 0.8);
  4241. \t\t\ttransform: scale(1.1);
  4242. \t\t}
  4243. \t\t/* Styles eBay-style pour les détails de boutique */
  4244. \t\t.shop-avatar-container-ebay {
  4245. \t\t\tposition: relative;
  4246. \t\t\tmargin-right: 20px;
  4247. \t\t}
  4248. \t\t.shop-avatar-ebay {
  4249. \t\t\twidth: 100px;
  4250. \t\t\theight: 100px;
  4251. \t\t\tborder-radius: 12px;
  4252. \t\t\tobject-fit: cover;
  4253. \t\t\tborder: 3px solid white;
  4254. \t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  4255. \t\t\ttransition: transform 0.3s ease;
  4256. \t\t}
  4257. \t\t.shop-avatar-ebay:hover {
  4258. \t\t\ttransform: scale(1.05);
  4259. \t\t}
  4260. \t\t.shop-avatar-placeholder {
  4261. \t\t\tbackground: linear-gradient(135deg, #f0f0f0 0%, #e0e0e0 100%);
  4262. \t\t\tdisplay: flex;
  4263. \t\t\talign-items: center;
  4264. \t\t\tjustify-content: center;
  4265. \t\t\tfont-size: 2.5rem;
  4266. \t\t\tcolor: #999;
  4267. \t\t}
  4268. \t\t.verified-badge-ebay {
  4269. \t\t\tposition: absolute;
  4270. \t\t\tbottom: -5px;
  4271. \t\t\tright: -5px;
  4272. \t\t\tbackground: #28a745;
  4273. \t\t\tcolor: white;
  4274. \t\t\twidth: 24px;
  4275. \t\t\theight: 24px;
  4276. \t\t\tborder-radius: 50%;
  4277. \t\t\tdisplay: flex;
  4278. \t\t\talign-items: center;
  4279. \t\t\tjustify-content: center;
  4280. \t\t\tfont-size: 12px;
  4281. \t\t\tborder: 2px solid white;
  4282. \t\t}
  4283. \t\t.shop-info-ebay {
  4284. \t\t\tpadding: 0;
  4285. \t\t}
  4286. \t\t.shop-name-section {
  4287. \t\t\tmargin-bottom: 12px;
  4288. \t\t}
  4289. \t\t.shop-name-ebay {
  4290. \t\t\tfont-size: 2.2rem;
  4291. \t\t\tfont-weight: 800;
  4292. \t\t\tbackground: linear-gradient(135deg, #333 0%, #555 100%);
  4293. \t\t\t-webkit-background-clip: text;
  4294. \t\t\t-webkit-text-fill-color: transparent;
  4295. \t\t\tbackground-clip: text;
  4296. \t\t\tmargin: 0;
  4297. \t\t\tline-height: 1.2;
  4298. \t\t\tword-wrap: break-word;
  4299. \t\t\toverflow-wrap: break-word;
  4300. \t\t\thyphens: auto;
  4301. \t\t\tletter-spacing: -0.5px;
  4302. \t\t}
  4303. \t\t.verified-text {
  4304. \t\t\tbackground: linear-gradient(135deg, #28a745 0%, #20c997 100%);
  4305. \t\t\t-webkit-background-clip: text;
  4306. \t\t\t-webkit-text-fill-color: transparent;
  4307. \t\t\tbackground-clip: text;
  4308. \t\t\tfont-size: 0.9rem;
  4309. \t\t\tfont-weight: 600;
  4310. \t\t\tdisplay: inline-flex;
  4311. \t\t\talign-items: center;
  4312. \t\t\tgap: 4px;
  4313. \t\t\tword-wrap: break-word;
  4314. \t\t\toverflow-wrap: break-word;
  4315. \t\t\tline-height: 1.4;
  4316. \t\t\twhite-space: normal;
  4317. \t\t\tflex-wrap: wrap;
  4318. \t\t\tmax-width: 100%;
  4319. \t\t}
  4320. \t\t.verified-text i {
  4321. \t\t\t-webkit-text-fill-color: #28a745;
  4322. \t\t\tcolor: #28a745;
  4323. \t\t\tflex-shrink: 0;
  4324. \t\t}
  4325. \t\t.shop-category-ebay {
  4326. \t\t\tbackground: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
  4327. \t\t\tcolor: #666;
  4328. \t\t\tpadding: 6px 14px;
  4329. \t\t\tborder-radius: 20px;
  4330. \t\t\tfont-size: 0.875rem;
  4331. \t\t\tfont-weight: 500;
  4332. \t\t\tdisplay: inline-block;
  4333. \t\t\tborder: 1px solid #dee2e6;
  4334. \t\t\tword-wrap: break-word;
  4335. \t\t\toverflow-wrap: break-word;
  4336. \t\t\tmax-width: 100%;
  4337. \t\t\tline-height: 1.4;
  4338. \t\t\twhite-space: normal;
  4339. \t\t}
  4340. \t\t.shop-stats-ebay {
  4341. \t\t\tmargin-top: 16px;
  4342. \t\t}
  4343. \t\t.stat-row {
  4344. \t\t\tdisplay: flex;
  4345. \t\t\tgap: 32px;
  4346. \t\t\tmargin-bottom: 12px;
  4347. \t\t\tflex-wrap: wrap;
  4348. \t\t}
  4349. \t\t.stat-item-ebay {
  4350. \t\t\tdisplay: flex;
  4351. \t\t\tflex-direction: column;
  4352. \t\t\talign-items: flex-start;
  4353. \t\t\tmin-width: 100px;
  4354. \t\t}
  4355. \t\t.stat-percentage {
  4356. \t\t\tfont-size: 1.4rem;
  4357. \t\t\tfont-weight: 800;
  4358. \t\t\tbackground: linear-gradient(135deg, #28a745 0%, #20c997 100%);
  4359. \t\t\t-webkit-background-clip: text;
  4360. \t\t\t-webkit-text-fill-color: transparent;
  4361. \t\t\tbackground-clip: text;
  4362. \t\t\tline-height: 1.1;
  4363. \t\t\tmargin-bottom: 4px;
  4364. \t\t\tword-wrap: break-word;
  4365. \t\t\toverflow-wrap: break-word;
  4366. \t\t}
  4367. \t\t.stat-number-ebay {
  4368. \t\t\tfont-size: 1.4rem;
  4369. \t\t\tfont-weight: 800;
  4370. \t\t\tbackground: linear-gradient(135deg, #333 0%, #555 100%);
  4371. \t\t\t-webkit-background-clip: text;
  4372. \t\t\t-webkit-text-fill-color: transparent;
  4373. \t\t\tbackground-clip: text;
  4374. \t\t\tline-height: 1.1;
  4375. \t\t\tmargin-bottom: 4px;
  4376. \t\t\tword-wrap: break-word;
  4377. \t\t\toverflow-wrap: break-word;
  4378. \t\t}
  4379. \t\t.stat-label-ebay {
  4380. \t\t\tfont-size: 0.75rem;
  4381. \t\t\tcolor: #6c757d;
  4382. \t\t\ttext-transform: uppercase;
  4383. \t\t\tletter-spacing: 0.8px;
  4384. \t\t\tfont-weight: 600;
  4385. \t\t\tmargin-top: 0;
  4386. \t\t\tline-height: 1.3;
  4387. \t\t\tword-wrap: break-word;
  4388. \t\t\toverflow-wrap: break-word;
  4389. \t\t\ttext-align: left;
  4390. \t\t\thyphens: auto;
  4391. \t\t\tmax-width: 100%;
  4392. \t\t}
  4393. \t\t.shop-additional-info {
  4394. \t\t\tdisplay: flex;
  4395. \t\t\tflex-wrap: wrap;
  4396. \t\t\tgap: 12px 20px;
  4397. \t\t\tfont-size: 0.875rem;
  4398. \t\t\tcolor: #495057;
  4399. \t\t\tmargin-top: 12px;
  4400. \t\t\tpadding-top: 16px;
  4401. \t\t\tborder-top: 1px solid #e9ecef;
  4402. \t\t\tline-height: 1.5;
  4403. \t\t\tword-wrap: break-word;
  4404. \t\t\toverflow-wrap: break-word;
  4405. \t\t}
  4406. \t\t.member-since {
  4407. \t\t\tfont-weight: 500;
  4408. \t\t\tdisplay: inline-flex;
  4409. \t\t\talign-items: center;
  4410. \t\t\twhite-space: normal;
  4411. \t\t\tpadding: 6px 12px;
  4412. \t\t\tbackground: #f8f9fa;
  4413. \t\t\tborder-radius: 8px;
  4414. \t\t\ttransition: all 0.3s ease;
  4415. \t\t\tborder: 1px solid transparent;
  4416. \t\t\tword-wrap: break-word;
  4417. \t\t\toverflow-wrap: break-word;
  4418. \t\t\tline-height: 1.4;
  4419. \t\t\tmax-width: 100%;
  4420. \t\t\tflex-wrap: wrap;
  4421. \t\t\ttext-align: center;
  4422. \t\t}
  4423. \t\t.member-since:hover {
  4424. \t\t\tbackground: #e9ecef;
  4425. \t\t\tborder-color: #dee2e6;
  4426. \t\t\ttransform: translateY(-1px);
  4427. \t\t}
  4428. \t\t.member-since i {
  4429. \t\t\tcolor: #ffa200;
  4430. \t\t\tmargin-right: 6px;
  4431. \t\t\tfont-size: 0.95rem;
  4432. \t\t\ttransition: transform 0.3s ease;
  4433. \t\t\tflex-shrink: 0;
  4434. \t\t}
  4435. \t\t.member-since:hover i {
  4436. \t\t\ttransform: scale(1.2);
  4437. \t\t}
  4438. \t\t.location {
  4439. \t\t\tdisplay: flex;
  4440. \t\t\talign-items: center;
  4441. \t\t}
  4442. \t\t.shop-actions-ebay {
  4443. \t\t\tdisplay: flex;
  4444. \t\t\tflex-direction: column;
  4445. \t\t\tgap: 10px;
  4446. \t\t\tmin-width: 160px;
  4447. \t\t}
  4448. \t\t.btn-ebay {
  4449. \t\t\tpadding: 10px 18px;
  4450. \t\t\tfont-size: 0.9rem;
  4451. \t\t\tfont-weight: 500;
  4452. \t\t\tborder-radius: 6px;
  4453. \t\t\ttext-align: center;
  4454. \t\t\ttransition: all 0.3s ease;
  4455. \t\t\tborder-width: 1px;
  4456. \t\t\twhite-space: normal;
  4457. \t\t\tword-wrap: break-word;
  4458. \t\t\toverflow-wrap: break-word;
  4459. \t\t\tline-height: 1.4;
  4460. \t\t}
  4461. \t\t.btn-ebay:hover {
  4462. \t\t\ttransform: translateY(-2px);
  4463. \t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  4464. \t\t}
  4465. \t\t.btn-ebay i {
  4466. \t\t\tvertical-align: middle;
  4467. \t\t}
  4468. \t\t.btn-ebay.following {
  4469. \t\t\tbackground: #28a745;
  4470. \t\t\tborder-color: #28a745;
  4471. \t\t\tcolor: white;
  4472. \t\t}
  4473. \t\t/* Styles pour les avis */
  4474. \t\t.review-stats {
  4475. \t\t\tbackground: white;
  4476. \t\t\tborder-radius: 12px;
  4477. \t\t\tpadding: 20px;
  4478. \t\t\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
  4479. \t\t\tmargin-bottom: 20px;
  4480. \t\t}
  4481. \t\t.stat-card {
  4482. \t\t\tpadding: 15px;
  4483. \t\t}
  4484. \t\t.stat-number {
  4485. \t\t\tfont-size: 2.5rem;
  4486. \t\t\tfont-weight: 700;
  4487. \t\t\tcolor: #333;
  4488. \t\t\tmargin: 0;
  4489. \t\t}
  4490. \t\t.stat-label {
  4491. \t\t\tcolor: #666;
  4492. \t\t\tfont-size: 0.9rem;
  4493. \t\t\tmargin: 5px 0 0;
  4494. \t\t}
  4495. \t\t.rating-stars {
  4496. \t\t\tcolor: #ffc107;
  4497. \t\t\tfont-size: 1.2rem;
  4498. \t\t\tmargin: 10px 0;
  4499. \t\t}
  4500. \t\t.reviews-preview {
  4501. \t\t\tbackground: white;
  4502. \t\t\tborder-radius: 12px;
  4503. \t\t\tpadding: 20px;
  4504. \t\t\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
  4505. \t\t}
  4506. \t\t.review-item {
  4507. \t\t\tborder-bottom: 1px solid #f0f0f0;
  4508. \t\t\tpadding: 15px 0;
  4509. \t\t}
  4510. \t\t.review-item:last-child {
  4511. \t\t\tborder-bottom: none;
  4512. \t\t}
  4513. \t\t.review-header {
  4514. \t\t\tdisplay: flex;
  4515. \t\t\tjustify-content: space-between;
  4516. \t\t\talign-items: flex-start;
  4517. \t\t\tmargin-bottom: 10px;
  4518. \t\t}
  4519. \t\t.reviewer-info {
  4520. \t\t\tdisplay: flex;
  4521. \t\t\talign-items: center;
  4522. \t\t\tgap: 10px;
  4523. \t\t}
  4524. \t\t.reviewer-avatar {
  4525. \t\t\twidth: 40px;
  4526. \t\t\theight: 40px;
  4527. \t\t\tborder-radius: 50%;
  4528. \t\t\tbackground: #f8f9fa;
  4529. \t\t\tdisplay: flex;
  4530. \t\t\talign-items: center;
  4531. \t\t\tjustify-content: center;
  4532. \t\t\tcolor: #666;
  4533. \t\t}
  4534. \t\t.reviewer-name {
  4535. \t\t\tmargin: 0;
  4536. \t\t\tfont-size: 1rem;
  4537. \t\t\tfont-weight: 600;
  4538. \t\t}
  4539. \t\t.review-rating {
  4540. \t\t\tcolor: #ffc107;
  4541. \t\t\tfont-size: 0.9rem;
  4542. \t\t}
  4543. \t\t.review-meta {
  4544. \t\t\ttext-align: right;
  4545. \t\t}
  4546. \t\t.review-date {
  4547. \t\t\tcolor: #666;
  4548. \t\t\tfont-size: 0.8rem;
  4549. \t\t}
  4550. \t\t.verified-badge {
  4551. \t\t\tdisplay: inline-block;
  4552. \t\t\tbackground: #28a745;
  4553. \t\t\tcolor: white;
  4554. \t\t\tpadding: 2px 8px;
  4555. \t\t\tborder-radius: 12px;
  4556. \t\t\tfont-size: 0.7rem;
  4557. \t\t\tmargin-left: 10px;
  4558. \t\t}
  4559. \t\t.review-comment {
  4560. \t\t\tmargin: 10px 0 0;
  4561. \t\t\tline-height: 1.5;
  4562. \t\t\tcolor: #333;
  4563. \t\t}
  4564. \t\t.review-actions-card {
  4565. \t\t\tbackground: white;
  4566. \t\t\tborder-radius: 12px;
  4567. \t\t\tpadding: 20px;
  4568. \t\t\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
  4569. \t\t\ttext-align: center;
  4570. \t\t}
  4571. \t\t.shop-banner-overlay {
  4572. \t\t\tposition: absolute;
  4573. \t\t\ttop: 0;
  4574. \t\t\tleft: 0;
  4575. \t\t\tright: 0;
  4576. \t\t\tbottom: 0;
  4577. \t\t\tbackground: rgba(0, 0, 0, 0.3);
  4578. \t\t\tz-index: 1;
  4579. \t\t}
  4580. \t\t.shop-header-content {
  4581. \t\t\tbackground: white;
  4582. \t\t\tborder: 1px solid #e1e1e1;
  4583. \t\t\tborder-radius: 4px;
  4584. \t\t\tpadding: 20px;
  4585. \t\t\tmargin: 0 20px 20px;
  4586. \t\t\tbox-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  4587. \t\t\tposition: relative;
  4588. \t\t\tz-index: 2;
  4589. \t\t}
  4590. \t\t.shop-avatar {
  4591. \t\t\twidth: 80px;
  4592. \t\t\theight: 80px;
  4593. \t\t\tborder-radius: 4px;
  4594. \t\t\tborder: 1px solid #e1e1e1;
  4595. \t\t\tobject-fit: cover;
  4596. \t\t\tposition: relative;
  4597. \t\t\tz-index: 3;
  4598. \t\t}
  4599. \t\t.shop-title {
  4600. \t\t\tfont-size: 1.5rem;
  4601. \t\t\tfont-weight: 600;
  4602. \t\t\tcolor: #333;
  4603. \t\t\tmargin-bottom: 8px;
  4604. \t\t}
  4605. \t\t.shop-subtitle {
  4606. \t\t\tcolor: #666;
  4607. \t\t\tfont-size: 0.9rem;
  4608. \t\t\tmargin-bottom: 15px;
  4609. \t\t}
  4610. \t\t.shop-stats-row {
  4611. \t\t\tdisplay: flex;
  4612. \t\t\talign-items: center;
  4613. \t\t\tgap: 20px;
  4614. \t\t\tflex-wrap: wrap;
  4615. \t\t\tmargin-bottom: 15px;
  4616. \t\t}
  4617. \t\t.shop-stat-item {
  4618. \t\t\tdisplay: flex;
  4619. \t\t\talign-items: center;
  4620. \t\t\tgap: 5px;
  4621. \t\t\tfont-size: 0.9rem;
  4622. \t\t}
  4623. \t\t.positive-feedback {
  4624. \t\t\tcolor: #007bff;
  4625. \t\t\tfont-weight: 600;
  4626. \t\t}
  4627. \t\t.items-sold {
  4628. \t\t\tcolor: #666;
  4629. \t\t}
  4630. \t\t.followers-count {
  4631. \t\t\tcolor: #666;
  4632. \t\t}
  4633. \t\t.shop-badges {
  4634. \t\t\tdisplay: flex;
  4635. \t\t\tgap: 10px;
  4636. \t\t\tmargin-bottom: 15px;
  4637. \t\t}
  4638. \t\t.shop-badge {
  4639. \t\t\tbackground: #f0f0f0;
  4640. \t\t\tcolor: #333;
  4641. \t\t\tpadding: 4px 8px;
  4642. \t\t\tborder-radius: 3px;
  4643. \t\t\tfont-size: 0.8rem;
  4644. \t\t\tfont-weight: 500;
  4645. \t\t}
  4646. \t\t.shop-badge.verified {
  4647. \t\t\tbackground: #d4edda;
  4648. \t\t\tcolor: #155724;
  4649. \t\t}
  4650. \t\t.shop-badge.premium {
  4651. \t\t\tbackground: #fff3cd;
  4652. \t\t\tcolor: #856404;
  4653. \t\t}
  4654. \t\t.shop-actions-row {
  4655. \t\t\tdisplay: flex;
  4656. \t\t\talign-items: center;
  4657. \t\t\tgap: 15px;
  4658. \t\t\tflex-wrap: wrap;
  4659. \t\t}
  4660. \t\t.shop-action-btn {
  4661. \t\t\tbackground: #007bff;
  4662. \t\t\tcolor: white;
  4663. \t\t\tborder: none;
  4664. \t\t\tpadding: 8px 16px;
  4665. \t\t\tborder-radius: 3px;
  4666. \t\t\tfont-size: 0.9rem;
  4667. \t\t\tfont-weight: 500;
  4668. \t\t\tcursor: pointer;
  4669. \t\t\ttransition: background-color 0.2s;
  4670. \t\t\ttext-decoration: none;
  4671. \t\t\tdisplay: inline-flex;
  4672. \t\t\talign-items: center;
  4673. \t\t\tgap: 5px;
  4674. \t\t}
  4675. \t\t.shop-action-btn:hover {
  4676. \t\t\tbackground: #0056b3;
  4677. \t\t\tcolor: white;
  4678. \t\t}
  4679. \t\t.shop-action-btn.following {
  4680. \t\t\tbackground: #28a745;
  4681. \t\t}
  4682. \t\t.shop-action-btn.following:hover {
  4683. \t\t\tbackground: #1e7e34;
  4684. \t\t}
  4685. \t\t.shop-action-btn.secondary {
  4686. \t\t\tbackground: #6c757d;
  4687. \t\t}
  4688. \t\t.shop-action-btn.secondary:hover {
  4689. \t\t\tbackground: #545b62;
  4690. \t\t}
  4691. \t\t/* Onglets eBay-style avec classes Karma */
  4692. \t\t.shop-tabs {
  4693. \t\t\tbackground: white;
  4694. \t\t\tborder: 1px solid #e1e1e1;
  4695. \t\t\tborder-top: none;
  4696. \t\t\tborder-radius: 0 0 4px 4px;
  4697. \t\t\tmargin-top: 0;
  4698. \t\t}
  4699. \t\t.shop-tabs-nav {
  4700. \t\t\tdisplay: flex;
  4701. \t\t\tborder-bottom: 1px solid #e1e1e1;
  4702. \t\t\tmargin: 0;
  4703. \t\t\tpadding: 0;
  4704. \t\t\tlist-style: none;
  4705. \t\t\tbackground: #f8f9fa;
  4706. \t\t}
  4707. \t\t.shop-tab {
  4708. \t\t\tmargin: 0;
  4709. \t\t}
  4710. \t\t.shop-tab-link {
  4711. \t\t\tdisplay: block;
  4712. \t\t\tpadding: 12px 20px;
  4713. \t\t\tcolor: #000000;
  4714. \t\t\ttext-decoration: none;
  4715. \t\t\tborder-bottom: 2px solid transparent;
  4716. \t\t\ttransition: all 0.2s;
  4717. \t\t\tfont-weight: 500;
  4718. \t\t\tfont-size: 1rem;
  4719. \t\t}
  4720. \t\t.shop-tab-link:hover,
  4721. \t\t.shop-tab-link.active {
  4722. \t\t\tcolor: #095ad3;
  4723. \t\t\tborder-bottom-color: #095ad3;
  4724. \t\t\tbackground: #ffa200;
  4725. \t\t}
  4726. \t\t.shop-tab-content {
  4727. \t\t\tpadding: 30px;
  4728. \t\t\tmin-height: 400px;
  4729. \t\t}
  4730. \t\t.shop-tab-content:not(.active) {
  4731. \t\t\tdisplay: none;
  4732. \t\t}
  4733. \t\t.shop-tab-content.active {
  4734. \t\t\tdisplay: block;
  4735. \t\t}
  4736. \t\t/* Cards d'information avec style Karma */
  4737. \t\t.shop-info-card {
  4738. \t\t\tbackground: #f8f9fa;
  4739. \t\t\tborder: 1px solid #e1e1e1;
  4740. \t\t\tborder-radius: 4px;
  4741. \t\t\tpadding: 20px;
  4742. \t\t\tmargin-bottom: 20px;
  4743. \t\t}
  4744. \t\t.shop-info-card h6 {
  4745. \t\t\tcolor: #333;
  4746. \t\t\tfont-weight: 600;
  4747. \t\t\tmargin-bottom: 15px;
  4748. \t\t\tfont-size: 1.1rem;
  4749. \t\t}
  4750. \t\t.shop-info-card p {
  4751. \t\t\tcolor: #666;
  4752. \t\t\tfont-size: 0.9rem;
  4753. \t\t\tmargin: 0;
  4754. \t\t\tline-height: 1.5;
  4755. \t\t}
  4756. \t\t.shop-contact-info {
  4757. \t\t\tdisplay: flex;
  4758. \t\t\tflex-direction: column;
  4759. \t\t\tgap: 10px;
  4760. \t\t}
  4761. \t\t.shop-contact-item {
  4762. \t\t\tdisplay: flex;
  4763. \t\t\talign-items: center;
  4764. \t\t\tgap: 10px;
  4765. \t\t\tfont-size: 0.9rem;
  4766. \t\t\tcolor: #666;
  4767. \t\t\tpadding: 5px 0;
  4768. \t\t}
  4769. \t\t.shop-contact-item i {
  4770. \t\t\twidth: 16px;
  4771. \t\t\tcolor: #007bff;
  4772. \t\t\ttext-align: center;
  4773. \t\t}
  4774. \t\t.shop-social-links {
  4775. \t\t\tdisplay: flex;
  4776. \t\t\tgap: 10px;
  4777. \t\t\tmargin-top: 15px;
  4778. \t\t\tflex-wrap: wrap;
  4779. \t\t}
  4780. \t\t.shop-social-link {
  4781. \t\t\tdisplay: inline-flex;
  4782. \t\t\talign-items: center;
  4783. \t\t\tjustify-content: center;
  4784. \t\t\twidth: 36px;
  4785. \t\t\theight: 36px;
  4786. \t\t\tbackground: #f0f0f0;
  4787. \t\t\tcolor: #666;
  4788. \t\t\tborder-radius: 4px;
  4789. \t\t\ttext-decoration: none;
  4790. \t\t\ttransition: all 0.2s;
  4791. \t\t\tfont-size: 1.1rem;
  4792. \t\t}
  4793. \t\t.shop-social-link:hover {
  4794. \t\t\tbackground: #007bff;
  4795. \t\t\tcolor: white;
  4796. \t\t\ttransform: translateY(-2px);
  4797. \t\t}
  4798. \t\t/* Produits avec style Karma */
  4799. \t\t.product-card {
  4800. \t\t\tbackground: white;
  4801. \t\t\tborder: 1px solid #e1e1e1;
  4802. \t\t\tborder-radius: 4px;
  4803. \t\t\toverflow: hidden;
  4804. \t\t\ttransition: all 0.3s ease;
  4805. \t\t\tmargin-bottom: 20px;
  4806. \t\t}
  4807. \t\t.product-card:hover {
  4808. \t\t\ttransform: translateY(-2px);
  4809. \t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  4810. \t\t}
  4811. \t\t/* Animation de tri des produits */
  4812. \t\t.product-item {
  4813. \t\t\ttransition: all 0.3s ease;
  4814. \t\t}
  4815. \t\t.product-item.sorting {
  4816. \t\t\topacity: 0;
  4817. \t\t\ttransform: translateY(20px);
  4818. \t\t}
  4819. \t\t.product-item.sorted {
  4820. \t\t\topacity: 1;
  4821. \t\t\ttransform: translateY(0);
  4822. \t\t}
  4823. \t\t.product-image {
  4824. \t\t\theight: 200px;
  4825. \t\t\tbackground-size: cover;
  4826. \t\t\tbackground-position: center;
  4827. \t\t\tposition: relative;
  4828. \t\t\toverflow: hidden;
  4829. \t\t}
  4830. \t\t.product-info {
  4831. \t\t\tpadding: 15px;
  4832. \t\t}
  4833. \t\t.product-title {
  4834. \t\t\tfont-size: 1rem;
  4835. \t\t\tfont-weight: 600;
  4836. \t\t\tmargin-bottom: 8px;
  4837. \t\t\tcolor: #333;
  4838. \t\t\tline-height: 1.3;
  4839. \t\t}
  4840. \t\t.product-title a {
  4841. \t\t\tcolor: #333;
  4842. \t\t\ttext-decoration: none;
  4843. \t\t}
  4844. \t\t.product-title a:hover {
  4845. \t\t\tcolor: #007bff;
  4846. \t\t}
  4847. \t\t.product-price {
  4848. \t\t\tfont-size: 1.2rem;
  4849. \t\t\tfont-weight: bold;
  4850. \t\t\tcolor: #ff6b35;
  4851. \t\t\tmargin-bottom: 10px;
  4852. \t\t}
  4853. \t\t.product-meta {
  4854. \t\t\tdisplay: flex;
  4855. \t\t\tjustify-content: space-between;
  4856. \t\t\talign-items: center;
  4857. \t\t\tfont-size: 0.85rem;
  4858. \t\t\tcolor: #666;
  4859. \t\t}
  4860. \t\t.rating {
  4861. \t\t\tcolor: #ffc107;
  4862. \t\t}
  4863. \t\t/* Responsive avec classes Karma */
  4864. \t\t/* Responsive amélioré pour la page shop */
  4865. \t\t/* Tablettes et écrans moyens */
  4866. \t\t@media(max-width: 1200px) {
  4867. \t\t\t.shop-carousel-ebay {
  4868. \t\t\t\theight: 400px;
  4869. \t\t\t}
  4870. \t\t\t
  4871. \t\t\t.carousel-controls-ebay {
  4872. \t\t\t\tbottom: 18px;
  4873. \t\t\t\tright: 18px;
  4874. \t\t\t\tgap: 11px;
  4875. \t\t\t}
  4876. \t\t\t
  4877. \t\t\t.carousel-btn-ebay {
  4878. \t\t\t\twidth: 48px;
  4879. \t\t\t\theight: 48px;
  4880. \t\t\t\tfont-size: 21px;
  4881. \t\t\t}
  4882. \t\t\t
  4883. \t\t\t.carousel-indicators-ebay {
  4884. \t\t\t\tbottom: 18px;
  4885. \t\t\t\tpadding: 7px 13px;
  4886. \t\t\t}
  4887. \t\t\t
  4888. \t\t\t.carousel-indicator-ebay {
  4889. \t\t\t\twidth: 9px;
  4890. \t\t\t\theight: 9px;
  4891. \t\t\t}
  4892. \t\t}
  4893. \t\t
  4894. \t\t@media(max-width: 991.98px) {
  4895. \t\t\t.shop-carousel-ebay {
  4896. \t\t\t\tmargin: 0 10px;
  4897. \t\t\t\theight: 380px;
  4898. \t\t\t}
  4899. \t\t\t
  4900. \t\t\t.carousel-controls-ebay {
  4901. \t\t\t\tbottom: 16px;
  4902. \t\t\t\tright: 16px;
  4903. \t\t\t\tgap: 10px;
  4904. \t\t\t}
  4905. \t\t\t
  4906. \t\t\t.carousel-btn-ebay {
  4907. \t\t\t\twidth: 46px;
  4908. \t\t\t\theight: 46px;
  4909. \t\t\t\tfont-size: 20px;
  4910. \t\t\t}
  4911. \t\t\t
  4912. \t\t\t.carousel-indicators-ebay {
  4913. \t\t\t\tbottom: 16px;
  4914. \t\t\t\tleft: 50%;
  4915. \t\t\t\ttransform: translateX(-50%);
  4916. \t\t\t\tpadding: 6px 12px;
  4917. \t\t\t}
  4918. \t\t\t
  4919. \t\t\t.carousel-indicator-ebay {
  4920. \t\t\t\twidth: 9px;
  4921. \t\t\t\theight: 9px;
  4922. \t\t\t}
  4923. \t\t\t
  4924. \t\t\t.shop-header-content {
  4925. \t\t\t\tpadding: 20px;
  4926. \t\t\t\tmargin: 0 10px 20px;
  4927. \t\t\t}
  4928. \t\t\t
  4929. \t\t\t.shop-header-content .row {
  4930. \t\t\t\tflex-wrap: wrap;
  4931. \t\t\t}
  4932. \t\t\t
  4933. \t\t\t.shop-info-ebay {
  4934. \t\t\t\tmargin-top: 0;
  4935. \t\t\t\ttext-align: center;
  4936. \t\t\t}
  4937. \t\t\t.shop-name-ebay {
  4938. \t\t\t\tfont-size: 1.75rem;
  4939. \t\t\t\tline-height: 1.3;
  4940. \t\t\t}
  4941. \t\t\t.verified-text {
  4942. \t\t\t\tfont-size: 0.85rem;
  4943. \t\t\t}
  4944. \t\t\t.shop-category-ebay {
  4945. \t\t\t\tfont-size: 0.8rem;
  4946. \t\t\t\tpadding: 5px 12px;
  4947. \t\t\t}
  4948. \t\t\t.stat-row {
  4949. \t\t\t\tjustify-content: center;
  4950. \t\t\t\tgap: 20px;
  4951. \t\t\t}
  4952. \t\t\t.stat-item-ebay {
  4953. \t\t\t\talign-items: center;
  4954. \t\t\t\tmin-width: 90px;
  4955. \t\t\t}
  4956. \t\t\t.stat-percentage,
  4957. \t\t\t.stat-number-ebay {
  4958. \t\t\t\tfont-size: 1.15rem;
  4959. \t\t\t}
  4960. \t\t\t.stat-label-ebay {
  4961. \t\t\t\tfont-size: 0.75rem;
  4962. \t\t\t\ttext-align: center;
  4963. \t\t\t}
  4964. \t\t\t.shop-additional-info {
  4965. \t\t\t\tjustify-content: center;
  4966. \t\t\t\tgap: 12px 18px;
  4967. \t\t\t\tfont-size: 0.8rem;
  4968. \t\t\t}
  4969. \t\t\t.member-since {
  4970. \t\t\t\tfont-size: 0.8rem;
  4971. \t\t\t}
  4972. \t\t\t.shop-actions-ebay {
  4973. \t\t\t\tmin-width: auto;
  4974. \t\t\t}
  4975. \t\t}
  4976. \t\t
  4977. \t\t@media(max-width: 768px) {
  4978. \t\t\t.shop-banner,
  4979. \t\t\t.shop-carousel-ebay {
  4980. \t\t\t\theight: 300px;
  4981. \t\t\t\tmargin: 0;
  4982. \t\t\t\tborder-radius: 0;
  4983. \t\t\t}
  4984. \t\t\t
  4985. \t\t\t.shop-carousel-ebay .carousel-container {
  4986. \t\t\t\tborder-radius: 0;
  4987. \t\t\t}
  4988. \t\t\t.carousel-controls-ebay {
  4989. \t\t\t\tbottom: 12px;
  4990. \t\t\t\tright: 12px;
  4991. \t\t\t\tgap: 8px;
  4992. \t\t\t}
  4993. \t\t\t.carousel-btn-ebay {
  4994. \t\t\t\twidth: 40px;
  4995. \t\t\t\theight: 40px;
  4996. \t\t\t\tfont-size: 16px;
  4997. \t\t\t}
  4998. \t\t\t
  4999. \t\t\t.carousel-btn-ebay #pauseIcon,
  5000. \t\t\t.carousel-btn-ebay .pause-icon-content {
  5001. \t\t\t\tfont-size: 18px !important;
  5002. \t\t\t}
  5003. \t\t\t.carousel-indicators-ebay {
  5004. \t\t\t\tbottom: 12px;
  5005. \t\t\t\tleft: 50%;
  5006. \t\t\t\ttransform: translateX(-50%);
  5007. \t\t\t\tgap: 6px;
  5008. \t\t\t\tpadding: 5px 10px;
  5009. \t\t\t}
  5010. \t\t\t
  5011. \t\t\t.carousel-indicator-ebay {
  5012. \t\t\t\twidth: 8px;
  5013. \t\t\t\theight: 8px;
  5014. \t\t\t}
  5015. \t\t\t.shop-header-content {
  5016. \t\t\t\tpadding: 20px 16px;
  5017. \t\t\t\tmargin: 0;
  5018. \t\t\t\tborder-radius: 0;
  5019. \t\t\t}
  5020. \t\t\t.shop-header-content .row {
  5021. \t\t\t\tflex-direction: column;
  5022. \t\t\t\ttext-align: center;
  5023. \t\t\t}
  5024. \t\t\t.shop-avatar-container-ebay {
  5025. \t\t\t\tmargin: 0 auto 16px;
  5026. \t\t\t}
  5027. \t\t\t.shop-avatar-ebay {
  5028. \t\t\t\twidth: 90px;
  5029. \t\t\t\theight: 90px;
  5030. \t\t\t}
  5031. \t\t\t.shop-name-ebay {
  5032. \t\t\t\tfont-size: 1.5rem;
  5033. \t\t\t\tmargin-bottom: 8px;
  5034. \t\t\t\tline-height: 1.3;
  5035. \t\t\t\tword-break: break-word;
  5036. \t\t\t\thyphens: auto;
  5037. \t\t\t\tmax-width: 100%;
  5038. \t\t\t}
  5039. \t\t\t.shop-name-section {
  5040. \t\t\t\tmargin-bottom: 10px;
  5041. \t\t\t}
  5042. \t\t\t.verified-text {
  5043. \t\t\t\tfont-size: 0.8rem;
  5044. \t\t\t\twhite-space: normal;
  5045. \t\t\t\tjustify-content: center;
  5046. \t\t\t\tflex-wrap: wrap;
  5047. \t\t\t\tline-height: 1.4;
  5048. \t\t\t}
  5049. \t\t\t.verified-text i {
  5050. \t\t\t\tfont-size: 0.85rem;
  5051. \t\t\t}
  5052. \t\t\t.shop-category-ebay {
  5053. \t\t\t\tfont-size: 0.75rem;
  5054. \t\t\t\tpadding: 5px 10px;
  5055. \t\t\t\tmax-width: 100%;
  5056. \t\t\t\tline-height: 1.3;
  5057. \t\t\t\tword-break: break-word;
  5058. \t\t\t}
  5059. \t\t\t.shop-info-ebay {
  5060. \t\t\t\ttext-align: center;
  5061. \t\t\t}
  5062. \t\t\t.stat-row {
  5063. \t\t\t\tjustify-content: center;
  5064. \t\t\t\tgap: 10px;
  5065. \t\t\t\tflex-wrap: wrap;
  5066. \t\t\t}
  5067. \t\t\t
  5068. \t\t\t.stat-item-ebay {
  5069. \t\t\t\talign-items: center;
  5070. \t\t\t\tmin-width: 75px;
  5071. \t\t\t\tflex: 0 1 auto;
  5072. \t\t\t\tpadding: 10px 8px;
  5073. \t\t\t}
  5074. \t\t\t.stat-percentage,
  5075. \t\t\t.stat-number-ebay {
  5076. \t\t\t\tfont-size: 1rem;
  5077. \t\t\t\tline-height: 1.1;
  5078. \t\t\t\tword-break: break-word;
  5079. \t\t\t}
  5080. \t\t\t.stat-label-ebay {
  5081. \t\t\t\tfont-size: 0.65rem;
  5082. \t\t\t\ttext-align: center;
  5083. \t\t\t\tline-height: 1.2;
  5084. \t\t\t\tletter-spacing: 0.3px;
  5085. \t\t\t\tword-break: break-word;
  5086. \t\t\t\thyphens: auto;
  5087. \t\t\t}
  5088. \t\t\t.shop-additional-info {
  5089. \t\t\t\tjustify-content: center;
  5090. \t\t\t\tflex-wrap: wrap;
  5091. \t\t\t\tgap: 8px 10px;
  5092. \t\t\t\tfont-size: 0.75rem;
  5093. \t\t\t\tline-height: 1.4;
  5094. \t\t\t}
  5095. \t\t\t.member-since {
  5096. \t\t\t\tflex-direction: row;
  5097. \t\t\t\ttext-align: center;
  5098. \t\t\t\tgap: 4px;
  5099. \t\t\t\twhite-space: normal;
  5100. \t\t\t\tfont-size: 0.75rem;
  5101. \t\t\t\tline-height: 1.4;
  5102. \t\t\t\tpadding: 5px 8px;
  5103. \t\t\t\tword-break: break-word;
  5104. \t\t\t}
  5105. \t\t\t.member-since i {
  5106. \t\t\t\tmargin-right: 4px;
  5107. \t\t\t\tfont-size: 0.85rem;
  5108. \t\t\t\tflex-shrink: 0;
  5109. \t\t\t}
  5110. \t\t\t.shop-actions-ebay {
  5111. \t\t\t\tflex-direction: column;
  5112. \t\t\t\tjustify-content: center;
  5113. \t\t\t\tmin-width: auto;
  5114. \t\t\t\tmargin-top: 20px;
  5115. \t\t\t\twidth: 100%;
  5116. \t\t\t}
  5117. \t\t\t.btn-ebay {
  5118. \t\t\t\twidth: 100%;
  5119. \t\t\t\tmin-width: auto;
  5120. \t\t\t}
  5121. \t\t\t.shop-actions-ebay .d-flex {
  5122. \t\t\t\twidth: 100%;
  5123. \t\t\t}
  5124. \t\t\t.btn-shop,
  5125. \t\t\t.shop-action-btn {
  5126. \t\t\t\twidth: 100%;
  5127. \t\t\t\tmin-width: auto;
  5128. \t\t\t\theight: 45px;
  5129. \t\t\t\tfont-size: 0.9rem;
  5130. \t\t\t\tpadding: 12px 20px;
  5131. \t\t\t}
  5132. \t\t\t.shop-tabs-nav {
  5133. \t\t\t\tflex-wrap: wrap;
  5134. \t\t\t\tjustify-content: center;
  5135. \t\t\t}
  5136. \t\t\t
  5137. \t\t\t.shop-tab-link {
  5138. \t\t\t\tfont-size: 0.85rem;
  5139. \t\t\t\tpadding: 0.5rem 0.75rem;
  5140. \t\t\t\tflex: 1;
  5141. \t\t\t\tmin-width: auto;
  5142. \t\t\t}
  5143. \t\t\t
  5144. \t\t\t/* Produits responsive */
  5145. \t\t\t#products-container .product-item {
  5146. \t\t\t\tmargin-bottom: 20px;
  5147. \t\t\t}
  5148. \t\t\t
  5149. \t\t\t.product-card {
  5150. \t\t\t\tpadding: 15px;
  5151. \t\t\t}
  5152. \t\t\t
  5153. \t\t\t.product-title {
  5154. \t\t\t\tfont-size: 0.95rem;
  5155. \t\t\t}
  5156. \t\t\t
  5157. \t\t\t.product-price {
  5158. \t\t\t\tfont-size: 1.1rem;
  5159. \t\t\t}
  5160. \t\t\t
  5161. \t\t\t/* Détails de la boutique responsive */
  5162. \t\t\t.shop-info-ebay {
  5163. \t\t\t\ttext-align: center;
  5164. \t\t\t}
  5165. \t\t}
  5166. \t\t
  5167. \t\t@media(max-width: 575.98px) {
  5168. \t\t\t.shop-banner,
  5169. \t\t\t.shop-carousel-ebay {
  5170. \t\t\t\theight: 280px;
  5171. \t\t\t\tmargin: 0;
  5172. \t\t\t}
  5173. \t\t\t
  5174. \t\t\t.carousel-controls-ebay {
  5175. \t\t\t\tbottom: 10px;
  5176. \t\t\t\tright: 10px;
  5177. \t\t\t\tgap: 6px;
  5178. \t\t\t}
  5179. \t\t\t
  5180. \t\t\t.carousel-btn-ebay {
  5181. \t\t\t\twidth: 36px;
  5182. \t\t\t\theight: 36px;
  5183. \t\t\t\tfont-size: 14px;
  5184. \t\t\t}
  5185. \t\t\t
  5186. \t\t\t.carousel-btn-ebay #pauseIcon,
  5187. \t\t\t.carousel-btn-ebay .pause-icon-content {
  5188. \t\t\t\tfont-size: 16px !important;
  5189. \t\t\t}
  5190. \t\t\t
  5191. \t\t\t.carousel-indicators-ebay {
  5192. \t\t\t\tbottom: 10px;
  5193. \t\t\t\tleft: 50%;
  5194. \t\t\t\ttransform: translateX(-50%);
  5195. \t\t\t\tpadding: 4px 8px;
  5196. \t\t\t\tgap: 5px;
  5197. \t\t\t}
  5198. \t\t\t
  5199. \t\t\t.carousel-indicator-ebay {
  5200. \t\t\t\twidth: 7px;
  5201. \t\t\t\theight: 7px;
  5202. \t\t\t}
  5203. \t\t\t
  5204. \t\t\t.shop-header-content {
  5205. \t\t\t\tmargin: 0;
  5206. \t\t\t\tpadding: 16px 12px;
  5207. \t\t\t}
  5208. \t\t\t
  5209. \t\t\t.shop-avatar-ebay {
  5210. \t\t\t\twidth: 80px;
  5211. \t\t\t\theight: 80px;
  5212. \t\t\t}
  5213. \t\t\t
  5214. \t\t\t.shop-name-ebay {
  5215. \t\t\t\tfont-size: 1.3rem;
  5216. \t\t\t\tline-height: 1.3;
  5217. \t\t\t\tword-break: break-word;
  5218. \t\t\t\tletter-spacing: -0.1px;
  5219. \t\t\t\thyphens: auto;
  5220. \t\t\t\tmax-width: 100%;
  5221. \t\t\t}
  5222. \t\t\t.shop-name-section {
  5223. \t\t\t\tmargin-bottom: 8px;
  5224. \t\t\t}
  5225. \t\t\t.verified-text {
  5226. \t\t\t\tfont-size: 0.7rem;
  5227. \t\t\t\twhite-space: normal;
  5228. \t\t\t\tline-height: 1.4;
  5229. \t\t\t\tflex-wrap: wrap;
  5230. \t\t\t\tjustify-content: center;
  5231. \t\t\t\tword-break: break-word;
  5232. \t\t\t}
  5233. \t\t\t.verified-text i {
  5234. \t\t\t\tfont-size: 0.75rem;
  5235. \t\t\t\tflex-shrink: 0;
  5236. \t\t\t}
  5237. \t\t\t.shop-category-ebay {
  5238. \t\t\t\tfont-size: 0.65rem;
  5239. \t\t\t\tpadding: 4px 8px;
  5240. \t\t\t\tmax-width: 100%;
  5241. \t\t\t\tline-height: 1.3;
  5242. \t\t\t\tword-break: break-word;
  5243. \t\t\t}
  5244. \t\t\t
  5245. \t\t\t.stat-row {
  5246. \t\t\t\tgap: 6px;
  5247. \t\t\t\tflex-direction: row;
  5248. \t\t\t\tjustify-content: space-around;
  5249. \t\t\t}
  5250. \t\t\t
  5251. \t\t\t.stat-item-ebay {
  5252. \t\t\t\tflex: 1;
  5253. \t\t\t\tmin-width: 0;
  5254. \t\t\t\talign-items: center;
  5255. \t\t\t\tpadding: 8px 4px;
  5256. \t\t\t}
  5257. \t\t\t.stat-percentage,
  5258. \t\t\t.stat-number-ebay {
  5259. \t\t\t\tfont-size: 0.95rem;
  5260. \t\t\t\tline-height: 1.1;
  5261. \t\t\t\tword-break: break-word;
  5262. \t\t\t}
  5263. \t\t\t.stat-label-ebay {
  5264. \t\t\t\tfont-size: 0.6rem;
  5265. \t\t\t\ttext-align: center;
  5266. \t\t\t\tline-height: 1.2;
  5267. \t\t\t\tletter-spacing: 0.2px;
  5268. \t\t\t\tpadding: 0 2px;
  5269. \t\t\t\tword-break: break-word;
  5270. \t\t\t\thyphens: auto;
  5271. \t\t\t}
  5272. \t\t\t.shop-additional-info {
  5273. \t\t\t\tflex-direction: column;
  5274. \t\t\t\tgap: 8px;
  5275. \t\t\t\tfont-size: 0.7rem;
  5276. \t\t\t\talign-items: center;
  5277. \t\t\t\tline-height: 1.5;
  5278. \t\t\t}
  5279. \t\t\t.member-since {
  5280. \t\t\t\tfont-size: 0.7rem;
  5281. \t\t\t\tpadding: 4px 8px;
  5282. \t\t\t\tline-height: 1.4;
  5283. \t\t\t\tword-break: break-word;
  5284. \t\t\t\ttext-align: center;
  5285. \t\t\t\twidth: 100%;
  5286. \t\t\t\tmax-width: 100%;
  5287. \t\t\t\tjustify-content: center;
  5288. \t\t\t\twhite-space: normal;
  5289. \t\t\t}
  5290. \t\t\t.member-since i {
  5291. \t\t\t\tfont-size: 0.8rem;
  5292. \t\t\t\tmargin-right: 3px;
  5293. \t\t\t\tflex-shrink: 0;
  5294. \t\t\t}
  5295. \t\t\t.btn-ebay {
  5296. \t\t\t\tfont-size: 0.8rem;
  5297. \t\t\t\tpadding: 10px 14px;
  5298. \t\t\t\tline-height: 1.3;
  5299. \t\t\t}
  5300. \t\t\t.member-since i {
  5301. \t\t\t\tmargin-right: 4px;
  5302. \t\t\t\tfont-size: 0.8rem;
  5303. \t\t\t}
  5304. \t\t\t
  5305. \t\t\t.btn-ebay {
  5306. \t\t\t\tfont-size: 0.85rem;
  5307. \t\t\t\tpadding: 10px 16px;
  5308. \t\t\t}
  5309. \t\t\t
  5310. \t\t\t.member-since {
  5311. \t\t\t\tfont-size: 0.75rem;
  5312. \t\t\t}
  5313. \t\t\t
  5314. \t\t\t.shop-tab-content {
  5315. \t\t\t\tpadding: 15px 10px;
  5316. \t\t\t}
  5317. \t\t\t.shop-stats-row {
  5318. \t\t\t\tflex-direction: column;
  5319. \t\t\t\tgap: 10px;
  5320. \t\t\t\talign-items: flex-start;
  5321. \t\t\t}
  5322. \t\t}
  5323. \t\t.follow-button {
  5324. \t\t\tbackground: #ffa200;
  5325. \t\t\tborder: none;
  5326. \t\t\tcolor: white;
  5327. \t\t\tpadding: 12px 30px;
  5328. \t\t\tborder-radius: 25px;
  5329. \t\t\tfont-weight: 600;
  5330. \t\t\ttransition: all 0.3s ease;
  5331. \t\t\tcursor: pointer;
  5332. \t\t\tdisplay: inline-flex;
  5333. \t\t\talign-items: center;
  5334. \t\t\tgap: 8px;
  5335. \t\t}
  5336. \t\t.follow-button:hover {
  5337. \t\t\tbackground: #e8910a;
  5338. \t\t\ttransform: translateY(-2px);
  5339. \t\t\tbox-shadow: 0 5px 15px rgba(255, 162, 0, 0.3);
  5340. \t\t}
  5341. \t\t.follow-button.following {
  5342. \t\t\tbackground: #28a745;
  5343. \t\t}
  5344. \t\t.follow-button.following:hover {
  5345. \t\t\tbackground: #218838;
  5346. \t\t}
  5347. \t\t.follow-button:disabled {
  5348. \t\t\topacity: 0.6;
  5349. \t\t\tcursor: not-allowed;
  5350. \t\t\ttransform: none;
  5351. \t\t}
  5352. \t\t.follow-stats {
  5353. \t\t\tdisplay: flex;
  5354. \t\t\tgap: 30px;
  5355. \t\t\tmargin-top: 20px;
  5356. \t\t\tflex-wrap: wrap;
  5357. \t\t}
  5358. \t\t.follow-stat {
  5359. \t\t\ttext-align: center;
  5360. \t\t\tpadding: 15px;
  5361. \t\t\tbackground: #f8f9fa;
  5362. \t\t\tborder-radius: 10px;
  5363. \t\t\tmin-width: 120px;
  5364. \t\t}
  5365. \t\t.follow-stat-number {
  5366. \t\t\tfont-size: 1.8rem;
  5367. \t\t\tfont-weight: bold;
  5368. \t\t\tcolor: #ffa200;
  5369. \t\t\tdisplay: block;
  5370. \t\t}
  5371. \t\t.follow-stat-label {
  5372. \t\t\tcolor: #666;
  5373. \t\t\tfont-size: 0.9rem;
  5374. \t\t\ttext-transform: uppercase;
  5375. \t\t\tletter-spacing: 0.5px;
  5376. \t\t}
  5377. \t\t.shop-actions {
  5378. \t\t\tdisplay: flex;
  5379. \t\t\tgap: 15px;
  5380. \t\t\talign-items: center;
  5381. \t\t\tflex-wrap: wrap;
  5382. \t\t\tmargin-top: 20px;
  5383. \t\t}
  5384. \t\t.action-button {
  5385. \t\t\tbackground: white;
  5386. \t\t\tborder: 2px solid #ffa200;
  5387. \t\t\tcolor: #ffa200;
  5388. \t\t\tpadding: 10px 20px;
  5389. \t\t\tborder-radius: 20px;
  5390. \t\t\ttext-decoration: none;
  5391. \t\t\tfont-weight: 500;
  5392. \t\t\ttransition: all 0.3s ease;
  5393. \t\t\tdisplay: inline-flex;
  5394. \t\t\talign-items: center;
  5395. \t\t\tgap: 8px;
  5396. \t\t}
  5397. \t\t.action-button:hover {
  5398. \t\t\tbackground: #ffa200;
  5399. \t\t\tcolor: white;
  5400. \t\t\ttransform: translateY(-2px);
  5401. \t\t\tbox-shadow: 0 5px 15px rgba(255, 162, 0, 0.3);
  5402. \t\t}
  5403. \t\t.positive-feedback {
  5404. \t\t\tcolor: #28a745;
  5405. \t\t\tfont-weight: bold;
  5406. \t\t}
  5407. \t\t.items-sold {
  5408. \t\t\tcolor: #666;
  5409. \t\t\tfont-size: 0.9rem;
  5410. \t\t}
  5411. \t\t.followers-count {
  5412. \t\t\tcolor: #666;
  5413. \t\t\tfont-size: 0.9rem;
  5414. \t\t}
  5415. \t\t.shop-avatar {
  5416. \t\t\twidth: 120px;
  5417. \t\t\theight: 120px;
  5418. \t\t\tborder-radius: 50%;
  5419. \t\t\tborder: 4px solid white;
  5420. \t\t\tobject-fit: cover;
  5421. \t\t\tmargin-bottom: 20px;
  5422. \t\t}
  5423. \t\t.shop-stats {
  5424. \t\t\tbackground: white;
  5425. \t\t\tborder-radius: 10px;
  5426. \t\t\tpadding: 30px;
  5427. \t\t\tbox-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
  5428. \t\t\tmargin-top: -50px;
  5429. \t\t\tposition: relative;
  5430. \t\t\tz-index: 10;
  5431. \t\t}
  5432. \t\t.stat-item {
  5433. \t\t\ttext-align: center;
  5434. \t\t\tpadding: 20px;
  5435. \t\t}
  5436. \t\t.stat-number {
  5437. \t\t\tfont-size: 2.5rem;
  5438. \t\t\tfont-weight: bold;
  5439. \t\t\tcolor: #ffa200;
  5440. \t\t\tdisplay: block;
  5441. \t\t}
  5442. \t\t.stat-label {
  5443. \t\t\tcolor: #666;
  5444. \t\t\tfont-size: 0.9rem;
  5445. \t\t\ttext-transform: uppercase;
  5446. \t\t\tletter-spacing: 1px;
  5447. \t\t}
  5448. \t\t.shop-description {
  5449. \t\t\tbackground: #f8f9fa;
  5450. \t\t\tpadding: 30px;
  5451. \t\t\tborder-radius: 10px;
  5452. \t\t\tmargin-bottom: 40px;
  5453. \t\t}
  5454. \t\t.shop-contact {
  5455. \t\t\tbackground: white;
  5456. \t\t\tborder: 1px solid #e9ecef;
  5457. \t\t\tborder-radius: 10px;
  5458. \t\t\tpadding: 25px;
  5459. \t\t\tmargin-bottom: 40px;
  5460. \t\t}
  5461. \t\t.contact-item {
  5462. \t\t\tdisplay: flex;
  5463. \t\t\talign-items: center;
  5464. \t\t\tmargin-bottom: 15px;
  5465. \t\t}
  5466. \t\t.contact-item i {
  5467. \t\t\tcolor: #ffa200;
  5468. \t\t\tmargin-right: 15px;
  5469. \t\t\twidth: 20px;
  5470. \t\t}
  5471. \t\t.product-card {
  5472. \t\t\tbackground: white;
  5473. \t\t\tborder-radius: 10px;
  5474. \t\t\toverflow: hidden;
  5475. \t\t\tbox-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
  5476. \t\t\ttransition: transform 0.3s ease, box-shadow 0.3s ease;
  5477. \t\t\tmargin-bottom: 30px;
  5478. \t\t}
  5479. \t\t.product-card:hover {
  5480. \t\t\ttransform: translateY(-5px);
  5481. \t\t\tbox-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
  5482. \t\t}
  5483. \t\t.product-image {
  5484. \t\t\theight: 200px;
  5485. \t\t\tbackground-size: cover;
  5486. \t\t\tbackground-position: center;
  5487. \t\t\tposition: relative;
  5488. \t\t}
  5489. \t\t.product-info {
  5490. \t\t\tpadding: 20px;
  5491. \t\t}
  5492. \t\t.product-title {
  5493. \t\t\tfont-size: 1.1rem;
  5494. \t\t\tfont-weight: 600;
  5495. \t\t\tmargin-bottom: 10px;
  5496. \t\t\tcolor: #333;
  5497. \t\t}
  5498. \t\t.product-price {
  5499. \t\t\tfont-size: 1.3rem;
  5500. \t\t\tfont-weight: bold;
  5501. \t\t\tcolor: #ffa200;
  5502. \t\t\tmargin-bottom: 15px;
  5503. \t\t}
  5504. \t\t.product-meta {
  5505. \t\t\tdisplay: flex;
  5506. \t\t\tjustify-content: space-between;
  5507. \t\t\talign-items: center;
  5508. \t\t\tfont-size: 0.9rem;
  5509. \t\t\tcolor: #666;
  5510. \t\t}
  5511. \t\t.rating {
  5512. \t\t\tcolor: #ffa200;
  5513. \t\t}
  5514. \t\t/* Boutons d'action uniformes */
  5515. \t\t.btn-shop,
  5516. \t\t.shop-action-btn {
  5517. \t\t\tbackground: #ffa200;
  5518. \t\t\tborder: 1px solid #ffa200;
  5519. \t\t\tcolor: white;
  5520. \t\t\tpadding: 12px 24px;
  5521. \t\t\tborder-radius: 6px;
  5522. \t\t\tfont-weight: 500;
  5523. \t\t\tfont-size: 0.9rem;
  5524. \t\t\ttransition: all 0.3s ease;
  5525. \t\t\ttext-decoration: none;
  5526. \t\t\tdisplay: inline-flex;
  5527. \t\t\talign-items: center;
  5528. \t\t\tjustify-content: center;
  5529. \t\t\tgap: 8px;
  5530. \t\t\tmin-width: 120px;
  5531. \t\t\theight: 44px;
  5532. \t\t\twhite-space: nowrap;
  5533. \t\t}
  5534. \t\t.btn-shop:hover,
  5535. \t\t.shop-action-btn:hover {
  5536. \t\t\tbackground: #e8910a;
  5537. \t\t\tborder-color: #e8910a;
  5538. \t\t\tcolor: white;
  5539. \t\t\ttransform: translateY(-1px);
  5540. \t\t\tbox-shadow: 0 4px 12px rgba(255, 162, 0, 0.3);
  5541. \t\t}
  5542. \t\t/* Boutons secondaires */
  5543. \t\t.shop-action-btn.secondary {
  5544. \t\t\tbackground: transparent;
  5545. \t\t\tborder: 1px solid #6c757d;
  5546. \t\t\tcolor: #6c757d;
  5547. \t\t}
  5548. \t\t.shop-action-btn.secondary:hover {
  5549. \t\t\tbackground: #6c757d;
  5550. \t\t\tborder-color: #6c757d;
  5551. \t\t\tcolor: white;
  5552. \t\t\ttransform: translateY(-1px);
  5553. \t\t\tbox-shadow: 0 4px 12px rgba(108, 117, 125, 0.3);
  5554. \t\t}
  5555. \t\t/* Responsive */
  5556. \t\t@media(max-width: 768px) {
  5557. \t\t\t.shop-header {
  5558. \t\t\t\tpadding: 100px 0 40px;
  5559. \t\t\t}
  5560. \t\t\t.shop-avatar {
  5561. \t\t\t\twidth: 80px;
  5562. \t\t\t\theight: 80px;
  5563. \t\t\t}
  5564. \t\t\t.shop-stats {
  5565. \t\t\t\tmargin-top: -30px;
  5566. \t\t\t\tpadding: 20px;
  5567. \t\t\t}
  5568. \t\t\t.stat-number {
  5569. \t\t\t\tfont-size: 2rem;
  5570. \t\t\t}
  5571. \t\t}
  5572. \t\t/* Très petits écrans */
  5573. \t\t@media(max-width: 480px) {
  5574. \t\t\t.btn-shop,
  5575. \t\t\t.shop-action-btn {
  5576. \t\t\t\tmin-width: 90px;
  5577. \t\t\t\theight: 38px;
  5578. \t\t\t\tfont-size: 0.8rem;
  5579. \t\t\t\tpadding: 8px 16px;
  5580. \t\t\t}
  5581. \t\t\t.shop-actions-row {
  5582. \t\t\t\tgap: 8px;
  5583. \t\t\t}
  5584. \t\t}
  5585. \t\t/* Styles pour la section des avis */
  5586. \t\t.review-stats-card {
  5587. \t\t\tbackground: white;
  5588. \t\t\tborder-radius: 10px;
  5589. \t\t\tpadding: 20px;
  5590. \t\t\tbox-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  5591. \t\t\tmargin-bottom: 20px;
  5592. \t\t}
  5593. \t\t.stats-header {
  5594. \t\t\tdisplay: flex;
  5595. \t\t\talign-items: center;
  5596. \t\t\tmargin-bottom: 20px;
  5597. \t\t}
  5598. \t\t.overall-rating {
  5599. \t\t\ttext-align: center;
  5600. \t\t\tmargin-right: 20px;
  5601. \t\t}
  5602. \t\t.rating-number {
  5603. \t\t\tfont-size: 36px;
  5604. \t\t\tfont-weight: bold;
  5605. \t\t\tcolor: #333;
  5606. \t\t\tdisplay: block;
  5607. \t\t}
  5608. \t\t.stars {
  5609. \t\t\tcolor: #ffc107;
  5610. \t\t\tfont-size: 18px;
  5611. \t\t\tmargin-top: 5px;
  5612. \t\t}
  5613. \t\t.rating-summary p {
  5614. \t\t\tmargin: 0;
  5615. \t\t\tcolor: #666;
  5616. \t\t}
  5617. \t\t.rating-breakdown {
  5618. \t\t\tmargin-top: 15px;
  5619. \t\t}
  5620. \t\t.rating-bar {
  5621. \t\t\tdisplay: flex;
  5622. \t\t\talign-items: center;
  5623. \t\t\tmargin-bottom: 8px;
  5624. \t\t}
  5625. \t\t.rating-label {
  5626. \t\t\twidth: 40px;
  5627. \t\t\tfont-size: 14px;
  5628. \t\t\tcolor: #666;
  5629. \t\t}
  5630. \t\t.rating-progress {
  5631. \t\t\tflex: 1;
  5632. \t\t\theight: 6px;
  5633. \t\t\tbackground: #e9ecef;
  5634. \t\t\tborder-radius: 3px;
  5635. \t\t\tmargin: 0 10px;
  5636. \t\t\toverflow: hidden;
  5637. \t\t}
  5638. \t\t.rating-fill {
  5639. \t\t\theight: 100%;
  5640. \t\t\tbackground: linear-gradient(45deg, #ffc107, #ff8c00);
  5641. \t\t\ttransition: width 0.3s ease;
  5642. \t\t}
  5643. \t\t.rating-count {
  5644. \t\t\twidth: 30px;
  5645. \t\t\ttext-align: right;
  5646. \t\t\tfont-size: 14px;
  5647. \t\t\tcolor: #666;
  5648. \t\t}
  5649. \t\t.reviews-preview {
  5650. \t\t\tbackground: white;
  5651. \t\t\tborder-radius: 10px;
  5652. \t\t\tpadding: 20px;
  5653. \t\t\tbox-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  5654. \t\t}
  5655. \t\t.review-card-preview {
  5656. \t\t\tborder-bottom: 1px solid #f0f0f0;
  5657. \t\t\tpadding-bottom: 15px;
  5658. \t\t\tmargin-bottom: 15px;
  5659. \t\t}
  5660. \t\t.review-card-preview:last-child {
  5661. \t\t\tborder-bottom: none;
  5662. \t\t\tmargin-bottom: 0;
  5663. \t\t}
  5664. \t\t.review-header {
  5665. \t\t\tdisplay: flex;
  5666. \t\t\tjustify-content: space-between;
  5667. \t\t\talign-items: center;
  5668. \t\t\tmargin-bottom: 10px;
  5669. \t\t}
  5670. \t\t.review-user {
  5671. \t\t\tdisplay: flex;
  5672. \t\t\talign-items: center;
  5673. \t\t}
  5674. \t\t.user-avatar {
  5675. \t\t\twidth: 35px;
  5676. \t\t\theight: 35px;
  5677. \t\t\tborder-radius: 50%;
  5678. \t\t\tbackground: linear-gradient(45deg, #667eea, #764ba2);
  5679. \t\t\tdisplay: flex;
  5680. \t\t\talign-items: center;
  5681. \t\t\tjustify-content: center;
  5682. \t\t\tcolor: white;
  5683. \t\t\tfont-weight: bold;
  5684. \t\t\tmargin-right: 10px;
  5685. \t\t}
  5686. \t\t.user-info h6 {
  5687. \t\t\tmargin: 0;
  5688. \t\t\tfont-size: 14px;
  5689. \t\t\tfont-weight: 600;
  5690. \t\t\tcolor: #333;
  5691. \t\t}
  5692. \t\t.user-info small {
  5693. \t\t\tcolor: #666;
  5694. \t\t\tfont-size: 12px;
  5695. \t\t}
  5696. \t\t.review-rating {
  5697. \t\t\tdisplay: flex;
  5698. \t\t\talign-items: center;
  5699. \t\t\tgap: 5px;
  5700. \t\t}
  5701. \t\t.verified-badge {
  5702. \t\t\tbackground: #28a745;
  5703. \t\t\tcolor: white;
  5704. \t\t\tpadding: 2px 4px;
  5705. \t\t\tborder-radius: 3px;
  5706. \t\t\tfont-size: 10px;
  5707. \t\t\tfont-weight: bold;
  5708. \t\t}
  5709. \t\t.review-content {
  5710. \t\t\tcolor: #666;
  5711. \t\t\tfont-size: 14px;
  5712. \t\t\tline-height: 1.5;
  5713. \t\t}
  5714. \t\t.empty-reviews {
  5715. \t\t\ttext-align: center;
  5716. \t\t\tpadding: 40px 20px;
  5717. \t\t\tcolor: #666;
  5718. \t\t}
  5719. \t\t.empty-reviews i {
  5720. \t\t\tfont-size: 48px;
  5721. \t\t\tcolor: #ddd;
  5722. \t\t\tmargin-bottom: 15px;
  5723. \t\t}
  5724. \t\t.empty-reviews h4 {
  5725. \t\t\tcolor: #333;
  5726. \t\t\tmargin-bottom: 10px;
  5727. \t\t}
  5728. \t\t.section-title h2 {
  5729. \t\t\tcolor: #333;
  5730. \t\t\tmargin-bottom: 10px;
  5731. \t\t}
  5732. \t\t.section-title p {
  5733. \t\t\tcolor: #666;
  5734. \t\t\tmargin-bottom: 30px;
  5735. \t\t}
  5736. \t\t@media(max-width: 768px) {
  5737. \t\t\t.stats-header {
  5738. \t\t\t\tflex-direction: column;
  5739. \t\t\t\ttext-align: center;
  5740. \t\t\t}
  5741. \t\t\t.overall-rating {
  5742. \t\t\t\tmargin-right: 0;
  5743. \t\t\t\tmargin-bottom: 15px;
  5744. \t\t\t}
  5745. \t\t\t.review-header {
  5746. \t\t\t\tflex-direction: column;
  5747. \t\t\t\talign-items: flex-start;
  5748. \t\t\t}
  5749. \t\t\t.review-rating {
  5750. \t\t\t\tmargin-top: 5px;
  5751. \t\t\t}
  5752. \t\t}
  5753. \t</style>
  5754. {% endblock %}
  5755. {% block body %}
  5756. \t<!-- Shop Header eBay-style avec Karma - Pleine largeur -->
  5757. \t<section
  5758. \t\tclass=\"shop-header\">
  5759. \t\t<!-- Carrousel eBay-style -->
  5760. \t\t<div class=\"shop-carousel-ebay\">
  5761. \t\t\t<div class=\"carousel-container\">
  5762. \t\t\t\t{% set allBannerImages = shop.getAllBannerImages() %}
  5763. \t\t\t\t{% if allBannerImages|length > 0 %}
  5764. \t\t\t\t\t{% for image in allBannerImages %}
  5765. \t\t\t\t\t\t<div class=\"carousel-slide {% if loop.first %}active{% endif %}\" style=\"background-image: url('{{ asset(image) }}')\">
  5766. \t\t\t\t\t\t\t<div class=\"shop-banner-overlay\"></div>
  5767. \t\t\t\t\t\t</div>
  5768. \t\t\t\t\t{% endfor %}
  5769. \t\t\t\t{% else %}
  5770. \t\t\t\t\t<!-- Slide par défaut avec dégradé si aucune image de bannière -->
  5771. \t\t\t\t\t<div class=\"carousel-slide active\" style=\"background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);\">
  5772. \t\t\t\t\t\t<div class=\"shop-banner-overlay\"></div>
  5773. \t\t\t\t\t</div>
  5774. \t\t\t\t{% endif %}
  5775. \t\t\t</div>
  5776. \t\t\t<!-- Contrôles eBay-style améliorés - toujours affichés si plusieurs images -->
  5777. \t\t\t{% set totalBannerImages = allBannerImages|length %}
  5778. \t\t\t{% if totalBannerImages > 1 %}
  5779. \t\t\t\t<div class=\"carousel-controls-ebay\">
  5780. \t\t\t\t\t<button class=\"carousel-btn-ebay prev-btn\" onclick=\"previousSlide()\" id=\"prevBtn\" title=\"Image précédente\" aria-label=\"Image précédente\">
  5781. \t\t\t\t\t\t<i class=\"lnr lnr-chevron-left\"></i>
  5782. \t\t\t\t\t</button>
  5783. \t\t\t\t\t<button class=\"carousel-btn-ebay pause-btn\" onclick=\"toggleCarousel()\" id=\"pauseBtn\" title=\"Pause/Reprendre\" aria-label=\"Pause/Reprendre\">
  5784. \t\t\t\t\t\t<span id=\"pauseIcon\" class=\"pause-icon-content\">⏸</span>
  5785. \t\t\t\t\t</button>
  5786. \t\t\t\t\t<button class=\"carousel-btn-ebay next-btn\" onclick=\"nextSlide()\" id=\"nextBtn\" title=\"Image suivante\" aria-label=\"Image suivante\">
  5787. \t\t\t\t\t\t<i class=\"lnr lnr-chevron-right\"></i>
  5788. \t\t\t\t\t</button>
  5789. \t\t\t\t</div>
  5790. \t\t\t\t<!-- Indicateurs eBay-style améliorés -->
  5791. \t\t\t\t<div class=\"carousel-indicators-ebay\">
  5792. \t\t\t\t\t{% for image in allBannerImages %}
  5793. \t\t\t\t\t\t<button class=\"carousel-indicator-ebay {% if loop.first %}active{% endif %}\" onclick=\"goToSlide({{ loop.index0 }})\" title=\"Image {{ loop.index }}\" aria-label=\"Aller à l'image {{ loop.index }}\"></button>
  5794. \t\t\t\t\t{% endfor %}
  5795. \t\t\t\t</div>
  5796. \t\t\t{% endif %}
  5797. \t\t</div>
  5798. \t\t<!-- Contenu de la boutique eBay-style -->
  5799. \t\t<div class=\"shop-header-content\">
  5800. \t\t\t<div class=\"row g-3 g-md-4 align-items-start align-items-md-center\">
  5801. \t\t\t\t<!-- Logo de la boutique -->
  5802. \t\t\t\t<div class=\"col-12 col-md-auto text-center text-md-start\">
  5803. \t\t\t\t\t<div class=\"shop-avatar-container-ebay\">
  5804. \t\t\t\t\t\t{% if shop.logo %}
  5805. \t\t\t\t\t\t\t<img src=\"{{ asset(shop.logo) }}\" alt=\"{{ shop.name }}\" class=\"shop-avatar-ebay\">
  5806. \t\t\t\t\t\t{% else %}
  5807. \t\t\t\t\t\t\t<div class=\"shop-avatar-ebay shop-avatar-placeholder\">
  5808. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\"></i>
  5809. \t\t\t\t\t\t\t</div>
  5810. \t\t\t\t\t\t{% endif %}
  5811. \t\t\t\t\t\t{% if shop.isVerified %}
  5812. \t\t\t\t\t\t\t<div class=\"verified-badge-ebay\">
  5813. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
  5814. \t\t\t\t\t\t\t</div>
  5815. \t\t\t\t\t\t{% endif %}
  5816. \t\t\t\t\t</div>
  5817. \t\t\t\t</div>
  5818. \t\t\t\t<!-- Informations principales -->
  5819. \t\t\t\t<div class=\"col-12 col-md\">
  5820. \t\t\t\t\t<div class=\"shop-info-ebay\">
  5821. \t\t\t\t\t\t<!-- Nom de la boutique -->
  5822. \t\t\t\t\t\t<div class=\"shop-name-section mb-2\">
  5823. \t\t\t\t\t\t\t<h1 class=\"shop-name-ebay mb-1\">{{ shop.name }}</h1>
  5824. \t\t\t\t\t\t\t<div class=\"d-flex flex-wrap align-items-center gap-2\">
  5825. \t\t\t\t\t\t\t{% if shop.isVerified %}
  5826. \t\t\t\t\t\t\t\t<span class=\"verified-text\">
  5827. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle me-1\"></i>Vendeur vérifié
  5828. \t\t\t\t\t\t\t\t</span>
  5829. \t\t\t\t\t\t\t{% endif %}
  5830. \t\t\t\t\t\t{% if shop.shopCategory %}
  5831. \t\t\t\t\t\t\t\t<span class=\"shop-category-ebay\">{{ shop.shopCategory.name }}</span>
  5832. \t\t\t\t\t\t{% endif %}
  5833. \t\t\t\t\t\t\t</div>
  5834. \t\t\t\t\t\t</div>
  5835. \t\t\t\t\t\t<!-- Statistiques principales -->
  5836. \t\t\t\t\t\t<div class=\"shop-stats-ebay\">
  5837. \t\t\t\t\t\t\t<div class=\"stat-row mb-2\">
  5838. \t\t\t\t\t\t\t\t{% if shop.averageRating > 0 %}
  5839. \t\t\t\t\t\t\t\t\t<div class=\"stat-item-ebay\">
  5840. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-percentage\">{{ shop.averageRating|number_format(1) }}%</span>
  5841. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-label-ebay\">Évaluations positives</span>
  5842. \t\t\t\t\t\t\t\t\t</div>
  5843. \t\t\t\t\t\t\t\t{% endif %}
  5844. \t\t\t\t\t\t\t\t{% if stats.totalProductSales > 0 %}
  5845. \t\t\t\t\t\t\t\t\t<div class=\"stat-item-ebay\">
  5846. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-number-ebay\">{{ stats.totalProductSales|number_format }}</span>
  5847. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-label-ebay\">Articles vendus</span>
  5848. \t\t\t\t\t\t\t\t\t</div>
  5849. \t\t\t\t\t\t\t\t{% endif %}
  5850. \t\t\t\t\t\t\t\t{% if followStats.active_follows > 0 %}
  5851. \t\t\t\t\t\t\t\t\t<div class=\"stat-item-ebay\">
  5852. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-number-ebay\">{{ followStats.active_follows|number_format }}</span>
  5853. \t\t\t\t\t\t\t\t\t\t<span class=\"stat-label-ebay\">Suiveurs</span>
  5854. \t\t\t\t\t\t\t\t\t</div>
  5855. \t\t\t\t\t\t\t\t{% endif %}
  5856. \t\t\t\t\t\t\t</div>
  5857. \t\t\t\t\t\t\t<!-- Informations supplémentaires -->
  5858. \t\t\t\t\t\t\t<div class=\"shop-additional-info\">
  5859. \t\t\t\t\t\t\t\t<div class=\"d-flex flex-wrap gap-3 gap-md-4\">
  5860. \t\t\t\t\t\t\t\t\t{% if shop.averageRating > 0 %}
  5861. \t\t\t\t\t\t\t\t\t\t<span class=\"member-since\">
  5862. \t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-thumbs-up me-1\"></i>
  5863. \t\t\t\t\t\t\t\t\t\t\t{{ shop.averageRating|number_format(1) }}% positive feedback
  5864. \t\t\t\t\t\t\t\t\t\t</span>
  5865. \t\t\t\t\t\t\t\t\t{% endif %}
  5866. \t\t\t\t\t\t\t\t\t{% if stats.totalProductSales > 0 %}
  5867. \t\t\t\t\t\t\t\t\t\t<span class=\"member-since\">
  5868. \t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-cart me-1\"></i>
  5869. \t\t\t\t\t\t\t\t\t\t\t{{ stats.totalProductSales|number_format }} produit{{ stats.totalProductSales > 1 ? 's' : '' }} vendu{{ stats.totalProductSales > 1 ? 's' : '' }}
  5870. \t\t\t\t\t\t\t\t\t\t</span>
  5871. \t\t\t\t\t\t\t\t\t{% endif %}
  5872. \t\t\t\t\t\t\t\t\t<span class=\"member-since\">
  5873. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-history me-1\"></i>
  5874. \t\t\t\t\t\t\t\t\t\tCréé depuis {{ shop.createdAt|date('M Y') }}
  5875. \t\t\t\t\t\t\t\t\t</span>
  5876. \t\t\t\t\t\t\t\t</div>
  5877. \t\t\t\t\t\t\t</div>
  5878. \t\t\t\t\t\t</div>
  5879. \t\t\t\t\t</div>
  5880. \t\t\t\t</div>
  5881. \t\t\t\t<!-- Actions eBay-style -->
  5882. \t\t\t\t<div class=\"col-12 col-md-auto\">
  5883. \t\t\t\t\t<div class=\"shop-actions-ebay\">
  5884. \t\t\t\t\t\t{% if app.user %}
  5885. \t\t\t\t\t\t\t<button id=\"follow-button\" class=\"btn btn-primary btn-ebay w-100 {% if isFollowing %}following{% endif %}\" data-shop-id=\"{{ shop.id }}\" data-following=\"{{ isFollowing ? 'true' : 'false' }}\">
  5886. \t\t\t\t\t\t\t\t<span id=\"follow-text\">
  5887. \t\t\t\t\t\t\t\t\t{% if isFollowing %}
  5888. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle me-1\"></i> Suivi
  5889. \t\t\t\t\t\t\t\t\t{% else %}
  5890. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-plus me-1\"></i> Suivre
  5891. \t\t\t\t\t\t\t\t\t{% endif %}
  5892. \t\t\t\t\t\t\t\t</span>
  5893. \t\t\t\t\t\t\t</button>
  5894. \t\t\t\t\t\t{% else %}
  5895. \t\t\t\t\t\t\t<a href=\"{{ path('ui_app_login') }}\" class=\"btn btn-primary btn-ebay w-100\">
  5896. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-user me-1\"></i> Se connecter pour suivre
  5897. \t\t\t\t\t\t\t</a>
  5898. \t\t\t\t\t\t{% endif %}
  5899. \t\t\t\t\t\t<div class=\"d-flex gap-2 mt-2\">
  5900. \t\t\t\t\t\t\t<button class=\"btn btn-outline-secondary btn-ebay flex-fill\" onclick=\"shareShop()\" title=\"Partager\">
  5901. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-bubble\"></i>
  5902. \t\t\t\t\t\t\t\t<span class=\"d-none d-md-inline ms-1\">Partager</span>
  5903. \t\t\t\t\t\t</button>
  5904. \t\t\t\t\t\t\t<button class=\"btn btn-outline-danger btn-ebay flex-fill\" onclick=\"reportShop()\" title=\"Signaler\">
  5905. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-flag\"></i>
  5906. \t\t\t\t\t\t\t\t<span class=\"d-none d-md-inline ms-1\">Signaler</span>
  5907. \t\t\t\t\t\t</button>
  5908. \t\t\t\t\t\t</div>
  5909. \t\t\t\t\t\t{% if canEdit %}
  5910. \t\t\t\t\t\t\t<a href=\"{{ path('seller_shop_edit', {slug: shop.slug}) }}\" class=\"btn btn-outline-primary btn-ebay w-100 mt-2\">
  5911. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-pencil me-1\"></i> Modifier la boutique
  5912. \t\t\t\t\t\t\t</a>
  5913. \t\t\t\t\t\t{% endif %}
  5914. \t\t\t\t\t</div>
  5915. \t\t\t\t</div>
  5916. \t\t\t</div>
  5917. \t\t</div>
  5918. \t</section>
  5919. \t<!-- Shop Tabs eBay-style avec Karma -->
  5920. \t<section class=\"container\">
  5921. \t\t<div class=\"shop-tabs\">
  5922. \t\t\t<ul class=\"nav nav-tabs shop-tabs-nav\" role=\"tablist\">
  5923. \t\t\t\t<li class=\"nav-item shop-tab\">
  5924. \t\t\t\t\t<a href=\"#shop-items\" class=\"nav-link shop-tab-link active\" data-tab=\"items\" role=\"tab\">
  5925. \t\t\t\t\t\tBoutique
  5926. \t\t\t\t\t</a>
  5927. \t\t\t\t</li>
  5928. \t\t\t\t<li class=\"nav-item shop-tab\">
  5929. \t\t\t\t\t<a href=\"#shop-sale\" class=\"nav-link shop-tab-link\" data-tab=\"sale\" role=\"tab\">
  5930. \t\t\t\t\t\tPromotions
  5931. \t\t\t\t\t</a>
  5932. \t\t\t\t</li>
  5933. \t\t\t\t<li class=\"nav-item shop-tab\">
  5934. \t\t\t\t\t<a href=\"#shop-about\" class=\"nav-link shop-tab-link\" data-tab=\"about\" role=\"tab\">
  5935. \t\t\t\t\t\tÀ propos
  5936. \t\t\t\t\t</a>
  5937. \t\t\t\t</li>
  5938. \t\t\t\t<li class=\"nav-item shop-tab\">
  5939. \t\t\t\t\t<a href=\"#shop-feedback\" class=\"nav-link shop-tab-link\" data-tab=\"feedback\" role=\"tab\">
  5940. \t\t\t\t\t\tAvis ({{ shop.getVisibleReviewsCount() }})
  5941. \t\t\t\t\t</a>
  5942. \t\t\t\t</li>
  5943. \t\t\t</ul>
  5944. \t\t\t<!-- Tab Content: Shop Items avec Karma -->
  5945. \t\t\t<div id=\"shop-items\" class=\"tab-content shop-tab-content active\">
  5946. \t\t\t\t<div class=\"row\">
  5947. \t\t\t\t\t<div class=\"col-lg-12\">
  5948. \t\t\t\t\t\t<div class=\"d-flex justify-content-between align-items-center mb-4\">
  5949. \t\t\t\t\t\t\t<h4 class=\"mb-0\">Produits de
  5950. \t\t\t\t\t\t\t\t{{ shop.name }}</h4>
  5951. \t\t\t\t\t\t\t<div class=\"d-flex align-items-center gap-3\">
  5952. \t\t\t\t\t\t\t\t<span style=\"font-size: 2rem; font-weight: 600; min-width: 100px; display: inline-block; text-align: center;\">
  5953. \t\t\t\t\t\t\t\t\t<span class=\"product-count\">{{ products|length|number_format }}</span>
  5954. \t\t\t\t\t\t\t\t\t<span style=\"font-size: 1rem; font-weight: 400;\">produits</span>
  5955. \t\t\t\t\t\t\t\t</span>
  5956. \t\t\t\t\t\t\t\t<select class=\"form-select\" id=\"product-sort\" style=\"width: auto;\" onchange=\"if(window.sortProducts) window.sortProducts(this.value);\">
  5957. \t\t\t\t\t\t\t\t\t<option value=\"\">Trier par</option>
  5958. \t\t\t\t\t\t\t\t\t<option value=\"price_asc\">Prix : Croissant</option>
  5959. \t\t\t\t\t\t\t\t\t<option value=\"price_desc\">Prix : Décroissant</option>
  5960. \t\t\t\t\t\t\t\t\t<option value=\"newest\">Plus récents</option>
  5961. \t\t\t\t\t\t\t\t\t<option value=\"popular\">Plus populaires</option>
  5962. \t\t\t\t\t\t\t\t\t<option value=\"name_asc\">Nom : A-Z</option>
  5963. \t\t\t\t\t\t\t\t\t<option value=\"name_desc\">Nom : Z-A</option>
  5964. \t\t\t\t\t\t\t\t</select>
  5965. \t\t\t\t\t\t\t</div>
  5966. \t\t\t\t\t\t</div>
  5967. \t\t\t\t\t\t{% if products|length > 0 %}
  5968. \t\t\t\t\t\t\t<div class=\"row\" id=\"products-container\">
  5969. \t\t\t\t\t\t\t\t{% for product in products %}
  5970. \t\t\t\t\t\t\t\t\t<div class=\"col-lg-3 col-md-4 col-sm-6 mb-4 product-item\" data-price=\"{{ product.price }}\" data-name=\"{{ product.name|lower }}\" data-views=\"{{ product.viewCount ?? 0 }}\" data-created=\"{{ product.publishedAt|date('Y-m-d') }}\">
  5971. \t\t\t\t\t\t\t\t\t\t<div class=\"product-card\">
  5972. \t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\">
  5973. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"product-image\" style=\"background-image: url('{% if product.images is defined and product.images|length > 0 %}{{ asset(product.images[0]) }}{% else %}{{ asset('ui/img/product/p1.jpg') }}{% endif %}')\"></div>
  5974. \t\t\t\t\t\t\t\t\t\t\t</a>
  5975. \t\t\t\t\t\t\t\t\t\t\t<div class=\"product-info\">
  5976. \t\t\t\t\t\t\t\t\t\t\t\t<h6 class=\"product-title\">
  5977. \t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\" class=\"text-decoration-none\">
  5978. \t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ product.name }}
  5979. \t\t\t\t\t\t\t\t\t\t\t\t\t</a>
  5980. \t\t\t\t\t\t\t\t\t\t\t\t</h6>
  5981. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"product-price\">{{ product.price|number_format(2, '.', ' ') }}
  5982. \t\t\t\t\t\t\t\t\t\t\t\t\tHTG</div>
  5983. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"product-meta\">
  5984. \t\t\t\t\t\t\t\t\t\t\t\t\t<span>
  5985. \t\t\t\t\t\t\t\t\t\t\t\t\t\t{% if product.averageRating %}
  5986. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"rating\">
  5987. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{% for i in 1..5 %}
  5988. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-star{% if i <= product.averageRating %}{% else %}-o{% endif %}\"></i>
  5989. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{% endfor %}
  5990. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  5991. \t\t\t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  5992. \t\t\t\t\t\t\t\t\t\t\t\t\t</span>
  5993. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-muted\">{{ product.viewCount ?? 0 }}
  5994. \t\t\t\t\t\t\t\t\t\t\t\t\t\tvues</span>
  5995. \t\t\t\t\t\t\t\t\t\t\t\t</div>
  5996. \t\t\t\t\t\t\t\t\t\t\t</div>
  5997. \t\t\t\t\t\t\t\t\t\t</div>
  5998. \t\t\t\t\t\t\t\t\t</div>
  5999. \t\t\t\t\t\t\t\t{% endfor %}
  6000. \t\t\t\t\t\t\t</div>
  6001. \t\t\t\t\t\t{% else %}
  6002. \t\t\t\t\t\t\t<div class=\"text-center py-5\">
  6003. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-package\" style=\"font-size: 4rem; color: #ccc;\"></i>
  6004. \t\t\t\t\t\t\t\t<h4 class=\"mt-3\">Aucun produit disponible</h4>
  6005. \t\t\t\t\t\t\t\t<p class=\"text-muted\">Cette boutique n'a pas encore de produits en vente.</p>
  6006. \t\t\t\t\t\t\t</div>
  6007. \t\t\t\t\t\t{% endif %}
  6008. \t\t\t\t\t</div>
  6009. \t\t\t\t</div>
  6010. \t\t\t</div>
  6011. \t\t\t<!-- Tab Content: Sale avec Karma -->
  6012. \t\t\t<div id=\"shop-sale\" class=\"tab-content shop-tab-content\">
  6013. \t\t\t\t<div class=\"text-center py-5\">
  6014. \t\t\t\t\t<i class=\"lnr lnr-tag\" style=\"font-size: 4rem; color: #ccc;\"></i>
  6015. \t\t\t\t\t<h4 class=\"mt-3\">Aucune promotion actuellement</h4>
  6016. \t\t\t\t\t<p class=\"text-muted\">Cette boutique n'a pas de promotions actives pour le moment.</p>
  6017. \t\t\t\t</div>
  6018. \t\t\t</div>
  6019. \t\t\t<!-- Tab Content: About avec Karma -->
  6020. \t\t\t<div id=\"shop-about\" class=\"tab-content shop-tab-content\">
  6021. \t\t\t\t<div class=\"row\">
  6022. \t\t\t\t\t<div class=\"col-lg-8\">
  6023. \t\t\t\t\t\t<div class=\"card\">
  6024. \t\t\t\t\t\t\t<div class=\"card-header\">
  6025. \t\t\t\t\t\t\t\t<h5 class=\"mb-0\">
  6026. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-user me-2\"></i>À propos de
  6027. \t\t\t\t\t\t\t\t\t{{ shop.name }}
  6028. \t\t\t\t\t\t\t\t</h5>
  6029. \t\t\t\t\t\t\t</div>
  6030. \t\t\t\t\t\t\t<div class=\"card-body\">
  6031. \t\t\t\t\t\t\t\t{% if shop.description %}
  6032. \t\t\t\t\t\t\t\t\t<div class=\"card-text shop-description-content\">{{ shop.description|raw }}</div>
  6033. \t\t\t\t\t\t\t\t{% else %}
  6034. \t\t\t\t\t\t\t\t\t<p class=\"text-muted\">Aucune description disponible.</p>
  6035. \t\t\t\t\t\t\t\t{% endif %}
  6036. \t\t\t\t\t\t\t\t{% if shop.businessHours %}
  6037. \t\t\t\t\t\t\t\t\t<h6 class=\"mt-4\">
  6038. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-clock me-2\"></i>Heures d'ouverture
  6039. \t\t\t\t\t\t\t\t\t</h6>
  6040. \t\t\t\t\t\t\t\t\t<p>{{ shop.businessHours }}</p>
  6041. \t\t\t\t\t\t\t\t{% endif %}
  6042. \t\t\t\t\t\t\t\t{% if shop.returnPolicy %}
  6043. \t\t\t\t\t\t\t\t\t<h6 class=\"mt-4\">
  6044. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-undo me-2\"></i>Politique de retour
  6045. \t\t\t\t\t\t\t\t\t</h6>
  6046. \t\t\t\t\t\t\t\t\t<p>{{ shop.returnPolicy }}</p>
  6047. \t\t\t\t\t\t\t\t{% endif %}
  6048. \t\t\t\t\t\t\t</div>
  6049. \t\t\t\t\t\t</div>
  6050. \t\t\t\t\t</div>
  6051. \t\t\t\t\t<div class=\"col-lg-4\">
  6052. \t\t\t\t\t\t<div class=\"card shop-info-card\">
  6053. \t\t\t\t\t\t\t<div class=\"card-header\">
  6054. \t\t\t\t\t\t\t\t<h6 class=\"mb-0\">
  6055. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-chart me-2\"></i>Statistiques de la boutique
  6056. \t\t\t\t\t\t\t\t</h6>
  6057. \t\t\t\t\t\t\t</div>
  6058. \t\t\t\t\t\t\t<div class=\"card-body\">
  6059. \t\t\t\t\t\t\t\t<div class=\"row text-center\">
  6060. \t\t\t\t\t\t\t\t\t<div class=\"col-6\">
  6061. \t\t\t\t\t\t\t\t\t\t<div class=\"shop-stat-item\">
  6062. \t\t\t\t\t\t\t\t\t\t\t<span class=\"stat-number h4 text-primary\">{{ stats.activeProducts }}</span>
  6063. \t\t\t\t\t\t\t\t\t\t\t<span class=\"stat-label d-block\">Produits actifs</span>
  6064. \t\t\t\t\t\t\t\t\t\t</div>
  6065. \t\t\t\t\t\t\t\t\t</div>
  6066. \t\t\t\t\t\t\t\t\t<div class=\"col-6\">
  6067. \t\t\t\t\t\t\t\t\t\t<div class=\"shop-stat-item\">
  6068. \t\t\t\t\t\t\t\t\t\t\t<span class=\"stat-number h4 text-info\">{{ stats.shopViews }}</span>
  6069. \t\t\t\t\t\t\t\t\t\t\t<span class=\"stat-label d-block\">Vues boutique</span>
  6070. \t\t\t\t\t\t\t\t\t\t</div>
  6071. \t\t\t\t\t\t\t\t\t</div>
  6072. \t\t\t\t\t\t\t\t</div>
  6073. \t\t\t\t\t\t\t</div>
  6074. \t\t\t\t\t\t</div>
  6075. \t\t\t\t\t</div>
  6076. \t\t\t\t</div>
  6077. \t\t\t</div>
  6078. \t\t\t<!-- Tab Content: Feedback avec Karma -->
  6079. \t\t\t<div id=\"shop-feedback\" class=\"tab-content shop-tab-content\">
  6080. \t\t\t\t<div class=\"row\">
  6081. \t\t\t\t\t<div
  6082. \t\t\t\t\t\tclass=\"col-lg-8\">
  6083. \t\t\t\t\t\t<!-- Statistiques des avis -->
  6084. \t\t\t\t\t\t<div class=\"review-stats mb-4\">
  6085. \t\t\t\t\t\t\t<div class=\"row\">
  6086. \t\t\t\t\t\t\t\t<div class=\"col-md-4\">
  6087. \t\t\t\t\t\t\t\t\t<div class=\"stat-card text-center\">
  6088. \t\t\t\t\t\t\t\t\t\t<h3 class=\"stat-number\">{{ shop.getAverageRating() }}</h3>
  6089. \t\t\t\t\t\t\t\t\t\t<div class=\"rating-stars\">
  6090. \t\t\t\t\t\t\t\t\t\t\t{% for i in 1..5 %}
  6091. \t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-star{% if i <= shop.getAverageRating() %}{% else %}-empty{% endif %}\"></i>
  6092. \t\t\t\t\t\t\t\t\t\t\t{% endfor %}
  6093. \t\t\t\t\t\t\t\t\t\t</div>
  6094. \t\t\t\t\t\t\t\t\t\t<p class=\"stat-label\">Note moyenne</p>
  6095. \t\t\t\t\t\t\t\t\t</div>
  6096. \t\t\t\t\t\t\t\t</div>
  6097. \t\t\t\t\t\t\t\t<div class=\"col-md-4\">
  6098. \t\t\t\t\t\t\t\t\t<div class=\"stat-card text-center\">
  6099. \t\t\t\t\t\t\t\t\t\t<h3 class=\"stat-number\">{{ shop.getVisibleReviewsCount() }}</h3>
  6100. \t\t\t\t\t\t\t\t\t\t<p class=\"stat-label\">Avis clients</p>
  6101. \t\t\t\t\t\t\t\t\t</div>
  6102. \t\t\t\t\t\t\t\t</div>
  6103. \t\t\t\t\t\t\t\t<div class=\"col-md-4\">
  6104. \t\t\t\t\t\t\t\t\t<div class=\"stat-card text-center\">
  6105. \t\t\t\t\t\t\t\t\t\t<h3 class=\"stat-number\">{{ ((shop.getVisibleReviewsCount() / 100) * 100)|round }}%</h3>
  6106. \t\t\t\t\t\t\t\t\t\t<p class=\"stat-label\">Satisfaction</p>
  6107. \t\t\t\t\t\t\t\t\t</div>
  6108. \t\t\t\t\t\t\t\t</div>
  6109. \t\t\t\t\t\t\t</div>
  6110. \t\t\t\t\t\t</div>
  6111. \t\t\t\t\t\t<!-- Liste des avis récents -->
  6112. \t\t\t\t\t\t<div class=\"reviews-preview\">
  6113. \t\t\t\t\t\t\t<h5 class=\"mb-3\">Avis récents</h5>
  6114. \t\t\t\t\t\t\t{% if shop.reviews|length > 0 %}
  6115. \t\t\t\t\t\t\t\t<div class=\"reviews-list\">
  6116. \t\t\t\t\t\t\t\t\t{% for review in shop.reviews|slice(0, 5) %}
  6117. \t\t\t\t\t\t\t\t\t\t{% if review.isVisible %}
  6118. \t\t\t\t\t\t\t\t\t\t\t<div class=\"review-item\">
  6119. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"review-header\">
  6120. \t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"reviewer-info\">
  6121. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"reviewer-avatar\">
  6122. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-user\"></i>
  6123. \t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  6124. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"reviewer-details\">
  6125. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h6 class=\"reviewer-name\">{{ review.user.userIdentifier }}</h6>
  6126. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"review-rating\">
  6127. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{% for i in 1..5 %}
  6128. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-star{% if i <= review.rating %}{% else %}-empty{% endif %}\"></i>
  6129. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{% endfor %}
  6130. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  6131. \t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  6132. \t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  6133. \t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"review-meta\">
  6134. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"review-date\">{{ review.createdAt|date('d/m/Y') }}</span>
  6135. \t\t\t\t\t\t\t\t\t\t\t\t\t\t{% if review.isVerified %}
  6136. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"verified-badge\">
  6137. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
  6138. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tVérifié
  6139. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>
  6140. \t\t\t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6141. \t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  6142. \t\t\t\t\t\t\t\t\t\t\t\t</div>
  6143. \t\t\t\t\t\t\t\t\t\t\t\t{% if review.comment %}
  6144. \t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"review-comment\">
  6145. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>{{ review.comment|length > 150 ? review.comment|slice(0, 150) ~ '...' : review.comment }}</p>
  6146. \t\t\t\t\t\t\t\t\t\t\t\t\t</div>
  6147. \t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6148. \t\t\t\t\t\t\t\t\t\t\t</div>
  6149. \t\t\t\t\t\t\t\t\t\t{% endif %}
  6150. \t\t\t\t\t\t\t\t\t{% endfor %}
  6151. \t\t\t\t\t\t\t\t</div>
  6152. \t\t\t\t\t\t\t\t<div class=\"text-center mt-4\">
  6153. \t\t\t\t\t\t\t\t\t<a href=\"{{ path('shop_reviews_index', {'slug': shop.slug}) }}\" class=\"btn btn-primary\">
  6154. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-star me-1\"></i>Voir tous les avis
  6155. \t\t\t\t\t\t\t\t\t</a>
  6156. \t\t\t\t\t\t\t\t</div>
  6157. \t\t\t\t\t\t\t{% else %}
  6158. \t\t\t\t\t\t\t\t<div class=\"text-center py-4\">
  6159. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-star\" style=\"font-size: 3rem; color: #ccc;\"></i>
  6160. \t\t\t\t\t\t\t\t\t<h5 class=\"mt-3\">Aucun avis pour le moment</h5>
  6161. \t\t\t\t\t\t\t\t\t<p class=\"text-muted\">Cette boutique n'a pas encore reçu d'avis clients.</p>
  6162. \t\t\t\t\t\t\t\t</div>
  6163. \t\t\t\t\t\t\t{% endif %}
  6164. \t\t\t\t\t\t</div>
  6165. \t\t\t\t\t</div>
  6166. \t\t\t\t\t<div
  6167. \t\t\t\t\t\tclass=\"col-lg-4\">
  6168. \t\t\t\t\t\t<!-- Lien vers la page complète des avis -->
  6169. \t\t\t\t\t\t<div class=\"review-actions-card\">
  6170. \t\t\t\t\t\t\t<h5>Évaluer cette boutique</h5>
  6171. \t\t\t\t\t\t\t<p class=\"text-muted\">Partagez votre expérience avec cette boutique.</p>
  6172. \t\t\t\t\t\t\t<a href=\"{{ path('shop_reviews_new', {'slug': shop.slug}) }}\" class=\"btn btn-primary w-100\">
  6173. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-star me-1\"></i>Laisser un avis
  6174. \t\t\t\t\t\t\t</a>
  6175. \t\t\t\t\t\t</div>
  6176. \t\t\t\t\t</div>
  6177. \t\t\t\t</div>
  6178. \t\t\t</div>
  6179. \t\t</div>
  6180. \t</section>
  6181. \t<!-- Modal de signalement -->
  6182. \t<div class=\"modal fade\" id=\"reportModal\" tabindex=\"-1\" aria-labelledby=\"reportModalLabel\" aria-hidden=\"true\">
  6183. \t\t<div class=\"modal-dialog\">
  6184. \t\t\t<div class=\"modal-content\">
  6185. \t\t\t\t<div class=\"modal-header\">
  6186. \t\t\t\t\t<h5 class=\"modal-title\" id=\"reportModalLabel\">
  6187. \t\t\t\t\t\t<i class=\"lnr lnr-flag me-2\"></i>&nbsp;Signaler cette boutique
  6188. \t\t\t\t\t</h5>
  6189. \t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>
  6190. \t\t\t\t</div>
  6191. \t\t\t\t<div class=\"modal-body\">
  6192. \t\t\t\t\t<form id=\"reportForm\">
  6193. \t\t\t\t\t\t<div class=\"mb-3\">
  6194. \t\t\t\t\t\t\t<label for=\"reportReason\" class=\"form-label\">Motif du signalement *</label>
  6195. \t\t\t\t\t\t\t<select class=\"form-select\" id=\"reportReason\" required>
  6196. \t\t\t\t\t\t\t\t<option value=\"\">Sélectionnez un motif</option>
  6197. \t\t\t\t\t\t\t\t<option value=\"fake_products\">Produits contrefaits</option>
  6198. \t\t\t\t\t\t\t\t<option value=\"inappropriate_content\">Contenu inapproprié</option>
  6199. \t\t\t\t\t\t\t\t<option value=\"spam\">Spam ou publicité abusive</option>
  6200. \t\t\t\t\t\t\t\t<option value=\"fraud\">Fraude ou escroquerie</option>
  6201. \t\t\t\t\t\t\t\t<option value=\"harassment\">Harcèlement</option>
  6202. \t\t\t\t\t\t\t\t<option value=\"other\">Autre</option>
  6203. \t\t\t\t\t\t\t</select>
  6204. \t\t\t\t\t\t</div>
  6205. \t\t\t\t\t\t<div class=\"mb-3\">
  6206. \t\t\t\t\t\t\t<label for=\"reportDescription\" class=\"form-label\">Description détaillée *</label>
  6207. \t\t\t\t\t\t\t<textarea class=\"form-control\" id=\"reportDescription\" rows=\"4\" placeholder=\"Décrivez le problème rencontré...\" required></textarea>
  6208. \t\t\t\t\t\t</div>
  6209. \t\t\t\t\t\t<div class=\"mb-3\">
  6210. \t\t\t\t\t\t\t<label for=\"reportEmail\" class=\"form-label\">Votre email (optionnel)</label>
  6211. \t\t\t\t\t\t\t<input type=\"email\" class=\"form-control\" id=\"reportEmail\" placeholder=\"votre@email.com\">
  6212. \t\t\t\t\t\t\t<div class=\"form-text\">Nous pourrons vous contacter pour plus d'informations</div>
  6213. \t\t\t\t\t\t</div>
  6214. \t\t\t\t\t</form>
  6215. \t\t\t\t</div>
  6216. \t\t\t\t<div class=\"modal-footer\">
  6217. \t\t\t\t\t<button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Annuler</button>
  6218. \t\t\t\t\t<button type=\"button\" class=\"btn btn-danger\" onclick=\"submitReport()\">
  6219. \t\t\t\t\t\t<i class=\"lnr lnr-flag  me-2\"></i>Envoyer le signalement
  6220. \t\t\t\t\t</button>
  6221. \t\t\t\t</div>
  6222. \t\t\t</div>
  6223. \t\t</div>
  6224. \t</div>
  6225. \t<!-- Section des avis -->
  6226. \t<div class=\"container my-5\">
  6227. \t\t<div class=\"row\">
  6228. \t\t\t<div class=\"col-12\">
  6229. \t\t\t\t<div class=\"section-title text-center\">
  6230. \t\t\t\t\t<h2>Avis clients</h2>
  6231. \t\t\t\t\t<p>Découvrez ce que pensent nos clients de cette boutique</p>
  6232. \t\t\t\t</div>
  6233. \t\t\t</div>
  6234. \t\t</div>
  6235. \t\t<div
  6236. \t\t\tclass=\"row\">
  6237. \t\t\t<!-- Statistiques des avis -->
  6238. \t\t\t<div class=\"col-md-4\">
  6239. \t\t\t\t<div class=\"review-stats-card\">
  6240. \t\t\t\t\t<div class=\"stats-header\">
  6241. \t\t\t\t\t\t<div class=\"overall-rating\">
  6242. \t\t\t\t\t\t\t<span class=\"rating-number\">{{ shop.reviews|length > 0 ? (shop.reviews|map(r => r.rating)|reduce((a, b) => a + b) / shop.reviews|length)|number_format(1) : '0.0' }}</span>
  6243. \t\t\t\t\t\t\t<div class=\"stars\">
  6244. \t\t\t\t\t\t\t\t{% set avgRating = shop.reviews|length > 0 ? (shop.reviews|map(r => r.rating)|reduce((a, b) => a + b) / shop.reviews|length) : 0 %}
  6245. \t\t\t\t\t\t\t\t{% for i in 1..5 %}
  6246. \t\t\t\t\t\t\t\t\t{% if i <= avgRating %}
  6247. \t\t\t\t\t\t\t\t\t\t★
  6248. \t\t\t\t\t\t\t\t\t{% elseif i - avgRating < 1 %}
  6249. \t\t\t\t\t\t\t\t\t\t☆
  6250. \t\t\t\t\t\t\t\t\t{% else %}
  6251. \t\t\t\t\t\t\t\t\t\t☆
  6252. \t\t\t\t\t\t\t\t\t{% endif %}
  6253. \t\t\t\t\t\t\t\t{% endfor %}
  6254. \t\t\t\t\t\t\t</div>
  6255. \t\t\t\t\t\t</div>
  6256. \t\t\t\t\t\t<div class=\"rating-summary\">
  6257. \t\t\t\t\t\t\t<p class=\"mb-1\">{{ shop.reviews|length }}
  6258. \t\t\t\t\t\t\t\tavis</p>
  6259. \t\t\t\t\t\t\t<p class=\"text-muted small\">Basé sur
  6260. \t\t\t\t\t\t\t\t{{ shop.reviews|filter(r => r.isVerified)|length }}
  6261. \t\t\t\t\t\t\t\tavis vérifiés</p>
  6262. \t\t\t\t\t\t</div>
  6263. \t\t\t\t\t</div>
  6264. \t\t\t\t\t<div class=\"rating-breakdown\">
  6265. \t\t\t\t\t\t{% for rating in 5..1 %}
  6266. \t\t\t\t\t\t\t{% set count = shop.reviews|filter(r => r.rating == rating)|length %}
  6267. \t\t\t\t\t\t\t{% set percentage = shop.reviews|length > 0 ? (count / shop.reviews|length * 100) : 0 %}
  6268. \t\t\t\t\t\t\t<div class=\"rating-bar\">
  6269. \t\t\t\t\t\t\t\t<span class=\"rating-label\">{{ rating }}★</span>
  6270. \t\t\t\t\t\t\t\t<div class=\"rating-progress\">
  6271. \t\t\t\t\t\t\t\t\t<div class=\"rating-fill\" style=\"width: {{ percentage }}%\"></div>
  6272. \t\t\t\t\t\t\t\t</div>
  6273. \t\t\t\t\t\t\t\t<span class=\"rating-count\">{{ count }}</span>
  6274. \t\t\t\t\t\t\t</div>
  6275. \t\t\t\t\t\t{% endfor %}
  6276. \t\t\t\t\t</div>
  6277. \t\t\t\t</div>
  6278. \t\t\t</div>
  6279. \t\t\t<!-- Aperçu des avis -->
  6280. \t\t\t<div class=\"col-md-8\">
  6281. \t\t\t\t<div class=\"reviews-preview\">
  6282. \t\t\t\t\t{% if shop.reviews|length > 0 %}
  6283. \t\t\t\t\t\t{% for review in shop.reviews|slice(0, 3) %}
  6284. \t\t\t\t\t\t\t<div class=\"review-card-preview\">
  6285. \t\t\t\t\t\t\t\t<div class=\"review-header\">
  6286. \t\t\t\t\t\t\t\t\t<div class=\"review-user\">
  6287. \t\t\t\t\t\t\t\t\t\t<div class=\"user-avatar\">
  6288. \t\t\t\t\t\t\t\t\t\t\t{{ review.user.firstName|first|upper|default(review.user.email|first|upper) }}
  6289. \t\t\t\t\t\t\t\t\t\t</div>
  6290. \t\t\t\t\t\t\t\t\t\t<div class=\"user-info\">
  6291. \t\t\t\t\t\t\t\t\t\t\t<h6>{{ review.user.firstName|default('Utilisateur') }}</h6>
  6292. \t\t\t\t\t\t\t\t\t\t\t<small>{{ review.getTimeAgo() }}</small>
  6293. \t\t\t\t\t\t\t\t\t\t</div>
  6294. \t\t\t\t\t\t\t\t\t</div>
  6295. \t\t\t\t\t\t\t\t\t<div class=\"review-rating\">
  6296. \t\t\t\t\t\t\t\t\t\t<div class=\"stars\">{{ review.getRatingStars() }}</div>
  6297. \t\t\t\t\t\t\t\t\t\t{% if review.isVerified %}
  6298. \t\t\t\t\t\t\t\t\t\t\t<span class=\"verified-badge\">✓</span>
  6299. \t\t\t\t\t\t\t\t\t\t{% endif %}
  6300. \t\t\t\t\t\t\t\t\t</div>
  6301. \t\t\t\t\t\t\t\t</div>
  6302. \t\t\t\t\t\t\t\t<div class=\"review-content\">
  6303. \t\t\t\t\t\t\t\t\t{{ review.comment|slice(0, 150) }}
  6304. \t\t\t\t\t\t\t\t\t{% if review.comment|length > 150 %}...
  6305. \t\t\t\t\t\t\t\t\t{% endif %}
  6306. \t\t\t\t\t\t\t\t</div>
  6307. \t\t\t\t\t\t\t</div>
  6308. \t\t\t\t\t\t{% endfor %}
  6309. \t\t\t\t\t\t<div class=\"text-center mt-3\">
  6310. \t\t\t\t\t\t\t<a href=\"{{ path('shop_reviews_index', {'slug': shop.slug}) }}\" class=\"btn btn-outline-primary\">
  6311. \t\t\t\t\t\t\t\tVoir tous les avis ({{ shop.reviews|length }})
  6312. \t\t\t\t\t\t\t</a>
  6313. \t\t\t\t\t\t</div>
  6314. \t\t\t\t\t{% else %}
  6315. \t\t\t\t\t\t<div class=\"empty-reviews\">
  6316. \t\t\t\t\t\t\t<i class=\"lnr lnr-star\"></i>
  6317. \t\t\t\t\t\t\t<h4>Aucun avis pour le moment</h4>
  6318. \t\t\t\t\t\t\t<p>Soyez le premier à laisser un avis sur cette boutique !</p>
  6319. \t\t\t\t\t\t\t{% if app.user %}
  6320. \t\t\t\t\t\t\t\t<a href=\"{{ path('shop_reviews_new', {'slug': shop.slug}) }}\" class=\"btn btn-primary\">
  6321. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnraccount_recently_viewed-star\"></i>
  6322. \t\t\t\t\t\t\t\t\tLaisser un avis
  6323. \t\t\t\t\t\t\t\t</a>
  6324. \t\t\t\t\t\t\t{% endif %}
  6325. \t\t\t\t\t\t</div>
  6326. \t\t\t\t\t{% endif %}
  6327. \t\t\t\t</div>
  6328. \t\t\t</div>
  6329. \t\t</div>
  6330. \t</div>
  6331. {% endblock %}
  6332. {% block javascripts %}
  6333. \t<script>
  6334. \t\tdocument.addEventListener('DOMContentLoaded', function () {
  6335. \t\t\t// Initialisation du carrousel
  6336. \t\t\tconsole.log('DOM Content Loaded - Initializing carousel...');
  6337. \t\t\tsetTimeout(function() {
  6338. initCarousel();
  6339. \t\t\t}, 100);
  6340. // Gestion des onglets eBay-style avec Bootstrap
  6341. const tabLinks = document.querySelectorAll('.shop-tab-link');
  6342. const tabContents = document.querySelectorAll('.shop-tab-content');
  6343. tabLinks.forEach(link => {
  6344. link.addEventListener('click', function (e) {
  6345. e.preventDefault();
  6346. // Retirer la classe active de tous les liens et contenus
  6347. tabLinks.forEach(l => {
  6348. l.classList.remove('active');
  6349. l.setAttribute('aria-selected', 'false');
  6350. });
  6351. tabContents.forEach(c => c.classList.remove('active'));
  6352. // Ajouter la classe active au lien cliqué
  6353. this.classList.add('active');
  6354. this.setAttribute('aria-selected', 'true');
  6355. // Afficher le contenu correspondant
  6356. const targetTab = this.dataset.tab;
  6357. const targetContent = document.getElementById (`shop-\${targetTab}`);
  6358. if (targetContent) {
  6359. targetContent.classList.add('active');
  6360. }
  6361. });
  6362. });
  6363. // Gestion du système de follow
  6364. const followButton = document.getElementById('follow-button');
  6365. if (followButton) {
  6366. followButton.addEventListener('click', function () {
  6367. const shopId = this.dataset.shopId;
  6368. const isFollowing = this.dataset.following === 'true';
  6369. // Désactiver le bouton pendant la requête
  6370. this.disabled = true;
  6371. const originalText = this.innerHTML;
  6372. this.innerHTML = '<i class=\"lnr lnr-spinner\"></i> Loading...';
  6373. // Envoyer la requête
  6374. fetch(\"{{ path('ui_api_shop_toggle_follow', {id: '__SHOP_ID__'}) }}\".replace('__SHOP_ID__', shopId), {
  6375. method: 'POST',
  6376. headers: {
  6377. 'Content-Type': 'application/json',
  6378. 'X-Requested-With': 'XMLHttpRequest'
  6379. }
  6380. }).then(response => response.json()).then(data => {
  6381. if (data.success) { // Mettre à jour l'interface
  6382. this.dataset.following = data.isFollowing;
  6383. if (data.isFollowing) {
  6384. this.classList.add('following');
  6385. this.innerHTML = '<i class=\"lnr lnr-checkmark\"></i> Suivi';
  6386. } else {
  6387. this.classList.remove('following');
  6388. this.innerHTML = '<i class=\"lnr lnr-plus\"></i> Suivre';
  6389. }
  6390. // Mettre à jour le compteur de followers
  6391. if (followersCount && data.followersCount !== undefined) {
  6392. followersCount.textContent = data.followersCount.toLocaleString();
  6393. }
  6394. // Afficher un message de confirmation
  6395. showNotification(data.message, 'success');
  6396. } else {
  6397. showNotification(data.message, 'error');
  6398. }
  6399. }).catch(error => {
  6400. console.error('Erreur:', error);
  6401. showNotification('Une erreur est survenue', 'error');
  6402. }). finally(() => {
  6403. this.disabled = false;
  6404. });
  6405. });
  6406. }
  6407. // Fonction pour afficher les notifications
  6408. function showNotification(message, type = 'info') { // Créer l'élément de notification
  6409. const notification = document.createElement('div');
  6410. notification.className = `alert alert-\${
  6411. type === 'success' ? 'success' : type === 'error' ? 'danger' : 'info'
  6412. } alert-dismissible fade show position-fixed`;
  6413. notification.style.cssText = 'top: 20px; right: 20px; z-index: 9999; min-width: 300px;';
  6414. notification.innerHTML = `
  6415.             \${message}
  6416.             <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\"></button>
  6417.         `;
  6418. document.body.appendChild(notification);
  6419. // Supprimer automatiquement après 5 secondes
  6420. setTimeout(() => {
  6421. if (notification.parentNode) {
  6422. notification.remove();
  6423. }
  6424. }, 5000);
  6425. }
  6426. // Fonctions pour les actions de boutique
  6427. window.shareShop = function () { // Vérifier si l'API Web Share est disponible et si on est sur mobile
  6428. if (navigator.share && /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
  6429. navigator.share({title: '{{ shop.name }}- Boutique sur MaketOu', text: 'Découvrez cette boutique et ses produits sur MaketOu', url: window.location.href}).then(() => {
  6430. console.log('Partage réussi');
  6431. showNotification('Lien partagé avec succès !', 'success');
  6432. }).catch((error) => {
  6433. console.log('Erreur lors du partage:', error);
  6434. // Fallback vers la copie
  6435. copyToClipboard();
  6436. });
  6437. } else { // Sur desktop ou si Web Share n'est pas disponible, copier directement
  6438. copyToClipboard();
  6439. }
  6440. };
  6441. // Fonction pour copier le lien dans le presse-papiers
  6442. function copyToClipboard() {
  6443. const shopUrl = window.location.href;
  6444. const shopName = '{{ shop.name }}';
  6445. const shareText = `Découvrez la boutique \"\${shopName}\" sur MaketOu : \${shopUrl}`;
  6446. // Utiliser directement le fallback pour éviter les conflits
  6447. fallbackCopyToClipboard(shareText);
  6448. }
  6449. // Fallback pour copier le texte
  6450. function fallbackCopyToClipboard(text) {
  6451. const textArea = document.createElement('textarea');
  6452. textArea.value = text;
  6453. textArea.style.position = 'fixed';
  6454. textArea.style.left = '-999999px';
  6455. textArea.style.top = '-999999px';
  6456. document.body.appendChild(textArea);
  6457. textArea.focus();
  6458. textArea.select();
  6459. try {
  6460. document.execCommand('copy');
  6461. showNotification('Lien copié dans le presse-papiers !', 'success');
  6462. } catch (err) {
  6463. console.error('Impossible de copier:', err);
  6464. showNotification('Impossible de copier le lien', 'error');
  6465. }
  6466. document.body.removeChild(textArea);
  6467. }
  6468. window.contactShop = function () { // Ouvrir un modal de signalement
  6469. openReportModal();
  6470. };
  6471. window.saveShop = function () { // Sauvegarder la boutique dans les favoris
  6472. showNotification('Boutique sauvegardée dans vos favoris', 'success');
  6473. };
  6474. // Fonction pour ouvrir le modal de signalement
  6475. window.openReportModal = function () {
  6476. const modal = new bootstrap.Modal(document.getElementById('reportModal'));
  6477. modal.show();
  6478. };
  6479. // Fonction pour soumettre le signalement
  6480. window.submitReport = function () {
  6481. const reason = document.getElementById('reportReason').value;
  6482. const description = document.getElementById('reportDescription').value;
  6483. const email = document.getElementById('reportEmail').value;
  6484. if (! reason || ! description) {
  6485. showNotification('Veuillez remplir tous les champs obligatoires', 'error');
  6486. return;
  6487. }
  6488. // Simuler l'envoi du signalement
  6489. const reportData = {
  6490. shopId: {{ shop.id }},
  6491. reason: reason,
  6492. description: description,
  6493. email: email,
  6494. reportedAt: new Date().toISOString()
  6495. };
  6496. console.log('Signalement envoyé:', reportData);
  6497. // Fermer le modal
  6498. const modal = bootstrap.Modal.getInstance(document.getElementById('reportModal'));
  6499. modal.hide();
  6500. // Réinitialiser le formulaire
  6501. document.getElementById('reportForm').reset();
  6502. // Afficher la confirmation
  6503. showNotification('Signalement envoyé avec succès. Nous examinerons votre demande.', 'success');
  6504. };
  6505. // Gestion du carrousel eBay-style - Variables globales
  6506. let currentSlide = 0;
  6507. let carouselInterval = null;
  6508. let isPaused = false;
  6509. let slides = [];
  6510. let indicators = [];
  6511. let carouselInitialized = false;
  6512. let autoSlideDelay = 5000; // Délai par défaut : 5 secondes
  6513. let userInteractionTimeout = null; // Timeout pour reprendre après interaction utilisateur
  6514. let isUserInteracting = false; // Flag pour savoir si l'utilisateur interagit
  6515. let pageVisibilityHidden = false; // Flag pour savoir si la page est cachée
  6516. // Définir les fonctions globales immédiatement pour qu'elles soient disponibles pour onclick
  6517. window.nextSlide = function() {
  6518.     if (slides.length === 0) {
  6519.         console.warn('nextSlide: No slides available, initializing...');
  6520.         initCarousel();
  6521.         return;
  6522.     }
  6523.     // Marquer comme interaction utilisateur
  6524.     handleUserInteraction();
  6525.     currentSlide = (currentSlide + 1) % slides.length;
  6526.     console.log('nextSlide: Moving to slide', currentSlide);
  6527.     updateCarousel();
  6528. };
  6529. window.previousSlide = function() {
  6530.     if (slides.length === 0) {
  6531.         console.warn('previousSlide: No slides available, initializing...');
  6532.         initCarousel();
  6533.         return;
  6534.     }
  6535.     // Marquer comme interaction utilisateur
  6536.     handleUserInteraction();
  6537.     currentSlide = (currentSlide - 1 + slides.length) % slides.length;
  6538.     console.log('previousSlide: Moving to slide', currentSlide);
  6539.     updateCarousel();
  6540. };
  6541. window.goToSlide = function(index) {
  6542.     if (slides.length === 0) {
  6543.         console.warn('goToSlide: No slides available, initializing...');
  6544.         initCarousel();
  6545.         // Attendre que l'initialisation soit terminée
  6546.         setTimeout(() => {
  6547.             if (index >= 0 && index < slides.length) {
  6548.                 currentSlide = index;
  6549.                 updateCarousel();
  6550.                 // Réinitialiser le carrousel automatique
  6551.                 handleUserInteraction();
  6552.             }
  6553.         }, 150);
  6554.         return;
  6555.     }
  6556.     if (index < 0 || index >= slides.length) {
  6557.         console.warn('goToSlide: Invalid index', index, '. Valid range: 0 to', slides.length - 1);
  6558.         return;
  6559.     }
  6560.     // Marquer comme interaction utilisateur
  6561.     handleUserInteraction();
  6562.     currentSlide = index;
  6563.     console.log('goToSlide: Moving to slide', currentSlide, 'of', slides.length);
  6564.     updateCarousel();
  6565. };
  6566. window.toggleCarousel = function() {
  6567.     if (slides.length === 0) {
  6568.         console.warn('toggleCarousel: No slides available, initializing...');
  6569.         initCarousel();
  6570.         return;
  6571.     }
  6572.     if (isPaused) {
  6573.         resumeCarousel();
  6574.     } else {
  6575.         pauseCarousel();
  6576.     }
  6577. };
  6578. function initCarousel() {
  6579.     if (carouselInitialized) {
  6580.         console.log('Carousel already initialized');
  6581.         return;
  6582.     }
  6583.     // Réinitialiser les variables
  6584.     currentSlide = 0;
  6585.     isPaused = false;
  6586.     
  6587.     // Récupérer les slides et indicateurs à nouveau
  6588.     const carouselContainer = document.querySelector('.shop-carousel-ebay');
  6589.     if (!carouselContainer) {
  6590.         console.log('Carousel container not found');
  6591.         return;
  6592.     }
  6593.     
  6594.     const allSlides = carouselContainer.querySelectorAll('.carousel-slide');
  6595.     const allIndicators = carouselContainer.querySelectorAll('.carousel-indicator-ebay');
  6596.     
  6597.     if (allSlides.length === 0) {
  6598.         // Masquer les contrôles si aucune image
  6599.         const controls = carouselContainer.querySelector('.carousel-controls-ebay');
  6600.         const indicatorsContainer = carouselContainer.querySelector('.carousel-indicators-ebay');
  6601.         if (controls) controls.style.display = 'none';
  6602.         if (indicatorsContainer) indicatorsContainer.style.display = 'none';
  6603.         return;
  6604.     }
  6605.     
  6606.     // Si une seule image, masquer les contrôles
  6607.     if (allSlides.length <= 1) {
  6608.         const controls = carouselContainer.querySelector('.carousel-controls-ebay');
  6609.         const indicatorsContainer = carouselContainer.querySelector('.carousel-indicators-ebay');
  6610.         if (controls) controls.style.display = 'none';
  6611.         if (indicatorsContainer) indicatorsContainer.style.display = 'none';
  6612.         // S'assurer que la slide unique est active
  6613.         allSlides[0].classList.add('active');
  6614.         return;
  6615.     }
  6616.     
  6617.     // Afficher les contrôles si plusieurs images
  6618.     const controls = carouselContainer.querySelector('.carousel-controls-ebay');
  6619.     const indicatorsContainer = carouselContainer.querySelector('.carousel-indicators-ebay');
  6620.     if (controls) controls.style.display = 'flex';
  6621.     if (indicatorsContainer) indicatorsContainer.style.display = 'flex';
  6622.     
  6623.     // Mettre à jour les références globales - convertir NodeList en Array
  6624.     slides = Array.from(allSlides);
  6625.     indicators = Array.from(allIndicators);
  6626.     
  6627.     console.log('initCarousel: Found', slides.length, 'slides and', indicators.length, 'indicators');
  6628.     
  6629.     // S'assurer que la première slide est active immédiatement
  6630.     currentSlide = 0;
  6631.     slides.forEach((slide, index) => {
  6632.         if (index === 0) {
  6633.             slide.classList.add('active');
  6634.             slide.style.opacity = '1';
  6635.             slide.style.zIndex = '2';
  6636.         } else {
  6637.             slide.classList.remove('active');
  6638.             slide.style.opacity = '0';
  6639.             slide.style.zIndex = '1';
  6640.         }
  6641.     });
  6642.     if (indicators.length > 0) {
  6643.         indicators.forEach((indicator, index) => {
  6644.             if (index === 0) {
  6645.                 indicator.classList.add('active');
  6646.             } else {
  6647.                 indicator.classList.remove('active');
  6648.             }
  6649.         });
  6650.     }
  6651.     
  6652.     // Démarrer le carrousel automatique immédiatement
  6653.     console.log('Initializing carousel - starting automatic rotation...');
  6654.     isPaused = false; // S'assurer que le carrousel n'est pas en pause
  6655.     startCarousel();
  6656.     
  6657.     // Gérer les événements de survol (une seule fois)
  6658.     carouselContainer.addEventListener('mouseenter', function() {
  6659.         if (!isPaused) {
  6660.             pauseCarousel();
  6661.         }
  6662.     });
  6663.     carouselContainer.addEventListener('mouseleave', function() {
  6664.         // Ne reprendre que si l'utilisateur n'a pas mis en pause manuellement
  6665.         if (!isPaused && !isUserInteracting && !pageVisibilityHidden) {
  6666.             startCarousel();
  6667.         }
  6668.     });
  6669.     
  6670.     // Gérer la visibilité de la page (pause quand la page est cachée)
  6671.     document.addEventListener('visibilitychange', function() {
  6672.         if (document.hidden) {
  6673.             pageVisibilityHidden = true;
  6674.             if (!isPaused) {
  6675.                 pauseCarousel();
  6676.             }
  6677.         } else {
  6678.             pageVisibilityHidden = false;
  6679.             // Reprendre seulement si l'utilisateur n'a pas mis en pause manuellement
  6680.             if (!isPaused && !isUserInteracting) {
  6681.                 startCarousel();
  6682.             }
  6683.         }
  6684.     });
  6685.     
  6686.     carouselInitialized = true;
  6687.     console.log('Carousel initialized with', slides.length, 'slides');
  6688. }
  6689. function startCarousel() {
  6690.     // Nettoyer l'intervalle existant
  6691.     clearInterval(carouselInterval);
  6692.     
  6693.     // Ne pas démarrer si la page est cachée ou si l'utilisateur interagit
  6694.     if (pageVisibilityHidden || isUserInteracting) {
  6695.         return;
  6696.     }
  6697.     
  6698.     if (slides.length <= 1) {
  6699.         console.log('Not enough slides to start carousel');
  6700.         return;
  6701.     }
  6702.     
  6703.     // S'assurer que isPaused est false pour démarrer
  6704.     isPaused = false;
  6705.     
  6706.     const pauseBtn = document.getElementById('pauseBtn');
  6707.     const pauseIcon = document.getElementById('pauseIcon');
  6708.     if (pauseBtn) {
  6709.         pauseBtn.classList.remove('playing');
  6710.         if (pauseIcon) {
  6711.             pauseIcon.textContent = '⏸';
  6712.             pauseIcon.className = 'pause-icon-content';
  6713.             pauseIcon.style.display = 'inline-block';
  6714.             pauseIcon.style.color = 'white';
  6715.             pauseIcon.style.fontSize = '22px';
  6716.             pauseIcon.style.visibility = 'visible';
  6717.             pauseIcon.style.opacity = '1';
  6718.         }
  6719.     }
  6720.     
  6721.     console.log('Starting carousel automatically...');
  6722.     carouselInterval = setInterval(() => {
  6723.         // Vérifier les conditions avant de changer de slide
  6724.         if (!isPaused && !isUserInteracting && !pageVisibilityHidden && slides.length > 0) {
  6725.             // Utiliser la fonction interne nextSlide pour éviter de déclencher handleUserInteraction
  6726.             currentSlide = (currentSlide + 1) % slides.length;
  6727.             console.log('Auto slide:', currentSlide);
  6728.             updateCarousel();
  6729.         }
  6730.     }, autoSlideDelay);
  6731. }
  6732. // Fonction pour gérer les interactions utilisateur
  6733. function handleUserInteraction() {
  6734.     isUserInteracting = true;
  6735.     
  6736.     // Nettoyer le timeout précédent s'il existe
  6737.     if (userInteractionTimeout) {
  6738.         clearTimeout(userInteractionTimeout);
  6739.     }
  6740.     
  6741.     // Reprendre le carrousel automatique après 3 secondes d'inactivité
  6742.     userInteractionTimeout = setTimeout(() => {
  6743.         isUserInteracting = false;
  6744.         // Reprendre seulement si l'utilisateur n'a pas mis en pause manuellement
  6745.         if (!isPaused && !pageVisibilityHidden) {
  6746.             startCarousel();
  6747.         }
  6748.     }, 3000);
  6749. }
  6750. function pauseCarousel() {
  6751. isPaused = true;
  6752. clearInterval(carouselInterval);
  6753.     
  6754.     // Nettoyer le timeout d'interaction utilisateur
  6755.     if (userInteractionTimeout) {
  6756.         clearTimeout(userInteractionTimeout);
  6757.         userInteractionTimeout = null;
  6758.     }
  6759.     
  6760.     const pauseBtn = document.getElementById('pauseBtn');
  6761. const pauseIcon = document.getElementById('pauseIcon');
  6762.     if (pauseBtn) {
  6763.         pauseBtn.classList.add('playing');
  6764. if (pauseIcon) {
  6765.             pauseIcon.textContent = '▶';
  6766.             pauseIcon.className = 'pause-icon-content';
  6767.             pauseIcon.style.display = 'inline-block';
  6768.             pauseIcon.style.color = 'white';
  6769.             pauseIcon.style.fontSize = '22px';
  6770.             pauseIcon.style.visibility = 'visible';
  6771.             pauseIcon.style.opacity = '1';
  6772.         }
  6773. }
  6774. }
  6775. function resumeCarousel() {
  6776. isPaused = false;
  6777.     isUserInteracting = false; // Réinitialiser le flag d'interaction
  6778.     
  6779.     // Nettoyer le timeout d'interaction utilisateur
  6780.     if (userInteractionTimeout) {
  6781.         clearTimeout(userInteractionTimeout);
  6782.         userInteractionTimeout = null;
  6783.     }
  6784.     
  6785.     const pauseBtn = document.getElementById('pauseBtn');
  6786. const pauseIcon = document.getElementById('pauseIcon');
  6787.     if (pauseBtn) {
  6788.         pauseBtn.classList.remove('playing');
  6789. if (pauseIcon) {
  6790.             pauseIcon.textContent = '⏸';
  6791.             pauseIcon.className = 'pause-icon-content';
  6792.             pauseIcon.style.display = 'inline-block';
  6793.             pauseIcon.style.color = 'white';
  6794.             pauseIcon.style.fontSize = '22px';
  6795.             pauseIcon.style.visibility = 'visible';
  6796.             pauseIcon.style.opacity = '1';
  6797. }
  6798.     }
  6799.     
  6800.     // Ne reprendre que si la page est visible
  6801.     if (!pageVisibilityHidden) {
  6802. startCarousel();
  6803.     }
  6804. }
  6805. function toggleCarousel() {
  6806.     const pauseBtn = document.getElementById('pauseBtn');
  6807.     const pauseIcon = document.getElementById('pauseIcon');
  6808.     
  6809. if (isPaused) {
  6810. resumeCarousel();
  6811. } else {
  6812. pauseCarousel();
  6813. }
  6814. }
  6815. function nextSlide() {
  6816.     if (slides.length === 0) {
  6817.         console.warn('No slides available');
  6818.         return;
  6819.     }
  6820. currentSlide = (currentSlide + 1) % slides.length;
  6821.     console.log('Next slide:', currentSlide);
  6822. updateCarousel();
  6823. }
  6824. function previousSlide() {
  6825.     if (slides.length === 0) {
  6826.         console.warn('No slides available');
  6827.         return;
  6828.     }
  6829. currentSlide = (currentSlide - 1 + slides.length) % slides.length;
  6830.     console.log('Previous slide:', currentSlide);
  6831. updateCarousel();
  6832. }
  6833. // Fonction interne goToSlide (utilisée par window.goToSlide)
  6834. function goToSlide(index) {
  6835.     if (slides.length === 0) {
  6836.         console.warn('goToSlide: No slides available');
  6837.         return;
  6838.     }
  6839.     if (index < 0 || index >= slides.length) {
  6840.         console.warn('goToSlide: Invalid index', index, '. Valid range: 0 to', slides.length - 1);
  6841.         return;
  6842.     }
  6843.     // Marquer comme interaction utilisateur
  6844.     handleUserInteraction();
  6845. currentSlide = index;
  6846.     console.log('goToSlide: Moving to slide', currentSlide, 'of', slides.length);
  6847. updateCarousel();
  6848. }
  6849. function updateCarousel() {
  6850.     if (slides.length === 0) {
  6851.         console.warn('No slides to update');
  6852.         return;
  6853.     }
  6854.     
  6855.     console.log('updateCarousel: Updating to slide', currentSlide, 'of', slides.length, 'slides');
  6856.     console.log('updateCarousel: Total indicators:', indicators.length);
  6857.     
  6858.     // Masquer toutes les slides et réinitialiser leurs styles
  6859.     slides.forEach((slide, index) => {
  6860.         slide.classList.remove('active');
  6861.         if (index === currentSlide) {
  6862.             slide.classList.add('active');
  6863.             slide.style.opacity = '1';
  6864.             slide.style.zIndex = '2';
  6865.         } else {
  6866.             slide.style.opacity = '0';
  6867.             slide.style.zIndex = '1';
  6868.         }
  6869.     });
  6870.     
  6871.     // Mettre à jour tous les indicateurs - FORCER la mise à jour en deux passes distinctes
  6872.     if (indicators.length > 0) {
  6873.         console.log('updateCarousel: Updating', indicators.length, 'indicators, currentSlide:', currentSlide);
  6874.         
  6875.         // Première passe : retirer active de TOUS les indicateurs
  6876.         indicators.forEach((indicator) => {
  6877.             indicator.classList.remove('active');
  6878.         });
  6879.         
  6880.         // Deuxième passe : ajouter active à l'indicateur correspondant à currentSlide
  6881.         if (currentSlide >= 0 && currentSlide < indicators.length && indicators[currentSlide]) {
  6882.             const activeIndicator = indicators[currentSlide];
  6883.             activeIndicator.classList.add('active');
  6884.             console.log('updateCarousel: Activated indicator', currentSlide);
  6885.             
  6886.             // Vérification et forcer si nécessaire
  6887.             if (!activeIndicator.classList.contains('active')) {
  6888.                 console.warn('updateCarousel: Class not added, forcing with setAttribute');
  6889.                 activeIndicator.setAttribute('class', activeIndicator.className + ' active');
  6890.             }
  6891.         } else {
  6892.             console.error('updateCarousel: Invalid currentSlide', currentSlide, 'or indicator not found. Total indicators:', indicators.length);
  6893.         }
  6894.     } else {
  6895.         console.warn('updateCarousel: No indicators available');
  6896.     }
  6897.     
  6898.     // Afficher la slide active
  6899.     if (slides[currentSlide]) {
  6900.         slides[currentSlide].classList.add('active');
  6901.         slides[currentSlide].style.opacity = '1';
  6902.         slides[currentSlide].style.zIndex = '2';
  6903.         console.log('updateCarousel: Showing slide', currentSlide);
  6904.     } else {
  6905.         console.error('updateCarousel: Slide', currentSlide, 'not found. Total slides:', slides.length);
  6906.     }
  6907. }
  6908. // Les fonctions globales sont définies au début du script
  6909. // Gestion du tri des produits via API Symfony
  6910. console.log('=== INITIALIZING PRODUCT SORTING ===');
  6911. console.log('Shop ID:', {{ shop.id }});
  6912. // Fonction de tri via AJAX - RENDUE GLOBALE
  6913. window.sortProducts = function (sortValue) {
  6914. console.log('=== SORT PRODUCTS CALLED ===');
  6915. console.log('Sort value:', sortValue);
  6916. const productsContainer = document.getElementById('products-container');
  6917. console.log('Products container:', productsContainer);
  6918. if (! productsContainer) {
  6919. console.error('Products container not found!');
  6920. return;
  6921. }
  6922. if (! sortValue) {
  6923. console.log('Resetting to original order');
  6924. // Recharger la page pour revenir à l'ordre original
  6925. window.location.reload();
  6926. return;
  6927. }
  6928. console.log('Showing loading spinner...');
  6929. // Afficher un indicateur de chargement
  6930. productsContainer.innerHTML = '<div class=\"col-12 text-center py-5\"><div class=\"spinner-border text-primary\" role=\"status\"><span class=\"visually-hidden\">Chargement...</span></div><p class=\"mt-3\">Tri des produits en cours...</p></div>';
  6931. // Récupérer l'ID de la boutique
  6932. const shopId = {{ shop.id }};
  6933. console.log('Shop ID for request:', shopId);
  6934. const url = \"{{ path('ui_api_shop_products_sort', {id: '__SHOP_ID__'}) }}\".replace('__SHOP_ID__', shopId);
  6935. console.log('Request URL:', url);
  6936. const requestData = {
  6937. sortBy: sortValue
  6938. };
  6939. console.log('Request data:', requestData);
  6940. // Envoyer la requête AJAX
  6941. console.log('Sending AJAX request...');
  6942. fetch(url, {
  6943. method: 'POST',
  6944. headers: {
  6945. 'Content-Type': 'application/json',
  6946. 'X-Requested-With': 'XMLHttpRequest'
  6947. },
  6948. body: JSON.stringify(requestData)
  6949. }).then(response => {
  6950. console.log('Response received:', response);
  6951. console.log('Response status:', response.status);
  6952. return response.json();
  6953. }).then(data => {
  6954. console.log('Sort response data:', data);
  6955. if (data.success) {
  6956. console.log('Sort successful, updating content...');
  6957. // Mettre à jour le contenu avec le HTML retourné
  6958. productsContainer.innerHTML = data.html;
  6959. // Mettre à jour le compteur de produits
  6960. const productCount = document.querySelector('.product-count');
  6961. if (productCount) {
  6962. productCount.textContent = data.count;
  6963. }
  6964. console.log('Products sorted successfully!');
  6965. } else {
  6966. console.error('Sort failed:', data.message);
  6967. showNotification('Erreur lors du tri: ' + data.message, 'error');
  6968. // Recharger la page en cas d'erreur
  6969. window.location.reload();
  6970. }
  6971. }).catch(error => {
  6972. console.error('Sort request failed:', error);
  6973. showNotification('Erreur de connexion lors du tri', 'error');
  6974. // Recharger la page en cas d'erreur
  6975. window.location.reload();
  6976. });
  6977. };
  6978. // Attendre que le DOM soit chargé
  6979. console.log('Setting up event listeners...');
  6980. setTimeout(() => {
  6981. const sortSelect = document.getElementById('product-sort');
  6982. console.log('Sort select element:', sortSelect);
  6983. if (sortSelect) {
  6984. console.log('Adding change event listener...');
  6985. sortSelect.addEventListener('change', function () {
  6986. console.log('=== SELECT CHANGE EVENT TRIGGERED ===');
  6987. console.log('Selected value:', this.value);
  6988. console.log('Calling sortProducts...');
  6989. window.sortProducts(this.value);
  6990. });
  6991. console.log('Event listener added successfully');
  6992. } else {
  6993. console.error('Sort select element not found!');
  6994. console.log('Available elements with ID containing \"sort\":', document.querySelectorAll('[id*=\"sort\"]'));
  6995. console.log('Available elements with class containing \"form-select\":', document.querySelectorAll('.form-select'));
  6996. }
  6997. }, 100);
  6998. // Gestion du bouton \"Suivre\"
  6999. const followBtn = document.querySelector('.btn-shop');
  7000. if (followBtn) {
  7001. followBtn.addEventListener('click', function () {
  7002. if (this.innerHTML.includes('Suivre')) {
  7003. this.innerHTML = '<i class=\"lnr lnr-heart me-1\"></i> Suivi';
  7004. this.classList.remove('btn-shop');
  7005. this.classList.add('btn-success');
  7006. } else {
  7007. this.innerHTML = '<i class=\"lnr lnr-heart me-1\"></i> Suivre';
  7008. this.classList.remove('btn-success');
  7009. this.classList.add('btn-shop');
  7010. }
  7011. });
  7012. }
  7013. });
  7014. \t</script>
  7015. {% endblock %}
  7016. ""home/shop.html.twig""/home/u540977899/domains/maketou-ht.com/public_html/templates/home/shop.html.twig");
  7017.     }
  7018. }