Tables and data display

Exhibit Roster Bulk Selection Table

In an exhibit roster table scenario, complete a bulk-selection table: includes real content, actionable controls, clear state feedback, and responsive layouts across sizes.

Tables and data displayBatch selection tableHTML 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>Exhibit Roster Bulk Selection Table</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}}
    .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-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}}
    .special-table{width:100%;border-collapse:collapse;background:var(--paper)}.special-table caption{padding:14px 16px;text-align:left;font-weight:800}.special-table th,.special-table td{padding:13px 16px;border-top:1px solid var(--line);text-align:left}.special-table tbody tr:hover{background:color-mix(in srgb,var(--secondary) 14%,transparent)}.special-table-shell{overflow:auto;border:1px solid var(--line);border-radius:18px;background:var(--paper)}.table-special-tools{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between;margin-bottom:14px}.table-special-tools select,.table-special-tools input{min-height:40px;padding:8px 11px;border:1px solid var(--line);border-radius:9px;background:var(--paper)}.bulk-table-studio{display:grid;gap:16px}.bulk-toolbar{display:flex;justify-content:space-between;gap:18px;align-items:end}.bulk-toolbar h2{margin:.35em 0}.bulk-toolbar label{display:grid;gap:8px;font-weight:800}.bulk-toolbar select{min-height:42px;padding:9px 12px;border:1px solid var(--line);border-radius:10px;background:var(--paper)}.bulk-board{display:grid;grid-template-columns:minmax(0,1.2fr) 260px;gap:14px}.bulk-table-studio tbody tr[data-bulk-hidden="true"]{display:none}.bulk-table-studio tbody tr:has([data-bulk-row]:checked){background:color-mix(in srgb,var(--accent) 12%,transparent)}.bulk-table-studio tbody strong,.bulk-table-studio tbody small{display:block}.bulk-pill{display:inline-flex;align-items:center;justify-content:center;min-width:72px;padding:5px 10px;border-radius:999px;background:color-mix(in srgb,var(--secondary) 14%,transparent);font-weight:900}.bulk-summary{display:grid;align-content:start;gap:14px}.bulk-summary dl{display:grid;gap:10px;margin:0}.bulk-summary dl div{display:flex;justify-content:space-between;gap:12px}.bulk-summary dd{margin:0;font-weight:900}.bulk-summary ol{display:grid;gap:8px;padding-left:18px;margin:0}.bulk-actions{display:grid;gap:10px}.bulk-actions button{width:100%}@media(max-width:760px){.bulk-toolbar{align-items:stretch;flex-direction:column}.bulk-board{grid-template-columns:1fr}}.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="split-note">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">terminal / bulk selection table / INTERMEDIATE</span><h1>Exhibit Roster Bulk Selection Table</h1><p class="intro">In an exhibit roster table scenario, complete a bulk-selection table: includes real content, actionable controls, clear state feedback, and responsive layouts across sizes.</p></div><span class="scenario">Exhibit list</span></header>
    <div class="composition-split"><aside class="split-note"><b>CASE 02</b><span>Master the semantic structure, responsive layout, keyboard operations, and state synchronization of a bulk selection table.</span></aside><section class="demo" aria-label="Exhibit List Bulk Selection Table Interactive Area"><div class="workflow-guide"><nav class="guide-rail" aria-label="Exhibit roster guide"><span class="eyebrow">Exhibit Roster Table GUIDE</span><ol><li data-workflow-guide-step="0" aria-current="step"><b>1</b><span>Exhibit roster filter view</span></li><li data-workflow-guide-step="1"><b>2</b><span>Exhibit Roster Comparison View</span></li><li data-workflow-guide-step="2"><b>3</b><span>Exhibit roster summary view</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="Exhibit roster table 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 the “Exhibit Roster Filter View” in the main example.</p><!-- 11DZ_CORE_START:tables-data-bulk-selection --><section class="bulk-table-studio"><header class="bulk-toolbar"><div><span class="eyebrow">BULK SELECTION</span><h2>Exhibit Roster Batch Processing Console</h2><p class="muted">Filter the current status, select records, and sync the results to the batch summary on the right.</p></div><label>Filter Status <select id="bulkStatusFilter"><option value="">All statuses</option><option value="To be processed">To be processed</option><option value="In Progress">In Progress</option><option value="Completed">Completed</option></select></label></header><div class="bulk-board"><div class="special-table-shell"><table class="special-table"><caption>Exhibit roster bulk action queue</caption><thead><tr><th><input id="bulkSelectAll" type="checkbox" aria-label="Select currently visible rows" data-core-bridge="tables-data-bulk-selection"></th><th aria-sort="none">Project</th><th aria-sort="none">Status</th><th aria-sort="none">Owner</th><th aria-sort="none">Hours</th></tr></thead><tbody><tr data-bulk-hours="12"><td><input data-bulk-row type="checkbox" aria-label="Favorite exhibit roster table"></td><td><strong>Exhibit roster collection</strong><small>Batch 01</small></td><td><span data-bulk-status class="bulk-pill">To be processed</span></td><td data-bulk-owner-label>Group A</td><td>12h</td></tr><tr data-bulk-hours="14"><td><input data-bulk-row type="checkbox" aria-label="Exhibit Roster Selection Overview"></td><td><strong>Exhibit roster overview</strong><small>Batch 02</small></td><td><span data-bulk-status class="bulk-pill">In Progress</span></td><td data-bulk-owner-label>Group B</td><td>14h</td></tr><tr data-bulk-hours="16"><td><input data-bulk-row type="checkbox" aria-label="Select exhibit roster plan"></td><td><strong>Exhibit roster planning</strong><small>Batch 03</small></td><td><span data-bulk-status class="bulk-pill">Completed</span></td><td data-bulk-owner-label>Group C</td><td>16h</td></tr><tr data-bulk-hours="18"><td><input data-bulk-row type="checkbox" aria-label="Exhibit Roster Selection Inspiration"></td><td><strong>Exhibit List Table Inspiration</strong><small>Batch 04</small></td><td><span data-bulk-status class="bulk-pill">To be processed</span></td><td data-bulk-owner-label>Group A</td><td>18h</td></tr><tr data-bulk-hours="20"><td><input data-bulk-row type="checkbox" aria-label="Select exhibit roster records"></td><td><strong>Exhibit Roster Record</strong><small>Batch 05</small></td><td><span data-bulk-status class="bulk-pill">In Progress</span></td><td data-bulk-owner-label>Group B</td><td>20h</td></tr><tr data-bulk-hours="22"><td><input data-bulk-row type="checkbox" aria-label="Select exhibit roster collaboration"></td><td><strong>Exhibit List Collaboration</strong><small>Batch 06</small></td><td><span data-bulk-status class="bulk-pill">Completed</span></td><td data-bulk-owner-label>Group C</td><td>22h</td></tr><tr data-bulk-hours="24"><td><input data-bulk-row type="checkbox" aria-label="Selection of exhibit roster progress"></td><td><strong>Exhibit roster progress</strong><small>Batch 07</small></td><td><span data-bulk-status class="bulk-pill">To be processed</span></td><td data-bulk-owner-label>Group A</td><td>24h</td></tr></tbody></table></div><aside class="bulk-summary panel"><strong>Batch summary</strong><dl><div><dt>Selected Records</dt><dd id="bulkCount">0</dd></div><div><dt>Total hours</dt><dd id="bulkHours">0h</dd></div><div><dt>Responsible Group</dt><dd id="bulkOwners">0 Group</dd></div></dl><ol id="bulkSelectedList"><li>No records selected</li></ol><div class="bulk-actions"><button id="bulkQueueReview" class="action" type="button">Add for review</button><button id="bulkCompleteRows" class="action primary" type="button">Complete Selected</button></div></aside></div></section><!-- 11DZ_CORE_END --></section><aside class="guide-evidence"><details id="workflowGuideDetails"><summary>View acceptance requirements</summary><ul><li>The exhibit roster filter view requires a visible state change in one go</li><li>The exhibit roster comparison view requires one visibly changing state at a time</li><li>The exhibit roster table summary view needs a visible state change at once</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></div>
  </main>
  <script>
    'use strict';
    const statusOutput = document.querySelector('#status');
    const announce = message => { statusOutput.textContent = message; };
    /* 11DZ_CORE_SCRIPT_START:tables-data-bulk-selection */
