Navigation and Menus

Campus Dispatch Desk Command Palette

Complete a command palette for a campus dispatch desk scenario: include real content, actionable controls, clear status feedback, and responsive layouts across sizes.

Navigation and MenusCommand PaletteHTMLCSSJavaScript
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>Campus Dispatch Desk Command Palette</title>
  <style>
    :root { --ink:#3a2419; --paper:#fbf3df; --accent:#c66a2d; --secondary:#b5c88d; --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:Optima,"Songti SC",serif; background:radial-gradient(ellipse at top left,color-mix(in srgb,var(--secondary) 32%,transparent),transparent 42%),radial-gradient(ellipse at bottom right,color-mix(in srgb,var(--accent) 18%,transparent),transparent 45%),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(1100px,calc(100% - 34px));margin:auto;padding:68px 0}.mast{display:grid;grid-template-columns:1fr auto;align-items:center;gap:40px;margin:0 4vw 36px}.mast h1{font-family:Optima,"Songti SC",serif;font-weight:700;font-size:clamp(40px,8vw,86px);letter-spacing:-.025em;margin:0;line-height:1.02}.eyebrow{display:block;margin-bottom:12px;color:var(--accent);font-size:12px;letter-spacing:.2em}.intro{max-width:60ch;line-height:1.9}.scenario{display:grid;width:108px;height:108px;place-items:center;padding:12px;border:1px solid var(--line);border-radius:50%;text-align:center}.demo{border-radius:72px 18px 72px 18px;box-shadow:0 28px 80px color-mix(in srgb,var(--ink) 14%,transparent);position:relative;min-height:430px;overflow:hidden;padding:clamp(28px,5vw,58px);background:color-mix(in srgb,var(--paper) 84%,transparent)}@media(max-width:700px){.page{width:calc(100% - 18px);padding:24px 0}.mast{grid-template-columns:1fr;margin-inline:12px}.scenario{width:auto;height:auto;border-radius:999px}.demo{padding:18px}}
    .panel{padding:24px;border-block:1px solid var(--ink);background:transparent}.stack{display:grid;gap:22px}.row{display:flex;flex-wrap:wrap;gap:16px}.action{padding:8px 0;border:0;border-bottom:1px solid currentColor;background:transparent;letter-spacing:.08em}.action.primary,.action.is-active{color:var(--accent);border-bottom-width:4px}.status{min-height:28px;margin-top:20px;font-style:italic}.metric{font-family:Didot,serif;font-size:clamp(38px,8vw,76px)}.muted{max-width:54ch;line-height:1.8}.meter{position:relative;height:3px;background:var(--line)}.meter>i{position:absolute;inset:0 auto 0 0;background:var(--accent)}.chip{padding-bottom:3px;border-bottom:1px solid var(--ink);font-size:13px}
    .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}}
    .command-studio{display:grid;gap:16px;max-width:980px;margin:auto}.command-studio header{display:flex;justify-content:space-between;gap:18px;align-items:end}.command-studio header label{display:grid;gap:8px;font-weight:800;flex:1}.command-studio header input{width:100%;padding:12px;border:1px solid var(--line);border-radius:12px;background:var(--paper)}.command-layout{display:grid;grid-template-columns:120px minmax(0,1fr) 250px;gap:14px}.command-groups{display:grid;align-content:start;gap:7px}.command-groups button{padding:10px;border:1px solid var(--line);border-radius:999px;background:transparent}.command-groups button[aria-pressed="true"]{color:var(--paper);background:var(--ink)}.command-results{display:grid;gap:10px}.command-results button{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:start;padding:15px;border:1px solid var(--line);border-radius:16px;background:var(--paper);text-align:left}.command-results button small{grid-column:1}.command-results button i{grid-row:1/3;font-style:normal;color:var(--accent)}.command-results button.is-active{border-color:var(--accent);box-shadow:inset 0 0 0 2px var(--accent)}.command-preview{display:grid;align-content:start;gap:10px;padding:18px;border-left:5px solid var(--accent);background:color-mix(in srgb,var(--secondary) 10%,transparent)}.command-preview strong{font-size:30px}@media(max-width:780px){.command-studio header{align-items:stretch;flex-direction:column}.command-layout{grid-template-columns:1fr}.command-groups{grid-auto-flow:column;overflow:auto}}.workflow-spatial{display:grid;gap:16px}.workflow-spatial>header{display:grid;grid-template-columns:1fr minmax(170px,.35fr) minmax(170px,.35fr);gap:18px;align-items:end;padding-bottom:16px;border-bottom:5px solid var(--ink)}.workflow-spatial h2{margin:.2em 0}.workflow-spatial header label{display:grid;grid-template-columns:1fr auto;gap:7px}.workflow-spatial header input{grid-column:1/-1;width:100%}.spatial-grid{display:grid;grid-template-columns:minmax(0,var(--spatial-width)) 20px minmax(180px,1fr);gap:0;align-items:stretch}.spatial-core{min-width:0;transform:scale(var(--spatial-zoom));transform-origin:top left;transition:transform .2s}.spatial-handle{display:grid;min-height:300px;place-items:center;border:0;border-inline:1px dashed var(--accent);background:color-mix(in srgb,var(--accent) 10%,transparent);cursor:col-resize}.spatial-grid>aside{display:grid;align-content:center;gap:14px;padding:22px;background:color-mix(in srgb,var(--secondary) 14%,var(--paper))}.spatial-grid>aside strong{font-size:clamp(24px,4vw,42px)}@media(max-width:900px){.workflow-spatial>header{grid-template-columns:1fr}.spatial-grid{order:-1;grid-template-columns:1fr}.spatial-handle{min-height:44px;cursor:row-resize}.spatial-core{transform:none}}
  </style>
