Marketing and content scenarios

Creative Festival Product Comparison Page

Complete a product comparison page in a creative festival scenario: includes real content, interactive controls, clear status feedback, and responsive layouts.

Marketing and content scenariosProduct comparison pageHTML TableCSSJavaScript
With JavaScript enabled, you can edit, run, and save this example. The fixed source is as follows:
<!doctype html>
<html lang="en" dir="ltr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Creative Festival Product Comparison Page</title>
  <style>
    :root { --ink:#24213a; --paper:#f6f1e8; --accent:#e6a23c; --secondary:#a8a1d8; --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:"DIN Alternate","Arial Narrow",sans-serif; background:repeating-linear-gradient(135deg,color-mix(in srgb,var(--ink) 5%,transparent) 0 1px,transparent 1px 18px),var(--paper); }
    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; } }
    .mast{display:flex;justify-content:space-between;border-bottom:6px solid var(--ink);padding-bottom:18px;gap:20px;align-items:flex-end;margin:0 0 22px}.page{width:min(1240px,calc(100% - 28px));margin:auto;padding:34px 0 70px}.scenario{padding:8px 12px;border:2px solid var(--ink);font:900 12px/1 ui-monospace,monospace}.mast h1{font-family:"DIN Condensed","Arial Narrow",sans-serif;font-weight:900;text-transform:uppercase;font-size:clamp(44px,10vw,104px);letter-spacing:-.02em;max-width:1000px;margin:0;line-height:.82}.intro{max-width:720px;font-family:"Arial Narrow",sans-serif;line-height:1.5}.eyebrow{display:inline-block;padding:6px 9px;color:var(--paper);background:var(--accent);font:900 10px/1 ui-monospace,monospace;letter-spacing:.12em}.demo{border-radius:3px;box-shadow:10px 10px 0 var(--accent);position:relative;min-height:400px;overflow:hidden;padding:32px;background:var(--paper)}@media(max-width:700px){.mast{display:grid;grid-template-columns:1fr}.page{width:calc(100% - 16px);padding-top:16px}.demo{padding:14px}}
    .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-studio{display:grid;gap:14px}.studio-ruler{display:flex;justify-content:space-between;padding:0 4px;color:color-mix(in srgb,var(--ink) 55%,transparent);font:700 11px/1 ui-monospace,monospace;letter-spacing:.14em}.studio-ruler::before{content:"01 / WORKING PROTOTYPE"}.studio-ruler::after{content:"360 · 768 · 1440"}.composition-studio .demo::after{content:"";position:absolute;right:18px;bottom:18px;width:24px;height:24px;border-right:2px solid var(--accent);border-bottom:2px solid var(--accent);pointer-events:none}
    .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-session{display:grid;gap:14px}.session-command{display:grid;grid-template-columns:1fr auto minmax(170px,.45fr) auto;gap:16px;align-items:end;padding:18px;border-block:4px double var(--ink)}.session-command h2{margin:.2em 0}.session-command output{font:900 clamp(28px,5vw,54px)/1 ui-monospace,monospace}.session-command label{display:grid;grid-template-columns:1fr auto;gap:7px;font-size:12px}.session-command input{grid-column:1/-1;width:100%}#workflowSessionProgress{height:12px;overflow:hidden;border-radius:2px;background:var(--line)}#workflowSessionProgress i{display:block;width:0;height:100%;background:var(--accent)}.session-stage{min-width:0;transition:filter .25s,transform .25s}.session-stage[data-session-phase="running"]{transform:translateY(-3px)}.session-stage[data-session-phase="paused"]{filter:grayscale(.65)}.session-stage[data-session-phase="complete"]{filter:contrast(.78);opacity:.72}.session-log{display:grid;grid-template-columns:auto 1fr;gap:18px;align-items:start}.session-log ol{display:flex;flex-wrap:wrap;gap:7px;padding:0;margin:0;list-style:none}.session-log li{padding:5px 8px;border:1px solid var(--line);font-size:12px}@media(max-width:900px){.session-stage{order:-1}.session-command{grid-template-columns:1fr auto}.session-command label{grid-column:1/-1}.session-log{grid-template-columns:1fr}}
  </style>
