Pages scénarisées pour le marketing et le contenu

Page de comparaison de produits d’une marque de thé

Réalisez une page de comparaison de produits pour un scénario de marque de thé : contenu réel, contrôles actionnables, retours d’état clairs et mise en page adaptative à toutes les tailles d’écran.

Pages scénarisées pour le marketing et le contenupage de comparaison de produitsHTML TableCSSJavaScript
Après activation de JavaScript, ce cas peut être modifié, exécuté et enregistré. Code source fixe ci-dessous :
<!doctype html>
<html lang="fr" dir="ltr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Page de comparaison de produits d’une marque de thé</title>
  <style>
    :root { --ink:#3a2419; --paper:#fbf3df; --accent:#c66a2d; --secondary:#b5c88d; --line:color-mix(in srgb, var(--ink) 18%, transparent); --shadow:0 24px 60px color-mix(in srgb, var(--ink) 16%, transparent); color-scheme:light; }
    * { box-sizing:border-box; }
    html { min-width:320px; background:var(--paper); }
    body { min-height:100vh; margin:0; overflow-x:hidden; color:var(--ink); font-family:Baskerville,"Songti SC",serif; background:linear-gradient(90deg,var(--paper) 0 72%,color-mix(in srgb,var(--secondary) 18%,var(--paper)) 72%); }
    button,input,select,textarea { color:inherit; font:inherit; }
    button,[role="button"],input,select,textarea { accent-color:var(--accent); }
    button { cursor:pointer; }
    button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible { outline:3px solid var(--accent); outline-offset:3px; }
    [hidden] { display:none !important; }
    @media (max-width:700px) { .mast h1 { line-height:1.08 !important; letter-spacing:-.035em !important; overflow-wrap:anywhere; } }
    @media (prefers-reduced-motion:reduce) { *,*::before,*::after { scroll-behavior:auto !important; animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important; } }
    .page{width:min(1200px,calc(100% - 38px));margin:auto;padding:76px 0}.mast{display:grid;grid-template-columns:2fr 1fr;gap:7vw;align-items:center;margin-bottom:44px}.mast h1{font-family:Baskerville,"Songti SC",serif;font-weight:800;font-size:clamp(48px,11vw,112px);line-height:.86;letter-spacing:-.06em;margin:0}.eyebrow{display:block;margin-bottom:22px;color:var(--accent);font:800 11px/1 ui-monospace,monospace;letter-spacing:.26em}.intro{max-width:46ch;margin-top:26px;font-size:17px;line-height:1.85}.scenario{align-self:end;padding-bottom:14px;border-bottom:5px solid var(--accent);font-weight:800}.demo{border-radius:0 60px 0 0;box-shadow:-16px 18px 0 color-mix(in srgb,var(--accent) 22%,transparent);position:relative;min-height:460px;overflow:hidden;padding:clamp(30px,6vw,72px);background:color-mix(in srgb,var(--paper) 92%,#fff)}@media(max-width:700px){.page{width:calc(100% - 22px);padding:30px 0}.mast{grid-template-columns:1fr}.demo{padding:20px}}
    .panel{padding:18px;border:3px solid var(--ink);background:var(--paper);box-shadow:8px 8px 0 var(--ink)}.stack{display:grid;gap:12px}.row{display:flex;flex-wrap:wrap;gap:8px}.action{min-height:42px;padding:8px 13px;border:3px solid var(--ink);background:var(--paper);font-weight:900}.action.primary,.action.is-active{color:var(--paper);background:var(--ink)}.status{min-height:24px;padding:8px;color:var(--paper);background:var(--ink);font-weight:900}.metric{font-size:clamp(34px,8vw,76px);font-weight:900;letter-spacing:-.08em}.muted{font-weight:600}.chip{padding:5px 8px;border:2px solid var(--ink);font-weight:900}.meter{height:14px;border:3px solid var(--ink)}.meter>i{display:block;height:100%;background:var(--ink)}
    .composition-index{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:18px}.index-mark{display:grid;align-content:space-between;width:76px;padding:16px 10px;border:1px solid var(--line);color:var(--accent);background:color-mix(in srgb,var(--paper) 82%,transparent);text-align:center}.index-mark strong{font:900 34px/1 ui-monospace,monospace}.index-mark span{writing-mode:vertical-rl;font:800 10px/1.2 ui-monospace,monospace;letter-spacing:.18em}.composition-index .demo{grid-column:1;grid-row:1}.composition-index::before{content:"";position:absolute;left:-12px;top:38px;width:5px;height:45%;background:linear-gradient(var(--accent),var(--secondary))}@media(max-width:700px){.composition-index{grid-template-columns:1fr}.index-mark{grid-row:1;width:auto;grid-template-columns:auto 1fr}.index-mark span{writing-mode:horizontal-tb}.composition-index .demo{grid-row:2}}
    .marketing-compare{display:grid;gap:18px}.marketing-compare>header{display:grid;grid-template-columns:1fr auto minmax(180px,.35fr);gap:22px;align-items:end;padding:24px;border:1px solid var(--line);background:var(--paper)}.marketing-compare h2{margin:.2em 0}.marketing-compare header fieldset{display:grid;gap:7px;border:0}.marketing-compare header>label{display:grid;grid-template-columns:1fr auto;gap:8px}.marketing-compare header input[type="range"]{grid-column:1/-1}.marketing-compare-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.marketing-compare-cards article{display:grid;align-content:start;gap:13px;padding:22px;border:1px solid var(--line);border-radius:20px;background:var(--paper)}.marketing-compare-cards article.is-recommended{transform:translateY(-8px);border:3px solid var(--accent)}.plan-rank{font:900 28px/1 ui-monospace,monospace;color:var(--accent)}.marketing-compare-cards h3{margin:0;font-size:28px}.marketing-compare-cards strong{font-size:36px}.marketing-compare-cards strong small{font-size:12px}.plan-fit{height:7px;overflow:hidden;background:var(--line)}.plan-fit i{display:block;height:100%;background:var(--accent)}.marketing-compare-cards ul{display:grid;gap:7px;padding-left:20px}.marketing-decision{display:grid;grid-template-columns:1fr 1fr auto;gap:18px;align-items:center;padding:20px;color:var(--paper);background:var(--ink)}.marketing-decision>div{display:grid;gap:6px}.marketing-decision strong{font-size:26px}.marketing-decision ol{display:flex;flex-wrap:wrap;gap:8px;padding:0;margin:0;list-style:none}.marketing-decision li{padding:5px 8px;border:1px solid color-mix(in srgb,var(--paper) 30%,transparent)}.marketing-decision .action{color:var(--paper);border-color:var(--paper)}@media(max-width:760px){.marketing-compare>header,.marketing-decision{grid-template-columns:1fr}.marketing-compare-cards{grid-template-columns:1fr}.marketing-compare-cards article.is-recommended{transform:none}}.workflow-dispatch{display:grid;grid-template-columns:minmax(210px,.48fr) minmax(0,1.52fr);gap:18px}.dispatch-console{display:grid;align-content:start;gap:16px;padding:22px;border:1px solid var(--line);border-radius:18px;background:color-mix(in srgb,var(--secondary) 12%,var(--paper))}.dispatch-console h2{margin:.2em 0}.dispatch-console form,.dispatch-console label{display:grid;gap:7px}.dispatch-console input,.dispatch-console select{min-width:0;width:100%;padding:10px;border:1px solid var(--line);border-radius:8px;background:var(--paper)}.dispatch-console fieldset{display:flex;gap:12px;border:1px solid var(--line);border-radius:10px}.dispatch-console fieldset label{display:flex;align-items:center}.dispatch-workbench{--dispatch-load:.22;min-width:0;padding:14px;border-left:8px solid color-mix(in srgb,var(--accent) calc(var(--dispatch-load)*100%),var(--line));background:linear-gradient(90deg,color-mix(in srgb,var(--accent) 8%,transparent),transparent 28%)}.dispatch-workbench[data-dispatch-priority="urgent"]{box-shadow:inset 0 0 0 2px var(--accent)}@media(max-width:900px){.workflow-dispatch{grid-template-columns:1fr}.dispatch-console{order:2}}
  </style>
</head>
<body data-aesthetic="magazine" data-composition="field-index">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">magazine / page de comparaison de produits / INTERMEDIATE</span><h1>Page de comparaison de produits d’une marque de thé</h1><p class="intro">Réalisez une page de comparaison de produits pour un scénario de marque de thé : contenu réel, contrôles actionnables, retours d’état clairs et mise en page adaptative à toutes les tailles d’écran.</p></div><span class="scenario">marque de thé</span></header>
    <div class="composition-index"><section class="demo" aria-label="Zone interactive de la page de comparaison des produits d’une marque de boissons au thé"><div class="workflow-dispatch"><aside class="dispatch-console"><span class="eyebrow">Marque de thé DISPATCH</span><h2>Salle de répartition pour le lancement de produits de thé</h2><form id="workflowDispatchForm"><label>Type de tâche<select id="workflowDispatchKind"><option>Série de thés infusés à froid</option><option>Thé en feuilles</option><option>Série des saisons solaires</option></select></label><label>Stock de lancement<input id="workflowDispatchAmount" type="number" min="1" max="9999" value="45"><span>boîte</span></label><fieldset><legend>Priorité de traitement</legend><label><input type="radio" name="workflowPriority" value="normal" checked>Standard</label><label><input type="radio" name="workflowPriority" value="urgent">Urgent</label></fieldset><button class="action primary" type="submit">Accéder à la publication</button></form><label>Tâche en cours<select id="workflowDispatchActive" aria-label="Basculer la tâche en cours"><option value="1">Série de thés infusés à froid</option><option value="2">Thé en feuilles</option></select></label><output id="workflowDispatchSummary">En attente de planification</output></aside><section id="workflowCore" class="workflow-core dispatch-workbench" data-dispatch-priority="normal"><!-- 11DZ_CORE_START:marketing-content-pages-comparison-page --><div class="marketing-compare"><header><div><span class="eyebrow">CHOOSE BY PRIORITY</span><h2>Comparaison des propositions de marques de thé</h2><p>Inutile d’empiler des paramètres dans des tableaux denses ; choisissez d’abord l’objectif le plus important, puis consultez les raisons de recommandation ciblées.</p></div><fieldset><legend>Objectif prioritaire actuel</legend><label><input type="radio" name="compareGoal" value="simple" checked>Démarrage rapide</label><label><input type="radio" name="compareGoal" value="team">Travail d’équipe</label><label><input type="radio" name="compareGoal" value="depth">Approfondir les capacités</label></fieldset><label>Plafond budgétaire mensuel<input id="marketingCompareBudget" type="range" min="30" max="150" step="10" value="90" data-core-bridge="marketing-content-pages-comparison-page"><output id="marketingCompareBudgetValue">¥90</output></label></header><section id="marketingCompareCards" class="marketing-compare-cards"><article data-marketing-plan="0" data-price="39"><span class="plan-rank">01</span><h3>Version légère</h3><strong>¥39<small>/ mois</small></strong><div class="plan-fit" role="progressbar" aria-label="Correspondance de la version légère" aria-valuemin="0" aria-valuemax="100" aria-valuenow="68"><i style="width:68%"></i></div><ul><li>Démarrage rapide</li><li>modèle de base</li><li>Support de la communauté</li></ul><button type="button" class="action" aria-pressed="false">Ajouter la barre de décision</button></article><article data-marketing-plan="1" data-price="79"><span class="plan-rank">02</span><h3>Version de collaboration</h3><strong>¥79<small>/ mois</small></strong><div class="plan-fit" role="progressbar" aria-label="degré d’adéquation de la version collaborative" aria-valuemin="0" aria-valuemax="100" aria-valuenow="86"><i style="width:86%"></i></div><ul><li>Collaboration multiutilisateur</li><li>Historique des versions</li><li>support prioritaire</li></ul><button type="button" class="action" aria-pressed="false">Ajouter la barre de décision</button></article><article data-marketing-plan="2" data-price="129"><span class="plan-rank">03</span><h3>Version professionnelle</h3><strong>¥129<small>/ mois</small></strong><div class="plan-fit" role="progressbar" aria-label="Correspondance version professionnelle" aria-valuemin="0" aria-valuemax="100" aria-valuenow="94"><i style="width:94%"></i></div><ul><li>Analyses avancées</li><li>Permissions complètes</li><li>Services sur mesure</li></ul><button type="button" class="action" aria-pressed="false">Ajouter la barre de décision</button></article></section><aside class="marketing-decision"><div><span>Recommandé actuellement</span><strong id="marketingRecommendation">Version de collaboration</strong><p id="marketingReason">Offrir des capacités de collaboration plus complètes dans le budget.</p></div><div><span>Barre de décision</span><ol id="marketingDecisionList"><li>Pas encore inscrit au forfait</li></ol></div><button id="marketingCompareConfirm" class="action primary" type="button">Confirmer le résultat de la comparaison</button></aside></div><!-- 11DZ_CORE_END --></section></div><p id="status" class="status" role="status" aria-live="polite"></p></section><aside class="index-mark" aria-hidden="true"><strong>05</strong><span>Marque de thé FIELD INDEX</span></aside></div>
  </main>
  <script>
    'use strict';
    const statusOutput = document.querySelector('#status');
    const announce = message => { statusOutput.textContent = message; };
    /* 11DZ_CORE_SCRIPT_START:marketing-content-pages-comparison-page */
const marketingComparePlans=[{"name":"Version légère","score":68,"price":39,"features":["Démarrage rapide","modèle de base","Support de la communauté"]},{"name":"Version de collaboration","score":86,"price":79,"features":["Collaboration multiutilisateur","Historique des versions","support prioritaire"]},{"name":"Version professionnelle","score":94,"price":129,"features":["Analyses avancées","Permissions complètes","Services sur mesure"]}];const marketingCompareCards=[...document.querySelectorAll('[data-marketing-plan]')];const marketingCompareBudget=document.querySelector('#marketingCompareBudget');const marketingCompareState={goal:'simple',budget:90,selected:new Set()};function marketingGoalBonus(planIndex){const matrix={simple:[24,12,2],team:[4,28,16],depth:[0,14,32]};return matrix[marketingCompareState.goal][planIndex];}function renderMarketingComparison(){marketingCompareState.budget=Number(marketingCompareBudget.value);document.querySelector('#marketingCompareBudgetValue').textContent='¥'+marketingCompareState.budget;const ranked=marketingComparePlans.map((plan,index)=>({index,fit:plan.score+marketingGoalBonus(index)-(plan.price>marketingCompareState.budget?45:0)})).sort((left,right)=>right.fit-left.fit);const winner=ranked[0];marketingCompareCards.forEach((card,index)=>{card.classList.toggle('is-recommended',index===winner.index);card.hidden=marketingComparePlans[index].price>marketingCompareState.budget+50;const fit=Math.max(0,Math.min(100,marketingComparePlans[index].score+marketingGoalBonus(index)));const meter=card.querySelector('[role="progressbar"]');meter.setAttribute('aria-valuenow',String(fit));meter.querySelector('i').style.width=fit+'%';});document.querySelector('#marketingRecommendation').textContent=marketingComparePlans[winner.index].name;document.querySelector('#marketingReason').textContent=marketingComparePlans[winner.index].price<=marketingCompareState.budget?'Correspond au budget et s’aligne sur les objectifs prioritaires actuels.':'Le budget actuel est trop faible ; nous recommandons l’option la plus proche de l’objectif.';const list=document.querySelector('#marketingDecisionList');list.replaceChildren(...(marketingCompareState.selected.size?[...marketingCompareState.selected].map(index=>{const item=document.createElement('li');item.textContent=marketingComparePlans[index].name;return item;}):[Object.assign(document.createElement('li'),{textContent:'Pas encore inscrit au forfait'})]));announce('Recommandé '+marketingComparePlans[winner.index].name);}document.querySelectorAll('[name="compareGoal"]').forEach(input=>input.addEventListener('change',()=>{marketingCompareState.goal=input.value;renderMarketingComparison();}));marketingCompareBudget.addEventListener('input',renderMarketingComparison);marketingCompareCards.forEach((card,index)=>card.querySelector('button').addEventListener('click',event=>{if(marketingCompareState.selected.has(index))marketingCompareState.selected.delete(index);else marketingCompareState.selected.add(index);event.currentTarget.setAttribute('aria-pressed',String(marketingCompareState.selected.has(index)));event.currentTarget.textContent=marketingCompareState.selected.has(index)?'Déplacer hors de la barre de décision':'Ajouter la barre de décision';renderMarketingComparison();}));document.querySelector('#marketingCompareConfirm').addEventListener('click',()=>announce(marketingCompareState.selected.size?'Confirmé '+marketingCompareState.selected.size+' options candidats':'Veuillez d’abord ajouter au moins une proposition candidate'));renderMarketingComparison();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"marketing-content-pages-comparison-page","selector":"[data-core-bridge=\"marketing-content-pages-comparison-page\"]","mode":"range","key":"ArrowRight"};const workflowBridgeCore=document.querySelector('#workflowCore');const workflowBridgeControl=workflowBridgeCore.querySelector(workflowBridgeSpec.selector);if(!workflowBridgeControl)throw new Error('Missing core bridge: '+workflowBridgeSpec.name);const workflowBridgeControlledId=workflowBridgeControl.getAttribute('aria-controls');const workflowBridgeControlled=workflowBridgeControlledId?document.getElementById(workflowBridgeControlledId):null;workflowBridgeCore.dataset.workflowBridge=workflowBridgeSpec.name;workflowBridgeCore.dataset.workflowVersion='0';function workflowBridgeSerialize(){const visualNode=workflowBridgeCore.firstElementChild||workflowBridgeCore;const visual=getComputedStyle(visualNode);const outputs=[...workflowBridgeCore.querySelectorAll('output,[role="status"],[aria-live],meter,progress')].map(node=>node.textContent.trim()+'|'+node.getAttribute('aria-valuenow')+'|'+node.getAttribute('value'));const canvas=[...workflowBridgeCore.querySelectorAll('canvas')].map(node=>{try{return node.toDataURL().slice(-160);}catch{return 'canvas-unavailable';}});return JSON.stringify({html:workflowBridgeCore.innerHTML,status:statusOutput.textContent,outputs,canvas,visual:[visual.display,visual.visibility,visual.opacity,visual.transform,visual.filter,visual.backgroundColor,visual.width,visual.height],scroll:workflowBridgeSpec.mode==='scroll'?workflowBridgeControl.scrollTop:null});}let workflowBridgeLastEffect=workflowBridgeSerialize();function workflowBridgeSummary(){const label=(workflowBridgeControl.getAttribute('aria-label')||workflowBridgeControl.textContent||workflowBridgeControl.value||workflowBridgeSpec.name).trim().replace(/\s+/g,' ').slice(0,72);return label+' · Version de base '+workflowBridgeCore.dataset.workflowVersion;}function workflowBridgeCommit(){const effect=workflowBridgeSerialize();if(effect===workflowBridgeLastEffect)return {changed:false,summary:workflowBridgeSummary()};workflowBridgeLastEffect=effect;workflowBridgeCore.dataset.workflowVersion=String(Number(workflowBridgeCore.dataset.workflowVersion||0)+1);return {changed:true,summary:workflowBridgeSummary()};}function workflowBridgeScheduleCommit(){queueMicrotask(workflowBridgeCommit);setTimeout(workflowBridgeCommit,0);}workflowBridgeControl.addEventListener("input",workflowBridgeScheduleCommit);workflowBridgeControl.addEventListener('change',workflowBridgeScheduleCommit);const workflowBridgeStateTargets=new Set(workflowBridgeCore.querySelectorAll('dialog'));if(workflowBridgeControlled&&workflowBridgeCore.contains(workflowBridgeControlled))workflowBridgeStateTargets.add(workflowBridgeControlled);workflowBridgeStateTargets.forEach(target=>['close','cancel','toggle'].forEach(eventName=>target.addEventListener(eventName,workflowBridgeScheduleCommit)));function workflowBridgeActivate(){workflowBridgeControl.focus();const step=Number(workflowBridgeControl.step)||1;const min=workflowBridgeControl.min===''?-Infinity:Number(workflowBridgeControl.min);const max=workflowBridgeControl.max===''?Infinity:Number(workflowBridgeControl.max);let next=Math.min(max,Math.max(min,(Number(workflowBridgeControl.value)||0)+step));if(next===Number(workflowBridgeControl.value))next=Math.max(min,Number(workflowBridgeControl.value)-step);workflowBridgeControl.value=String(next);workflowBridgeControl.dispatchEvent(new Event('input',{bubbles:true}));workflowBridgeControl.dispatchEvent(new Event('change',{bubbles:true}));const result=workflowBridgeCommit();setTimeout(workflowBridgeCommit,0);return result;}function workflowBridgeReset(){workflowBridgeCore.dataset.workflowVersion='0';workflowBridgeLastEffect=workflowBridgeSerialize();}
const workflowDispatchCore=document.querySelector('#workflowCore');const workflowDispatchForm=document.querySelector('#workflowDispatchForm');const workflowDispatchSelect=document.querySelector('#workflowDispatchActive');const workflowDispatchJobs=new Map([["1",{"label":"Série de thés infusés à froid","amount":12,"priority":"normal","touches":0}],["2",{"label":"Thé en feuilles","amount":21,"priority":"urgent","touches":0}]]);let workflowDispatchSerial=workflowDispatchJobs.size;function workflowDispatchDrive(job,activate=false){workflowDispatchCore.dataset.dispatchPriority=job.priority;workflowDispatchCore.style.setProperty('--dispatch-load',Math.min(.95,.16+job.amount/120));const bridge=activate?workflowBridgeActivate():{changed:false,summary:workflowBridgeSummary()};document.querySelector('#workflowDispatchSummary').textContent=job.label+' · '+job.amount+' Boîte · '+bridge.summary;announce('Tâches en cours pour le lancement du thé :'+job.label);}function workflowDispatchRender(activeId,activate=false){workflowDispatchSelect.replaceChildren(...[...workflowDispatchJobs].map(([id,job])=>{const option=document.createElement('option');option.value=id;option.textContent=job.label+(job.priority==='urgent'?' · Urgent':'');return option;}));workflowDispatchSelect.value=activeId;workflowDispatchDrive(workflowDispatchJobs.get(activeId),activate);}workflowDispatchForm.addEventListener('submit',event=>{event.preventDefault();const data=new FormData(workflowDispatchForm);const id=String(++workflowDispatchSerial);workflowDispatchJobs.set(id,{label:document.querySelector('#workflowDispatchKind').value,amount:Math.max(1,Number(document.querySelector('#workflowDispatchAmount').value)||1),priority:data.get('workflowPriority'),touches:0});workflowDispatchRender(id,true);});workflowDispatchSelect.addEventListener('change',()=>workflowDispatchDrive(workflowDispatchJobs.get(workflowDispatchSelect.value),true));workflowDispatchCore.addEventListener('focusin',()=>{const job=workflowDispatchJobs.get(workflowDispatchSelect.value);if(!job)return;job.touches+=1;document.querySelector('#workflowDispatchSummary').textContent=job.label+' · '+job.amount+' Boîte · '+workflowBridgeSummary();});workflowDispatchRender('1',false);
workflowBridgeReset();
  </script>
</body>
</html>
Commentaires sur la pageVous avez découvert un problème ou avez une suggestion d’amélioration ?
Les fonctions de retour nécessitent l’utilisation de la version en ligne

Veuillez activer JavaScript dans la version en ligne avant de soumettre ; les fonctionnalités locales de l’outil ou du cas ne sont pas affectées.

Aller vers la version en ligne pour envoyer des commentaires