Tables and data display

Course Attendance Bulk Selection Table

Complete a bulk selection table in a class attendance scenario: includes real content, actionable controls, clear status feedback, and responsive layouts.

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>Course Attendance Bulk Selection Table</title>
  <style>
    :root { --ink:#111111; --paper:#f8f8f4; --accent:#111111; --secondary:#8d8d88; --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:Helvetica,"PingFang SC",sans-serif; background:repeating-linear-gradient(0deg,transparent 0 31px,color-mix(in srgb,var(--ink) 7%,transparent) 32px),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(1120px,calc(100% - 30px));margin:auto;padding:48px 0 80px}.mast{display:grid;grid-template-columns:1fr auto;border-top:10px solid var(--ink);padding-top:20px;gap:20px;align-items:end;margin-bottom:26px}.mast h1{font-family:Helvetica,"PingFang SC",sans-serif;font-weight:900;font-size:clamp(44px,10vw,106px);letter-spacing:-.075em;margin:0;line-height:.82}.eyebrow{display:inline-block;margin-bottom:12px;padding:5px 8px;color:var(--paper);background:var(--ink);font:900 10px/1 ui-monospace,monospace;letter-spacing:.14em}.intro{max-width:700px;line-height:1.55}.scenario{padding:9px 12px;border:3px solid var(--ink);font-weight:900}.demo{border:3px solid var(--ink);border-radius:0;box-shadow:12px 12px 0 var(--ink);position:relative;min-height:410px;overflow:hidden;padding:clamp(22px,4vw,46px);background:var(--paper)}@media(max-width:700px){.page{width:calc(100% - 18px);padding:20px 0}.mast{grid-template-columns:1fr}.demo{padding:15px}}
    .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-index{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:18px}.index-mark{display:grid;align-content:space-between;width:76px;padding:16px 10px;border:1px solid var(--line);color:var(--accent);background:color-mix(in srgb,var(--paper) 82%,transparent);text-align:center}.index-mark strong{font:900 34px/1 ui-monospace,monospace}.index-mark span{writing-mode:vertical-rl;font:800 10px/1.2 ui-monospace,monospace;letter-spacing:.18em}.composition-index .demo{grid-column:1;grid-row:1}.composition-index::before{content:"";position:absolute;left:-12px;top:38px;width:5px;height:45%;background:linear-gradient(var(--accent),var(--secondary))}@media(max-width:700px){.composition-index{grid-template-columns:1fr}.index-mark{grid-row:1;width:auto;grid-template-columns:auto 1fr}.index-mark span{writing-mode:horizontal-tb}.composition-index .demo{grid-row:2}}
    .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-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="monochrome" data-composition="field-index">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">monochrome / Bulk Selection Table / BEGINNER</span><h1>Course Attendance Bulk Selection Table</h1><p class="intro">Complete a bulk selection table in a class attendance scenario: includes real content, actionable controls, clear status feedback, and responsive layouts.</p></div><span class="scenario">Course attendance</span></header>
    <div class="composition-index"><section class="demo" aria-label="Class attendance bulk selection table interaction area"><div class="workflow-session"><header class="session-command"><div><span class="eyebrow">Course Attendance SESSION</span><h2>Course Attendance Timekeeper</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">Apply View</button></header><div id="workflowSessionProgress" role="progressbar" aria-label="Class Attendance 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:tables-data-bulk-selection --><section class="bulk-table-studio"><header class="bulk-toolbar"><div><span class="eyebrow">BULK SELECTION</span><h2>Course Attendance 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>Class Attendance Bulk Processing 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="Select Course Attendance Collaboration"></td><td><strong>Class Attendance Collaboration</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="Selected class attendance progress"></td><td><strong>Class Attendance Progress</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 course attendance reminder"></td><td><strong>Class Attendance Reminder</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="Select Course Attendance Collection"></td><td><strong>Course Attendance Favorites</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 Course Attendance Overview"></td><td><strong>Class Attendance Overview</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 class attendance plan"></td><td><strong>Class Attendance Plan</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="Class attendance inspiration"></td><td><strong>Course Attendance Inspiration</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><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><aside class="index-mark" aria-hidden="true"><strong>05</strong><span>Class attendance FIELD INDEX</span></aside></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 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?'Course Attendance Round 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('Course attendance round 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