</head>
<body data-aesthetic="industrial" data-composition="studio">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">industrial / Product Comparison Page / INTERMEDIATE</span><h1>Creative Festival Product Comparison Page</h1><p class="intro">Complete a product comparison page in a creative festival scenario: includes real content, interactive controls, clear status feedback, and responsive layouts.</p></div><span class="scenario">Creative Festival</span></header>
    <div class="composition-studio"><div class="studio-ruler" aria-hidden="true"></div><section class="demo" aria-label="Interactive area for the Creative Festival product comparison page"><div class="workflow-session"><header class="session-command"><div><span class="eyebrow">Creative Festival SESSION</span><h2>Program Recording Timer Panel</h2></div><output id="workflowSessionClock">00:45</output><label>Round Duration<input id="workflowSessionLength" type="range" min="15" max="90" step="15" value="45"><span>sec</span></label><button id="workflowSessionToggle" class="action primary" type="button">Start rehearsal</button></header><div id="workflowSessionProgress" role="progressbar" aria-label="Program Recording Progress" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><i></i></div><section id="workflowCore" class="workflow-core session-stage" data-session-phase="ready" tabindex="-1"><!-- 11DZ_CORE_START:marketing-content-pages-comparison-page --><div class="marketing-compare"><header><div><span class="eyebrow">CHOOSE BY PRIORITY</span><h2>Creative Festival Proposal Comparison</h2><p>Rather than packing parameters into dense tables, first choose the most important goal, then review tailored recommendation reasons.</p></div><fieldset><legend>Current priority target</legend><label><input type="radio" name="compareGoal" value="simple" checked>Get started quickly</label><label><input type="radio" name="compareGoal" value="team">Team Collaboration</label><label><input type="radio" name="compareGoal" value="depth">Deep capability</label></fieldset><label>Monthly budget cap<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>Lite version</h3><strong>¥39<small>/ mo</small></strong><div class="plan-fit" role="progressbar" aria-label="Lightweight fit" aria-valuemin="0" aria-valuemax="100" aria-valuenow="68"><i style="width:68%"></i></div><ul><li>Quick Start</li><li>Basic template</li><li>Community Support</li></ul><button type="button" class="action" aria-pressed="false">Add to decision bar</button></article><article data-marketing-plan="1" data-price="79"><span class="plan-rank">02</span><h3>Collaborative Edition</h3><strong>¥79<small>/ mo</small></strong><div class="plan-fit" role="progressbar" aria-label="Collaborative fit" aria-valuemin="0" aria-valuemax="100" aria-valuenow="86"><i style="width:86%"></i></div><ul><li>Collaborative</li><li>Version History</li><li>Priority Support</li></ul><button type="button" class="action" aria-pressed="false">Add to decision bar</button></article><article data-marketing-plan="2" data-price="129"><span class="plan-rank">03</span><h3>Pro</h3><strong>¥129<small>/ mo</small></strong><div class="plan-fit" role="progressbar" aria-label="Pro Edition Match" aria-valuemin="0" aria-valuemax="100" aria-valuenow="94"><i style="width:94%"></i></div><ul><li>Advanced Analysis</li><li>Full Permissions</li><li>Exclusive Service</li></ul><button type="button" class="action" aria-pressed="false">Add to decision bar</button></article></section><aside class="marketing-decision"><div><span>Current recommendation</span><strong id="marketingRecommendation">Collaborative Edition</strong><p id="marketingReason">Provide more complete collaboration capabilities within budget.</p></div><div><span>Decision Bar</span><ol id="marketingDecisionList"><li>Not yet on a plan</li></ol></div><button id="marketingCompareConfirm" class="action primary" type="button">Confirm comparison results</button></aside></div><!-- 11DZ_CORE_END --></section><footer class="session-log"><strong id="workflowSessionScore">0 interaction checkpoints</strong><ol id="workflowSessionLaps" aria-label="Round Log"></ol></footer></div><p id="status" class="status" role="status" aria-live="polite"></p></section></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":"Lite version","score":68,"price":39,"features":["Quick Start","Basic template","Community Support"]},{"name":"Collaborative Edition","score":86,"price":79,"features":["Collaborative","Version History","Priority Support"]},{"name":"Pro","score":94,"price":129,"features":["Advanced Analysis","Full Permissions","Exclusive Service"]}];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?'Matches the budget and the current priority goals.':'The current budget is too low, so the closest recommended option is provided.';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:'Not yet on a plan'})]));announce('Recommended '+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)?'Move Out of Decision Bar':'Add to decision bar';renderMarketingComparison();}));document.querySelector('#marketingCompareConfirm').addEventListener('click',()=>announce(marketingCompareState.selected.size?'Confirmed '+marketingCompareState.selected.size+' candidate solutions':'Please add at least one candidate first'));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+' · Core Version '+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 workflowSessionCore=document.querySelector('#workflowCore');const workflowSessionToggle=document.querySelector('#workflowSessionToggle');const workflowSessionLength=document.querySelector('#workflowSessionLength');const workflowSessionState={phase:'ready',elapsed:0,limit:Number(workflowSessionLength.value),checkpoints:[],timer:null};function workflowSessionFormat(seconds){return String(Math.floor(seconds/60)).padStart(2,'0')+':'+String(seconds%60).padStart(2,'0');}function workflowSessionDrive(){const percent=Math.min(100,Math.round(workflowSessionState.elapsed/workflowSessionState.limit*100));document.querySelector('#workflowSessionClock').textContent=workflowSessionFormat(Math.max(0,workflowSessionState.limit-workflowSessionState.elapsed));const progress=document.querySelector('#workflowSessionProgress');progress.setAttribute('aria-valuenow',String(percent));progress.querySelector('i').style.width=percent+'%';workflowSessionCore.dataset.sessionPhase=workflowSessionState.phase;document.querySelector('#workflowSessionScore').textContent=workflowSessionState.checkpoints.length+' interactive checkpoints';}function workflowSessionLap(label){workflowSessionState.checkpoints.push({label,at:workflowSessionState.elapsed});const item=document.createElement('li');item.textContent=label+' · '+workflowSessionFormat(workflowSessionState.elapsed);document.querySelector('#workflowSessionLaps').append(item);workflowSessionDrive();}function workflowSessionStop(complete=false){clearInterval(workflowSessionState.timer);workflowSessionState.timer=null;workflowSessionState.phase=complete?'complete':'paused';workflowSessionToggle.textContent=complete?'Restart':'Continue round';workflowSessionToggle.setAttribute('aria-pressed','false');workflowSessionDrive();announce(complete?'Festival Episode Recording Complete':'Round paused');}function workflowSessionStart(){if(workflowSessionState.phase==='complete'){workflowSessionState.elapsed=0;workflowSessionState.checkpoints=[];document.querySelector('#workflowSessionLaps').replaceChildren();}workflowSessionState.phase='running';workflowSessionToggle.textContent='Pause round';workflowSessionToggle.setAttribute('aria-pressed','true');const bridge=workflowBridgeActivate();workflowSessionLap(bridge.summary);clearInterval(workflowSessionState.timer);workflowSessionState.timer=setInterval(()=>{workflowSessionState.elapsed+=1;if(workflowSessionState.elapsed>=workflowSessionState.limit){workflowSessionStop(true);return;}workflowSessionDrive();},1000);workflowSessionDrive();announce('The recording session has started · '+bridge.summary);}workflowSessionToggle.addEventListener('click',()=>workflowSessionState.phase==='running'?workflowSessionStop():workflowSessionStart());workflowSessionLength.addEventListener('input',()=>{workflowSessionState.limit=Number(workflowSessionLength.value);workflowSessionState.elapsed=Math.min(workflowSessionState.elapsed,workflowSessionState.limit);workflowSessionDrive();});workflowSessionCore.addEventListener('keydown',event=>{if(event.key==='Enter'||event.key===' '){workflowSessionLap('Keyboard Interaction');}});workflowSessionCore.addEventListener('click',event=>{if(event.target.closest('[data-core-bridge]'))workflowSessionLap('Core action · '+workflowBridgeSummary());});document.addEventListener('visibilitychange',()=>{if(document.hidden&&workflowSessionState.phase==='running')workflowSessionStop();});workflowSessionDrive();
workflowBridgeReset();
  </script>
</body>
</html>
Page feedbackFound an issue or have suggestions for improvement?
Feedback features need to be used in the online version

Please enable JavaScript in the online version before submitting; local features of the current tool or example are not affected.

Go to the online version for feedback