</head>
<body data-aesthetic="organic" data-composition="split-note">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">organic / Command Palette / INTERMEDIATE</span><h1>Campus Dispatch Desk Command Palette</h1><p class="intro">Complete a command palette for a campus dispatch desk scenario: include real content, actionable controls, clear status feedback, and responsive layouts across sizes.</p></div><span class="scenario">Campus dispatch desk</span></header>
    <div class="composition-split"><aside class="split-note"><b>CASE 02</b><span>Master the semantic structure, responsive arrangement, keyboard interaction, and state synchronization of command palettes.</span></aside><section class="demo" aria-label="Campus Dispatch Desk command palette interaction area"><div id="workflowSpatial" class="workflow-spatial" style="--spatial-width:64%;--spatial-zoom:1"><header><div><span class="eyebrow">Campus Dispatch Desk SPATIAL CANVAS</span><h2>Campus dispatch desk adjustment station</h2></div><label>Time on Page Share<input id="workflowSpatialWidth" type="range" min="38" max="82" value="64"><output id="workflowSpatialWidthValue">64%</output></label><label>Content Scaling<input id="workflowSpatialZoom" type="range" min="80" max="120" value="100"><output id="workflowSpatialZoomValue">100%</output></label></header><div class="spatial-grid"><section id="workflowCore" class="workflow-core spatial-core"><!-- 11DZ_CORE_START:navigation-menus-command-palette --><div class="command-studio panel"><header><label><span>Search commands</span><input id="commandQuery" type="search" placeholder="Enter keywords to filter commands" autocomplete="off"></label><output id="commandCount">7 items in total</output></header><div class="command-layout"><nav class="command-groups" aria-label="Command groups"><button type="button" data-command-group="0" aria-pressed="true" data-core-bridge="navigation-menus-command-palette">All</button><button type="button" data-command-group="1" aria-pressed="false">Action</button><button type="button" data-command-group="2" aria-pressed="false">Navigation</button><button type="button" data-command-group="3" aria-pressed="false">Materials</button></nav><section id="commandResults" class="command-results"><button type="button" data-command-index="0" data-command-kind="1"><strong>Campus dispatch desk records</strong><small>Perform local actions</small><i>Action</i></button><button type="button" data-command-index="1" data-command-kind="1"><strong>Campus Dispatch Desk Collaboration</strong><small>Update current view</small><i>Action</i></button><button type="button" data-command-index="2" data-command-kind="2"><strong>Campus Dispatch Desk Progress</strong><small>Perform local actions</small><i>Navigation</i></button><button type="button" data-command-index="3" data-command-kind="0"><strong>Campus Dispatch Desk Alerts</strong><small>Update current view</small><i>Action</i></button><button type="button" data-command-index="4" data-command-kind="1"><strong>Campus Dispatch Desk Favorites</strong><small>Perform local actions</small><i>Action</i></button><button type="button" data-command-index="5" data-command-kind="2"><strong>Campus Dispatch Desk Overview</strong><small>Update current view</small><i>Navigation</i></button><button type="button" data-command-index="6" data-command-kind="0"><strong>Campus dispatch desk plan</strong><small>Perform local actions</small><i>Action</i></button></section><aside class="command-preview"><span>Current command</span><strong id="commandPreviewTitle">Campus dispatch desk records</strong><p id="commandPreviewCopy">Action commands complete immediately on the current page, without making external requests.</p><button id="commandRun" class="action primary" type="button">Execute current command</button></aside></div></div><!-- 11DZ_CORE_END --></section><input id="workflowSpatialHandle" class="spatial-handle" type="button" value="↔" aria-label="Drag to adjust the main case preview width"><aside><strong>Campus Dispatch Desk Entry Navigation</strong><p>The campus dispatch desk path navigation and campus dispatch desk completion navigation will be rearranged according to the canvas size.</p><output id="workflowSpatialStatus">Width 64%, zoom 100%</output><input id="workflowSpatialApply" class="action primary" type="button" value="Entry Path"></aside></div></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:navigation-menus-command-palette */
