{"id":4074,"date":"2025-07-15T21:49:16","date_gmt":"2025-07-16T02:49:16","guid":{"rendered":"https:\/\/itishoemath.com\/?p=4074"},"modified":"2025-10-17T10:18:47","modified_gmt":"2025-10-17T15:18:47","slug":"98-pourquoi-cest-difficile","status":"publish","type":"post","link":"https:\/\/itishoemath.com\/fr\/98-pourquoi-cest-difficile\/","title":{"rendered":"98% [Pourquoi est-ce difficile ?]"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"4074\" class=\"elementor elementor-4074\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-97dd7a3 e-flex e-con-boxed e-con e-parent\" data-id=\"97dd7a3\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ce1c704 elementor-widget elementor-widget-html\" data-id=\"ce1c704\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4>Pourquoi les rencontres sont-elles si difficiles ?<\/h4>\n<br>\n<b>1. Id\u00e9es fausses sur ce qui est important<\/b>\nLa plupart des gens pensent que les hommes se battent \u00e0 cause de normes insens\u00e9es en mati\u00e8re d'apparence. Ce n'est pas le cas. La plupart des hommes ne sont pas perdants parce qu'ils veulent des mannequins - ils se heurtent \u00e0 un autre mur.\n<br><br>\n<b>2. Les rencontres sont-elles moins gratifiantes ?<\/b>\nAutrefois, les rencontres \u00e9taient excitantes. Aujourd'hui, les hommes et les femmes sont de plus en plus d\u00e9\u00e7us. La soci\u00e9t\u00e9 ne cesse de rehausser les attentes et d'alt\u00e9rer le sens de la valeur.<!--preview-->Chaque fois que l'on touche \u00e0 l'\u00e9cran ou que l'on discute, on a l'impression de faire un pari qui ne rapporte pas grand-chose.\n<br><br>\n<b>3. Qui finit avec qui ?<\/b>\nVous n'\u00eates pas en train de rater votre coup parce que vous avez un physique moyen. La plupart des gens finissent par se mettre en couple avec des personnes qui leur ressemblent. La premi\u00e8re impression est importante, mais elle est rarement \u00e0 l'origine de l'\u00e9chec d'une relation.\n<br><br>\n<b>4. Ce n'est pas qu'une question d'apparence<\/b>\nBien s\u00fbr, tout le monde a des normes de base. Mais la vraie connexion ? Elle vient de ce qui se cache sous la surface - les int\u00e9r\u00eats, l'\u00e9tat d'esprit et la disponibilit\u00e9 des gens. Le probl\u00e8me est de rencontrer des femmes qui sont r\u00e9ellement ouvertes \u00e0 quelque chose de vrai.\n<br><br>\n<b>5. Le pi\u00e8ge de l'application<\/b>\nLes applications transforment les rencontres en un jeu de chiffres - et la plupart des hommes perdent. Pour la plupart des hommes, il s'agit de correspondances mortes et de bo\u00eetes de r\u00e9ception vides. Tous ces rejets s'accumulent et les hommes se sentent invisibles et n'ont plus envie d'essayer.\n<br><br>\n<b>6. Mod\u00e8les bris\u00e9s<\/b>\nLes cycles de rencontres modernes sont brutaux. Au lieu d'\u00e9tablir la confiance, les gens passent \u00e0 l'option suivante, \"font le singe\" avec de nouveaux partenaires, et d\u00e9passent rarement le cycle des connexions rapides et des d\u00e9ceptions r\u00e9p\u00e9t\u00e9es.\n<br><br>\n<b>7. Le vrai probl\u00e8me<\/b>\nLa v\u00e9rit\u00e9 ? Il ne s'agit pas de d\u00e9crocher un dix. Il s'agit de deviner sans cesse ce que l'autre personne veut, qui est r\u00e9ellement disponible et si quelqu'un est s\u00e9rieux dans sa volont\u00e9 de construire quelque chose de durable.\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8858505 elementor-widget elementor-widget-html\" data-id=\"8858505\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p> <\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4860eef elementor-widget elementor-widget-html\" data-id=\"4860eef\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- CSV for video links and summaries -->\n<!-- Header: Not Translated -->\n<script id=\"video-data-header\" type=\"text\/plain\">\ntime|stop|tab|title|description\n<\/script>\n<div id=\"tp-translatable-strings2\"\n     style=\"color:#000101; background:#000101; width:100vw; height:auto; position:static; z-index:1; font-size:1px;\">\n<pre id=\"video-data-rows\">\n0|30|Images erron\u00e9es|Images erron\u00e9es sur les pr\u00e9f\u00e9rences masculines|\"La discussion s'ouvre sur l'id\u00e9e fausse selon laquelle les hommes ont du mal \u00e0 faire des rencontres en raison de normes \u00e9lev\u00e9es en mati\u00e8re d'attrait physique, en pr\u00e9cisant qu'il ne s'agit pas l\u00e0 du probl\u00e8me principal.\"\n31|86|Attentes|Attentes et valeur dans les rencontres|\"La conversation souligne que les hommes et les femmes ont des exp\u00e9riences positives et n\u00e9gatives les uns avec les autres, et introduit l'id\u00e9e que les rencontres sont moins gratifiantes au fil du temps, en se r\u00e9f\u00e9rant aux perceptions sociales et aux tableaux de valeurs.\"\n87|148|Accordement|Accordement et normes|\"Il est expliqu\u00e9 que la plupart des gens finissent par avoir des partenaires semblables \u00e0 eux en termes d'attractivit\u00e9, et que les jugements initiaux bas\u00e9s sur l'apparence sont courants mais ne constituent pas le principal obstacle aux relations.\"\n149|213|Priorit\u00e9s|Priorit\u00e9s au-del\u00e0 de l'apparence|\"L'importance d'autres qualit\u00e9s que l'apparence est discut\u00e9e, en notant que chacun a des exigences minimales mais que des traits plus profonds peuvent changer les perceptions, les hommes ayant souvent du mal \u00e0 rencontrer des femmes vraiment disponibles.\"\n214|307|Technologie|L'impact de la technologie sur les rencontres|\"Les applications de rencontres amplifient le rejet et la d\u00e9tresse \u00e9motionnelle des hommes, car la majorit\u00e9 d'entre eux re\u00e7oivent tr\u00e8s peu de correspondances ou de r\u00e9ponses, ce qui entra\u00eene une frustration et un sentiment de futilit\u00e9.\"\n308|456|Mod\u00e8les|Mod\u00e8les et cycles de relations|\"Le r\u00e9cit d\u00e9crit des cycles communs dans les relations modernes, tels que les connexions br\u00e8ves, les \"branches de singe\" et la difficult\u00e9 d'\u00e9tablir la confiance en raison des attentes changeantes et des d\u00e9ceptions r\u00e9p\u00e9t\u00e9es.\"\n457|480|Cause_originale|Cause_originale des difficult\u00e9s de rencontre|\"La conclusion souligne que le v\u00e9ritable d\u00e9fi des rencontres n'est pas de trouver des partenaires s\u00e9duisants, mais l'incertitude quant aux intentions, \u00e0 la disponibilit\u00e9 et \u00e0 la capacit\u00e9 de nouer des liens significatifs et durables.\"\n<\/pre>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9265a2c elementor-widget elementor-widget-html\" data-id=\"9265a2c\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- 2.1. MOD Image CSV -->\n<!-- 1st image, update this\n     ImageID_3 image data locations and text -->\n<div id=\"tp-translatable-strings3\"\n     style=\"color:#000101; background:#000101; width:100vw; height:auto; position:static; z-index:1; font-size:1px;\">\n<!-- CSV for image1  style=\"display:none;\" -->\n<pre id=\"hotspot-data-image1\">\n<span class=\"notranslate\">\nordre|x_px|y_px|Gauche_droite_sup\u00e9rieur_inf\u00e9rieur|texte\n1|228|163|B|<span class=\"translate\">Une femme formidable, un homme qui s'attache<\/span>\n2|623|94|R|<span class=\"translate\">La femme se sent \u00e0 l'aise et l\u00e2che la v\u00e9rit\u00e9 : \"J'ai \u00e9t\u00e9 strip-teaseuse\", \"J'ai couch\u00e9 avec 400 personnes\" ou \"J'ai eu un plan \u00e0 trois deux jours avant de te rencontrer\".<\/span>\n3|649|368|R|<span class=\"translate\">La femme s'attend \u00e0 ce que nous lui disions : \"Ce n'est pas grave, je t'aime maintenant\", mais ce n'est jamais le cas.<\/span>\n<\/span>\n<\/pre>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-53abaad elementor-widget elementor-widget-html\" data-id=\"53abaad\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- 2.2. OPTIONAL 2nd Image CSV -->\n<!-- 2nd image, update this, else delete\n     ImageID_3 image data locations and text -->\n<div id=\"tp-translatable-strings4\"\n     style=\"color:#000101; background:#000101; width:100vw; height:auto; position:static; z-index:1; font-size:1px;\">\n<pre id=\"hotspot-data-image2\">\n<span class=\"notranslate\">\nordre|x_px|y_px|gauche_droite_sup\u00e9rieur_inf\u00e9rieur|texte\n1|75|54|B|<span class=\"translate\">Il offre la stabilit\u00e9 et la paix.<\/span>\n2|169|77|R|<span class=\"translate\">La femme \"s'ennuie\" et s'en va pour quelqu'un d'autre.<\/span>\n3|255|170|B|<span class=\"translate\"><span>h<\/span>C'est ce qui est arriv\u00e9 \u00e0 oe_math au d\u00e9but de sa vie amoureuse. Puis, lorsqu'il a \u00e9t\u00e9 beaucoup plus s\u00e9duisant, les filles ont commenc\u00e9 \u00e0 quitter leur petit ami pour lui, et il s'est rendu compte que c'\u00e9tait pour \u00e7a qu'elles partaient, qu'elles avaient trouv\u00e9 quelque chose d'autre.<\/span>\n4|974|44|L|<span class=\"translate\">Mais ce type la met en situation parce qu'elle n'\u00e9tait qu'une passag\u00e8re du temps, et elle essaie de revenir.<\/span>\n5|972|360|L|<span class=\"translate\">Ensuite, il y a un cycle de femmes qui viennent demander \"Qu'est-ce qu'on est ?\" et vous r\u00e9pondez \"Juste des amies\" et elles partent. Puis une autre se pr\u00e9sente, m\u00eame chose, et la premi\u00e8re revient.<\/span>\n<\/span>\n<\/pre>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1417dae elementor-widget elementor-widget-html\" data-id=\"1417dae\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- 1. MOD Image Links -->\n<!-- ImageID_5 image urls -->\n<script>\n  const imageMap = {\n    image1: \"https:\/\/itishoemath.com\/wp-content\/uploads\/2025\/07\/170_1.jpg\",\n    image2: \"https:\/\/itishoemath.com\/wp-content\/uploads\/2025\/07\/170_2.jpg\"\n  };\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d08897e elementor-widget elementor-widget-html\" data-id=\"d08897e\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"tp-translatable-strings5\"\n     style=\"color:#000101; background:#000101; width:100vw; height:auto; position:static; z-index:1; font-size:1px;\">\n<span id=\"hiddenText\">\n0.0 Pour ceux d'entre vous qui ont du mal \u00e0 sortir avec des hommes, je comprends. J'ai vu des milliers de commentaires d'hommes disant qu'ils voulaient juste \u00eatre compris, mais vous ne me donnez pas beaucoup d'\u00e9l\u00e9ments pour avancer. Pourtant, il y a beaucoup de choses \u00e0 dire ici.\n13.0 Vous devriez vraiment obtenir une copie de ce tableau que j'ai fait. J'essaie sinc\u00e8rement de tendre une branche d'olivier et d'avoir une discussion honn\u00eate. Je suis persuad\u00e9 que, pour la plupart des hommes, la premi\u00e8re chose que l'on regarde, c'est si une fille est jolie.\n23.0 En gros, elle demande : \"Est-ce que tu \u00e9choues parce que tes crit\u00e8res d'apparence sont trop \u00e9lev\u00e9s ?\" Honn\u00eatement, non, mais voyons ce qu'il en est.\n31.0 J'ai demand\u00e9 aux hommes : \"Aimez-vous les femmes ?\" Mais attention, il s'agit en fait de deux questions : Est-ce que j'\u00e9choue parce que je n'arrive pas \u00e0 trouver une femme sexy ? Et est-ce que j'aime les femmes ? La r\u00e9ponse est non, et c'est compliqu\u00e9. Rien dans l'univers n'est tout bon ou tout mauvais. Il y a des choses que nous aimons chez les femmes et d'autres que nous n'aimons pas. Les gars et moi en avons parl\u00e9, et nous sommes d'accord pour dire qu'avec le temps, le jus vaut de moins en moins la peine d'\u00eatre press\u00e9.\n56.0 Il s'agit du \"tableau des illusions f\u00e9minines\" standard. Il se moque de la fa\u00e7on dont les femmes per\u00e7oivent les hommes, elles-m\u00eames et les autres, mais j'y inclus aussi les hommes. D'un c\u00f4t\u00e9, vous avez les fans d'anime qui sont heureux de parler \u00e0 n'importe quelle fille, et de l'autre, le gars qui appelle toutes les filles \"deux\" juste pour se sentir important. Je pense que vous \u00eates en train de tomber dans ce pi\u00e8ge.\n83.0 Il y a deux choses \u00e0 retenir sur le monde des rencontres en ce moment. Tout d'abord, lorsque les gens se mettent ensemble, ils finissent g\u00e9n\u00e9ralement avec quelqu'un de leur niveau ou assez proche. Mais les gens se rencontrent de moins en moins et de plus en plus, et cela se fait principalement par le biais de la technologie. C'est bizarre et d\u00e9connect\u00e9.\n104.0 Il y a un an, j'ai m\u00eame dessin\u00e9 une fille avec des cheveux comme les tiens. Ce n'est donc pas tant une question d'apparence que vous le pensez. Les hommes et les femmes ont vraiment du mal \u00e0 se comprendre. J'ai beaucoup appris \u00e0 ce sujet en lisant et en prenant des notes, mais mon sponsor ShortForm prend des notes pour vous - obtenez les meilleurs r\u00e9sum\u00e9s de livres du monde pour 20% gr\u00e2ce \u00e0 mon lien.\n122.0 Quelle est l'importance de l'apparence ? Je suis toujours convaincu que la premi\u00e8re chose que l'on remarque, c'est si elle est jolie. Chronologiquement, oui, la plupart des hommes peuvent, d'un seul coup d'\u0153il, savoir si une fille est en lice ou non. Mais la plupart des gens finissent par avoir quelqu'un de proche d'eux en termes d'apparence, donc vous ne devriez pas vous inqui\u00e9ter de cette premi\u00e8re partie - c'est surtout pour le spectacle.\n149.0 Diriez-vous que vous pourriez ignorer compl\u00e8tement le physique si tous vos autres d\u00e9sirs \u00e9taient satisfaits ? Eh bien, non. Ce n'est pas r\u00e9aliste. Personne ne dit simplement : \"Oublions cela.\" C'est plut\u00f4t comme s'il y avait un minimum pour chacune de ces cat\u00e9gories, et que d'autres facteurs pouvaient vous faire progresser ou r\u00e9gresser. J'ai m\u00eame entendu des hommes dire \u00e0 leur petite amie : \"Tu es g\u00e9niale, mais je ne veux pas que mes amis me voient avec toi tant que tu n'auras pas perdu de poids et que tu n'auras pas pris de la valeur.\"\n182.0 Si vous combinez toutes les autres cat\u00e9gories, est-ce qu'elles l'emportent sur l'apparence ? C'est diff\u00e9rent pour tout le monde. Certains supporteront beaucoup de choses pour leur apparence, et d'autres renonceront \u00e0 leur apparence pour une bonne personne. On ne sait jamais vraiment qui ressent quoi. C'est la raison pour laquelle j'ai cr\u00e9\u00e9 ce tableau : tu dois regarder comment ils te traitent et comprendre pourquoi. La principale raison invoqu\u00e9e par les hommes pour justifier un score faible est cette section - que j'appelle d\u00e9sormais \"puret\u00e9\" dans les zones 3. C'est plus inclusif.\n219.0 Personnellement, je n'ai jamais eu de mal \u00e0 trouver des femmes suffisamment belles ou agr\u00e9ables \u00e0 fr\u00e9quenter, voire les deux \u00e0 la fois. Mais j'ai toujours eu du mal \u00e0 trouver des femmes qui n'\u00e9taient pas occup\u00e9es par ailleurs. C'est de l\u00e0 que vient le nom de ma cha\u00eene : lorsque les femmes sont toujours occup\u00e9es, il est difficile de cr\u00e9er des liens avec elles. C'est ce qui rend les rencontres difficiles.\n246.0 Vous vous souvenez du dessin de la fille qui a la m\u00eame coiffure que vous ? Elle aspire la vie de ce type par le biais du t\u00e9l\u00e9phone. Si tu utilises des applications de rencontres, tu re\u00e7ois probablement beaucoup de messages de mauvaise qualit\u00e9. En ce qui nous concerne, nous ne recevons rien, sauf si vous faites partie du top 10%, ce qui a \u00e9t\u00e9 mon cas pendant un certain temps. Mais lorsque j'ai pris de l'\u00e2ge et que j'ai r\u00e9trograd\u00e9, j'ai cru que j'avais \u00e9t\u00e9 banni de Bumble. Voici les r\u00e9sultats pour l'utilisateur masculin moyen d'une application de rencontres : l'homme moyen swipe \u00e0 droite 52% du temps, n'obtient une rencontre que 2% du temps, et la plupart des rencontres ne donnent pas lieu \u00e0 une r\u00e9ponse. La plupart des r\u00e9ponses ne donnent pas lieu \u00e0 des rencontres, et la plupart des rencontres n'aboutissent \u00e0 rien.\n304.0 Pensez \u00e0 ce qu'un tel rejet nous fait subir. Vous pouvez vous moquer de nous, et beaucoup de gens le font, en disant qu'une application de rencontre a bless\u00e9 nos sentiments, mais c'est juste de la biologie. Le rejet provoque un processus physique et chimique dans le corps, et c'est vraiment d\u00e9sagr\u00e9able. D'un c\u00f4t\u00e9, vous absorbez des likes \u00e0 n'en plus finir et vous vous sentez comme une princesse. De l'autre, nous nous disons : \"Pourquoi as-tu r\u00e9pondu si tu n'as pas envie de me parler ?\". Ce n'est pas tr\u00e8s agr\u00e9able.\n334.0 Et il n'y a pas que les applications. La lib\u00e9ration entra\u00eene beaucoup de confusion. Voici une chronologie : la conversation sur le \"pass\u00e9 r\u00e9v\u00e9l\u00e9\", c'est quand vous nous laissez nous attacher et que vous laissez tomber tout votre bagage, comme \"J'ai \u00e9t\u00e9 strip-teaseuse\", \"J'ai couch\u00e9 avec 400 personnes\", \"J'ai eu un plan \u00e0 trois deux jours avant de vous rencontrer\". Vous vous attendez \u00e0 ce qu'on vous dise : \"\u00c7a n'a pas d'importance, je t'aime maintenant\", mais \u00e7a ne marche jamais comme \u00e7a. Nous aurions toujours aim\u00e9 que vous nous le disiez d\u00e8s le d\u00e9but, pour ne pas nous attacher.\n372.0 On m'a dit 18 fois \"j'ai un petit ami\" ou \"j'ai un mari\". Ensuite, il y a le \"monkey-branching\", c'est-\u00e0-dire le fait que nous offrons la stabilit\u00e9, mais que vous vous lassez au bout de trois mois et que vous partez \u00e0 la recherche de quelqu'un d'autre. Cela m'est arriv\u00e9 souvent avant m\u00eame que je ne r\u00e9alise ce qui se passait. Les filles ont commenc\u00e9 \u00e0 quitter leur petit ami pour moi, et j'ai r\u00e9alis\u00e9 que c'\u00e9tait pour \u00e7a qu'elles partaient, qu'elles avaient trouv\u00e9 quelque chose d'autre. Mais ensuite, ce type la met dans une situation de couple parce qu'elle n'\u00e9tait qu'une passag\u00e8re du temps, et elle essaie de revenir.\n404.0 Cela devient : \"H\u00e9, tu te souviens quand on sortait ensemble ? J'ai essay\u00e9 un tas de gars que je pr\u00e9f\u00e9rais, mais ils \u00e9taient m\u00e9chants avec moi. Tu veux qu'on se marie ?\" Et, vous savez, non. C'est ce qui conduit \u00e0 ce cycle de situations. En tant qu'homme, une fois que vous avez reconnu ces sch\u00e9mas, vous essayez de ne pas trop vous attacher pour vous prot\u00e9ger. On se retrouve alors avec un cycle de femmes qui viennent demander \"Qu'est-ce qu'on est ?\", vous r\u00e9pondez \"Juste des amis\" et elles s'en vont. Puis une autre se pr\u00e9sente, m\u00eame chose, et la premi\u00e8re revient.\n433.0 Maintenant, je suis un peu c\u00e9l\u00e8bre, et beaucoup de femmes m'ont envoy\u00e9 des messages en me disant qu'elles seraient l'\u00e9pouse parfaite et qu'elles m'aimeraient pour toujours, mais je ne les crois plus. Je ne sais pas ce qui va se passer. Nous avions l'habitude de r\u00e9soudre ce probl\u00e8me en faisant honte aux gens qui essayaient de transformer une relation de couple en une v\u00e9ritable relation, parce que nous savions ce que cela donnait - les couples restaient ensemble.\n457.0 J'ai toujours 98% confiance dans le fait que la premi\u00e8re chose que vous regardez, c'est si elle est jolie ou si elle vous pla\u00eet. Mais non, il ne s'agit pas de savoir \u00e0 quel point les filles sont sexy, ou de comparer la personnalit\u00e9 \u00e0 l'apparence. C'est que j'ai besoin d'\u00eatre 98% s\u00fbr que vous n'\u00eates pas mari\u00e9, que vous n'\u00eates pas une strip-teaseuse, que vous ne faites pas que passer du temps - et il n'y a plus aucun moyen de le savoir.\n<\/span>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-eddabf7 elementor-widget elementor-widget-html\" data-id=\"eddabf7\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\n\/\/ 1. Define which video to play for each language:\nconst videoMap = {\n  en: { type: \"youtube\", id: \"cDCXNXYVwDo\" },\n  es: { type: \"bunny\", id: \"c54e24e7-cf57-4a87-a239-835ab02084b4\" }, \n  fr: { type: \"bunny\", id: \"346e3cbf-e991-4da0-9d37-cfebf3524c3c\" },\n  ja: { type: \"bunny\", id: \"a1e26419-f129-43d5-8b59-f01ca9ba0ac6\" },\n  pt: { type: \"bunny\", id: \"3a45dd01-0e8e-4eea-8b40-18bbe9b43331\" } \n};\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a010ab1 e-flex e-con-boxed e-con e-parent\" data-id=\"a010ab1\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4c437ca elementor-widget elementor-widget-template\" data-id=\"4c437ca\" data-element_type=\"widget\" data-widget_type=\"template.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-template\">\n\t\t\t\t\t<div data-elementor-type=\"section\" data-elementor-id=\"3172\" class=\"elementor elementor-3172\" data-elementor-post-type=\"elementor_library\">\n\t\t\t<div class=\"elementor-element elementor-element-7079b43 e-flex e-con-boxed e-con e-parent\" data-id=\"7079b43\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-800d60f elementor-widget elementor-widget-html\" data-id=\"800d60f\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n#simplified-transcript-note {\n  display: none !important;\n}\n<\/style>\n<div id=\"simplified-transcript-note\">Les traductions et la transcription simplifi\u00e9e sont bas\u00e9es sur les traductions du mat\u00e9riel original, localis\u00e9 en plusieurs langues. R\u00e9alis\u00e9 par PeakCreatorRoyalty.com sous licence de <span>h<\/span>oe_math.<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3a02ec9 elementor-widget elementor-widget-html\" data-id=\"3a02ec9\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\n  \/\/ Auto-hide translation block after page load\n  window.addEventListener('DOMContentLoaded', function() {\n    for (let i = 1; i <= 5; i++) {\n      document.querySelectorAll(`[id$=\"${i}\"]`).forEach(el => {\n        el.style.display = 'none';\n      });\n    }\n  });\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2f7b1d elementor-widget elementor-widget-html\" data-id=\"f2f7b1d\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n  h3 {\n    margin-left: 0px; \/* Adjust as needed *\/\n    \/* Optionally add: *\/\n    text-align: left;  \n  }\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e3ade12 elementor-widget elementor-widget-html\" data-id=\"e3ade12\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- VIDEO PLAYER CONTAINER -->\n<div id=\"videoPlayerContainer\" style=\"max-width: 800px; margin: auto; text-align: center;\">\n  <!-- Video player is injected here -->\n<\/div>\n\n<!-- SCROLLING TABS & CHAPTER DETAILS -->\n<div style=\"max-width: 1000px; margin: 32px auto 0 auto;\">\n  <div id=\"chapterTabs\" class=\"chapter-tabs-scroll\">\n    <!-- Tabs will be generated by JavaScript -->\n  <\/div>\n  <!-- div id=\"chapterPlayPause\" style=\"margin:1em 0 0.5em 0;\">\n  <\/div -->\n  <div id=\"chapterPanel\" class=\"chapter-panel\">\n    <!-- Chapter text will appear here  -->\n  <\/div>\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-928f586 elementor-widget elementor-widget-html\" data-id=\"928f586\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- NO TOUCH Scripts -->\n<!-- Video script v1.0 -->\n<!--[wpcode id=\"1824\"] -->\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/hls.js@latest\"><\/script> <!-- Include HLS.js -->\r\n\r\n<style>\r\n  .half-br {\r\n    display: block;\r\n    height: 1px;\r\n    width: 100%;\r\n    border: none;\r\n    margin: 0;\r\n    padding: 0;\r\n  }\r\n<\/style>\r\n\r\n<script>\r\n\r\nlet currentChapterIdx = 0;\r\n\t\r\nfunction getCurrentLang() {\r\n  return document.documentElement.lang ? document.documentElement.lang.substring(0,2) : 'en';\r\n}\r\n\r\n\/\/ function waitTranslate(ms=1000) {\r\n\/\/   const end = Date.now() + ms; \/\/ 100 milliseconds = 1\/10 second\r\n\/\/   while (Date.now() < end) {\r\n\/\/     \/\/ Busy-wait: blocks the main thread!\r\n\/\/   }\r\n\/\/ }\r\n\r\n\/\/ const lang = getCurrentLang();\r\n\/\/ if (lang !== \"en\") {\r\n\/\/   var marker = document.getElementById('language-marker');\r\n\/\/   if (marker) {\r\n\/\/     \/\/ You can check for known translations of the phrase\r\n\/\/     var currentLangPhrase = marker.textContent.trim();\r\n\/\/ \r\n\/\/     \/\/ Example for English vs French\r\n\/\/     if (currentLangPhrase === \"Currently English language.\") {\r\n\/\/       console.log(\"Miss, translation in progress to '\/\"+lang+\"\/', 3 second delay.\")\r\n\/\/       waitTranslate(ms=3000);\r\n\/\/     } else {\r\n\/\/       console.log(\"Hit, pre-translated page in '\/\"+lang+\"\/'.\")\r\n\/\/     }\r\n\/\/   }\r\n\/\/ } else {\r\n\/\/   console.log(\"English, no translation needed.\")\r\n\/\/ }\r\n\r\n\/* ====== CONFIGURATION SECTION ====== *\/\r\n\/\/ const BUNNY_VIDEO_LIBRARY_ID = \"vz-c02c9ec9-42b.b-cdn.net\"; \/\/ Replace with your actual Bunny Video Library ID\r\nconst BUNNY_VIDEO_LIBRARY_ID = \"vz-d8eb6cfe-1f7.b-cdn.net\"; \/\/ Replace with your actual Bunny Video Library ID\r\n\r\n\/\/ 1. Define which video to play for each language:\r\n\/\/const videoMap = {\r\n\/\/  en: { type: \"youtube\", id: \"wWrsW76bG88\" },\r\n\/\/  fr: { type: \"bunny\", id: \"fc57904c-7f56-4b36-8d13-d1d715b82e81\" }, \/\/ This is the VIDEO ID\r\n\/\/  de: { type: \"bunny\", id: \"YOUR_GERMAN_VIDEO_ID\" }                   \/\/ This is the VIDEO ID\r\n  \/\/ Add more: es, it, etc.\r\n\/\/};\r\n\r\n\/\/ 2. Define chapters for each language:\r\nfunction parseCSVFromHeaderRows(headerText, rowsText) {\r\n  const headers = headerText.trim().split('|').map(h => h.trim());\r\n  const lines = rowsText.trim().split('\\n').filter(line => line.trim().length);\r\n\r\n  return lines.map(line => {\r\n    const values = [];\r\n    \/\/ Split by |, but don't split inside quotes (simple version assumes no | inside quotes)\r\n    \/\/ If you need to handle | inside quoted fields, regex needs to be more complex\r\n    let regex = \/(\"(?:[^\"]|\"\")*\"|'(?:[^']|'')*'|[^|]+)\/g;\r\n    let match;\r\n    while ((match = regex.exec(line))) {\r\n      let value = match[0].trim();\r\n      \/\/ Remove leading and trailing single or double quotes\r\n      value = value.replace(\/^(['\"])(.*)\\1$\/, '$2');\r\n      values.push(isNaN(value) ? value : Number(value));\r\n    }\r\n    const obj = {};\r\n    headers.forEach((h, i) => { obj[h] = values[i]; });\r\n    return obj;\r\n  });\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\/\/ Parse hiddenText into [{time: number, text: string}]\r\n\/\/ Parses lines like: 12.0 Text, or * Bullet point, or 1. Numbered item\r\nfunction parseHiddenText() {\r\n  const hiddenText = document.getElementById('hiddenText')?.textContent || '';\r\n  const lines = hiddenText.split('\\n').map(line => line.trim()).filter(Boolean);\r\n  const results = [];\r\n  let lastTime = null;\r\n\r\n  for (let line of lines) {\r\n    \/\/ Match timestamps with comma or dot\r\n    let match = \/^(\\d+(?:[.,]\\d+)?)\\s+(.*)$\/.exec(line);\r\n    if (match) {\r\n      lastTime = parseFloat(match[1].replace(',', '.'));\r\n      results.push({ time: lastTime, text: match[2] });\r\n      continue;\r\n    }\r\n    \/\/ Match bullets or numbers\r\n    match = \/^(\\*|\\-|\\d+\\.)\\s+(.*)$\/.exec(line);\r\n    if (match && lastTime !== null) {\r\n      results.push({ time: lastTime, text: line });\r\n      continue;\r\n    }\r\n    if (lastTime !== null) {\r\n      results.push({ time: lastTime, text: line });\r\n    }\r\n  }\r\n  return results;\r\n}\r\n\r\n\r\n\r\n\r\nconst hiddenTextLines = parseHiddenText(); \/\/ Global for later use\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\/\/ Get the header and rows from the DOM\r\nconst csvHeader = document.getElementById('video-data-header').textContent;\r\nconst csvRows = document.getElementById('video-data-rows').textContent;\r\n\r\nconst chapterMap = {\r\n  en: parseCSVFromHeaderRows(csvHeader, csvRows)\r\n};\r\n\r\n\/\/ List of properties to process\r\nconst properties = ['tab', 'title', 'description'];\r\n\r\n\/\/ Loop through each row in chapterMap.en\r\nchapterMap.en.forEach(row => {\r\n  properties.forEach(prop => {\r\n    const val = row[prop];\r\n    if (typeof val === 'string') {\r\n      row[prop] = val.replace(\/^[\\'\\\"]+|[\\'\\\"]+$\/g, '');\r\n    }\r\n  });\r\n});\r\n\r\n\/\/ console.log(chapterMap.en); \/\/ Output objects in browser console\r\n\r\n\r\n\/* ====== END CONFIGURATION ====== *\/\r\n\r\n\/* ----- Global Player Variables ----- *\/\r\nlet ytPlayer, ytReady = false, stopTimer = null;\r\nlet hlsInstance = null; \/\/ To store the HLS.js instance\r\nlet html5VideoElement = null; \/\/ To store the HTML5 video element for Bunny\r\n\r\n\r\n\/* ----- Player and Chapters Logic ----- *\/\r\nfunction cleanupPlayers() {\r\n    \/\/ Clear existing stop timer\r\n    if (stopTimer) {\r\n        clearInterval(stopTimer);\r\n        stopTimer = null;\r\n    }\r\n\r\n    \/\/ Cleanup YouTube Player\r\n    if (ytPlayer && typeof ytPlayer.destroy === 'function') {\r\n        ytPlayer.destroy();\r\n    }\r\n    ytPlayer = null;\r\n    ytReady = false;\r\n\r\n    \/\/ Cleanup HLS.js Player\r\n    if (hlsInstance) {\r\n        hlsInstance.destroy();\r\n        hlsInstance = null;\r\n    }\r\n    html5VideoElement = null; \/\/ Clear reference\r\n\r\n    \/\/ Clear the container\r\n    const container = document.getElementById('videoPlayerContainer');\r\n    if (container) container.innerHTML = \"\";\r\n}\r\n\r\nfunction setVideoPlayer(langObj) {\r\n  cleanupPlayers(); \/\/ Ensure previous players are cleaned up\r\n\r\n  const container = document.getElementById('videoPlayerContainer');\r\n  if (!container) return;\r\n\r\n  if (langObj.type === \"youtube\") {\r\n    container.innerHTML = `<div style=\"position: relative; width: 100%; padding-top: 56.25%;\">\r\n<iframe id=\"myVideo\" style=\"position: absolute;  top: 0; left: 0; width: 100%; height: 100%;\" \r\n            src=\"https:\/\/www.youtube.com\/embed\/${langObj.id}?enablejsapi=1&rel=0&origin=${window.location.origin}\"\r\n            frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n            allowfullscreen><\/iframe><\/div>`;\r\n    \/\/ YT API will be loaded\/re-initialized later\r\n  } else if (langObj.type === \"bunny\") {\r\n    const bunnyStreamUrl = `https:\/\/${BUNNY_VIDEO_LIBRARY_ID}\/${langObj.id}\/playlist.m3u8`;\r\n    container.innerHTML = `<video id=\"myVideo\" width=\"100%\" height=\"390\" controls playsinline poster=\"https:\/\/itishoemath.com\/wp-content\/uploads\/2025\/05\/UCsEPI9OwGEw5Lm0E7Paq62g_0003_wWrsW76bG88_en.jpg\"><\/video>`;\r\n    html5VideoElement = document.getElementById('myVideo'); \/\/ Get the new video element\r\n\r\n\tif (html5VideoElement) {\r\n        html5VideoElement.addEventListener('play', () => renderPlayPauseButton(currentChapterIdx));\r\n        html5VideoElement.addEventListener('pause', () => renderPlayPauseButton(currentChapterIdx));\r\n    }\r\n\r\n\t  \r\n    if (Hls.isSupported()) {\r\n        hlsInstance = new Hls();\r\n        hlsInstance.loadSource(bunnyStreamUrl);\r\n        hlsInstance.attachMedia(html5VideoElement);\r\n        hlsInstance.on(Hls.Events.MANIFEST_PARSED, function() {\r\n            \/\/ console.log(\"Bunny HLS: Manifest parsed and video ready.\");\r\n            \/\/ html5VideoElement.play(); \/\/ Optional: Autoplay (mind browser restrictions)\r\n        });\r\n        hlsInstance.on(Hls.Events.ERROR, function(event, data) {\r\n            \/\/ console.error('Bunny HLS Error:', data);\r\n            if (data.fatal) {\r\n                switch(data.type) {\r\n                    case Hls.ErrorTypes.NETWORK_ERROR: hlsInstance.startLoad(); break;\r\n                    case Hls.ErrorTypes.MEDIA_ERROR: hlsInstance.recoverMediaError(); break;\r\n                    default: hlsInstance.destroy(); break;\r\n                }\r\n            }\r\n        });\r\n    } else if (html5VideoElement.canPlayType('application\/vnd.apple.mpegurl')) {\r\n        \/\/ Native HLS support (e.g., Safari)\r\n        html5VideoElement.src = bunnyStreamUrl;\r\n        html5VideoElement.addEventListener('loadedmetadata', function() {\r\n            \/\/ console.log('Bunny Native HLS: Metadata loaded.');\r\n        });\r\n    } else {\r\n        \/\/ console.error('HLS is not supported in this browser for Bunny.net video.');\r\n        container.innerHTML = '<p>Sorry, HLS video playback is not supported in your browser.<\/p>';\r\n    }\r\n  }\r\n}\r\n\r\nfunction renderTabs(activeIdx, chapters) {\r\n  const tabRow = document.getElementById('chapterTabs');\r\n  tabRow.innerHTML = chapters.map((ch, i) =>\r\n    `<button class=\"chapter-tab${i === activeIdx ? \" active\" : \"\"}\" onclick=\"showChapter(${i})\">${ch.tab}<\/button>`\r\n  ).join('');\r\n}\r\n\r\n\r\n\r\n\t\r\nfunction renderPlayPauseButton(idx) {\r\n  const lang = getCurrentLang();\r\n  const chapters = chapterMap['en'];\r\n  const ch = chapters[idx];\r\n  if (!ch) return \"\";\r\n\r\n  let isPlaying = false;\r\n  const videoObj = videoMap[lang] || videoMap['en'];\r\n\r\n  if (videoObj.type === \"youtube\" && ytPlayer && ytReady) {\r\n    isPlaying = ytPlayer.getPlayerState && ytPlayer.getPlayerState() === 1;\r\n  } else if (videoObj.type === \"bunny\" && html5VideoElement) {\r\n    isPlaying = !html5VideoElement.paused;\r\n  }\r\n\r\n  const buttonLabel = isPlaying ? \"Pause\" : \"Play\";\r\n  const buttonIcon = isPlaying ? \"\u23f8\" : \"\u25b6\ufe0f\";\r\n\r\n  const btnHtml = `<button id=\"playPauseBtn\" style=\"padding:0.5em 1em;font-size:1em;border-radius:6px;background: #0F3F91;color:#fff;border:none;cursor:pointer;margin-bottom:1em;transition: background 0.2s;display: block;\">\r\n      ${buttonIcon} ${buttonLabel}\r\n    <\/button>`;\r\n\r\n  const container = document.getElementById('playPauseContainer');\r\n  if (container) {\r\n    container.innerHTML = btnHtml;\r\n    const playPauseBtn = document.getElementById('playPauseBtn');\r\n    if (playPauseBtn) {\r\n      playPauseBtn.onclick = function() {\r\n        let isPlayingNow = false;\r\n        if (videoObj.type === \"youtube\" && ytPlayer && ytReady) {\r\n          isPlayingNow = ytPlayer.getPlayerState && ytPlayer.getPlayerState() === 1;\r\n          ytPlayer.seekTo(ch.time, true);\r\n          if (isPlayingNow) {\r\n            ytPlayer.pauseVideo();\r\n          } else {\r\n            ytPlayer.playVideo();\r\n          }\r\n        } else if (videoObj.type === \"bunny\" && html5VideoElement) {\r\n          isPlayingNow = !html5VideoElement.paused;\r\n          html5VideoElement.currentTime = ch.time;\r\n          if (isPlayingNow) {\r\n            html5VideoElement.pause();\r\n          } else {\r\n            html5VideoElement.play();\r\n          }\r\n        }\r\n        \/\/ No manual re-render here!\r\n      };\r\n    }\r\n  }\r\n}\r\n\r\n\r\nfunction formatTranscriptBlock(lines) {\r\n  let prevTime = null;\r\n  let out = [];\r\n  for (let i = 0; i < lines.length; i++) {\r\n    const { time, text } = lines[i];\r\n    \/\/ Convert seconds to MM:SS\r\n    const min = Math.floor(time \/ 60);\r\n    const sec = Math.floor(time % 60);\r\n    const mmss = `${min}:${sec.toString().padStart(2, '0')}`;\r\n    if (time !== prevTime) {\r\n      out.push(`<br><b><span style=\"color:#FFF\">${mmss}<\/span><\/b> ${text}`);\r\n    } else {\r\n      out.push(text);\r\n    }\r\n    prevTime = time;\r\n  }\r\n  return out.join('<br>');\r\n}\r\n\r\n\r\n\r\n\r\nfunction renderPanel(idx) {\r\n  const lang = getCurrentLang();\r\n\r\n  const simplifiedLabel = document.getElementById('simplified-transcript-label')?.textContent || \"\";\r\n  const simplifiedNote = document.getElementById('simplified-transcript-note')?.textContent || \"Note: ...\";\r\n\r\n  const chapters = chapterMap['en'];\r\n  const ch = chapters[idx];\r\n  if (!ch) {\r\n      console.error(`Chapter index ${idx} not found for language ${lang}.`);\r\n      return;\r\n  }\r\n\r\n  \/\/ --- Find hiddenText lines within this chapter's time range ---\r\n  const linesInRangeArr = hiddenTextLines\r\n    .filter(line => line.time >= ch.time && line.time < ch.stop);\r\n\r\n  const transcriptHTML = formatTranscriptBlock(linesInRangeArr);\r\n\r\n  let extra = \"\";\r\n  if (linesInRangeArr.length) {\r\n    extra = `\r\n      <br><br>\r\n      <!--span style=\"display:block;margin-top:1em;margin-bottom:0.25em;font-weight:bold\">${simplifiedLabel}<\/span-->\r\n      <span style=\"color:#f5f5f5;font-size:100%\">${transcriptHTML}<\/span>\r\n      <br>\r\n      <span style=\"display:block;margin-top:0.75em;font-size:75%;color:#00C2C2;\">\r\n        <br>${simplifiedNote}\r\n      <\/span>\r\n    `;\r\n  }\r\n\r\n  \/\/ Insert the Play\/Pause button at the very top of the panel\r\n  const playPauseButton = renderPlayPauseButton(idx);\r\n\r\n  document.getElementById('chapterPanel').innerHTML =\r\n    `<h3 style=\"margin-top:0;color:#fff\">${ch.title}<\/h3>\r\n     <div id=\"playPauseContainer\" style=\"margin-bottom:1em\"><\/div>\r\n     <p style=\"margin-bottom:0;color:#fff\">${ch.description}${extra}<\/p>`;\r\n\r\n  renderPlayPauseButton(idx);\r\n  renderTabs(idx, chapters);\r\n\r\n  \/\/ Attach the event handler after the button is inserted\r\n  const playPauseBtn = document.getElementById('playPauseBtn');\r\n  if (playPauseBtn) {\r\n    playPauseBtn.onclick = function() {\r\n      const videoObj = videoMap[lang] || videoMap['en'];\r\n      let isPlaying = false;\r\n      if (videoObj.type === \"youtube\" && ytPlayer && ytReady) {\r\n        isPlaying = ytPlayer.getPlayerState && ytPlayer.getPlayerState() === 1;\r\n        ytPlayer.seekTo(ch.time, true);\r\n        if (isPlaying) {\r\n          ytPlayer.pauseVideo();\r\n        } else {\r\n          ytPlayer.playVideo();\r\n        }\r\n      } else if (videoObj.type === \"bunny\" && html5VideoElement) {\r\n        isPlaying = !html5VideoElement.paused;\r\n        html5VideoElement.currentTime = ch.time;\r\n        if (isPlaying) {\r\n          html5VideoElement.pause();\r\n        } else {\r\n          html5VideoElement.play();\r\n        }\r\n      }\r\n      \/\/ Optionally update button after action\r\n      \/\/ setTimeout(() => renderPanel(idx), 300);\r\n    };\r\n  }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nwindow.showChapter = function(idx) {\r\n  currentChapterIdx = idx;\r\n\r\n  const lang = getCurrentLang();\r\n  \/\/ const chapters = chapterMap[lang] || chapterMap['en']; \/\/ Fallback to 'en'   \r\n  \/\/ will switch for video but NOT for text (translatepress will accomplish)\r\n  const chapters = chapterMap['en']; \/\/ Fallback to 'en' chapters\r\n  const chapterData = chapters[idx];\r\n\r\n  if (!chapterData) {\r\n      console.error(`Chapter data for index ${idx} not found.`);\r\n      return;\r\n  }\r\n  renderPanel(idx); \/\/ Update panel and tabs\r\n\r\n  \/\/ Scroll tab into view\r\n  const buttons = document.getElementsByClassName('chapter-tab');\r\n  if (buttons[idx]) buttons[idx].scrollIntoView({ behavior: 'smooth', inline: 'center', block: 'nearest' });\r\n\r\n  const videoObj = videoMap[lang] || videoMap['en'];\r\n\r\n  \/\/ Clear previous stop timer\r\n  if (stopTimer) clearInterval(stopTimer);\r\n\r\n  if (videoObj.type === \"youtube\") {\r\n    if (ytReady && ytPlayer && typeof ytPlayer.seekTo === 'function') {\r\n      ytPlayer.seekTo(chapterData.time, true);\r\n      ytPlayer.playVideo();\r\n      \r\n    } else {\r\n        console.warn(\"YouTube player not ready or seekTo not available.\");\r\n    }\r\n  } else if (videoObj.type === \"bunny\" && html5VideoElement) {\r\n    html5VideoElement.currentTime = chapterData.time;\r\n    html5VideoElement.play().catch(e => console.warn(\"Autoplay after seek prevented:\", e));\r\n  }\r\n};\r\n\r\nfunction reInitChaptersAndPlayer() {\r\n  const lang = getCurrentLang();\r\n  const videoObj = videoMap[lang] || videoMap['en']; \/\/ Fallback to 'en' video\r\n\r\n  if (!videoObj) {\r\n      console.error(`No video configuration found for language: ${lang} or fallback 'en'.`);\r\n      return;\r\n  }\r\n\r\n  setVideoPlayer(videoObj); \/\/ This now also cleans up old players\r\n\r\n  \/\/ Short delay to ensure DOM is updated, especially for iframe\r\n  setTimeout(function(){\r\n    renderPanel(0); \/\/ Render first chapter panel\r\n    if (videoObj.type === \"youtube\") {\r\n      \/\/ Load or re-initialize YT API for new iframe\r\n      if (typeof YT === 'undefined' || !YT.Player) { \/\/ Check if YT object or YT.Player is undefined\r\n        var tag = document.createElement('script');\r\n        tag.src = \"https:\/\/www.youtube.com\/iframe_api\";\r\n        var firstScriptTag = document.getElementsByTagName('script')[0];\r\n        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n      } else {\r\n        \/\/ If API is loaded, re-initialize player for the new iframe if needed\r\n        onYouTubeIframeAPIReady();\r\n      }\r\n    }\r\n  }, 100); \/\/ Reduced delay, might need adjustment\r\n}\r\n\r\n\/* ----- YT API Bootstrapping ----- *\/\r\n\/\/ This global function is called by the YouTube Iframe API script\r\nwindow.onYouTubeIframeAPIReady = function() {\r\n  const iframe = document.getElementById('myVideo');\r\n  if (iframe && iframe.tagName === 'IFRAME' && !ytPlayer) { \/\/ Ensure it's an iframe and player not already set\r\n    \/\/ console.log(\"onYouTubeIframeAPIReady called, initializing YT Player.\");\r\n    ytPlayer = new YT.Player('myVideo', {\r\n      events: {\r\n        'onReady': function(event) {\r\n          ytReady = true;\r\n          \/\/ console.log(\"YouTube Player Ready.\");\r\n          \/\/ If a chapter was clicked before YT was ready, try to apply it now.\r\n          \/\/ This requires knowing the current chapter index, which might need to be stored.\r\n          \/\/ For simplicity, we'll assume the user might click a chapter again or it starts at 0.\r\n        },\r\n        'onStateChange': function(event) {\r\n\t\t\t\/\/ 1 = playing, 2 = paused\r\n\t\t\trenderPlayPauseButton(currentChapterIdx); \/\/ currentChapterIdx should be tracked globally\r\n\t\t}\r\n      }\r\n    });\r\n  } else if (iframe && iframe.tagName === 'IFRAME' && ytPlayer && typeof ytPlayer.destroy === 'function') {\r\n    \/\/ This case handles if the API is reloaded or if reInit is called and iframe exists\r\n    \/\/ It's a bit tricky; ideally, we destroy and recreate fully.\r\n    \/\/ The cleanupPlayers function should handle most of this.\r\n    \/\/ console.log(\"onYouTubeIframeAPIReady called, player might exist. Attempting to re-bind if necessary.\");\r\n  }\r\n};\r\n\r\n\/* ----- Event Hooks ----- *\/\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n    if (document.getElementById('videoPlayerContainer')) { \/\/ Only run if the container exists\r\n        reInitChaptersAndPlayer();\r\n\r\n\t\t\r\n\r\n\r\n    }\r\n});\r\n\/\/ TranslatePress fires this event on language change\r\ndocument.addEventListener('trp_language_changed', function() {\r\n    if (document.getElementById('videoPlayerContainer')) { \/\/ Only run if the container exists\r\n        reInitChaptersAndPlayer();\r\n\t\t\r\n\r\n    }\r\n});\r\n\r\n<\/script>\r\n\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-40859b7 elementor-widget elementor-widget-html\" data-id=\"40859b7\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n\/* Your existing CSS is good, no changes needed unless you want to refine *\/\n.chapter-tabs-scroll {\n  display: flex;\n  overflow-x: auto;\n  gap: 10px;\n  margin-bottom: 18px;\n  scrollbar-width: thin;\n  scrollbar-color: #a0aec0 #f7fafc; \/* For Firefox *\/\n  -webkit-overflow-scrolling: touch;\n  padding-bottom: 5px; \/* To make scrollbar visible without cutting content *\/\n  border-radius: 8px; \/* Optional: if you want rounded corners for the scroll area *\/\n}\n\/* Webkit Scrollbar Styles *\/\n.chapter-tabs-scroll::-webkit-scrollbar {\n  height: 7px;\n}\n.chapter-tabs-scroll::-webkit-scrollbar-track {\n  background: #111; \/* Or a lighter color if preferred *\/\n  border-radius: 4px;\n}\n.chapter-tabs-scroll::-webkit-scrollbar-thumb {\n  background: #333; \/* Or a contrasting color *\/\n  border-radius: 4px;\n}\n.chapter-tab {\n  white-space: nowrap;\n  border: none;\n  background: #222; \/* Darker tab background *\/\n  color: #fff;\n  font-size: 1.1em;\n  padding: 8px 22px;\n  border-radius: 999px; \/* Pill shape *\/\n  cursor: pointer;\n  transition: background 0.2s, color 0.2s, font-weight 0.2s, box-shadow 0.2s;\n  margin-bottom: 0; \/* Ensure no extra space below tabs if they wrap *\/\n  outline: none; \/* Remove default focus outline if you have custom focus styles *\/\n  margin-right: 0; \/* Reset if previously set for spacing between items *\/\n}\n.chapter-tab.active,\n.chapter-tab:hover {\n  background: #e0e7ff; \/* Light blue for active\/hover *\/\n  color: #111; \/* Dark text for active\/hover *\/\n  font-weight: bold;\n  box-shadow: 0 2px 8px #dbeafe66; \/* Softer shadow *\/\n}\n.chapter-panel {\n  background: rgba(20,20,20,0.88); \/* Semi-transparent dark background *\/\n  border-radius: 8px;\n  box-shadow: 0 2px 6px #111; \/* Subtle shadow *\/\n  padding: 20px 24px;\n  min-height: 80px; \/* Ensure panel has some height even if description is short *\/\n  transition: box-shadow 0.3s; \/* Smooth shadow transition on hover (if any) *\/\n}\n\/* Add a class for the video player container if you want to target its children more easily *\/\n#videoPlayerContainer video { \/* Ensure video tag fits container *\/\n    display: block; \/* Removes extra space below if it's inline *\/\n}\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e4bc449 pa-display-conditions-yes e-flex e-con-boxed e-con e-parent\" data-id=\"e4bc449\" data-element_type=\"container\" data-settings=\"{&quot;pa_display_conditions_switcher&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-fdce02d e-con-full e-flex e-con e-child\" data-id=\"fdce02d\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6160f3a elementor-widget elementor-widget-shortcode\" data-id=\"6160f3a\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- Post Page Mid Roll -->\r\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f66116d elementor-widget elementor-widget-heading\" data-id=\"f66116d\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Chefs-d'\u0153uvre interactifs<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ce4511b elementor-widget elementor-widget-text-editor\" data-id=\"ce4511b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"border-borderMain\/50 ring-borderMain\/50 divide-borderMain\/50 dark:divide-borderMainDark\/50 dark:ring-borderMainDark\/50 dark:border-borderMainDark\/50 bg-transparent\"><div class=\"gap-y-sm md:gap-y-md flex flex-col\"><div class=\"relative font-sans text-base text-textMain dark:text-textMainDark selection:bg-super\/50 selection:text-textMain dark:selection:bg-super\/10 dark:selection:text-super\"><div class=\"min-w-0 break-words [word-break:break-word]\"><div id=\"markdown-content-0\" class=\"gap-y-md after:clear-both after:block after:content-['']\" dir=\"auto\"><div class=\"relative\"><div class=\"prose text-pretty dark:prose-invert inline leading-normal break-words min-w-0 [word-break:break-word]\"><p class=\"my-0\">Dans cette image interactive, explorez la grande falaise de r\u00e9v\u00e9lation apr\u00e8s l'investissement du gars.<\/p><\/div><\/div><\/div><\/div><\/div><div class=\"flex items-center justify-between\"><div class=\"-ml-sm gap-xs flex items-center\"><div><div>\u00a0<\/div><\/div><div>\u00a0<\/div><\/div><div class=\"gap-x-xs flex items-center\"><div class=\"gap-xs flex items-center border-borderMain\/50 ring-borderMain\/50 divide-borderMain\/50 dark:divide-borderMainDark\/50 dark:ring-borderMainDark\/50 dark:border-borderMainDark\/50 bg-transparent\">\u00a0<\/div><div class=\"\">\u00a0<\/div><\/div><\/div><\/div><\/div><div class=\"\"><div class=\"animate-in fade-in duration-100 ease-out border-borderMain\/50 ring-borderMain\/50 divide-borderMain\/50 dark:divide-borderMainDark\/50 dark:ring-borderMainDark\/50 dark:border-borderMainDark\/50 bg-transparent\"><div class=\"border-borderMain\/50 ring-borderMain\/50 divide-borderMain\/50 dark:divide-borderMainDark\/50 dark:ring-borderMainDark\/50 dark:border-borderMainDark\/50 bg-transparent\"><div class=\"flex items-center justify-between border-borderMain\/50 ring-borderMain\/50 divide-borderMain\/50 dark:divide-borderMainDark\/50 dark:ring-borderMainDark\/50 dark:border-borderMainDark\/50 bg-background\"><div class=\"flex w-full items-center justify-between mb-sm\"><div class=\"\"><div class=\"space-x-sm flex items-center\"><div class=\"font-display text-lg font-medium text-textMain dark:text-textMainDark selection:bg-super\/50 selection:text-textMain dark:selection:bg-super\/10 dark:selection:text-super\"><div class=\"w-[24px]\">\u00a0<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e92154f elementor-widget elementor-widget-html\" data-id=\"e92154f\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- 3.1 CSS and 1st Image HTML -->\n<!-- ImageID_1 CSS -->\n\n<style class=\"wpcode-css-snippet\"><style>\r\n\r\n.hotspot-block,\r\n.hotspot,\r\n.hotspot-tooltip,\r\n.hotspot-btn {\r\n  font-family: \"HM Saira-VariableFont_wdth,wght\", sans-serif;\r\n}\r\n\r\n.hotspot-block {\r\n  position: relative;\r\n  margin: 40px auto;\r\n  max-width: 1280px;\r\n}\r\n\r\n.hotspot-controls {\r\n  margin-bottom: 15px;\r\n  display: flex;\r\n  justify-content: center;\r\n  flex-wrap: wrap;\r\n  gap: 15px;\r\n  align-items: center;\r\n  position: relative;\r\n  z-index: 10;\r\n}\r\n\r\n.hotspot-container {\r\n  position: absolute;\r\n  top: 0;\r\n  left: 0;\r\n  width: 100%;\r\n  height: 100%;\r\n  pointer-events: none;\r\n  z-index: 2000;\r\n}\r\n\r\n.main-image {\r\n  width: 100%;\r\n  display: block;\r\n}\r\n\r\n.hotspot {\r\n  overflow: visible;\r\n  width: 36px;\r\n  height: 36px;\r\n  background: #007BFF;\r\n  color: white;\r\n  font-size: 16px;\r\n  border-radius: 50%;\r\n  text-align: center;\r\n  line-height: 36px;\r\n  font-weight: bold;\r\n  cursor: pointer;\r\n  transition: transform 0.4s, background 0.3s;\r\n  position: absolute;\r\n  pointer-events: auto;\r\n}\r\n\r\n.hotspot.enlarged {\r\n  transform: scale(1.18);\r\n  background: red;\r\n}\r\n\r\n.hotspot:hover {\r\n  transform: scale(1.18);\r\n}\r\n\r\n\/* ----------- TOOLTIP: Modern Approach ----------- *\/\r\n.hotspot-tooltip {\r\n  display: none;\r\n  position: absolute;\r\n  left: 50%;\r\n  top: auto; \/* default, will be set by direction *\/\r\n  bottom: auto;\r\n  max-width: 300px;\r\n  min-width: 0;\r\n  width: max-content; \/* will grow up to max-width, shrink for short items *\/\r\n  white-space: normal;\r\n  word-break: break-word;\r\n  padding: 10px 16px;\r\n  background: rgba(20, 20, 30, 0.92);\r\n  color: #fff;\r\n  font-size: 15px;\r\n  border-radius: 10px;\r\n  box-shadow: 0 6px 16px rgba(0,0,0,0.13);\r\n  z-index: 5000;\r\n  line-height: 1.5;\r\n  text-align: left;\r\n  border: 2px solid red;\r\n  box-sizing: border-box;\r\n  transform: translateX(-50%);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\/* Tooltip direction and placement *\/\r\n.tooltip-above .hotspot-tooltip {\r\n  left: 50%;\r\n  bottom: 110%;\r\n  transform: translateX(-50%);\r\n  margin-bottom: 10px;\r\n}\r\n.tooltip-below .hotspot-tooltip {\r\n  left: 50%;\r\n  top: 110%;\r\n  transform: translateX(-50%);\r\n  margin-top: 10px;\r\n}\r\n.tooltip-left .hotspot-tooltip {\r\n  right: 110%;          \/* Puts tooltip fully to the left of the hotspot, with a gap *\/\r\n  top: 50%;\r\n  left: auto;           \/* Prevent any left property conflict *\/\r\n  transform: translateY(-50%);\r\n  margin-right: 10px;   \/* Space between tooltip and hotspot *\/\r\n  margin-left: 0;\r\n}\r\n\r\n.tooltip-right .hotspot-tooltip {\r\n  left: 110%;\r\n  top: 50%;\r\n  transform: translateY(-50%);\r\n  margin-left: 10px;\r\n}\r\n\r\n\/* Tooltip shown on enlarged\/active hotspot *\/\r\n.hotspot.enlarged .hotspot-tooltip,\r\n.hotspot.active .hotspot-tooltip,\r\n.hotspot.show-all .hotspot-tooltip {\r\n  display: block;\r\n}\r\n\r\n\/* ----------- Button styling ----------- *\/\r\n.hotspot-btn {\r\n  width: 36px;\r\n  height: 36px;\r\n  border-radius: 50%;\r\n  font-size: 16px;\r\n  background: #007BFF;\r\n  color: white;\r\n  font-weight: bold;\r\n  border: none;\r\n  cursor: pointer;\r\n  transition: background 0.2s, transform 0.2s;\r\n  position: relative;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  line-height: 1;\r\n  padding: 0;\r\n}\r\n\r\n.hotspot-btn.highlight {\r\n  background: red;\r\n}\r\n\r\n.hotspot-btn.enlarged {\r\n  transform: scale(1.18);\r\n}\r\n\r\n.hotspot-btn:hover {\r\n  background: #0056b3;\r\n}\r\n\r\n\/* Mobile responsive adjustments *\/\r\n@media (max-width: 600px) {\r\n  .hotspot {\r\n    width: 22px;\r\n    height: 22px;\r\n    font-size: 12px;\r\n    line-height: 22px;\r\n  }\r\n\r\n  .hotspot-btn {\r\n    width: 28px;\r\n    height: 28px;\r\n    font-size: 13px;\r\n  }\r\n\r\n    .hotspot-tooltip {\r\n    padding: 6px 8px;\r\n    font-size: 0.9em;\r\n  font-weight: normal;\r\n    max-width: 250px;\r\n    min-width: 120px;\r\n    width: auto;\r\n  }\r\n}\r\n<\/style><\/style>\n\n<!-- 1st image, keep this\n     ImageID_2 HTML -->\n\n<!-- Image Block 1 -->\n\n<div class=\"hotspot-block\" data-id=\"image1\" style=\"max-width:1280px; margin:40px auto; position:relative;\">\n\n  <!-- Buttons and Checkbox ABOVE the Image -->\n  <div class=\"hotspot-controls\" data-id=\"image1\" style=\"margin-bottom:15px; display:flex; justify-content:center; flex-wrap:wrap; gap:15px; align-items:center; position:relative; z-index:10;\">\n    <div class=\"hotspot-buttons\" style=\"display:flex; gap:10px; flex-wrap:wrap;\"><\/div>\n    <label style=\"font-family:sans-serif; font-size:14px;\">\n      <input type=\"checkbox\" class=\"show-all-toggle\" data-id=\"image1\" style=\"margin-right:5px;\">\n      Tous\n    <\/label>\n    <label style=\"font-family: sans-serif; font-size: 14px;\">\n       <input type=\"checkbox\" class=\"hide-numbers-toggle\" data-id=\"image1\" style=\"margin-left: 12px; margin-right: 5px;\">\n       Cacher\n    <\/label>\n  <\/div>\n\n  <!-- Image and Hotspot container -->\n  <div style=\"position: relative;\">\n    <img decoding=\"async\" class=\"main-image\" data-id=\"image1\" src=\"\" style=\"width:100%; display:block;\">\n    \n    <!-- Hotspot container positioned absolutely over the image -->\n    <div class=\"hotspot-container\" style=\"position:absolute; top:0; left:0; width:100%; height:100%; pointer-events:none; z-index:2000;\">\n      <!-- Hotspots injected by JS here -->\n    <\/div>\n  <\/div>\n\n<\/div>\n\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c39202f elementor-widget elementor-widget-text-editor\" data-id=\"c39202f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Dans la deuxi\u00e8me image, explorez l'oscillation de la branche du singe.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-138b181 elementor-widget elementor-widget-html\" data-id=\"138b181\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- 3.2 OPTIONAL 2nd Image HTML -->\n<!-- 2nd image, keep or delete\n     ImageID_2 HTML -->\n\n<!-- Repeat same structure for Image Block 2 -->\n<!-- Repeat same structure for Image Block 2 -->\n<!-- Repeat same structure for Image Block 2 -->\n\n<div class=\"hotspot-block\" data-id=\"image2\" style=\"max-width:1280px; margin:80px auto; position:relative;\">\n\n  <!-- Buttons and Checkbox ABOVE the Image -->\n  <div class=\"hotspot-controls\" data-id=\"image2\" style=\"margin-bottom:30px; display:flex; justify-content:center; flex-wrap:wrap; gap:15px; align-items:center; position:relative; z-index:10;\">\n    <div class=\"hotspot-buttons\" style=\"display:flex; gap:10px; flex-wrap:wrap;\"><\/div>\n    <label style=\"font-family:sans-serif; font-size:14px;\">\n      <input type=\"checkbox\" class=\"show-all-toggle\" data-id=\"image2\" style=\"margin-right:5px;\">\n      Tous\n    <\/label>\n    <label style=\"font-family: sans-serif; font-size: 14px;\">\n       <input type=\"checkbox\" class=\"hide-numbers-toggle\" data-id=\"image2\" style=\"margin-left: 12px; margin-right: 5px;\">\n       Cacher\n    <\/label>\n  <\/div>\n\n  <!-- Image and Hotspot container -->\n  <div style=\"position: relative;\">\n    <img decoding=\"async\" class=\"main-image\" data-id=\"image2\" src=\"\" style=\"width:100%; display:block;\">\n    \n    <!-- Hotspot container positioned absolutely over the image -->\n    <div class=\"hotspot-container\" style=\"position:absolute; top:0; left:0; width:100%; height:100%; pointer-events:none; z-index:2000;\">\n      <!-- Hotspots injected by JS here -->\n    <\/div>\n  <\/div>\n\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ea60902 elementor-widget elementor-widget-html\" data-id=\"ea60902\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- 4. NO TOUCH Scripts -->\n<!-- ImageID_4 HTML external scripts to call + JS -->\n<!-- script src=\"https:\/\/code.jquery.com\/jquery-3.7.1.min.js\"><\/script -->\r\n<script>\r\njQuery(document).ready(function ($) {\r\n\r\n  \/\/ --- IMAGE HOTSPOTS AND BUTTONS INIT ---\r\n  $('.hotspot-block').each(function () {\r\n    const $block = $(this);\r\n    const id = $block.data('id');\r\n    const $image = $block.find(`.main-image[data-id=\"${id}\"]`);\r\n    const $container = $block.find('.hotspot-container');\r\n    const $buttons = $block.find('.hotspot-buttons');\r\n    const imageUrl = imageMap[id];\r\n\r\n\r\n\t\r\n    const csvRaw = $(`pre#hotspot-data-${id}`).text().trim();\r\n\r\n    const activeNumbers = [];\r\n    $block.data('activeNumbers', activeNumbers);\r\n\r\n    if (!imageUrl) return;\r\n    $image.attr('src', imageUrl);\r\n\r\n    $image.on('load', function () {\r\n      const imgWidth = $image[0].naturalWidth;\r\n      const imgHeight = $image[0].naturalHeight;\r\n\r\n      \/\/ --- Simple Pipe-Delimited Parse ---\r\n\tconst lines = csvRaw.split('\\n').map(line => line.trim()).filter(Boolean);\r\n\tif (lines.length < 2) return;\r\n\t\/\/ Optionally check header here if you want\r\n\tconst data = lines.slice(1).map(line => {\r\n\t  \/\/ Split by pipe instead of comma, but allow pipes in the text field (by joining the rest)\r\n\t  const parts = line.split('|');\r\n\t  const order = parts[0] ? parts[0].trim() : '';\r\n\t  const x_px = parts[1] ? parts[1].trim() : '';\r\n\t  const y_px = parts[2] ? parts[2].trim() : '';\r\n\t  const direction = parts[3] ? parts[3].trim() : '';\r\n\t  const text = parts.length > 4 ? parts.slice(4).join('|').trim() : '';\r\n\t  return { order, x_px, y_px, direction, text };\r\n\t});\r\n\r\n\t\/\/ console.log('Parsed data:', data);\r\n\r\n\r\n      data.forEach(row => {\r\n        const number = String($.trim(row.order));\r\n        const xPx = parseFloat(row.x_px);\r\n        const yPx = parseFloat(row.y_px);\r\n        const dir = (row.direction || \"A\").trim().toUpperCase();\r\n        const text = $.trim(row.text);\r\n        const leftPercent = (xPx \/ imgWidth) * 100;\r\n        const topPercent = (yPx \/ imgHeight) * 100;\r\n\r\n        const tooltipClass = {\r\n          A: 'tooltip-above',\r\n          B: 'tooltip-below',\r\n          L: 'tooltip-left',\r\n          R: 'tooltip-right'\r\n        }[dir] || 'tooltip-above';\r\n\r\n        \/\/ Tooltip text present in DOM for TranslatePress!\r\n        const formattedText = `${number}. ` + text.replace(\/\\n\/g, '<br>');\r\n        const $hotspot = $(`\r\n          <div class=\"hotspot ${tooltipClass}\" data-number=\"${number}\">\r\n            <span class=\"hotspot-number\">${number}<\/span>\r\n            <span class=\"hotspot-tooltip\" style=\"display:none;\">${formattedText}<\/span>\r\n          <\/div>\r\n        `).css({\r\n          left: `${leftPercent}%`,\r\n          top: `${topPercent}%`,\r\n          transform: 'translate(-50%, -50%)',\r\n          position: 'absolute'\r\n        });\r\n\r\n        $container.append($hotspot);\r\n        $buttons.append(`<button class=\"hotspot-btn\" data-number=\"${number}\">${number}<\/button>`);\r\n      });\r\n    });\r\n  });\r\n\r\n  \/\/ --- STYLE UPDATE FUNCTION ---\r\nfunction updateStyles($block) {\r\n  const active = $block.data('activeNumbers') || [];\r\n  $block.find('.hotspot').each(function () {\r\n    const num = String($(this).data('number'));\r\n    const $tooltip = $(this).find('.hotspot-tooltip');\r\n    if (active.includes(num)) {\r\n      $(this).addClass('enlarged active');\r\n      $tooltip.show(); \/\/ <-- Show tooltip!\r\n    } else {\r\n      $(this).removeClass('enlarged active');\r\n      $tooltip.hide(); \/\/ <-- Hide tooltip!\r\n    }\r\n  });\r\n  $block.find('.hotspot-btn').each(function () {\r\n    const num = String($(this).data('number'));\r\n    $(this)\r\n      .toggleClass('highlight', active.includes(num))\r\n      .toggleClass('enlarged', active.includes(num));\r\n  });\r\n}\r\n\r\n\r\n  \/\/ --- HOTSPOT\/BUTTON CLICK ---\r\n  $(document).on('click', '.hotspot, .hotspot-btn', function (e) {\r\n    e.preventDefault();\r\n    const $clicked = $(e.target).closest('.hotspot, .hotspot-btn');\r\n    const num = String($clicked.data('number'));\r\n    const $block = $clicked.closest('.hotspot-block');\r\n    let active = $block.data('activeNumbers') || [];\r\n\r\n    const wasActive = active.includes(num);\r\n\r\n    \/\/ Clear Hide if checked\r\n    const $hide = $block.find('.hide-numbers-toggle');\r\n    if ($hide.is(':checked')) {\r\n      $hide.prop('checked', false).trigger('change');\r\n    }\r\n\r\n    if (wasActive) {\r\n      active = active.filter(n => n !== num);\r\n    } else {\r\n      active = [num]; \/\/ Only one active at a time\r\n    }\r\n    $block.data('activeNumbers', active);\r\n    updateStyles($block);\r\n\r\n    \/\/ Uncheck \"Show all\" if not all hotspots are active\r\n    const allNums = $block.find('.hotspot').map((_, el) => String($(el).data('number'))).get();\r\n    const $toggle = $block.find('.show-all-toggle');\r\n    const isAllActive = allNums.every(n => active.includes(n));\r\n    $toggle.prop('checked', isAllActive);\r\n  });\r\n\r\n  \/\/ --- SHOW ALL \/ HIDE MUTUAL EXCLUSIVITY AND BEHAVIOR ---\r\n  $(document).on('change', '.show-all-toggle', function() {\r\n    const id = $(this).data('id');\r\n    const $block = $(`.hotspot-block[data-id=\"${id}\"]`);\r\n    const $hide = $block.find('.hide-numbers-toggle');\r\n    const $hotspots = $block.find('.hotspot');\r\n    const allNums = $hotspots.map((_, el) => String($(el).data('number'))).get();\r\n\r\n    \/\/ Mutually exclusive: uncheck Hide if Show All is checked\r\n    if ($(this).is(':checked')) {\r\n      if ($hide.is(':checked')) {\r\n        $hide.prop('checked', false).trigger('change');\r\n      }\r\n      $block.data('activeNumbers', allNums);\r\n    } else {\r\n      $block.data('activeNumbers', []);\r\n    }\r\n\r\n    updateStyles($block);\r\n  });\r\n\r\n  \/\/ Hide handler\r\n  $(document).on('change', '.hide-numbers-toggle', function() {\r\n    const id = $(this).data('id');\r\n    const $block = $(`.hotspot-block[data-id=\"${id}\"]`);\r\n    const $showAll = $block.find('.show-all-toggle');\r\n    const $hotspots = $block.find('.hotspot');\r\n    const checked = $(this).is(':checked');\r\n\r\n    \/\/ Mutually exclusive: uncheck Show All if Hide is checked\r\n    if (checked && $showAll.is(':checked')) {\r\n      $showAll.prop('checked', false).trigger('change');\r\n    }\r\n\r\n    if (checked) {\r\n      $hotspots.hide();\r\n      $block.find('.enlarged, .active').removeClass('enlarged active');\r\n    } else {\r\n      $hotspots.show();\r\n    }\r\n  });\r\n\r\n  \/\/ --- CLICKING OUTSIDE CLEARS EVERYTHING ---\r\n  $(document).on('click', function (e) {\r\n    const $target = $(e.target);\r\n    const $block = $target.closest('.hotspot-block');\r\n    $('.hotspot-block').each(function () {\r\n      const $thisBlock = $(this);\r\n      if (!$block.length || !$block.is(this)) {\r\n        $thisBlock.data('activeNumbers', []);\r\n        $thisBlock.find('.show-all-toggle').prop('checked', false);\r\n        updateStyles($thisBlock);\r\n      }\r\n    });\r\n  });\r\n\r\n});\r\n<\/script>\r\n \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Pourquoi les rencontres sont si difficiles 1. Id\u00e9es fausses sur ce qui compte La plupart des gens pensent que les hommes ont des difficult\u00e9s \u00e0 cause de normes insens\u00e9es en mati\u00e8re d'apparence. Ce n'est pas le cas. La plupart des hommes ne sont pas perdants parce qu'ils veulent des mannequins - ils se heurtent \u00e0 un autre mur. 2. Les rencontres sont-elles moins gratifiantes ? Autrefois, les rendez-vous \u00e9taient excitants. Aujourd'hui, les hommes et les femmes sont d\u00e9\u00e7us [...]<\/p>","protected":false},"author":6,"featured_media":4460,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[134,100,130,103],"tags":[127,126,129,128],"class_list":["post-4074","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dating-dynamics","category-free-newsletter-insider-exclusives","category-recent","category-relationships","tag-es","tag-fr","tag-ja","tag-pt"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/posts\/4074","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/comments?post=4074"}],"version-history":[{"count":125,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/posts\/4074\/revisions"}],"predecessor-version":[{"id":5439,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/posts\/4074\/revisions\/5439"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/media\/4460"}],"wp:attachment":[{"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/media?parent=4074"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/categories?post=4074"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itishoemath.com\/fr\/wp-json\/wp\/v2\/tags?post=4074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}