Business and Service Flows

Workshop Booking Checkout Steps Flow

Complete the checkout step flow in a workshop booking scenario: includes real content, actionable controls, clear status 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>Workshop Booking Checkout Steps Flow</title>
  <style>
    :root { --ink:#ecf7f3; --paper:#071310; --accent:#ff6b5e; --secondary:#71c9b5; --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-split{display:grid;grid-template-columns:150px minmax(0,1fr);gap:18px;align-items:start}.split-note{position:sticky;top:20px;display:grid;gap:14px;padding:18px 12px;border-block:3px double var(--accent);font-size:13px;line-height:1.65}.split-note b{font:900 12px/1 ui-monospace,monospace;letter-spacing:.12em}.split-note span{writing-mode:vertical-rl;min-height:120px;color:color-mix(in srgb,var(--ink) 60%,transparent)}.composition-split .demo{min-width:0}@media(max-width:900px){.composition-split{grid-template-columns:1fr}.split-note{position:static;grid-template-columns:auto 1fr}.split-note span{writing-mode:horizontal-tb;min-height:0}}
    .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-compare{display:grid;grid-template-columns:minmax(230px,.55fr) minmax(0,1.45fr);gap:18px}.compare-stage{display:grid;gap:12px;min-width:0}.compare-stage>header{display:flex;justify-content:space-between;gap:16px;align-items:end}.compare-stage h2{margin:.2em 0}.compare-core{--compare-split:50%;min-width:0;padding:14px;clip-path:inset(0 calc(100% - var(--compare-split)) 0 0);outline:1px dashed var(--accent);outline-offset:-8px;transition:clip-path .25s,filter .25s}.compare-core[data-compare-channel="B"]{filter:hue-rotate(32deg) saturate(1.15)}.compare-controls{display:grid;align-content:start;gap:16px;padding:20px;border:1px solid var(--line);border-radius:24px 4px 24px 4px;background:var(--paper)}.compare-controls fieldset,.compare-controls>label{display:grid;gap:8px}.compare-controls input[type="range"]{width:100%}#workflowCompareShelf{display:grid;gap:6px;padding:0;margin:0;list-style:none}#workflowCompareShelf li{display:grid;grid-template-columns:auto 1fr auto;gap:8px;padding:9px;border-top:1px solid var(--line);font-size:12px}@media(max-width:900px){.workflow-compare{grid-template-columns:1fr}.compare-stage{order:-1}.compare-core{clip-path:none;border-left:8px solid var(--accent)}}
  </style>
</head>
<body data-aesthetic="terminal" data-composition="split-note">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">terminal / checkout flow / BEGINNER</span><h1>Workshop Booking Checkout Steps Flow</h1><p class="intro">Complete the checkout step flow in a workshop booking scenario: includes real content, actionable controls, clear status feedback, and responsive layouts across sizes.</p></div><span class="scenario">Workshop Booking</span></header>
    <div class="composition-split"><aside class="split-note"><b>CASE 02</b><span>Understand the semantic structure, responsive layout, keyboard interaction, and state synchronization of the checkout step flow.</span></aside><section class="demo" aria-label="Interactive area for the workshop booking checkout steps flow"><div class="workflow-compare"><form id="workflowCompareControls" class="compare-controls"><fieldset><legend>Reference Channel</legend><label><input type="radio" name="workflowChannel" value="A" checked>A · Basic experience</label><label><input type="radio" name="workflowChannel" value="B">B · Group Creation</label></fieldset><label>Participant Count Weight<input id="workflowCompareWeight" type="range" min="10" max="90" value="50"><output id="workflowCompareWeightValue">50 Person</output></label><label><input id="workflowCompareFreeze" type="checkbox">Freeze current version</label><button id="workflowCompareCapture" class="action primary" type="button">Sample and Confirm Appointment</button><ol id="workflowCompareShelf" aria-label="Version Sampling Record"></ol></form><section class="compare-stage"><header><span class="eyebrow">Workshop Booking COMPARE</span><h2>Workshop plan side-by-side comparison</h2><output id="workflowCompareLive">Version A waiting for sampling</output></header><section id="workflowCore" class="workflow-core compare-core" data-compare-channel="A" style="--compare-split:50%"><!-- 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>Workshop 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>Workshop booking favorites</b><small>¥46</small></span></label><label><input type="checkbox" name="checkoutItem" value="1" checked><span><b>Workshop Booking Overview</b><small>¥75</small></span></label><label><input type="checkbox" name="checkoutItem" value="2"><span><b>Workshop booking plan</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></section></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: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('Workshop Booking checkout has been 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 workflowCompareCore=document.querySelector('#workflowCore');const workflowCompareWeight=document.querySelector('#workflowCompareWeight');const workflowCompareState={channel:'A',weight:50,frozen:false,snapshots:[]};function workflowCompareFingerprint(){const controls=[...workflowCompareCore.querySelectorAll('input,select,textarea')];const outputs=[...workflowCompareCore.querySelectorAll('output,[role="status"],strong')].map(node=>node.textContent.trim()).filter(Boolean);return {controlValues:controls.map(control=>control.type==='checkbox'||control.type==='radio'?control.checked:control.value),summary:outputs.slice(0,4).join(' / '),nodes:workflowCompareCore.querySelectorAll('*').length};}function workflowCompareDrive(){workflowCompareCore.dataset.compareChannel=workflowCompareState.channel;workflowCompareCore.style.setProperty('--compare-split',workflowCompareState.weight+'%');document.querySelector('#workflowCompareWeightValue').textContent=workflowCompareState.weight+' person';document.querySelector('#workflowCompareLive').textContent=workflowCompareState.channel+' Version · '+workflowCompareState.weight+' person'+(workflowCompareState.frozen?' · Frozen':'');announce('Workshop plan under review '+workflowCompareState.channel+' Version');}function workflowCompareCapture(source){const bridge=workflowBridgeActivate();const snapshot={...workflowCompareFingerprint(),channel:workflowCompareState.channel,weight:workflowCompareState.weight,source,bridge:bridge.summary};workflowCompareState.snapshots.push(snapshot);const item=document.createElement('li');item.innerHTML='<b>'+snapshot.channel+'</b><span>'+(snapshot.summary||snapshot.bridge)+'</span><small>'+snapshot.weight+' person · '+snapshot.bridge+'</small>';document.querySelector('#workflowCompareShelf').prepend(item);announce('sampled '+snapshot.channel+' Confirm booking · '+bridge.summary);}document.querySelectorAll('[name="workflowChannel"]').forEach(input=>input.addEventListener('change',()=>{workflowCompareState.channel=input.value;workflowCompareDrive();}));workflowCompareWeight.addEventListener('input',()=>{workflowCompareState.weight=Number(workflowCompareWeight.value);workflowCompareDrive();});document.querySelector('#workflowCompareFreeze').addEventListener('change',event=>{workflowCompareState.frozen=event.currentTarget.checked;workflowCompareDrive();});document.querySelector('#workflowCompareCapture').addEventListener('click',()=>workflowCompareCapture('Button Sampling'));workflowCompareCore.addEventListener('dblclick',()=>workflowCompareCapture('Main view double-click'));workflowCompareDrive();
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