Forms and input

Roster scheduling budget setup sheet

Complete the budget configuration sheet for a residential schedule scenario: includes real content, interactive controls, clear state feedback, and responsive layouts.

Forms and inputBudget allocation sheetHTMLCSSJavaScript
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>Roster scheduling budget setup sheet</title>
  <style>
    :root { --ink:#18332f; --paper:#f4efe4; --accent:#d45f3e; --secondary:#8fc4ad; --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:Didot,"Songti SC",serif; background:linear-gradient(30deg,transparent 48%,color-mix(in srgb,var(--accent) 9%,transparent) 49% 51%,transparent 52%),var(--paper);background-size:52px 90px; }
    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(1040px,calc(100% - 36px));margin:auto;padding:64px 0}.mast{display:grid;justify-items:center;text-align:center;border-block:3px double var(--accent);padding:26px;gap:20px;margin-bottom:32px}.mast h1{font-family:Didot,"Songti SC",serif;font-weight:700;font-size:clamp(38px,8vw,86px);letter-spacing:.035em;margin:0;line-height:1}.eyebrow{display:block;color:var(--accent);font:800 11px/1 ui-monospace,monospace;letter-spacing:.3em}.intro{max-width:600px;margin-inline:auto;line-height:1.8}.scenario{padding:8px 26px;border-inline:1px solid var(--accent);letter-spacing:.16em}.demo{border:4px double var(--accent);border-radius:0;clip-path:polygon(24px 0,calc(100% - 24px) 0,100% 24px,100% calc(100% - 24px),calc(100% - 24px) 100%,24px 100%,0 calc(100% - 24px),0 24px);position:relative;min-height:440px;overflow:hidden;padding:clamp(28px,5vw,60px);background:var(--paper)}@media(max-width:700px){.page{width:calc(100% - 20px);padding:24px 0}.mast{padding:18px}.demo{padding:18px}}
    .panel{padding:30px;border:0;border-radius:42px 12px;background:color-mix(in srgb,var(--secondary) 18%,var(--paper))}.row{display:flex;flex-wrap:wrap;gap:14px;align-items:center}.stack{display:flex;flex-direction:column;gap:20px}.action{min-height:48px;padding:12px 22px;border:0;border-radius:50% 50% 18px 18px;background:color-mix(in srgb,var(--secondary) 42%,transparent);font-weight:800}.action.primary,.action.is-active{color:var(--paper);background:var(--accent)}.muted{color:color-mix(in srgb,var(--ink) 64%,transparent);line-height:1.7}.status{min-height:25px;margin-top:16px;color:var(--accent)}.metric{font-size:clamp(32px,7vw,66px);font-weight:800}.meter{height:11px;border-radius:50%;background:color-mix(in srgb,var(--ink) 10%,transparent)}.meter>i{display:block;height:100%;border-radius:inherit;background:var(--accent)}.chip{padding:8px 12px;border-radius:50%;background:var(--paper)}
    .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}}
    .budget-studio{display:grid;gap:16px;max-width:940px;margin:auto}.budget-studio header{display:flex;justify-content:space-between;gap:18px;align-items:end}.budget-studio h2{margin:.3em 0}.budget-studio header label{display:grid;gap:8px;font-weight:800}.budget-studio header select{min-height:42px;padding:9px 12px;border:1px solid var(--line);border-radius:10px;background:var(--paper)}.budget-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.budget-grid article{display:grid;gap:10px;padding:18px;border:1px solid var(--line);border-radius:18px;background:var(--paper)}.budget-grid strong{font-size:clamp(32px,6vw,52px)}.budget-inline-field{display:grid;gap:6px;font-weight:800}.budget-inline-field input{width:100%;padding:10px;border:1px solid var(--line);border-radius:10px;background:var(--paper)}.budget-grid input[type="range"]{width:100%}.budget-ledger{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;padding:18px;border-radius:22px;color:var(--paper);background:var(--ink)}.budget-ledger dl{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-column:1/-1;gap:12px;margin:0}.budget-ledger dl div{display:grid;gap:6px;padding:12px;border:1px solid #ffffff24;border-radius:14px}.budget-ledger dd{margin:0;font-size:28px;font-weight:900}.budget-ledger ol{grid-column:1/-1;display:grid;gap:8px;padding-left:18px;margin:0}@media(max-width:760px){.budget-studio header{align-items:stretch;flex-direction:column}.budget-grid,.budget-ledger dl{grid-template-columns:1fr}.budget-ledger{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="art-deco" data-composition="split-note">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">art-deco / Budget Configuration Sheet / ADVANCED</span><h1>Roster scheduling budget setup sheet</h1><p class="intro">Complete the budget configuration sheet for a residential schedule scenario: includes real content, interactive controls, clear state feedback, and responsive layouts.</p></div><span class="scenario">Housing schedule sheet</span></header>
    <div class="composition-split"><aside class="split-note"><b>CASE 02</b><span>Master the semantic structure, responsive layout, keyboard operation, and state synchronization of the budget configuration table.</span></aside><section class="demo" aria-label="Homestay Schedule Sheet Budget Configuration Sheet Interaction Area"><div class="workflow-guide"><nav class="guide-rail" aria-label="Housing Schedule Sheet Guide"><span class="eyebrow">Housing Duty Schedule Sheet GUIDE</span><ol><li data-workflow-guide-step="0" aria-current="step"><b>1</b><span>Accommodation Schedule Sheet Basic Information</span></li><li data-workflow-guide-step="1"><b>2</b><span>Additional Materials for the Housing Schedule</span></li><li data-workflow-guide-step="2"><b>3</b><span>Final confirmation of the lodging work schedule sheet</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="Housing schedule sheet completeness" 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 related operations for the “Housing Shift Schedule Sheet Basic Information” in the main example.</p><!-- 11DZ_CORE_START:forms-input-budget-builder --><section class="budget-studio"><header><div><span class="eyebrow">BUDGET BUILDER</span><h2>Homestay schedule sheet budget pool</h2><p>Turn the budget into drag-and-drop quotas, then sync them to the key summary on the right.</p></div><label>Budget tier <select id="budgetPreset"><option value="520">Compact · ¥520</option><option value="760" selected>Standard · ¥760</option><option value="980">Expand · ¥980</option></select></label></header><div class="budget-grid"><article><span>Venue</span><strong id="budgetCardValue0">¥120</strong><label class="budget-inline-field"><span>Direct input</span><input data-budget-line="0" type="number" min="40" max="320" step="10" value="120" aria-label="Venue budget values" data-core-bridge="forms-input-budget-builder"></label><input data-budget-range="0" type="range" min="40" max="320" step="10" value="120" aria-label="Venue budget"><small>Priority Protection</small></article><article><span>Materials</span><strong id="budgetCardValue1">¥160</strong><label class="budget-inline-field"><span>Direct input</span><input data-budget-line="1" type="number" min="40" max="320" step="10" value="160" aria-label="Material budget value"></label><input data-budget-range="1" type="range" min="40" max="320" step="10" value="160" aria-label="Material budget"><small>Flexible adjustment possible</small></article><article><span>Transportation</span><strong id="budgetCardValue2">¥200</strong><label class="budget-inline-field"><span>Direct input</span><input data-budget-line="2" type="number" min="40" max="320" step="10" value="200" aria-label="Transportation Budget Values"></label><input data-budget-range="2" type="range" min="40" max="320" step="10" value="200" aria-label="Transportation Budget"><small>Priority Protection</small></article><article><span>Catering</span><strong id="budgetCardValue3">¥240</strong><label class="budget-inline-field"><span>Direct input</span><input data-budget-line="3" type="number" min="40" max="320" step="10" value="240" aria-label="Catering budget values"></label><input data-budget-range="3" type="range" min="40" max="320" step="10" value="240" aria-label="Catering budget"><small>Flexible adjustment possible</small></article></div><aside class="budget-ledger"><dl><div><dt>Budget cap</dt><dd id="budgetLimit">¥760</dd></div><div><dt>Current total</dt><dd id="budgetTotal">¥0</dd></div><div><dt>Remaining space</dt><dd id="budgetBalance">¥0</dd></div></dl><ol id="budgetHighlights"><li>Waiting to be reassigned</li></ol></aside></section><!-- 11DZ_CORE_END --></section><aside class="guide-evidence"><details id="workflowGuideDetails"><summary>View acceptance requirements</summary><ul><li>Basic information for the housing schedule sheet needs one visible state change</li><li>Additional materials for the accommodation scheduling sheet need a visible status change</li><li>The homestay schedule sheet final confirmation needs one visible state change</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:forms-input-budget-builder */
const budgetRanges=[...document.querySelectorAll('[data-budget-range]')];const budgetNumbers=[...document.querySelectorAll('[data-budget-line]')];const budgetPreset=document.querySelector('#budgetPreset');const budgetNames=["Venue","Materials","Transportation","Catering"];function syncBudgetValue(index,next){const value=Math.min(320,Math.max(40,Math.round((Number(next)||40)/10)*10));budgetRanges[index].value=String(value);budgetNumbers[index].value=String(value);return value;}function renderBudgetStudio(){const limit=Math.max(0,Number(budgetPreset.value)||0);const entries=budgetRanges.map((input,index)=>({name:budgetNames[index],value:syncBudgetValue(index,input.value),index}));const total=entries.reduce((sum,entry)=>sum+entry.value,0);entries.forEach(entry=>{document.querySelector('#budgetCardValue'+entry.index).textContent='¥'+entry.value;});document.querySelector('#budgetLimit').textContent='¥'+limit;document.querySelector('#budgetTotal').textContent='¥'+total;const balance=limit-total;document.querySelector('#budgetBalance').textContent=(balance>=0?'Remaining ':'Over ')+'¥'+Math.abs(balance);const highlights=entries.slice().sort((left,right)=>right.value-left.value).slice(0,3);document.querySelector('#budgetHighlights').replaceChildren(...highlights.map((entry,rank)=>{const item=document.createElement('li');item.textContent='Key focus '+(rank+1)+' · '+entry.name+' · ¥'+entry.value;return item;}));announce('Total Budget '+total+' yuan');}budgetRanges.forEach((input,index)=>input.addEventListener('input',()=>{syncBudgetValue(index,input.value);renderBudgetStudio();}));budgetNumbers.forEach((input,index)=>input.addEventListener('input',()=>{syncBudgetValue(index,input.value);renderBudgetStudio();}));budgetPreset.addEventListener('change',renderBudgetStudio);renderBudgetStudio();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"forms-input-budget-builder","selector":"[data-core-bridge=\"forms-input-budget-builder\"]","mode":"number","key":"ArrowUp"};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("input",workflowBridgeScheduleCommit);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();const step=Number(workflowBridgeControl.step)||1;const min=workflowBridgeControl.min===''?-Infinity:Number(workflowBridgeControl.min);const max=workflowBridgeControl.max===''?Infinity:Number(workflowBridgeControl.max);let next=Math.min(max,Math.max(min,(Number(workflowBridgeControl.value)||0)+step));if(next===Number(workflowBridgeControl.value))next=Math.max(min,Number(workflowBridgeControl.value)-step);workflowBridgeControl.value=String(next);workflowBridgeControl.dispatchEvent(new Event('input',{bubbles:true}));workflowBridgeControl.dispatchEvent(new Event('change',{bubbles:true}));const result=workflowBridgeCommit();setTimeout(workflowBridgeCommit,0);return result;}function workflowBridgeReset(){workflowBridgeCore.dataset.workflowVersion='0';workflowBridgeLastEffect=workflowBridgeSerialize();}
const workflowGuideCore=document.querySelector('#workflowCore');const workflowGuideStages=["Accommodation Schedule Sheet Basic Information","Additional Materials for the Housing Schedule","Final confirmation of the lodging work schedule sheet"];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?'Confirm Submission':'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('Household schedule 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