Business and Service Flows

Audio Booking Checkout Flow

Complete the checkout step flow in a recording booking scenario: includes real content, interactive controls, clear state feedback, and responsive layouts across sizes.

Business and Service FlowsCheckout steps flowHTMLCSSJavaScript
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>Audio Booking Checkout Flow</title>
  <style>
    :root { --ink:#ecf7f3; --paper:#071310; --accent:#d45f3e; --secondary:#8fc4ad; --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:ui-monospace,"SFMono-Regular",Consolas,monospace; background:linear-gradient(color-mix(in srgb,var(--secondary) 5%,transparent) 1px,transparent 1px),linear-gradient(90deg,color-mix(in srgb,var(--secondary) 5%,transparent) 1px,transparent 1px),var(--paper);background-size:24px 24px; }
    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(1080px,calc(100% - 30px));margin:auto;padding:48px 0}.eyebrow{color:var(--secondary);font:700 12px/1.3 ui-monospace,monospace}.eyebrow::before{content:"> ";color:var(--accent)}.mast{display:grid;grid-template-columns:1fr auto;border:1px solid var(--secondary);padding:18px;gap:24px;align-items:center;margin-bottom:16px}.mast h1{font-family:ui-monospace,"SFMono-Regular",monospace;font-weight:700;font-size:clamp(34px,7vw,72px);letter-spacing:-.055em;margin:12px 0;line-height:1.05}.intro{margin:0;color:color-mix(in srgb,var(--ink) 72%,transparent);font:400 14px/1.7 ui-monospace,monospace}.scenario{padding:7px 10px;border:1px dashed var(--secondary);font:700 11px/1 ui-monospace,monospace}.demo{border-color:var(--secondary);border-radius:8px;box-shadow:0 0 50px color-mix(in srgb,var(--secondary) 15%,transparent);position:relative;min-height:390px;padding:26px;background:color-mix(in srgb,var(--paper) 94%,#000)}@media(max-width:700px){.page{width:calc(100% - 18px);padding:20px 0}.mast{grid-template-columns:1fr}.demo{padding:14px}}
    .stack{display:flex;flex-direction:column;gap:18px}.panel{padding:28px;border-left:7px solid var(--accent);background:color-mix(in srgb,var(--secondary) 12%,var(--paper))}.action{min-height:46px;padding:11px 18px;border:0;border-bottom:3px solid var(--ink);background:transparent;font-weight:900}.action.primary,.action.is-active{color:var(--paper);background:var(--ink)}.row{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}.metric{font:900 clamp(32px,7vw,64px)/1 ui-monospace,monospace}.status{min-height:22px;padding-top:12px;border-top:1px dashed var(--line)}.muted{color:color-mix(in srgb,var(--ink) 62%,transparent)}.chip{display:inline-block;padding:5px 8px;background:var(--secondary)}.meter{height:12px;border:1px solid var(--ink)}.meter>i{display:block;height:100%;background:var(--ink)}
    .composition-gallery{margin:0;padding:clamp(8px,2vw,18px);border:1px solid var(--ink);background:color-mix(in srgb,var(--paper) 78%,transparent)}.gallery-caption{display:grid;grid-template-columns:auto 1fr auto;gap:16px;align-items:center;padding:15px 4px 2px;font-size:12px}.gallery-caption::before,.gallery-caption::after{content:"";height:1px;background:var(--line)}.gallery-caption strong{font:800 11px/1.2 ui-monospace,monospace;letter-spacing:.16em;text-transform:uppercase}.composition-gallery .demo{box-shadow:none}.composition-gallery .demo::before{content:"";position:absolute;inset:10px;border:1px dashed color-mix(in srgb,var(--accent) 36%,transparent);pointer-events:none}
    .visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.checkout-flow{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(240px,.75fr) minmax(230px,.65fr);gap:14px}.checkout-flow>section,.checkout-payment{display:grid;align-content:start;gap:15px;padding:20px;border:1px solid var(--line);background:var(--paper)}.checkout-flow h2,.checkout-flow h3{margin:.2em 0}.checkout-order fieldset,.checkout-delivery fieldset{display:grid;gap:8px;padding:0;border:0}.checkout-order fieldset>label,.checkout-delivery fieldset>label{display:grid;grid-template-columns:auto 1fr;gap:10px;align-items:center;padding:12px;border:1px solid var(--line);border-radius:12px}.checkout-order span,.checkout-delivery span{display:flex;justify-content:space-between;gap:12px}.checkout-delivery>label,.checkout-payment>label{display:grid;gap:7px}.checkout-delivery input:not([type="radio"]),.checkout-delivery textarea,.checkout-payment select{width:100%;padding:10px;border:1px solid var(--line);border-radius:8px;background:var(--paper)}.checkout-payment{color:var(--paper);background:var(--ink)}.checkout-payment dl{display:grid;gap:9px}.checkout-payment dl div{display:flex;justify-content:space-between;gap:12px;padding-bottom:8px;border-bottom:1px solid color-mix(in srgb,var(--paper) 20%,transparent)}.checkout-payment dd{margin:0;font-weight:900}.checkout-payment select{color:var(--ink)}.checkout-consent{grid-template-columns:auto 1fr!important;align-items:start}.checkout-payment output{min-height:22px;color:var(--secondary);font-weight:800}@media(max-width:900px){.checkout-flow{grid-template-columns:1fr 1fr}.checkout-payment{grid-column:1/-1}}@media(max-width:620px){.checkout-flow{grid-template-columns:1fr}.checkout-payment{grid-column:auto}}.workflow-guide{display:grid;grid-template-columns:190px minmax(0,1fr);grid-template-areas:"rail core" "rail evidence";gap:14px 18px}.guide-rail{grid-area:rail;display:grid;align-content:start;gap:15px;padding:18px;border-right:1px solid var(--line)}.guide-rail ol{display:grid;gap:8px;padding:0;margin:0;list-style:none}.guide-rail li{display:grid;grid-template-columns:30px 1fr;gap:8px;align-items:center;padding:9px;opacity:.5}.guide-rail li[aria-current="step"]{opacity:1;color:var(--paper);background:var(--ink)}.guide-rail li.is-complete{opacity:1;color:var(--accent)}.guide-actions{display:grid;grid-template-columns:1fr 1fr;gap:7px}.guide-actions .action{padding-inline:8px}#workflowGuideProgress{height:6px;background:var(--line)}#workflowGuideProgress i{display:block;width:0;height:100%;background:var(--accent)}.guide-core{grid-area:core;min-width:0;padding:16px;border:1px solid var(--line)}.guide-core>p{margin:0 0 14px;padding:10px;border-left:4px solid var(--accent);background:color-mix(in srgb,var(--secondary) 12%,transparent)}.guide-core[data-guide-step="1"]{border-radius:28px}.guide-core[data-guide-step="2"]{box-shadow:inset 0 0 0 4px color-mix(in srgb,var(--accent) 35%,transparent)}.guide-evidence{grid-area:evidence;display:grid;grid-template-columns:1fr 1fr auto;gap:12px;align-items:start}.guide-evidence details,.guide-evidence form{padding:12px;border:1px solid var(--line)}.guide-evidence label{display:grid;gap:7px}.guide-evidence textarea{width:100%;padding:9px;border:1px solid var(--line);background:var(--paper)}@media(max-width:900px){.workflow-guide{grid-template-columns:1fr;grid-template-areas:"core" "rail" "evidence"}.guide-rail{border-right:0;border-bottom:1px solid var(--line)}.guide-rail ol{grid-template-columns:repeat(3,1fr)}.guide-evidence{grid-template-columns:1fr}}
  </style>
</head>
<body data-aesthetic="terminal" data-composition="gallery-frame">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">terminal / checkout flow / BEGINNER</span><h1>Audio Booking Checkout Flow</h1><p class="intro">Complete the checkout step flow in a recording booking scenario: includes real content, interactive controls, clear state feedback, and responsive layouts across sizes.</p></div><span class="scenario">Recording appointment</span></header>
    <figure class="composition-gallery"><section class="demo" aria-label="Recording appointment checkout step flow interactive area"><div class="workflow-guide"><nav class="guide-rail" aria-label="Audio Booking Guide"><span class="eyebrow">Recording Appointment GUIDE</span><ol><li data-workflow-guide-step="0" aria-current="step"><b>1</b><span>Recording Booking Requirement Confirmation</span></li><li data-workflow-guide-step="1"><b>2</b><span>Recording Appointment Plan Selection</span></li><li data-workflow-guide-step="2"><b>3</b><span>Final submission for audio booking</span></li></ol><div class="guide-actions"><button id="workflowGuideBack" class="action" type="button" disabled>Previous</button><button id="workflowGuideNext" class="action primary" type="button">Complete this step</button></div><div id="workflowGuideProgress" role="progressbar" aria-label="Recording booking completion" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><i></i></div></nav><section id="workflowCore" class="workflow-core guide-core" data-guide-step="0" aria-describedby="workflowGuideInstruction"><p id="workflowGuideInstruction">Please complete the operations related to “Recording Appointment Requirement Confirmation” in the main example.</p><!-- 11DZ_CORE_START:commerce-service-flows-checkout-steps --><form id="checkoutFlowForm" class="checkout-flow"><section class="checkout-order"><header><span class="eyebrow">ORDER REVIEW</span><h2>Recording Booking Checkout List</h2><p>First confirm the items actually needed, and the delivery and payment summary will recalculate immediately.</p></header><fieldset><legend>Order items</legend><label><input type="checkbox" name="checkoutItem" value="0" checked data-core-bridge="commerce-service-flows-checkout-steps"><span><b>Audio Booking Overview</b><small>¥46</small></span></label><label><input type="checkbox" name="checkoutItem" value="1" checked><span><b>Recording Session Plan</b><small>¥75</small></span></label><label><input type="checkbox" name="checkoutItem" value="2"><span><b>Recording Booking Inspiration</b><small>¥104</small></span></label></fieldset></section><section class="checkout-delivery"><span class="eyebrow">FULFILMENT</span><h3>Delivery method</h3><fieldset><legend class="visually-hidden">Choose a delivery method</legend><label><input type="radio" name="checkoutDelivery" value="pickup" checked><span>Pickup In Store<small>Free · Ready today</small></span></label><label><input type="radio" name="checkoutDelivery" value="standard"><span>Standard delivery<small>¥12 · within two days</small></span></label><label><input type="radio" name="checkoutDelivery" value="priority"><span>Priority delivery<small>¥28 · Same-day delivery</small></span></label></fieldset><label>Contact email<input name="checkoutEmail" type="email" autocomplete="email" required placeholder="name@example.com"></label><label>Delivery notes<textarea name="checkoutNote" rows="3" maxlength="120"></textarea></label></section><aside class="checkout-payment"><span class="eyebrow">LOCAL PAYMENT PREVIEW</span><h3>Confirm summary</h3><dl><div><dt>item count</dt><dd id="checkoutItemCount">0</dd></div><div><dt>Item amount</dt><dd id="checkoutSubtotal">¥0</dd></div><div><dt>Delivery fee</dt><dd id="checkoutDeliveryFee">¥0</dd></div><div><dt>Estimated total</dt><dd id="checkoutGrandTotal">¥0</dd></div></dl><label>Payment Demo<select name="checkoutPayment"><option>Pay in store</option><option>Bank Card Demo</option><option>Enterprise Monthly Billing</option></select></label><label class="checkout-consent"><input name="checkoutConsent" type="checkbox" required> I have checked the project and delivery information</label><button class="action primary" type="submit">Confirm checkout locally</button><button class="action" type="reset">Clear checkout selections</button><output id="checkoutReceipt" aria-live="polite">Not confirmed yet</output></aside></form><!-- 11DZ_CORE_END --></section><aside class="guide-evidence"><details id="workflowGuideDetails"><summary>View acceptance requirements</summary><ul><li>Recording session booking request confirmation requires one visible state change</li><li>The audio booking plan selection requires an immediately visible state change</li><li>Audio Booking final submission requires one visible state change</li></ul></details><form id="workflowGuideEvidenceForm"><label>This step evidence<textarea id="workflowGuideEvidence" rows="3" placeholder="Record the observed state"></textarea></label><input class="action" type="submit" value="Save evidence"></form><output id="workflowGuideSummary">0 / 3 Steps Complete</output></aside></div><p id="status" class="status" role="status" aria-live="polite"></p></section><figcaption class="gallery-caption"><strong>Recording appointment / GALLERY 03</strong></figcaption></figure>
  </main>
  <script>
    'use strict';
    const statusOutput = document.querySelector('#status');
    const announce = message => { statusOutput.textContent = message; };
    /* 11DZ_CORE_SCRIPT_START:commerce-service-flows-checkout-steps */
const checkoutFlowForm=document.querySelector('#checkoutFlowForm');const checkoutPrices=[46,75,104];const checkoutFees={pickup:0,standard:12,priority:28};const checkoutState={items:new Set(),delivery:'pickup',payment:'Pay in store',confirmed:false};function readCheckoutState(){checkoutState.items=new Set([...checkoutFlowForm.querySelectorAll('[name="checkoutItem"]:checked')].map(input=>Number(input.value)));checkoutState.delivery=new FormData(checkoutFlowForm).get('checkoutDelivery')||'pickup';checkoutState.payment=new FormData(checkoutFlowForm).get('checkoutPayment')||'Pay in store';}function renderCheckout(){readCheckoutState();const subtotal=[...checkoutState.items].reduce((sum,index)=>sum+checkoutPrices[index],0);const deliveryFee=checkoutFees[checkoutState.delivery];document.querySelector('#checkoutItemCount').textContent=checkoutState.items.size+' Item';document.querySelector('#checkoutSubtotal').textContent='¥'+subtotal;document.querySelector('#checkoutDeliveryFee').textContent='¥'+deliveryFee;document.querySelector('#checkoutGrandTotal').textContent='¥'+(subtotal+deliveryFee);announce('Checkout summary updated, estimated '+(subtotal+deliveryFee)+' yuan');return subtotal+deliveryFee;}checkoutFlowForm.addEventListener('change',event=>{checkoutState.confirmed=false;document.querySelector('#checkoutReceipt').textContent='The information has changed. Please check it again.';renderCheckout();if(event.target.name==='checkoutDelivery')document.querySelector('[name="checkoutEmail"]').focus();});checkoutFlowForm.addEventListener('input',event=>{if(event.target.name==='checkoutNote')document.querySelector('#checkoutReceipt').textContent='Notes '+event.target.value.length+' / 120 min';});checkoutFlowForm.addEventListener('submit',event=>{event.preventDefault();if(!checkoutFlowForm.reportValidity())return;if(!checkoutState.items.size){document.querySelector('#checkoutReceipt').textContent='Please keep at least one order item';return;}const total=renderCheckout();checkoutState.confirmed=true;document.querySelector('#checkoutReceipt').textContent='Local settlement confirmed · '+checkoutState.payment+' · ¥'+total;announce('Recording appointment checkout confirmed locally');});checkoutFlowForm.addEventListener('reset',()=>{queueMicrotask(()=>{checkoutState.items.clear();checkoutState.confirmed=false;document.querySelector('#checkoutReceipt').textContent='Checkout selection has been reset';renderCheckout();});});renderCheckout();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"commerce-service-flows-checkout-steps","selector":"[data-core-bridge=\"commerce-service-flows-checkout-steps\"]","mode":"toggle","key":" "};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.setAttribute('aria-keyshortcuts',workflowBridgeSpec.key===' '?'Space':workflowBridgeSpec.key);const workflowBridgeToggleKeyMatches=event=>event.key===workflowBridgeSpec.key||event.key==='Spacebar'||event.code==='Space';workflowBridgeControl.addEventListener('keydown',event=>{if(!workflowBridgeToggleKeyMatches(event))return;event.preventDefault();});workflowBridgeControl.addEventListener('keyup',event=>{if(!workflowBridgeToggleKeyMatches(event))return;event.preventDefault();workflowBridgeControl.click();});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();workflowBridgeControl.click();const result=workflowBridgeCommit();setTimeout(workflowBridgeCommit,0);return result;}function workflowBridgeReset(){workflowBridgeCore.dataset.workflowVersion='0';workflowBridgeLastEffect=workflowBridgeSerialize();}
const workflowGuideCore=document.querySelector('#workflowCore');const workflowGuideStages=["Recording Booking Requirement Confirmation","Recording Appointment Plan Selection","Final submission for audio booking"];const workflowGuideState={step:0,completed:new Set(),evidence:new Map(),consumedVersion:0};function workflowGuideDrive(){const step=workflowGuideState.step;workflowGuideCore.dataset.guideStep=String(step);document.querySelector('#workflowGuideInstruction').textContent='Please complete the main example ‘'+workflowGuideStages[step]+'Related actions.”';document.querySelectorAll('[data-workflow-guide-step]').forEach((item,index)=>{item.classList.toggle('is-complete',workflowGuideState.completed.has(index));if(index===step)item.setAttribute('aria-current','step');else item.removeAttribute('aria-current');});document.querySelector('#workflowGuideBack').disabled=step===0;document.querySelector('#workflowGuideNext').textContent=step===workflowGuideStages.length-1?'Confirmation Flow':'Complete this step';const percent=Math.round(workflowGuideState.completed.size/workflowGuideStages.length*100);const progress=document.querySelector('#workflowGuideProgress');progress.setAttribute('aria-valuenow',String(percent));progress.querySelector('i').style.width=percent+'%';document.querySelector('#workflowGuideSummary').textContent=workflowGuideState.completed.size+' / '+workflowGuideStages.length+' Step complete · '+workflowBridgeSummary();announce('Recording appointment current step:'+workflowGuideStages[step]);}function workflowGuideAdvance(direction){if(direction>0){const bridge=workflowBridgeActivate();const version=Number(workflowGuideCore.dataset.workflowVersion||0);if(version<=workflowGuideState.consumedVersion){announce('Please complete the visible state change in the main example first');return;}workflowGuideState.consumedVersion=version;workflowGuideState.completed.add(workflowGuideState.step);announce('Main case changes recorded · '+bridge.summary);}workflowGuideState.step=Math.max(0,Math.min(workflowGuideStages.length-1,workflowGuideState.step+direction));workflowGuideDrive();}document.querySelector('#workflowGuideBack').addEventListener('click',()=>workflowGuideAdvance(-1));document.querySelector('#workflowGuideNext').addEventListener('click',()=>workflowGuideAdvance(1));document.querySelector('#workflowGuideEvidenceForm').addEventListener('submit',event=>{event.preventDefault();const version=Number(workflowGuideCore.dataset.workflowVersion||0);if(version<=workflowGuideState.consumedVersion){announce('Evidence not saved: the main example has no new changes yet');return;}const text=document.querySelector('#workflowGuideEvidence').value.trim();workflowGuideState.evidence.set(workflowGuideState.step,text||'Visible status check completed');workflowGuideState.completed.add(workflowGuideState.step);workflowGuideState.consumedVersion=version;workflowGuideDrive();announce('Evidence for this step has been saved · '+workflowBridgeSummary());});document.querySelector('#workflowGuideDetails').addEventListener('toggle',event=>announce(event.currentTarget.open?'Acceptance requirements expanded':'Acceptance requirements collapsed'));workflowGuideDrive();
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