Tables and data display

Project Budget Mobile Card Table

Complete a mobile card table in a project budget scenario: includes realistic content, interactive controls, clear status feedback, and responsive layouts.

Tables and data displayMobile card 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>Project Budget Mobile Card Table</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:Avenir,"PingFang SC",sans-serif; background: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(1320px,calc(100% - 56px));margin:auto;padding:10vh 0}.mast{display:grid;grid-template-columns:minmax(0,1fr) 160px;gap:10vw;margin-block:6vh;align-items:start;margin-bottom:10vh}.mast h1{font-family:Avenir,"PingFang SC",sans-serif;font-weight:500;font-size:clamp(38px,8vw,88px);letter-spacing:-.055em;margin:0;line-height:.96}.eyebrow{display:block;margin-bottom:24px;font:600 10px/1 ui-monospace,monospace;letter-spacing:.22em}.intro{max-width:52ch;margin-top:28px;line-height:1.8}.scenario{font-size:13px;text-align:right}.demo{border-radius:1px;border-color:color-mix(in srgb,var(--ink) 35%,transparent);box-shadow:none;position:relative;min-height:420px;padding:clamp(28px,5vw,70px);background:transparent}@media(max-width:700px){.page{width:calc(100% - 24px);padding:36px 0}.mast{grid-template-columns:1fr;margin-bottom:30px}.scenario{text-align:left}.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-gallery{margin:0;padding:clamp(8px,2vw,18px);border:1px solid var(--ink);background:color-mix(in srgb,var(--paper) 78%,transparent)}.gallery-caption{display:grid;grid-template-columns:auto 1fr auto;gap:16px;align-items:center;padding:15px 4px 2px;font-size:12px}.gallery-caption::before,.gallery-caption::after{content:"";height:1px;background:var(--line)}.gallery-caption strong{font:800 11px/1.2 ui-monospace,monospace;letter-spacing:.16em;text-transform:uppercase}.composition-gallery .demo{box-shadow:none}.composition-gallery .demo::before{content:"";position:absolute;inset:10px;border:1px dashed color-mix(in srgb,var(--accent) 36%,transparent);pointer-events:none}
    .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)}.responsive-table-demo{display:grid;gap:14px}.responsive-table-demo h2{margin:.35em 0}.responsive-cell-label{display:none}.responsive-record-table.force-cards{border:0;background:transparent}.responsive-record-table.force-cards table,.responsive-record-table.force-cards tbody,.responsive-record-table.force-cards tr,.responsive-record-table.force-cards td{display:block}.responsive-record-table.force-cards thead{position:absolute;clip:rect(0 0 0 0)}.responsive-record-table.force-cards tbody{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px}.responsive-record-table.force-cards tr{padding:14px;border:1px solid var(--line);border-radius:14px;background:var(--paper)}.responsive-record-table.force-cards td{display:grid;grid-template-columns:90px 1fr;border:0;padding:7px}.responsive-record-table.force-cards .responsive-cell-label{display:block;font-weight:900}@media(max-width:620px){.responsive-record-table{border:0;background:transparent}.responsive-record-table table,.responsive-record-table tbody,.responsive-record-table tr,.responsive-record-table td{display:block}.responsive-record-table thead{position:absolute;clip:rect(0 0 0 0)}.responsive-record-table tbody{display:grid;gap:12px}.responsive-record-table tr{padding:14px;border:1px solid var(--line);border-radius:14px;background:var(--paper)}.responsive-record-table td{display:grid;grid-template-columns:90px 1fr;border:0;padding:7px}.responsive-record-table .responsive-cell-label{display:block;font-weight:900}}.workflow-compare{display:grid;grid-template-columns:minmax(230px,.55fr) minmax(0,1.45fr);gap:18px}.compare-stage{display:grid;gap:12px;min-width:0}.compare-stage>header{display:flex;justify-content:space-between;gap:16px;align-items:end}.compare-stage h2{margin:.2em 0}.compare-core{--compare-split:50%;min-width:0;padding:14px;clip-path:inset(0 calc(100% - var(--compare-split)) 0 0);outline:1px dashed var(--accent);outline-offset:-8px;transition:clip-path .25s,filter .25s}.compare-core[data-compare-channel="B"]{filter:hue-rotate(32deg) saturate(1.15)}.compare-controls{display:grid;align-content:start;gap:16px;padding:20px;border:1px solid var(--line);border-radius:24px 4px 24px 4px;background:var(--paper)}.compare-controls fieldset,.compare-controls>label{display:grid;gap:8px}.compare-controls input[type="range"]{width:100%}#workflowCompareShelf{display:grid;gap:6px;padding:0;margin:0;list-style:none}#workflowCompareShelf li{display:grid;grid-template-columns:auto 1fr auto;gap:8px;padding:9px;border-top:1px solid var(--line);font-size:12px}@media(max-width:900px){.workflow-compare{grid-template-columns:1fr}.compare-stage{order:-1}.compare-core{clip-path:none;border-left:8px solid var(--accent)}}
  </style>
