Business and Service Flows

Flower Shop Seat Selector

Complete the seat selector in a flower shop scenario: includes realistic content, interactive controls, clear status feedback, and responsive layouts.

Business and Service FlowsSeat PickerHTMLCSSJavaScript
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>Flower Shop Seat Selector</title>
  <style>
    :root { --ink:#ecf7f3; --paper:#071310; --accent:#e05263; --secondary:#79b7c7; --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:"Trebuchet MS","PingFang SC",sans-serif; background:radial-gradient(circle at 20% 10%,color-mix(in srgb,var(--accent) 22%,transparent),transparent 35%),radial-gradient(circle at 85% 90%,color-mix(in srgb,var(--secondary) 20%,transparent),transparent 38%),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; } }
    .page{width:min(1160px,calc(100% - 30px));margin:auto;padding:60px 0}.mast{display:flex;justify-content:space-between;border-left:4px solid var(--accent);padding-left:22px;gap:28px;align-items:center;margin-bottom:34px}.mast h1{font-family:"Trebuchet MS","PingFang SC",sans-serif;font-weight:900;font-size:clamp(42px,9vw,94px);text-shadow:0 0 28px color-mix(in srgb,var(--accent) 55%,transparent);margin:0;line-height:.92}.eyebrow{display:block;margin-bottom:14px;color:var(--accent);font:900 11px/1 ui-monospace,monospace;letter-spacing:.2em}.intro{max-width:680px;color:color-mix(in srgb,var(--ink) 68%,transparent);line-height:1.7}.scenario{padding:10px 16px;border:1px solid var(--secondary);border-radius:4px;box-shadow:0 0 20px color-mix(in srgb,var(--secondary) 30%,transparent)}.demo{border-color:color-mix(in srgb,var(--accent) 55%,transparent);border-radius:24px;box-shadow:inset 0 0 40px color-mix(in srgb,var(--accent) 8%,transparent),0 0 60px color-mix(in srgb,var(--secondary) 12%,transparent);position:relative;min-height:410px;overflow:hidden;padding:clamp(24px,4vw,50px);background:color-mix(in srgb,var(--paper) 86%,transparent)}@media(max-width:700px){.mast{display:grid}.page{padding:22px 0}.demo{padding:16px}}
    .panel{padding:26px;border:1px solid var(--line);border-radius:2px;background:var(--paper)}.stack{display:grid;gap:28px}.row{display:flex;gap:20px;flex-wrap:wrap}.action{padding:9px 2px;border:0;border-bottom:2px solid var(--line);background:transparent}.action.primary,.action.is-active{border-color:var(--accent);color:var(--accent)}.muted{font-size:14px;line-height:1.9}.status{min-height:20px;margin-top:28px;font-size:13px}.metric{font-size:clamp(40px,9vw,88px);font-weight:500;letter-spacing:-.06em}.meter{height:2px;background:var(--line)}.meter>i{display:block;height:100%;background:var(--accent)}.chip{font-size:11px;letter-spacing:.12em;text-transform:uppercase}
    .composition-deck{display:grid;grid-template-rows:auto 1fr;border:1px solid var(--line);border-radius:24px;overflow:hidden;background:color-mix(in srgb,var(--ink) 4%,var(--paper))}.deck-bar{display:flex;justify-content:space-between;gap:18px;align-items:center;padding:12px 18px;color:var(--paper);background:var(--ink);font:700 12px/1 ui-monospace,monospace}.deck-lights{display:flex;gap:7px}.deck-lights i{width:10px;height:10px;border-radius:50%;background:var(--accent)}.deck-lights i:nth-child(2){background:var(--secondary)}.deck-lights i:nth-child(3){background:color-mix(in srgb,var(--paper) 55%,transparent)}.composition-deck .demo{border:0;border-radius:0;box-shadow:none}
    .seat-selection-demo{display:grid;grid-template-columns:1fr minmax(220px,.5fr);gap:18px}.seat-selection-demo>section{display:grid;gap:14px}.seat-selection-demo h2{margin:.3em 0}.seat-screen{padding:10px;border-radius:50% 50% 10px 10px;text-align:center;background:var(--ink);color:var(--paper)}.seat-map{display:grid;grid-template-columns:repeat(5,1fr);gap:9px}.seat-map button{aspect-ratio:1;border:1px solid var(--line);border-radius:10px;background:var(--paper)}.seat-map button[aria-pressed="true"]{color:var(--paper);background:var(--accent)}.seat-map button:disabled{opacity:.3;background:var(--line)}.seat-legend{display:flex;gap:14px;justify-content:center}.seat-legend i{display:inline-block;width:12px;height:12px;margin-right:5px;border:1px solid var(--line);background:var(--paper)}.seat-legend span:nth-child(2) i{background:var(--accent)}.seat-legend span:nth-child(3) i{background:var(--line)}.seat-selection-demo aside{display:grid;align-content:center;gap:14px}.seat-selection-demo aside output{font-size:26px;font-weight:900}@media(max-width:650px){.seat-selection-demo{grid-template-columns:1fr}}.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="dark-neon" data-composition="control-deck">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">dark-neon / Seat Selector / ADVANCED</span><h1>Flower Shop Seat Selector</h1><p class="intro">Complete the seat selector in a flower shop scenario: includes realistic content, interactive controls, clear status feedback, and responsive layouts.</p></div><span class="scenario">Flower shop</span></header>
    <div class="composition-deck"><div class="deck-bar"><span>CONTROL DECK · 04</span><span>Seat Picker</span><span class="deck-lights" aria-hidden="true"><i></i><i></i><i></i></span></div><section class="demo" aria-label="Flower shop seat selector interactive area"><div class="workflow-dispatch"><aside class="dispatch-console"><span class="eyebrow">Flower Shop DISPATCH</span><h2>Bouquet order dispatch console</h2><form id="workflowDispatchForm"><label>Task Type<select id="workflowDispatchKind"><option>Daily Bouquet</option><option>Seasonal bouquet</option><option>Custom Bouquet</option></select></label><label>Floral quantity<input id="workflowDispatchAmount" type="number" min="1" max="9999" value="42"><span>Branch</span></label><fieldset><legend>Processing priority</legend><label><input type="radio" name="workflowPriority" value="normal" checked>Regular</label><label><input type="radio" name="workflowPriority" value="urgent">Urgent</label></fieldset><button class="action primary" type="submit">Accept orders</button></form><label>Current task<select id="workflowDispatchActive" aria-label="Switch current task"><option value="1">Daily Bouquet</option><option value="2">Seasonal bouquet</option></select></label><output id="workflowDispatchSummary">Waiting for Dispatch</output></aside><section id="workflowCore" class="workflow-core dispatch-workbench" data-dispatch-priority="normal"><!-- 11DZ_CORE_START:commerce-service-flows-seat-selection --><div class="seat-selection-demo"><section><span class="eyebrow">SEAT MAP</span><h2>Flower shop seating</h2><div class="seat-screen">Front / Service Desk</div><div id="seatMap" class="seat-map" role="grid" aria-label="Seating chart"><button type="button" role="gridcell" data-seat="1" aria-pressed="false" aria-label="Seat 1 available" data-core-bridge="commerce-service-flows-seat-selection">1</button><button type="button" role="gridcell" data-seat="2" aria-pressed="false" aria-label="Seat 2, optional">2</button><button type="button" role="gridcell" data-seat="3" aria-pressed="false" disabled aria-label="Seat 3, occupied">3</button><button type="button" role="gridcell" data-seat="4" aria-pressed="false" aria-label="Seat 4, optional">4</button><button type="button" role="gridcell" data-seat="5" aria-pressed="false" aria-label="Seat 5, optional">5</button><button type="button" role="gridcell" data-seat="6" aria-pressed="false" aria-label="Seat 6, optional">6</button><button type="button" role="gridcell" data-seat="7" aria-pressed="false" aria-label="Seat 7, optional">7</button><button type="button" role="gridcell" data-seat="8" aria-pressed="false" disabled aria-label="Seat 8, occupied">8</button><button type="button" role="gridcell" data-seat="9" aria-pressed="false" aria-label="Seat 9, optional">9</button><button type="button" role="gridcell" data-seat="10" aria-pressed="false" aria-label="Seat 10 available">10</button><button type="button" role="gridcell" data-seat="11" aria-pressed="false" aria-label="Seat 11, selectable">11</button><button type="button" role="gridcell" data-seat="12" aria-pressed="false" aria-label="Seat 12, optional">12</button><button type="button" role="gridcell" data-seat="13" aria-pressed="false" disabled aria-label="Seat 13, occupied">13</button><button type="button" role="gridcell" data-seat="14" aria-pressed="false" aria-label="Seats 14 optional">14</button><button type="button" role="gridcell" data-seat="15" aria-pressed="false" aria-label="Seat 15, optional">15</button><button type="button" role="gridcell" data-seat="16" aria-pressed="false" aria-label="Seat 16, optional">16</button><button type="button" role="gridcell" data-seat="17" aria-pressed="false" aria-label="Seat 17, available">17</button><button type="button" role="gridcell" data-seat="18" aria-pressed="false" disabled aria-label="Seat 18, occupied">18</button><button type="button" role="gridcell" data-seat="19" aria-pressed="false" aria-label="Seat 19, optional">19</button><button type="button" role="gridcell" data-seat="20" aria-pressed="false" aria-label="Seat 20, optional">20</button></div><div class="seat-legend"><span><i></i>Optional</span><span><i></i>Selected</span><span><i></i>Occupied</span></div></section><aside class="panel"><span>Selected Seat</span><strong id="seatCount" class="metric">0</strong><p id="seatNames">Not selected yet</p><output id="seatTotal">¥0</output><button id="confirmSeats" class="action primary" type="button">Confirm seat</button></aside></div><!-- 11DZ_CORE_END --></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-seat-selection */
const seatButtons=[...document.querySelectorAll('.seat-map button:not(:disabled)')];function renderSeats(){const selected=seatButtons.filter(button=>button.getAttribute('aria-pressed')==='true');document.querySelector('#seatCount').textContent=selected.length;document.querySelector('#seatNames').textContent=selected.length?'Seat '+selected.map(button=>button.dataset.seat).join('、'):'Not selected yet';document.querySelector('#seatTotal').textContent='¥'+selected.length*38;announce('Selected '+selected.length+' seats');}seatButtons.forEach(button=>button.addEventListener('click',()=>{button.setAttribute('aria-pressed',String(button.getAttribute('aria-pressed')!=='true'));renderSeats();}));document.querySelector('#confirmSeats').addEventListener('click',()=>announce(seatButtons.some(button=>button.getAttribute('aria-pressed')==='true')?'Seat confirmed locally':'Please select a seat first'));renderSeats();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"commerce-service-flows-seat-selection","selector":"[data-core-bridge=\"commerce-service-flows-seat-selection\"]","mode":"click","key":"Enter"};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("click",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 workflowDispatchCore=document.querySelector('#workflowCore');const workflowDispatchForm=document.querySelector('#workflowDispatchForm');const workflowDispatchSelect=document.querySelector('#workflowDispatchActive');const workflowDispatchJobs=new Map([["1",{"label":"Daily Bouquet","amount":12,"priority":"normal","touches":0}],["2",{"label":"Seasonal bouquet","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+' Branch · '+bridge.summary;announce('Current flower order task:'+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+' Branch · '+workflowBridgeSummary();});workflowDispatchRender('1',false);
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