Basic Controls and Selectors

Quick date selection for meeting rooms

Complete quick date selection in a meeting room scenario: includes real content, interactive controls, clear state feedback, and responsive layouts.

Basic Controls and SelectorsDate Quick SelectHTMLCSSJavaScript
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>Quick date selection for meeting rooms</title>
  <style>
    :root { --ink:#252525; --paper:#f7f2e8; --accent:#247ba0; --secondary:#f4b942; --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:"IBM Plex Sans","PingFang SC",sans-serif; background:linear-gradient(color-mix(in srgb,var(--ink) 5%,transparent) 1px,transparent 1px),var(--paper);background-size:100% 36px; }
    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(1280px,calc(100% - 24px));margin:auto;padding:28px 0 64px}.mast{display:flex;justify-content:space-between;padding:18px;border:1px solid var(--line);background:color-mix(in srgb,#fff 60%,transparent);gap:18px;margin-bottom:14px}.mast h1{font-family:"IBM Plex Sans","PingFang SC",sans-serif;font-weight:800;font-size:clamp(34px,6vw,66px);letter-spacing:-.045em;margin:0;line-height:1}.eyebrow{display:block;margin-bottom:6px;color:var(--accent);font:800 10px/1 ui-monospace,monospace;letter-spacing:.16em}.intro{max-width:720px;margin:10px 0 0;font-size:14px;line-height:1.6}.scenario{padding:7px 10px;border:1px solid var(--line);border-radius:8px;background:var(--paper);font-size:12px}.demo{border-radius:14px;box-shadow:0 14px 40px color-mix(in srgb,var(--ink) 11%,transparent);position:relative;min-height:390px;overflow:hidden;padding:24px;background:color-mix(in srgb,var(--paper) 90%,#fff)}@media(max-width:700px){.page{width:calc(100% - 12px);padding-top:12px}.mast{display:grid}.demo{padding:12px}}
    .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-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}
    .calendar-choice-demo{display:grid;gap:14px;max-width:760px;margin:auto;padding:clamp(20px,4vw,38px);border:1px solid var(--line);border-radius:24px;background:var(--paper)}.calendar-choice-demo header{display:flex;justify-content:space-between;gap:20px;align-items:end}.calendar-choice-demo h2{margin:.2em 0}.calendar-month-controls{display:flex;gap:9px;align-items:center}.calendar-month-controls button{width:42px;height:42px;border:1px solid var(--line);border-radius:50%;background:transparent}.calendar-month-controls strong{min-width:130px;text-align:center}.calendar-weekdays,.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:7px}.calendar-weekdays span{padding:7px;text-align:center;font-size:12px;font-weight:900}.calendar-grid button{min-height:58px;border:1px solid transparent;border-radius:13px;background:color-mix(in srgb,var(--secondary) 10%,transparent);font-weight:800}.calendar-grid button:hover{border-color:var(--accent)}.calendar-grid button[aria-selected="true"]{color:var(--paper);background:var(--accent)}.calendar-choice-demo footer{display:flex;justify-content:space-between;gap:16px;align-items:center;padding-top:14px;border-top:1px solid var(--line);font-weight:900}@media(max-width:560px){.calendar-choice-demo header{align-items:flex-start;flex-direction:column}.calendar-grid button{min-height:42px}.calendar-choice-demo footer{align-items:flex-start;flex-direction:column}}.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="dashboard" data-composition="control-deck">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">dashboard / Quick Date Selection / BEGINNER</span><h1>Quick date selection for meeting rooms</h1><p class="intro">Complete quick date selection in a meeting room scenario: includes real content, interactive controls, clear state feedback, and responsive layouts.</p></div><span class="scenario">Meeting room</span></header>
    <div class="composition-deck"><div class="deck-bar"><span>CONTROL DECK · 04</span><span>Date Quick Select</span><span class="deck-lights" aria-hidden="true"><i></i><i></i><i></i></span></div><section class="demo" aria-label="Meeting Room Date Quick-Select Interaction Area"><div class="workflow-dispatch"><aside class="dispatch-console"><span class="eyebrow">Meeting Room DISPATCH</span><h2>Meeting room occupancy scheduling desk</h2><form id="workflowDispatchForm"><label>Task Type<select id="workflowDispatchKind"><option>Morning stand-up</option><option>Plan Review</option><option>Client Communication</option></select></label><label>Number of attendees<input id="workflowDispatchAmount" type="number" min="1" max="9999" value="45"><span>person</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">Locked Meeting</button></form><label>Current task<select id="workflowDispatchActive" aria-label="Switch current task"><option value="1">Morning stand-up</option><option value="2">Plan Review</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:controls-selectors-calendar-choice --><section class="calendar-choice-demo"><header><div><span class="eyebrow">CALENDAR CHOICE</span><h2>Meeting room date</h2></div><div class="calendar-month-controls"><button id="calendarPrevious" type="button" aria-label="Last month">←</button><strong id="calendarMonth">2026 year 7 month</strong><button id="calendarNext" type="button" aria-label="Next month" data-core-bridge="controls-selectors-calendar-choice">→</button></div></header><div class="calendar-weekdays" aria-hidden="true"><span>One</span><span>Two</span><span>Three</span><span>Four</span><span>Five</span><span>Six</span><span>Day</span></div><div id="calendarGrid" class="calendar-grid" role="grid" aria-label="Select Date"><button type="button" role="gridcell" data-calendar-index="0" aria-selected="true">1</button><button type="button" role="gridcell" data-calendar-index="1" aria-selected="false">2</button><button type="button" role="gridcell" data-calendar-index="2" aria-selected="false">3</button><button type="button" role="gridcell" data-calendar-index="3" aria-selected="false">4</button><button type="button" role="gridcell" data-calendar-index="4" aria-selected="false">5</button><button type="button" role="gridcell" data-calendar-index="5" aria-selected="false">6</button><button type="button" role="gridcell" data-calendar-index="6" aria-selected="false">7</button><button type="button" role="gridcell" data-calendar-index="7" aria-selected="false">8</button><button type="button" role="gridcell" data-calendar-index="8" aria-selected="false">9</button><button type="button" role="gridcell" data-calendar-index="9" aria-selected="false">10</button><button type="button" role="gridcell" data-calendar-index="10" aria-selected="false">11</button><button type="button" role="gridcell" data-calendar-index="11" aria-selected="false">12</button><button type="button" role="gridcell" data-calendar-index="12" aria-selected="false">13</button><button type="button" role="gridcell" data-calendar-index="13" aria-selected="false">14</button><button type="button" role="gridcell" data-calendar-index="14" aria-selected="false">15</button><button type="button" role="gridcell" data-calendar-index="15" aria-selected="false">16</button><button type="button" role="gridcell" data-calendar-index="16" aria-selected="false">17</button><button type="button" role="gridcell" data-calendar-index="17" aria-selected="false">18</button><button type="button" role="gridcell" data-calendar-index="18" aria-selected="false">19</button><button type="button" role="gridcell" data-calendar-index="19" aria-selected="false">20</button><button type="button" role="gridcell" data-calendar-index="20" aria-selected="false">21</button><button type="button" role="gridcell" data-calendar-index="21" aria-selected="false">22</button><button type="button" role="gridcell" data-calendar-index="22" aria-selected="false">23</button><button type="button" role="gridcell" data-calendar-index="23" aria-selected="false">24</button><button type="button" role="gridcell" data-calendar-index="24" aria-selected="false">25</button><button type="button" role="gridcell" data-calendar-index="25" aria-selected="false">26</button><button type="button" role="gridcell" data-calendar-index="26" aria-selected="false">27</button><button type="button" role="gridcell" data-calendar-index="27" aria-selected="false">28</button></div><footer><output id="calendarSelection">Selected 2026-07-01</output><button id="calendarToday" class="action" type="button">Back to this month</button></footer></section><!-- 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:controls-selectors-calendar-choice */