</head>
<body data-aesthetic="minimal" data-composition="gallery-frame">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">minimal / Mobile Card Table / ADVANCED</span><h1>Project Budget Mobile Card Table</h1><p class="intro">Complete a mobile card table in a project budget scenario: includes realistic content, interactive controls, clear status feedback, and responsive layouts.</p></div><span class="scenario">Project budget</span></header>
    <figure class="composition-gallery"><section class="demo" aria-label="Project Budget Mobile Card Table Interactive Area"><div class="workflow-compare"><form id="workflowCompareControls" class="compare-controls"><fieldset><legend>Reference Channel</legend><label><input type="radio" name="workflowChannel" value="A" checked>A · Conservative budget</label><label><input type="radio" name="workflowChannel" value="B">B · Baseline Budget</label></fieldset><label>Budget amount weight<input id="workflowCompareWeight" type="range" min="10" max="90" value="50"><output id="workflowCompareWeightValue">50 yuan</output></label><label><input id="workflowCompareFreeze" type="checkbox">Freeze current version</label><button id="workflowCompareCapture" class="action primary" type="button">Sample and lock in the budget</button><ol id="workflowCompareShelf" aria-label="Version Sampling Record"></ol></form><section class="compare-stage"><header><span class="eyebrow">Project Budget COMPARE</span><h2>Budget comparison dual-version comparison</h2><output id="workflowCompareLive">Version A waiting for sampling</output></header><section id="workflowCore" class="workflow-core compare-core" data-compare-channel="A" style="--compare-split:50%"><!-- 11DZ_CORE_START:tables-data-table-to-cards --><div class="responsive-table-demo"><header class="table-special-tools"><div><span class="eyebrow">RESPONSIVE RECORDS</span><h2>Project Budget Cross-Device Record</h2></div><button id="tableCardModeToggle" class="action" type="button" aria-pressed="false" data-core-bridge="tables-data-table-to-cards">Preview Card Mode</button></header><div id="responsiveRecordTable" class="responsive-record-table special-table-shell"><table class="special-table"><caption>Project Budget Cross-Device Record</caption><thead><tr><th>Project</th><th>Value</th><th>Status</th></tr></thead><tbody><tr><td><span class="responsive-cell-label" aria-hidden="true">Project</span><span class="responsive-cell-value">Project Budget Overview</span></td><td><span class="responsive-cell-label" aria-hidden="true">Value</span><span class="responsive-cell-value">18</span></td><td><span class="responsive-cell-label" aria-hidden="true">Status</span><span class="responsive-cell-value">To be processed</span></td></tr><tr><td><span class="responsive-cell-label" aria-hidden="true">Project</span><span class="responsive-cell-value">Project Budget Plan</span></td><td><span class="responsive-cell-label" aria-hidden="true">Value</span><span class="responsive-cell-value">31</span></td><td><span class="responsive-cell-label" aria-hidden="true">Status</span><span class="responsive-cell-value">In Progress</span></td></tr><tr><td><span class="responsive-cell-label" aria-hidden="true">Project</span><span class="responsive-cell-value">Project Budget Ideas</span></td><td><span class="responsive-cell-label" aria-hidden="true">Value</span><span class="responsive-cell-value">44</span></td><td><span class="responsive-cell-label" aria-hidden="true">Status</span><span class="responsive-cell-value">Completed</span></td></tr><tr><td><span class="responsive-cell-label" aria-hidden="true">Project</span><span class="responsive-cell-value">Project Budget Records</span></td><td><span class="responsive-cell-label" aria-hidden="true">Value</span><span class="responsive-cell-value">57</span></td><td><span class="responsive-cell-label" aria-hidden="true">Status</span><span class="responsive-cell-value">To be processed</span></td></tr><tr><td><span class="responsive-cell-label" aria-hidden="true">Project</span><span class="responsive-cell-value">Project Budget Collaboration</span></td><td><span class="responsive-cell-label" aria-hidden="true">Value</span><span class="responsive-cell-value">70</span></td><td><span class="responsive-cell-label" aria-hidden="true">Status</span><span class="responsive-cell-value">In Progress</span></td></tr><tr><td><span class="responsive-cell-label" aria-hidden="true">Project</span><span class="responsive-cell-value">Project budget progress</span></td><td><span class="responsive-cell-label" aria-hidden="true">Value</span><span class="responsive-cell-value">83</span></td><td><span class="responsive-cell-label" aria-hidden="true">Status</span><span class="responsive-cell-value">Completed</span></td></tr></tbody></table></div></div><!-- 11DZ_CORE_END --></section></section></div><p id="status" class="status" role="status" aria-live="polite"></p></section><figcaption class="gallery-caption"><strong>Project Budget / GALLERY 03</strong></figcaption></figure>
  </main>
  <script>
    'use strict';
    const statusOutput = document.querySelector('#status');
    const announce = message => { statusOutput.textContent = message; };
    /* 11DZ_CORE_SCRIPT_START:tables-data-table-to-cards */