const bulkRows=[...document.querySelectorAll('[data-bulk-row]')];const bulkSelectAll=document.querySelector('#bulkSelectAll');const bulkStatusFilter=document.querySelector('#bulkStatusFilter');const bulkSelectedList=document.querySelector('#bulkSelectedList');function bulkRowStatus(row){return row.querySelector('[data-bulk-status]').textContent.trim();}function bulkRowOwner(row){return row.querySelector('[data-bulk-owner-label]').textContent.trim();}function bulkVisibleRows(){return bulkRows.filter(box=>box.closest('tr').dataset.bulkHidden!=='true');}function bulkSelectedRows(){return bulkRows.filter(box=>box.checked&&box.closest('tr').dataset.bulkHidden!=='true');}function bulkSyncSummary(message){const selected=bulkSelectedRows();const owners=new Set(selected.map(box=>bulkRowOwner(box.closest('tr'))));const hours=selected.reduce((sum,box)=>sum+Number(box.closest('tr').dataset.bulkHours||0),0);document.querySelector('#bulkCount').textContent=String(selected.length);document.querySelector('#bulkHours').textContent=hours+'h';document.querySelector('#bulkOwners').textContent=owners.size+' Group';bulkSelectedList.replaceChildren(...(selected.length?selected.map(box=>{const item=document.createElement('li');const row=box.closest('tr');item.textContent=row.querySelector('strong').textContent+' · '+bulkRowStatus(row);return item;}):[Object.assign(document.createElement('li'),{textContent:'No records selected'})]));const visible=bulkVisibleRows();bulkSelectAll.indeterminate=selected.length>0&&selected.length<visible.length;bulkSelectAll.checked=visible.length>0&&selected.length===visible.length;if(message)announce(message);}function bulkApplyFilter(){const filter=bulkStatusFilter.value;bulkRows.forEach(box=>{const row=box.closest('tr');const hidden=Boolean(filter)&&bulkRowStatus(row)!==filter;row.dataset.bulkHidden=String(hidden);if(hidden)box.checked=false;});bulkSyncSummary(filter?'Filtered '+filter:'All statuses shown');}bulkSelectAll.addEventListener('change',()=>{bulkVisibleRows().forEach(box=>{box.checked=bulkSelectAll.checked;});bulkSyncSummary('Updated current visible row selection');});bulkRows.forEach(box=>box.addEventListener('change',()=>bulkSyncSummary('Batch summary updated')));bulkStatusFilter.addEventListener('change',bulkApplyFilter);document.querySelector('#bulkQueueReview').addEventListener('click',()=>{const selected=bulkSelectedRows();selected.forEach(box=>{box.closest('tr').querySelector('[data-bulk-status]').textContent='Pending Review';});bulkSyncSummary('Added to Review Queue '+selected.length+' item');});document.querySelector('#bulkCompleteRows').addEventListener('click',()=>{const selected=bulkSelectedRows();selected.forEach(box=>{const row=box.closest('tr');row.querySelector('[data-bulk-status]').textContent='Completed';box.checked=false;});bulkSyncSummary('Completed '+selected.length+' records');});bulkApplyFilter();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"tables-data-bulk-selection","selector":"[data-core-bridge=\"tables-data-bulk-selection\"]","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=["Exhibit roster filter view","Exhibit Roster Comparison View","Exhibit roster summary view"];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?'Application view':'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('Exhibit Roster 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