// SEO GUY — écrans const { useState: useS, useEffect: useE, useRef: useR } = React; function GuyThinkingLoader({ title, sub, block, compact }) { return (
{title}
{sub ?{sub}
: null}Rédaction et optimisation en cours…
Votre article est en ligne et déjà indexé. SEO GUY prépare le suivant…
{quotaExhausted && quota ? <>Vous avez utilisé {quota.used}/{quota.limit} article(s) cette semaine. Revenez lundi ou passez au plan supérieur.> : "Générez des titres dans Mes articles pour alimenter le pipeline."}
Contenu optimisé juste ce qu'il faut pour avoir des résultats sur le long terme
{publishedThisMonth} articles
publiés ce mois-ci
Mardi 9 h
prochaine publication auto
{stats?.keywordsTotal ?? 0} mots-clés
suivis et priorisés
{shopifyConnected && gscConnected ? "Tout est connecté" : shopifyConnected ? "Shopify connecté" : gscConnected ? "GSC connectée" : "À connecter"}
{[shopifyConnected && "Shopify", gscConnected && "Search Console"].filter(Boolean).join(" · ") || "Shopify · Search Console"}
{compare.beforeLabel}
{compare.beforeValue}
{compare.beforeMeta}
{compare.afterLabel}
{compare.afterValue}
{compare.afterMeta}
{BLOG_COVER_HINT}
Cliquez sur Générer — SEO GUY rédige l'article complet pour vous. {quota && !quota.unlimited ? ( <> Quota restant cette semaine : {quota.remaining}.> ) : null} {hiddenByQuota > 0 ? ( <> {hiddenByQuota} autre(s) sujet(s) masqué(s) — quota hebdomadaire atteint.> ) : null}
Aucun sujet proposé pour l'instant. {quota && !quota.unlimited ? ( <> Générez jusqu'à {quota.limit} titres pour remplir votre quota hebdomadaire.> ) : null}
{s.title}
{s.keyword} · {s.volume}
Aucun article produit pour l'instant. Lancez une génération pour commencer.
) : null} {articles.map((a) => { const st = articleStatusMeta(a.status); const title = a.title || "Sans titre"; return ({title}
J'ai repéré {opportunities.length} opportunités faciles à saisir
Peu de concurrence, bon volume — aucun article ne les cible encore. Un clic suffit.
{emptyGsc}
}Publiez des articles et connectez la GSC pour voir les performances.
) : ({t.title}
{t.revenue ? `CA ${t.revenue} €` : ""}
{emptyGsc}
) : ( <>Guy placera ici un contenu du plan éditorial (article ou interview) à l'horaire choisi.
Jour
Heure précise
Publication : {dayLabel} à {String(hour).padStart(2, "0")}h {minute ? `:${String(minute).padStart(2, "0")}` : ""}
Format
Les interviews ne sont pas incluses dans votre plan actuel.
) : null}Persona cible
{error}
: null}{hint}
: null} {open ? (Créneaux horaires vides : Guy y insère articles et interviews selon votre plan éditorial. Cliquez une case de la grille pour ouvrir la configuration (format, persona, heure précise).
Cliquez une case pour configurer un créneau · {localSlots.length}/{maxSlots} max {maxPerWeek ? ` · plan : ${maxPerWeek} art./sem.` : ""}
Choisissez comment SEO Guy gère la rédaction et la publication de vos contenus.
Assistant Guy rédige, publie et suit sans votre vérification. Vous restez néanmoins responsable de la publication au sens légal. Nous vous invitons à contrôler régulièrement les contenus créés.
Aucun créneau — ouvrez la configuration pour définir votre rythme.
) : null}Ton éditorial
La voix de vos articles — alignée sur vos personas et le funnel segments. {!targetAudiences?.length ? " Complétez vos segments pour ancrer le ton en base." : ""}
{saveMsg}
: null} {saveErr ?{saveErr}
: null} {saving ?Enregistrement…
: null}Blog et auteur affichés sur vos articles publiés dans Shopify.
Blog par défaut
Les nouveaux articles sont créés dans ce blog Shopify (statut brouillon).
Boutique non connectée — publication en mode brouillon local.
) : blogsLoading ? (Chargement des blogs Shopify…
) : shopifyBlogs.length > 0 ? ( ) : (Aucun blog détecté dans cette boutique.
)}Auteur par défaut
Nom affiché sur les articles publiés.
{saveMsg}
: null} {saveErr ?{saveErr}
: null} {saving ?Enregistrement…
: null}Langue de rédaction des articles et marchés SEO visés par Guy.
Langue principale
Langue dans laquelle Guy rédige vos articles.
Pays ciblés
Marchés prioritaires pour le SEO et les recommandations éditoriales.
{targetCountries.length ? `${targetCountries.length} pays sélectionné(s) · ${formatTargetCountriesSummary(targetCountries)}` : "Sélectionnez au moins un pays pour ancrer le ciblage SEO."}
{saveMsg}
: null} {saveErr ?{saveErr}
: null} {saving ?Enregistrement…
: null}Pack métier pour pré-remplir les interdits, ou saisie manuelle. Guy est un garde-fou éditorial, pas un juriste.
Pack métier
Sans pack, vous configurez les interdits à la main. Un pack génère une liste sourcée : vos termes saisis manuellement sont conservés.
{selectedPack ? ( <>{selectedPack.description}
Cadres réglementaires
Certifications (optionnel)
Cochez seulement si la marque est réellement certifiée — Guy ajoute alors des interdits extra (surpromesses « 100 % naturel », etc.).
Garde-fou éditorial — ne remplace pas un conseil juridique.
> ) : null}Aucun mot-clé ni expression interdit pour le moment.
)}Coller une liste
Un terme par ligne. Virgules acceptées si tout est sur une seule ligne.
Référentiels normatifs
Collez un règlement, un code ou une consigne métier. Guy en extrait les mots et expressions interdits (ex. pas de vertus médicales sur un cosmétique ou une huile essentielle).
{forbidMsg}
: null} {forbidErr ?{forbidErr}
: null} {forbidSaving && !forbidBusy ?Enregistrement…
: null}{isWebsiteSite ? "WordPress publie les articles Guy sur votre site. Shopify reste optionnel." : "Boutique Shopify et synchronisation des contenus vers votre blog."}
Dans WordPress : menu Assistant Guy (plugin) → générer le mot de passe d’application pour le compte Éditeur, puis le coller ici. Il n’est jamais réaffiché. Pas le mot de passe de connexion WordPress.
setWpBaseUrl(e.target.value)} style={{ width: "100%", margin: "6px 0 12px" }} /> setWpUsername(e.target.value)} style={{ width: "100%", margin: "6px 0 12px" }} /> setWpPassword(e.target.value)} style={{ width: "100%", margin: "6px 0 12px" }} /> {wpCategories.length > 0 ? ( <> > ) : null}{wpMsg}
: null} {wpErr ?{wpErr}
: null}Connexion technique (jeton Admin API)
Collez le jeton Admin API Shopify de cette boutique. Il n’est jamais réaffiché après enregistrement.
setTokenShop(e.target.value)} style={{ width: "100%", margin: "6px 0 12px" }} /> setTokenValue(e.target.value)} style={{ width: "100%", margin: "6px 0 12px" }} />{tokenMsg}
: null} {tokenErr ?{tokenErr}
: null}Synchronisation Shopify
Repousse titres, contenu et images vers le blog Shopify après une coupure ou une génération en mode autonome.
{resyncMsg ?{resyncMsg}
: null} {resyncErr ?{resyncErr}
: null}Connectez votre boutique Shopify pour activer la synchronisation automatique.
) : null}En activant le pilote automatique, SEO Guy rédige, publie et suit les contenus sans validation humaine. Vous restez responsable de la publication au sens légal et vous vous engagez à contrôler régulièrement les contenus créés.
Votre article a été traité. Vous pouvez fermer cette fenêtre.
{BLOG_COVER_HINT}
{editMode ? ({error}
}{p.title}
Avec {p.who} · {p.keyword} {p.completedAt ? ` · ${new Date(p.completedAt).toLocaleDateString("fr-FR")}` : ""}
J'ai repéré 3 sujets où votre expertise ferait la différence
Choisissez-en un, répondez à 4 petites questions (4–5 min), et je transforme vos réponses en article optimisé.
{p.title}
Avec {p.who} · {p.date}
Mot-clé : {session.seedKeyword} · {session.questionCount} réponses enregistrées
) : null}Chargement de la transcription…
Relisez les réponses, ajustez si besoin, puis générez l'article SEO et le visuel.
{transcript.map((turn, ti) => ({turn.question}
{turn.answers.map((a, ai) => ({error}
: null} > )}Copiez le lien pour un expert externe, ou lancez l'interview vous-même.
Valide jusqu'au {formatIvExpiry(expiresAt)}
{IV_ANALYSIS_MSGS[messageIndex]}
Analyse approfondie en cours — cela prend quelques secondes.
Étape {wizardStep + 1} sur {IV_WIZARD_STEPS.length} — {IV_WIZARD_STEPS[wizardStep]}
Gardés pour plus tard
Relancez un sujet que vous aviez mis de côté.
{savedThemes.map((t) => { const p = themeToProposal(t); return (Mot-clé : {p.seedKeyword}{p.estimatedVolume ? ` · ~${p.estimatedVolume} recherches/mois` : ""}
{p.angle ?{p.angle}
: null}Nouvelles suggestions
Guy analyse votre marché pour proposer des sujets à fort potentiel SEO.
{themesLoading ? (Voilà les sujets qui peuvent vous apporter des visites — choisissez ou saisissez un sujet libre.
{themes.map((t, i) => (Mot-clé : {t.seedKeyword} {t.estimatedVolume ? ` · ~${t.estimatedVolume} recherches/mois` : ""}
{t.angle ?{t.angle}
: null}{error}
: null}Format de l'interview
Visuel de couverture
Optionnel — sinon Guy génère une image à la publication.
Validité du lien d'invitation
Pour envoyer l'interview à une personne externe.
Aucun crédit interview disponible.
) : null} {error ?{error}
: null}