<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Favicons -->
<!--
L'icone du domaine, deux fois, et le doublon est VOULU.
Google cherche `/favicon.ico` A LA RACINE avant de lire ces balises. Le
fichier ne vivait que dans /favicon/ : la racine repondait 404, et les
resultats de recherche affichaient le globe gris generique au lieu du
logo — constate le 2026-08-19 sur « site:mahamoden.tn ».
`public/favicon.ico` est donc une copie de `public/favicon/favicon.ico`.
Si l'un change, changer l'autre : ce sont deux fichiers, pas un lien.
Il fait 48x48, la taille de reference de Google — qui attend un carre
dont le cote est un multiple de 48. C'est aussi le cas du 192x192
ci-dessous ; les 16, 32, 180 et 512 ne le sont pas, et ne servent qu'aux
navigateurs et aux systemes mobiles.
-->
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="icon" type="image/x-icon" href="/favicon/favicon.ico" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon/favicon-32x32.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon/android-chrome-192x192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="/favicon/android-chrome-512x512.png" />
<!-- Web manifest -->
<link rel="manifest" href="/site.webmanifest" />
<!-- Theme color (barre navigateur mobile) -->
<meta name="theme-color" content="#0A0A0A" />
<meta name="msapplication-TileColor" content="#0A0A0A" />
<meta name="msapplication-TileImage" content="/favicon/android-chrome-192x192.png" />
<!--
Vérification du domaine par Meta.
ÉCRITE EN DUR, et c'est une obligation : Meta refuse expressément une
balise posée par JavaScript. Elle ne peut donc pas passer par PageSeo.
Elle est répétée dans SocialPreviewController — ce n'est pas un oubli. Le
robot de vérification de Meta se présente sous la même signature que
celui des aperçus, il reçoit donc la page rendue par le serveur et non
celle-ci. Sans la balise aux DEUX endroits, la vérification échouerait
sans qu'on comprenne pourquoi.
-->
<meta name="facebook-domain-verification" content="s75zo8buwegwla1h2b6gxi3mh7kee2" />
<!-- SEO de base (complété par react-helmet-async sur chaque page) -->
<meta name="description" content="Maha Moden — Mode féminine élégante en Tunisie. Robes, manteaux, pantalons et collections exclusives. Livraison partout en Tunisie." />
<meta name="robots" content="index, follow" />
<meta name="author" content="Maha Moden" />
<!--
Open Graph ÉCRIT EN DUR, et ce n'est pas une redondance avec PageSeo.
PageSeo pose ces mêmes balises, mais depuis JavaScript. Or le robot de
Facebook — facebookexternalhit — n'exécute PAS de JavaScript : il lisait
donc une page sans la moindre balise og:. Conséquence constatée le
12 août 2026 : TOUT lien vers le site, partagé sur Facebook, Instagram,
Messenger ou WhatsApp, s'affichait sans image, sans titre propre et sans
description. Y compris les liens des publicités.
Ces balises-ci sont le filet : elles garantissent qu'un partage montre au
moins la marque et son visuel. Les pages produit méritent mieux — leur
propre photo et leur prix — et c'est le rôle du rendu pour robots
sociaux, côté serveur (voir SocialPreviewController).
-->
<meta property="og:site_name" content="Maha Moden" />
<meta property="og:type" content="website" />
<meta property="og:locale" content="fr_TN" />
<meta property="og:title" content="Maha Moden — Mode Féminine Élégante" />
<meta property="og:description" content="Mode féminine élégante, pensée pour la femme moderne. Collections exclusives, qualité premium. Livraison partout en Tunisie." />
<meta property="og:url" content="https://mahamoden.tn/" />
<meta property="og:image" content="https://mahamoden.tn/og-image.jpg" />
<!-- Dimensions annoncées : sans elles, Facebook doit télécharger l'image
avant de composer l'aperçu, et le premier partage s'affiche nu. -->
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="Maha Moden — mode féminine élégante" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Maha Moden — Mode Féminine Élégante" />
<meta name="twitter:description" content="Mode féminine élégante, pensée pour la femme moderne. Livraison partout en Tunisie." />
<meta name="twitter:image" content="https://mahamoden.tn/og-image.jpg" />
<link rel="preconnect" href="https://mahamoden.tn" crossorigin />
<link rel="dns-prefetch" href="https://mahamoden.tn" />
<!--
Mesure : GA4 et le pixel Meta ne sont demandés qu'une fois React monté,
et chaque connexion neuve (DNS + TCP + TLS) coûtait alors ~325 ms au
relevé du 16 août 2026. Ouvrir les deux tuyaux pendant que le bundle se
télécharge rend ce délai invisible. Deux origines, pas plus : chaque
preconnect inutilisé occupe une connexion au détriment du reste.
-->
<link rel="preconnect" href="https://www.googletagmanager.com" crossorigin />
<link rel="preconnect" href="https://connect.facebook.net" crossorigin />
<title>Maha Moden — Mode Féminine Élégante</title>
<!--
L'identité de la marque pour les moteurs : nom, logo, coordonnées et
comptes officiels. C'est ce qui permet à Google de rattacher le site à une
entreprise réelle (panneau de marque, résultats enrichis).
ÉCRITE EN DUR, et sur toutes les pages, pour deux raisons : elle ne dépend
d'aucune donnée, et les robots qui n'exécutent pas de JavaScript — Bing,
ChatGPT, Claude, Perplexity — doivent la lire aussi. Les données
structurées des fiches, rayons et articles, elles, sont posées par le
serveur page par page (PageShellController côté Symfony).
Les informations viennent des mentions légales et de la page Contact : si
l'une change là-bas, elle change ici.
-->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "OnlineStore",
"name": "Maha Moden",
"legalName": "STE MAHA MODEN",
"url": "https://mahamoden.tn/",
"logo": "https://mahamoden.tn/logo.png",
"image": "https://mahamoden.tn/og-image.jpg",
"email": "contact@mahamoden.tn",
"telephone": "+21658440119",
"taxID": "0620712C",
"currenciesAccepted": "TND",
"areaServed": { "@type": "Country", "name": "Tunisie" },
"address": {
"@type": "PostalAddress",
"streetAddress": "Route Kaïed M’Hamed Km 1,5 — Av. Hédi Soussi",
"postalCode": "3039",
"addressLocality": "Sfax",
"addressCountry": "TN"
},
"sameAs": [
"https://www.facebook.com/MAHAMODEN.1990",
"https://www.instagram.com/maha_moden/"
]
}
</script>
<script type="module" crossorigin src="/assets/index-AgeamvRs.js"></script>
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-QTnfLwEv.js">
<link rel="modulepreload" crossorigin href="/assets/query-Cvj7AXH8.js">
<link rel="modulepreload" crossorigin href="/assets/vendor-DZD9sr_e.js">
<link rel="modulepreload" crossorigin href="/assets/utils-DF7TVy55.js">
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-DnQkZOEJ.js">
<link rel="modulepreload" crossorigin href="/assets/api-ByKu5IiL.js">
<link rel="modulepreload" crossorigin href="/assets/mappers-BDwCDaaV.js">
<link rel="modulepreload" crossorigin href="/assets/loadError-Sp70WtrQ.js">
<link rel="modulepreload" crossorigin href="/assets/price-GWuic15D.js">
<link rel="stylesheet" crossorigin href="/assets/index-CoWeKx6A.css">
</head>
<body>
<div id="root"></div>
</body>
</html>