const commandQuery=document.querySelector('#commandQuery');const commandGroupButtons=[...document.querySelectorAll('[data-command-group]')];const commandCards=[...document.querySelectorAll('[data-command-index]')];let activeCommandIndex=0;let activeCommandGroup=0;function setCommandActive(index,announceChange=true){const card=commandCards.find(item=>Number(item.dataset.commandIndex)===index&&!item.hidden);if(!card)return;activeCommandIndex=index;commandCards.forEach(item=>item.classList.toggle('is-active',item===card));document.querySelector('#commandPreviewTitle').textContent=card.querySelector('strong').textContent;document.querySelector('#commandPreviewCopy').textContent=card.querySelector('small').textContent+',labelled as '+card.querySelector('i').textContent+'。';if(announceChange)announce('Current command '+card.querySelector('strong').textContent);}function filterCommandCards(){const query=commandQuery.value.normalize('NFKC').trim().toLowerCase();let count=0;commandCards.forEach(card=>{const groupMatch=activeCommandGroup===0||Number(card.dataset.commandKind)===activeCommandGroup;const searchable=card.querySelector('strong').textContent.normalize('NFKC').toLowerCase();const searchMatch=!query||searchable.includes(query);card.hidden=!(groupMatch&&searchMatch);if(!card.hidden)count+=1;});document.querySelector('#commandCount').textContent='All '+count+' item';const firstVisible=commandCards.find(card=>!card.hidden);if(firstVisible)setCommandActive(Number(firstVisible.dataset.commandIndex),false);announce('Currently Visible Commands '+count+' item');}commandGroupButtons.forEach(button=>button.addEventListener('click',()=>{activeCommandGroup=Number(button.dataset.commandGroup);commandGroupButtons.forEach(item=>item.setAttribute('aria-pressed',String(item===button)));filterCommandCards();}));commandQuery.addEventListener('input',filterCommandCards);commandCards.forEach(card=>card.addEventListener('click',()=>setCommandActive(Number(card.dataset.commandIndex))));document.querySelector('#commandRun').addEventListener('click',()=>announce('Executed:'+document.querySelector('#commandPreviewTitle').textContent));filterCommandCards();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"navigation-menus-command-palette","selector":"[data-core-bridge=\"navigation-menus-command-palette\"]","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 workflowSpatial=document.querySelector('#workflowSpatial');const workflowSpatialCore=document.querySelector('#workflowCore');const workflowSpatialWidth=document.querySelector('#workflowSpatialWidth');const workflowSpatialZoom=document.querySelector('#workflowSpatialZoom');const workflowSpatialHandle=document.querySelector('#workflowSpatialHandle');const workflowSpatialState={width:64,zoom:1,dragging:false};function workflowSpatialDrive(){workflowSpatial.style.setProperty('--spatial-width',workflowSpatialState.width+'%');workflowSpatial.style.setProperty('--spatial-zoom',String(workflowSpatialState.zoom));workflowSpatialWidth.value=String(workflowSpatialState.width);workflowSpatialZoom.value=String(Math.round(workflowSpatialState.zoom*100));document.querySelector('#workflowSpatialWidthValue').textContent=workflowSpatialState.width+'%';document.querySelector('#workflowSpatialZoomValue').textContent=Math.round(workflowSpatialState.zoom*100)+'%';document.querySelector('#workflowSpatialStatus').textContent='width '+workflowSpatialState.width+'%, zoom '+Math.round(workflowSpatialState.zoom*100)+'%';announce('Campus Dispatch Desk canvas has been rearranged');}workflowSpatialWidth.addEventListener('input',()=>{workflowSpatialState.width=Number(workflowSpatialWidth.value);workflowSpatialDrive();});workflowSpatialZoom.addEventListener('input',()=>{workflowSpatialState.zoom=Number(workflowSpatialZoom.value)/100;workflowSpatialDrive();});workflowSpatialHandle.addEventListener('pointerdown',event=>{workflowSpatialState.dragging=true;workflowSpatialHandle.setPointerCapture(event.pointerId);});workflowSpatialHandle.addEventListener('pointermove',event=>{if(!workflowSpatialState.dragging)return;const rect=workflowSpatial.getBoundingClientRect();workflowSpatialState.width=Math.max(38,Math.min(82,Math.round((event.clientX-rect.left)/rect.width*100)));workflowSpatialDrive();});workflowSpatialHandle.addEventListener('pointerup',event=>{workflowSpatialState.dragging=false;workflowSpatialHandle.releasePointerCapture(event.pointerId);});workflowSpatialHandle.addEventListener('wheel',event=>{event.preventDefault();workflowSpatialState.zoom=Math.max(.8,Math.min(1.2,workflowSpatialState.zoom+(event.deltaY<0?.05:-.05)));workflowSpatialDrive();},{passive:false});workflowSpatialHandle.addEventListener('keydown',event=>{if(!['ArrowLeft','ArrowRight'].includes(event.key))return;event.preventDefault();workflowSpatialState.width=Math.max(38,Math.min(82,workflowSpatialState.width+(event.key==='ArrowRight'?2:-2)));workflowSpatialDrive();});document.querySelector('#workflowSpatialApply').addEventListener('click',()=>{const bridge=workflowBridgeActivate();document.querySelector('#workflowSpatialStatus').textContent='Path Entered · Width '+workflowSpatialState.width+'%, zoom '+Math.round(workflowSpatialState.zoom*100)+'% · '+bridge.summary;announce(document.querySelector('#workflowSpatialStatus').textContent);});workflowSpatialDrive();
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