À compléter avant l'envoi
[server name][licensed name][dental polyclinic / private practice / aesthetic clinic][responsible manager][content physician][site editor][physician list][treatments][phone][WhatsApp][address][hours]
Construis from scratch un nouveau site pour ma clinique sur mon serveur d'hébergement [server name]. Détails :
1. Raison sociale autorisée : [licensed name], type : [dental polyclinic / private practice / aesthetic clinic]
2. Responsable légal : [responsible manager], médecin responsable du contenu : [content physician], éditeur du site : [site editor]
3. Médecins avec titres, formation et domaines d'activité : [physician list]
4. Soins pour lesquels rédiger des pages d'information, et médecin qui prépare chacune : [treatments]
5. Téléphone : [phone], WhatsApp : [WhatsApp], adresse : [address], horaires d'ouverture : [hours]
6. Domaine : [domain], préférence de couleurs : [colour preference], vraies photos : [where the photos are, or "none"]
Ce site doit être entièrement conforme au Règlement turc relatif aux activités de promotion et d'information dans les services de santé (Journal officiel du 12.11.2025, n° 33075). Les règles :
1. Aucun avis de patient, message de remerciement, étoile ni note. Pas d'aggregateRating ni de review dans le JSON-LD non plus ; Google n'accepte pas qu'une entreprise affiche elle-même sa note dans le balisage.
2. Aucun tarif, remise, campagne, paiement échelonné, moyen de paiement ni formule du type « consultation gratuite ». Pas d'offers, de price ni de priceRange dans le JSON-LD.
3. Aucune promotion de produit ou de marque : ne cite aucune marque d'implant, d'aligneur, de composite ou d'appareil.
4. Aucune promesse de supériorité ou de résultat : évite « le meilleur », « leader », « garanti », « solution définitive », « indolore », « parfait », « 100 pour cent ». Utilise « cela varie d'une personne à l'autre et se précise après l'examen ».
5. Aucun chiffre invérifiable : pas de « 15 ans d'expérience », « 5 000 patients » ou « des milliers d'implants ».
6. Titres corrects : un chirurgien-dentiste sans spécialité est « Dt. », un spécialiste est « Uzm. Dt. » ; « Dr. » ne s'emploie que pour un titulaire d'un doctorat. Une polyclinique mentionne un « mesul müdür » (responsable légal), pas un « médecin-chef ».
7. Aucune photo de patient, aucune image de chirurgie ou de zones intimes. Les images avant/après ne peuvent être publiées qu'avec le consentement écrit du patient, dans le même cadre et avec la même technique, avec la date de l'intervention et la date de prise de l'image ; si je ne dispose pas de ces éléments, n'utilise aucune image avant/après. Si tu en utilises, ajoute dessous cette phrase telle quelle : "Her cerrahi veya girişimsel işlemde sonuçlar kişiden kişiye değişiklik gösterebilir. İşlem öncesinde hekiminizden detaylı görüş almanız önerilir." Mets-la aussi sur les pages d'actes interventionnels.
8. Des mentions légales sur chaque page : raison sociale autorisée, responsable légal, médecin responsable du contenu, éditeur du site et date de dernière mise à jour.
9. Le contenu de tourisme médical n'a pas sa place sur ce site ; il nécessite une autorisation distincte et une plateforme distincte.
Pour vérifier automatiquement ces règles, écris uyum-check.mjs à la racine du site. Il analyse le texte visible et le texte alternatif des images de chaque page, séparément des blocs JSON-LD : formules d'avis et de notation ; nombres accompagnés de TL ou ₺ ; les mots price, fee, discount, campaign, instalment, free, best, guarantee, painless, permanent solution ; noms de marques ; expressions comme « 15+ years » ou « 5000 patients » ; « Dr. » et « chief physician » ; « before and after » ; health tourism ; et aggregateRating, review, offers, price dans le JSON-LD. Il vérifie aussi la présence des cinq champs de mentions légales sur chaque page, de lastReviewed et reviewedBy sur les pages de soins, et de la phrase d'avertissement sur les pages d'actes interventionnels. Marque les phrases qui expliquent la réglementation (par exemple « ce site n'affiche aucun tarif ») avec data-uyum="aciklama" ; le script ne les compte pas comme des erreurs mais les liste pour relecture manuelle. Il doit se terminer avec le code 1 en cas de violation.
Confirme ensuite le serveur avec list_servers et lance scaffold_site avec style="clinic", d'abord avec confirm=false, puis avec confirm=true après mon accord. Lis site_design_guide et site_seo_guide. Écris une décision de direction artistique dans _kaynak/ART.md et montre-la-moi : une belle police serif d'affichage de Fontshare (par exemple Zodiak) associée à une police de texte sobre (par exemple Switzer), un fond crème, un texte vert très foncé presque noir, un seul accent bleu-vert profond et beaucoup d'espace blanc. L'élément signature est une carte « médecin ayant préparé cette page » à côté de chaque page de soin : nom du médecin avec son titre, spécialité et date de relecture médicale. S'il n'y a pas de photo du médecin, n'utilise pas de photo de personne issue d'une banque d'images ; utilise un simple badge avec les initiales. Aucun patient ne doit apparaitre sur les photos des locaux.
Pages et schémas :
1. Accueil : ce qu'est la clinique, combien de médecins travaillent dans quels domaines, l'approche « d'abord l'examen, ensuite nous décidons ensemble », les soins, les médecins, les étapes de prise de rendez-vous et 4 FAQ. Schéma : WebPage, FAQPage. Dans le graphe de base, le type d'entreprise est Dentist (MedicalClinic pour une clinique esthétique).
2. Une page Soins et une page d'information par soin : le premier paragraphe dit ce qu'est le soin et pour qui il est envisagé ; puis à qui il convient ou non, les étapes d'évaluation, le déroulement du traitement, les risques et précautions, les suites et 3 FAQ. Schéma : MedicalWebPage (about un MedicalProcedure, reviewedBy et author le nœud Person du médecin, lastReviewed), FAQPage.
3. Nos médecins : nom avec titre, spécialité, formation et domaines d'activité de chacun. Schéma : un Person avec un @id pour chaque médecin (honorificPrefix, jobTitle, worksFor #business, knowsAbout). Le type schema.org Physician décrit une organisation ; ne l'utilise pas pour une personne.
4. Rendez-vous et contact : téléphone, formulaire WhatsApp, adresse, horaires, liste « à apporter » et itinéraire. Schéma : ContactPage.
5. Une page de mentions légales, de confidentialité et de principes de publication, et une page 404.
Aucune invention : n'écris ni avis, ni notes, ni distinctions, ni certificats, ni nombres de clients, ni affirmations du type « le meilleur » qui ne soient pas réelles. N'ajoute au schéma ni au texte aucun horaire, aucune coordonnée GPS, aucun prix ni aucun e-mail que je ne t'ai pas fournis ; omets le champ et signale-le comme manquant dans le rapport. N'utilise aucun tiret long ni slogan tout fait, et fais en sorte que le premier paragraphe de chaque page réponde directement à la question de cette page.
Travail SEO commun : chaque page reçoit un title unique de 48 à 60 caractères, une description de 145 à 158 caractères, un seul H1 et une canonical se terminant par une barre oblique. Ajoute à chaque page son propre nœud WebPage et un BreadcrumbList, reliés au graphe de base par @id. Dans robots.txt, écris Allow: / pour Googlebot, Bingbot, OAI-SearchBot, ChatGPT-User, GPTBot, Claude-SearchBot, Claude-User, ClaudeBot, PerplexityBot, Perplexity-User, Google-Extended, Applebot-Extended et CCBot, explique la décision dans un commentaire et indique ce qu'il faut modifier si je veux bloquer les robots d'entrainement. sitemap.xml porte de vraies dates lastmod. llms.txt décrit l'entreprise avec exactitude en deux phrases et liste le NAP (nom, adresse, téléphone) et les pages importantes avec leurs liens.
Configuration technique (le chemin par défaut du kit n'est pas utilisé sur ce site, pour les raisons suivantes) :
1. Compile Tailwind et abandonne le CDN. Le kit charge Tailwind via le Play CDN, qui compile dans le navigateur, affiche un avertissement dans la console et dégrade les performances mobiles. Écris _kaynak/package.json avec site_write_file, installe avec site_run_command("cd _kaynak && npm i -D tailwindcss@3 html-validate", background=true) et attends avec site_command_status. Dans _kaynak/tailwind.config.js, définis content sur "./*.html", "./**/*.html", "!./_kaynak/**" et "./_kaynak/chrome.mjs". Déplace les règles @font-face, les lignes @tailwind ainsi que l'anneau de focus, le lien d'évitement et le garde anti-débordement de l'app.css du kit vers _kaynak/site.css. Sors le résultat dans assets/app.css, car design-check.mjs cherche les polices dans ce fichier, et ajoute ?v=<content hash> au lien sur chaque page pour que le cache en périphérie ne serve jamais l'ancien fichier.
2. Héberge les polices toi-même. Lis l'URL CSS des familles Fontshare choisies (api.fontshare.com/v2/css?f[]=...) avec site_read_url, télécharge ses fichiers woff2 avec site_fetch dans assets/fonts/, et déclare-les avec @font-face et font-display: swap. Précharge chaque graisse utilisée au-dessus de la ligne de flottaison avec <link rel="preload" as="font" type="font/woff2" crossorigin>, trois fichiers au maximum. Sans cela, le changement de police décale la mise en page ; dans la démo, le CLS desktop était de 0,078 pour cette raison et est tombé à 0 avec le préchargement.
3. Rends le menu et le pied de page en HTML statique. Les composants <site-nav> et <site-footer> du kit fonctionnent avec JavaScript, et la plupart des robots d'IA ne voient jamais le menu, l'adresse ni le téléphone. Supprime les scripts chrome.js et motion.js de chaque page. Dans _kaynak/chrome.mjs, écris deux fonctions qui construisent le HTML de l'en-tête et du pied de page à partir de assets/site.config.js ; construis le menu mobile sans JavaScript avec <details> et <summary>, et marque la page courante avec aria-current="page". Écris à la racine du site build.mjs qui, dans l'ordre, exécute node seo-stamp.mjs, retamponne tout ce qui se trouve entre <!-- chrome:header:start --> et <!-- chrome:header:end --> (et de même pour le pied de page) sur chaque page, compile Tailwind et met à jour le hash du lien CSS. Après chaque modification, exécute uniquement site_run_command("node build.mjs").
4. Aucun mouvement. Ne charge ni GSAP, ni Lenis, ni Swiper, ni aucun script d'animation ; le brief est celui d'un site d'information calme et lisible.
5. Allège les images. Télécharge chaque photo avec site_fetch dans des fichiers séparés avec resize="480x", "800x", "1200x", "1600x", image_format="webp" et une qualité entre 60 et 68. Donne à chaque <img> srcset, sizes, ainsi que width et height correspondant au vrai ratio ; si tu recadres, ajoute une classe de ratio comme aspect-[4/3] avec object-cover, sinon la mise en page se décale au chargement de l'image. L'image du premier écran reçoit fetchpriority="high" et n'est pas en lazy ; toutes les autres reçoivent loading="lazy". Télécharge l'image de partage en 1200x630 JPG avec site_fetch.
6. Petits détails qui coutent des points : ajoute un favicon SVG avec <link rel="icon"> (sinon le navigateur demande /favicon.ico, le 404 apparait comme une erreur dans la console et les Bonnes pratiques baissent). Écris DOCTYPE en majuscules, n'utilise aucun attribut style et ne laisse aucun espace en fin de ligne. Utilise à la place des espaces dans le texte visible des liens téléphoniques (règle tel-non-breaking de html-validate). Les liens du menu, du pied de page, du fil d'Ariane et des titres doivent mesurer au moins 44 pixels de haut et de large. N'intègre pas d'iframe Google Maps ; le site ne doit faire aucune requête externe, donc affiche l'adresse et un lien « Obtenir l'itinéraire » à la place.
7. Aucune requête ne doit quitter le site : polices, scripts, styles et images résident tous sur ton propre serveur. Il n'y a pas de gestionnaire de formulaire, donc le formulaire de contact est un formulaire method="get" pointant vers https://wa.me/[WhatsApp number] avec un textarea prérempli nommé "text" ; aucun JavaScript n'est nécessaire.
Contrôles (dans cet ordre ; ne dis pas que c'est terminé tant qu'ils ne sont pas tous validés) :
1. Exécute node build.mjs avec site_run