/*
Theme Name: KUT Child
Theme URI: https://keyusertraining.com/
Description: Theme enfant de Kadence pour Key User Training. Heberge les templates silent rendering (Homepage 2026, SAP Starter, SAP Build, Parcours Long PDH, Hub Reconversion, Hub Junior, Hub Freelance, Hub SAP Entreprise, Cours SAP / Expert Training Center, A propos, Contact, 4 pages legales, page Catalogue formations-courtes). v1.11.0 : chantier 4 sous-projet C - page Catalogue /formations-courtes/ (template-formations-courtes.php) avec 7 sections : Hero+stats-band-hero, Disponibles maintenant (2 actives WP_Query), Pills modules SAP (10 teasers nav rapide), A venir (10 teasers WP_Query), FAQ catalogue 8 Q/R + FAQPage JSON-LD, Bridge ETC pivot abonnement, Suggere une formation form + endpoint REST /wp-json/kut/v1/suggest-formation -> Make webhook -> Odoo. Partial unifie card-formation.php (active/teaser dispatch). Schema CollectionPage + BreadcrumbList + ItemList 12 ListItem + FAQPage. Architecture i18n bootstrappee FR + slug EN reserve. v1.11.1 : chantier 13 hygiene staging - template-homepage.php appelle desormais wp_head()/wp_footer() (sinon CookieYes RGPD + Site Kit/GA4 ne se chargent PAS sur la home, page la plus visitee) avec dedup core+Yoast pour eviter title/canonical/OG en double ; coupe la sortie schema JSON-LD de Yoast (wpseo_json_ld_output false) car le theme emet deja son propre @graph. v1.11.2 : chantier 13 corrections audit UX (XiaoXiao + Codex/Playwright) - (1) dark mode : color-scheme:light global (le navigateur forcait l'auto-dark -> texte noir-sur-noir + texte des boutons verts invisible, surtout le diagnostic) + couleurs explicites inputs diagnostic ; (2) pagination EN blog/categorie /en/en/ 404 corrigee (garde anti double-prefixe dans kut_en_path_for) ; (3) liens auteur EN localises /en/author/ ; (4) chaine YouTube EN dediee sur /en/tools/ ; (5) tableau comparatif colonne recommandee opaque (couleur etrange au scroll mobile) ; (6) honeypot contact fallback style inline ; (7) H1 EN longs wrappent au lieu d'etre clippes (underline-gold white-space normal + overflow-wrap) ; (8) Inter enforce sur titres h1-h6 + reset font-family controles natifs. v1.11.3 : suite audit dark mode (review Michael) - textarea du diagnostic + pastilles d'option avaient background:#fff code en dur (texte clair sur blanc = illisible en dark mode KUT) -> rendus theme-aware via var(--kut-bg-white) dans diagnostic-junior-question / diagnostic-reconv-question / lead-magnet-input-diagnostic-junior. v1.11.4 : M1 audit EN (verif E2E live diagnostic) - le level_label (titre de niveau du rapport) sortait en FR car les libelles sont codes en dur en FR dans la rubrique du prompt agent IA (module 2 des scenarios Make) ; remap FR->EN sur les pages resultat (template-diagnostic-result junior n1/n2/n3 + template-diagnostic-reconv-result n1/n2) depuis le code level neutre, gate $kut_is_en, FR byte-identique. NB : l email J0 Make (module 6) reference encore 5.level_label en FR -> swap if(lang=en) a appliquer cote scenario (non touche ici, blueprint delicat). v1.11.5 : SEO articles blog (note session blog, 2026-06-09) - (1) single.php neutralise desormais Yoast + WP core via le pattern canonique 4 lignes (remove _wp_render_title_tag/rel_canonical/wp_robots + wpseo_frontend_presenters vide) deja utilise par homepage/pdh/404 : single.php emettait jusque-la title/canonical/robots/OG EN DOUBLE car wp_head() laissait Yoast (et WP core) reinjecter par-dessus son <head> fait main ; (2) og:image + twitter:image + image du schema Article = la COVER bespoke 1200x630 de l article (nouveau helper kut_blog_cover_image, cascade cover EN _kut_featured_en -> cover FR featured_media -> og:image categorie en fallback) au lieu de l og:image generique de categorie. Rendu FR strictement intact (fallback gracieux si pas de cover). v1.11.6 : routing EN des articles blog pilote par meta (note 2 session blog, anti-redeploy) - un nouvel article EN est desormais servi sur /en/<slug>/ SANS editer kut_i18n_routes() ni redeployer le theme. Nouvelle route map fusionnee memoisee kut_i18n_route_map() (inc/i18n-routes.php) = table statique (pages + 20 articles seedes prod, AUTORITAIRE) + articles ayant la meta _kut_slug_en ET un corps EN _kut_content_en (precedence au statique sur collision de cle FR ; filet admin sur collision de valeur EN). kut_fr_to_en_slug / kut_en_to_fr_slug / kut_has_en_version / kut_localize_url + rewriter de liens de corps (blog-i18n-links) consultent desormais la map fusionnee -> routing inbound + canonical + hreflang + switcher + cross-links herites sans autre modif. Metas _kut_slug_en (sanitize_title) + _kut_featured_en (cover EN, integer) enregistrees en REST pour le pipeline blog. La rewrite rule ^en/(.+) etant deja generique, aucun flush_rewrite_rules. Additif + reversible (repointer sur kut_i18n_routes() restaure l'ancien comportement), FR strictement intact. Cote pipeline blog : reste a PUT _kut_slug_en au meta-swap (contrat cross-session). v1.11.7 : SEO head des 3 pages-outils EN (R6 follow-up, 2026-06-09) - cablage hreflang manquant ajoute sur template-outils.php (/outils/), template-outils-influenceurs.php (/outils/influenceurs-sap/) et template-guide-sap.php (/guide-sap/) via kut_render_alternate_links (emet fr/en/x-default) juste apres le canonical ; + template-guide-sap.php : $kut_locale deplace AVANT le calcul du canonical et canonical rendu locale-aware (la version EN /en/sap-guide/ pointait son canonical vers le FR /guide-sap/ au lieu d'elle-meme). Additif et gate sur la locale EN, FR strictement intact (0 regression). v1.11.8 : qualite visuelle mega-menu Ressources (review Michael, 2026-06-09) - la carte "Article phare" affichait la cover de l article via la taille WordPress 'medium' (300px) -> floue sur ecrans haute densite (texte grave dans la cover illisible) + doublon avec le titre deja rendu en texte juste en dessous. Retour a la tuile-icone Phosphor (ph-newspaper) deja utilisee par le fallback et les colonnes Formations/A propos : nette, on-brand, coherente. La cover reste reservee au partage social/SEO (og:image, v1.11.5). Suppression de la regle CSS orpheline .kut-mega-featured-img et de la variable $kut_thumb devenues inutiles. v1.11.9 : pre-prod hygiene SEO (audit go-live, 2026-06-10) - (1) 5 og:image cassees (homepage, devenir-freelance, freelance, formation-sap-entreprise, formations-courtes) qui pointaient vers des /uploads/ inexistants (404 prod+staging) -> 5 nouvelles cartes og 1200x630 on-brand generees dans assets/ + URLs repointees vers le theme (pattern coherent avec og-pdh/og-reconversion/og-etc deja en place) ; (2) URLs du logo Organization/schema cassees (/assets/kut-logo.svg, /uploads/kut-logo.png, /uploads/2025/06/KUT-logo.png, /uploads/logo-kut.svg) repointees vers l asset existant assets/images/kut-logo-monogramme-512.png sur 8 templates + render-jsonld-schemas. 10 fichiers, additif, FR intact, 0 regression. v1.11.10 : fix bouton bleu Kadence (report Michael 2026-06-10) - le skin bouton du theme parent (global.min.css) peint tout <button>/.button en bleu palette (#2B6CB0 repos, #215387 hover/focus/active) ; les composants KUT gagnent par specificite SAUF les boutons a classe simple sans regle :focus, qui viraient au bleu tant qu'ils gardaient le focus apres clic. Fix a la source dans kut-shared-styles : les 4 variables Kadence (--global-palette-btn[-bg][-hover]) sont rabattues sur les tokens KUT (vert / vert fonce, texte blanc). Aucun etat Kadence ne peut plus produire de bleu ; les composants qui se stylent eux-memes gagnent comme avant. Additif, FR intact, 0 regression attendue. v1.11.11 : review Michael batch blog (2026-06-11) - (1) header meta du single article sur 2 lignes (auteur / date . lecture . maj) via .article-meta-row, dots uniquement entre items ; dates locale-proof (mois FR explicites, la locale WP du site etant en_US les pages FR affichaient "15 October 2021") ; (2) "A lire ensuite" pertinent par sujet : kut_blog_related_articles ne matche plus sur les tags de format how-to/concept (presents partout -> renvoyait toujours les 4 articles les plus recents) mais score par tags specifiques module/sujet partages, recence en tie-break, complement par categorie inchange. v1.11.12 : review Michael 2026-06-11 (4 fixes) - (1) /devenir-freelance/ : em des H2 de section enfin verts (regle accent figee 0b76116 jamais appliquee a ce template chantier 4) + em du CTA final waitlist en gold ; (2) rapport diagnostic reconv : claim bio corrige (Michael a decouvert SAP en 2018 comme key user, l'age '33 ans' etait faux et retire, source vault michael-parcours.md) ; (3+4) diagnostics junior + reconv : l'URL du rapport est desormais persistee 90 j en localStorage au submit et une banniere 'Revoir mon rapport ->' s'affiche au retour sur la page (avant : rapport impossible a retrouver sans l'email). Additif, FR/EN, 0 regression attendue. v1.11.13 : review Michael 2026-06-11 bis (/devenir-freelance/) - (1) surlignage gold du H1 hero trop long : le span underline-gold couvrait toute la phrase qui wrappe sur 2 lignes (le ::after pleine largeur depassait largement le texte court de la 2e ligne) -> le span ne couvre plus que les mots cles ('ta transition' FR, 'transition right' EN), le swoosh epouse le texte ; (2) blindage anti-skin-parent du bouton waitlist gold : etats :focus/:active/:hover explicites (specificite button.classe) pour qu'aucun CSS generique (inline Kadence d'une page en cache, etc.) ne puisse le repeindre en vert/bleu. v1.11.14 : swoosh underline-gold multi-ligne (suite review Michael) - le balayage 12 pages x 5 largeurs a montre que le debordement du surlignage touche aussi /freelance/ /a-propos/ /formation-sap-entreprise/ en desktop et 6 pages en mobile 390. Fix mecanisme (shared, additif, anti-regression respectee) : JS 03bis mesure la derniere ligne du span via Range API quand il wrappe et pose --ug-x/--ug-w ; la regle .ug-multiline fait epouser le swoosh a la derniere ligne. Toutes pages FR+EN, toutes largeurs, design intact quand le span tient sur 1 ligne, fallback sans JS = comportement historique. v1.11.15 : hug swoosh etendu aux heros custom - le JS 03bis selectionne desormais TOUS les .underline-gold (les heros repliques .radar-hero /outils/influenceurs-sap/ et .outils-hero /outils/ ont leur propre copie du swoosh hors selecteurs .hero) + regles .ug-multiline locales dans les 2 templates outils. Durci ensuite : filtre des fragments whitespace ~0px du Range (largeur fausse sinon) + ResizeObserver par span (remplace window.resize debounce, couvre les reflows fonts/bannieres). v1.11.16 : review Michael 2026-06-11 ter (2 pages) - (1) page ETC /en/ : toute mention de l'essai gratuit 1 semaine Espresso retiree de la version EN (meta/og/twitter descriptions, FAQ visible q6 + schema FAQPage q6 reformules sans essai, bloc pricing sans-engagement, ligne finale du CTA conditionnee a une chaine non vide -> absente en EN) pour que les acheteurs non-FR passent par le lien affilie (partenariat FR : direct Espresso OK cote francophones uniquement) ; FR strictement intact. (2) page /outils/ : Indy ne pointe plus vers le c3po.link de Keobiz (copy-paste prod) mais vers indy.fr sans affiliation en attendant le vrai lien affilie ; Alternative Search retire FR+EN (site mort 301 vers LinkedIn, et c'etait un cabinet de recrutement SAP FR, pas un moteur d'emploi) ; version EN sans la section Freelances & entrepreneurs (LegalStart/Keobiz/Indy/Shine = services exclusivement francais) + sous-titre hero EN ajuste. v1.11.17 : page /outils/ - Indy retire de la version FR (Michael n'a pas de lien affilie Indy, decision 2026-06-11 ; pointait historiquement vers le c3po.link de Keobiz). Section Freelances FR = LegalStart + Keobiz + Shine. v1.11.18 : mini-chantier filtres modules blog (decision Michael 2026-06-11, avant gel du 20/06) - (1) rangee de chips filtres factorisee en partial unique template-parts/blog-filters.php (home.php + archive.php consommaient 2 copies quasi identiques qui pouvaient diverger) ; (2) 6 chips modules SAP ajoutes a cote de Tous/Tutos/Carriere : PP, MM, PM, ABAP, EWM, Fiori (tags deja poses par le pipeline blog, compteurs live, etat actif sur l'archive du tag, icones Phosphor dediees, FR+EN via kut_blog_url_localized ; QM a 1 article attendra, Master Data/S/4HANA = transverses hors chips ; un module retombe a 0 article disparait seul) ; (3) fix double <title> + double og:* sur /blog/ et toutes les archives categorie/tag FR+EN : home.php et archive.php avaient rate le pattern canonique silent-render (remove _wp_render_title_tag/rel_canonical/wp_robots + wpseo_frontend_presenters vide) applique a single.php en v1.11.5 - Yoast reinjectait son title/og par-dessus le head fait main depuis son installation au chantier 13. v1.11.19 : filtres blog layout 2 rangees (review Michael 2026-06-11) - rangee 1 = les 3 familles (Tous/Tutos/Carriere, chips inchanges), rangee 2 = modules SAP visuellement secondaire (label uppercase 'Par module'/'By module' + chips reduits fond transparent, hover/actif re-assertes car meme specificite que les overrides). Nouvelles classes scopees .blog-filters-wrap/.blog-filters-modules/.blog-filters-label, 0 collision grep, rangee modules masquee si aucun module n'a d'article. + Generalisation du pattern canonique anti-doublon Yoast a TOUS les silent templates restants (audit statique : 17 fichiers appelaient wp_head() sans neutraliser les presenters Yoast -> double <title>/og:* potentiels) : author.php, single-formation.php, render-teaser.php, cours-sap, devenir-freelance, formations-courtes, formation-sap-entreprise, consultant-sap-junior, contact, freelance, 4 legales, guide-sap, 2 diagnostics-result. Chaque template emet deja title/canonical/robots propres (verifie par grep avant patch) -> zero perte ; les pages legales/diagnostics perdent l'og:title par defaut Yoast (souhaitable : CGV et rapports perso noindex n'ont rien a faire en partage social decore). v1.11.20 : page de vente SAP Starter (FR+EN) - le glossaire n'est plus annonce comme PDF (decision session formation 2026-06-11 : glossaire = page inline dans le cours, pas un fichier ; le besoin document telechargeable est couvert par l'export PDF du workbook). Module 02 : duree '3 lecons . 1 PDF' -> '1 glossaire', lecon 'Document : Glossaire SAP debutant' -> 'Glossaire SAP debutant', idem EN. v1.11.21 : maj des 2 liens de paiement Stripe du parcours PDH (Basic 740 EUR + Premium 1480 EUR) vers les nouveaux liens du compte Stripe KUT (anciens liens format court dR600.../8wM8... remplaces) ; template-pdh.php uniquement, template partage donc FR+EN couverts d'un coup, prix affiches + JSON-LD deja alignes sur 740/1480/2480, palier Excellence 2480 EUR inchange (modale booking, pas de Stripe). v1.11.22 : conformite legale marque SAP (audit affiliation 2026-06-13) - (1) ligne disclaimer SAP persistante ajoutee au footer, toutes pages FR+EN (cle kut_t footer.trademark_disclaimer dans lang/fr.json + lang/en.json, rendu dans footer-kut.php sous nouvelle classe .footer-trademark, CSS canon dans kut-shared-styles) : attribution SAP(R) = marque deposee de SAP SE + KUT organisme de formation independant sans affiliation/partenariat/agrement ; (2) clause marques des mentions legales (content/mentions-legales.php marques.p2 FR+EN) etoffee de 'pas affilie' vers 'ni affilie, ni partenaire, ni agree, ni sponsorise ou endosse par SAP SE' + phrase 'aucun contenu ne doit etre interprete comme emanant de SAP SE ou approuve par elle'. Additif, FR+EN, 0 regression (claims certification deja prudents, partenaires = Espresso reels, Pierre PP/EAM + temoignages confirmes exacts par Michael). v1.11.23 : conformite legale (review globale, P0.1) - retrait du claim Trustpilot "100% de notes 5 etoiles" (contradictoire avec la note 4,7/5 affichee a cote = pratique trompeuse UCPD/Omnibus) sur les ~10 resumes Trustpilot du site : fallback trustpilotClaim vide dans lang/fr.json+en.json (render-reviews guarde deja le vide L73) + retrait du bullet sep+claim dans 7 templates (homepage, pdh, junior, entreprise, reconversion, freelance, cours-sap) + 3 instances mega-menu du header-kut. Resultat affiche = "4,7/5 sur Trustpilot . Voir tous les avis". Cles de contenu devenues mortes laissees en place (sans sortie). FR+EN, additif, 0 regression. v1.11.24 : conformite legale (review globale, lot RGPD) - (1) arret du log de PII (payload nom/email/user-agent) dans les error_log des endpoints newsletter + sept-matins (RGPD minimisation art.5, ne reste qu'erreur/code HTTP) ; (2) Google / Google Tag Manager explicitement nomme dans la politique de confidentialite (destinataires item5 + transferts hors UE p1, au meme titre que Stripe) et la politique cookies (section 3.2 + tableau row3) ; (3) mesure d'audience GA/GTM passee de 'selon configuration et exemptions' a 'soumis a consentement' (GA via GTM non exempte sous ePrivacy). FR+EN, additif, 0 regression. v1.11.25 : conformite legale (review globale, lot pages de vente) - P1.6 mention TTC ajoutee aux prix consommateur (PDH price-sub x3, ETC priceUnit x2, micro-learnings sap-starter/sap-build kicker FR+EN ; prix assujettis TVA confirme par Michael) ; P1.1 promesse d'emploi "premier poste ou premiere mission dans les 6 mois" (home FAQ visible + schema FAQPage, 2 occurrences) reformulee sans promesse de resultat d'emploi, alignee sur le disclaimer obligation de moyens des CGV s15. FR+EN, additif, 0 regression. v1.11.26 : conformite legale (review globale, lot CGV/garantie - P0.2 + P1.2 + acces a vie + P2 ODR, decisions Michael) - (1) garantie PDH '100% conditionnee a 28 modules' -> 'satisfait ou rembourse sous 14 jours sans condition' (bloc garantie h3/p1/p2 + 2 FAQ visible+schema + label palier 'plateforme 12 mois' -> 'acces a vie') ; (2) CGV s10 retractation : exception contenu numerique + renoncement remplaces par garantie 14 jours pour TOUS les produits ; (3) CGV s11 : duree d'acces '12 mois minimum' -> 'acces a vie' (sans limitation tant que KUT exploite la Formation, preavis raisonnable si arret) ; (4) CGV s18 : lien ODR/RLL mort (plateforme EU fermee 07/2025) retire -> service national de mediation LU (entite ADR exacte a confirmer par avocat). FR+EN, additif. A faire valider par juriste LU avant prod. v1.11.27 : conformite legale (review globale, P1.7 + P1.3) - (1) P1.7 schema PDH : aggregateRating (4.7/50, avis GENERAUX KUT non specifiques au parcours, cf functions.php:100) + totalHistoricalEnrollment:150 (non source) retires du @type Course (evite des etoiles SERP basees sur des avis non dedies = conformite Google rich results + Omnibus) ; (2) P1.3 divulgation affiliation Espresso : rel='sponsored' ajoute aux 2 CTA d'abonnement ETC porteurs d'affId (silver+gold) + mention 'liens partenaires, remunere KUT sans surcout' ajoutee a la note checkout. FR+EN, additif. v1.11.28 : conformite legale (review globale, P1.9) - cron RGPD quotidien de purge des diagnostics (nouveau includes/diagnostic-purge.php, cable dans functions.php apres diagnostic-reconv) : suppression complete des CPT kut-diag / kut-diag-reconv au-dela de 12 mois + effacement des identifiants directs (email/prenom/nom) entre 30 jours et 12 mois (rapport de-identifie conserve). Comble l'ecart entre la promesse de purge de la politique de confidentialite et l'absence de mecanisme. Event wp-cron 'kut_diag_purge_daily', deplanifie au switch_theme. v1.11.29 : conformite legale (review globale, P2 RGPD liens consentement) - lien 'politique de confidentialite' locale-aware (FR /politique-de-confidentialite/ + EN /en/privacy-policy/) ajoute aux labels de consentement des principaux points de collecte : formulaire contact, modale newsletter, bande lead-magnet (esc_html -> wp_kses_post), brochure PDH, demande de booking (RGPD art.13, information au point de collecte). FR+EN, additif. Reste : 2 consentements de formulaires diagnostic (junior + sept-matins) a cabler apres verif du rendu. v1.11.30 : QA orthographe/typo (review Michael) - retrait des em dashes introduits par les lots legaux (garantie PDH FR+EN + 2 FAQ EN -> virgule ; 2 commentaires diagnostic-purge.php -> deux-points) + correction de l'espace avant deux-points en anglais (homepage P1.1 'the market :' -> 'the market:'). Aucun em dash ni faute d'accent restante dans le contenu ecrit/corrige cette session (balayage em/en dash sur tous les fichiers edites). v1.11.31 : conformite legale (review globale, P2 liens consentement - completude) - audit exhaustif des formulaires (review Michael 'il n'y a pas que consultant') : lien 'politique de confidentialite' ajoute aux 6 derniers consentements (diagnostic junior + diagnostic reconv, serie Sept matins, serie freelance, waitlist freelance, programme SAP Build formConsent). Total 11 consentements de formulaire couverts (les 5 de v1.11.29 + 6 ici). FR+EN, additif. v1.11.32 : blocage temporaire de la vente SAP Starter (demande Michael 2026-06-16, formation non finalisee) - flag 'sale_blocked' ajoute au bloc offer des fichiers contenu (sap-starter.php FR + sap-starter.en.php EN) ; render-offer remplace le bouton d'achat Stripe par un avis 'Disponible en juillet 2026' et masque le caption 'acces immediat apres paiement' ; render-mobile-sticky-cta se masque (pas de barre achat mobile) ; render-jsonld-schemas passe l'availability du Course de InStock a PreOrder. Theme-only, scope SAP Starter uniquement (SAP Build et PDH intacts), reversible : retirer le bloc sale_* des 2 fichiers contenu restaure l'achat. FR+EN, additif.
Author: Key User Training
Author URI: https://keyusertraining.com/
Template: kadence
Version: 1.11.32
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: kut-child
*/

/* Le design system KUT est integre dans chaque template via une balise <style> inline. Ce style.css reste minimal. */