const cardMedia=matchMedia('(max-width:620px)');const responsiveRecordTable=document.querySelector('#responsiveRecordTable');const tableCardModeToggle=document.querySelector('#tableCardModeToggle');function announceTableMode(){const forced=responsiveRecordTable.classList.contains('force-cards');announce(forced||cardMedia.matches?'Table converted to card records':'Using desktop table view');}tableCardModeToggle.addEventListener('click',()=>{const forced=responsiveRecordTable.classList.toggle('force-cards');tableCardModeToggle.setAttribute('aria-pressed',String(forced));tableCardModeToggle.textContent=forced?'Restore auto layout':'Preview Card Mode';announceTableMode();});cardMedia.addEventListener?.('change',announceTableMode);announceTableMode();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"tables-data-table-to-cards","selector":"[data-core-bridge=\"tables-data-table-to-cards\"]","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 workflowCompareCore=document.querySelector('#workflowCore');const workflowCompareWeight=document.querySelector('#workflowCompareWeight');const workflowCompareState={channel:'A',weight:50,frozen:false,snapshots:[]};function workflowCompareFingerprint(){const controls=[...workflowCompareCore.querySelectorAll('input,select,textarea')];const outputs=[...workflowCompareCore.querySelectorAll('output,[role="status"],strong')].map(node=>node.textContent.trim()).filter(Boolean);return {controlValues:controls.map(control=>control.type==='checkbox'||control.type==='radio'?control.checked:control.value),summary:outputs.slice(0,4).join(' / '),nodes:workflowCompareCore.querySelectorAll('*').length};}function workflowCompareDrive(){workflowCompareCore.dataset.compareChannel=workflowCompareState.channel;workflowCompareCore.style.setProperty('--compare-split',workflowCompareState.weight+'%');document.querySelector('#workflowCompareWeightValue').textContent=workflowCompareState.weight+' yuan';document.querySelector('#workflowCompareLive').textContent=workflowCompareState.channel+' Version · '+workflowCompareState.weight+' yuan'+(workflowCompareState.frozen?' · Frozen':'');announce('Budget comparison in review '+workflowCompareState.channel+' Version');}function workflowCompareCapture(source){const bridge=workflowBridgeActivate();const snapshot={...workflowCompareFingerprint(),channel:workflowCompareState.channel,weight:workflowCompareState.weight,source,bridge:bridge.summary};workflowCompareState.snapshots.push(snapshot);const item=document.createElement('li');item.innerHTML='<b>'+snapshot.channel+'</b><span>'+(snapshot.summary||snapshot.bridge)+'</span><small>'+snapshot.weight+' Yuan · '+snapshot.bridge+'</small>';document.querySelector('#workflowCompareShelf').prepend(item);announce('sampled '+snapshot.channel+' Version and lock budget · '+bridge.summary);}document.querySelectorAll('[name="workflowChannel"]').forEach(input=>input.addEventListener('change',()=>{workflowCompareState.channel=input.value;workflowCompareDrive();}));workflowCompareWeight.addEventListener('input',()=>{workflowCompareState.weight=Number(workflowCompareWeight.value);workflowCompareDrive();});document.querySelector('#workflowCompareFreeze').addEventListener('change',event=>{workflowCompareState.frozen=event.currentTarget.checked;workflowCompareDrive();});document.querySelector('#workflowCompareCapture').addEventListener('click',()=>workflowCompareCapture('Button Sampling'));workflowCompareCore.addEventListener('dblclick',()=>workflowCompareCapture('Main view double-click'));workflowCompareDrive();
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