let calendarOffset=0;let selectedCalendarIndex=0;const calendarButtons=[...document.querySelectorAll('[data-calendar-index]')];const calendarMonth=document.querySelector('#calendarMonth');const calendarSelection=document.querySelector('#calendarSelection');function calendarDate(index){return new Date(2026,6+calendarOffset,index+1);}function formatCalendar(date){return date.getFullYear()+'-'+String(date.getMonth()+1).padStart(2,'0')+'-'+String(date.getDate()).padStart(2,'0');}function renderCalendar(){const monthDate=new Date(2026,6+calendarOffset,1);calendarMonth.textContent=monthDate.getFullYear()+' Year '+(monthDate.getMonth()+1)+' Month';calendarButtons.forEach((button,index)=>{const date=calendarDate(index);button.textContent=String(date.getDate());button.setAttribute('aria-label',formatCalendar(date));button.setAttribute('aria-selected',String(index===selectedCalendarIndex));});calendarSelection.textContent='Selected '+formatCalendar(calendarDate(selectedCalendarIndex));announce(calendarSelection.textContent);}function chooseCalendar(index){selectedCalendarIndex=Math.max(0,Math.min(calendarButtons.length-1,index));renderCalendar();calendarButtons[selectedCalendarIndex].focus();}calendarButtons.forEach((button,index)=>{button.addEventListener('click',()=>{selectedCalendarIndex=index;renderCalendar();});button.addEventListener('keydown',event=>{const moves={ArrowLeft:-1,ArrowRight:1,ArrowUp:-7,ArrowDown:7};if(moves[event.key]){event.preventDefault();chooseCalendar(index+moves[event.key]);}});});document.querySelector('#calendarPrevious').addEventListener('click',()=>{calendarOffset-=1;selectedCalendarIndex=0;renderCalendar();});document.querySelector('#calendarNext').addEventListener('click',()=>{calendarOffset+=1;selectedCalendarIndex=0;renderCalendar();});document.querySelector('#calendarToday').addEventListener('click',()=>{calendarOffset=0;selectedCalendarIndex=0;renderCalendar();});renderCalendar();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"controls-selectors-calendar-choice","selector":"[data-core-bridge=\"controls-selectors-calendar-choice\"]","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":"Morning stand-up","amount":12,"priority":"normal","touches":0}],["2",{"label":"Plan Review","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+' person · '+bridge.summary;announce('Current task occupying the meeting room:'+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+' person · '+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