Cards, Lists, and Content Organization

Archive Shelf Bookmark Organizer

Complete the bookmark organizer in an archive-shelf scenario: include real content, actionable controls, clear state feedback, and responsive layouts across sizes.

Cards, Lists, and Content OrganizationBookmark OrganizerHTMLCSS GridJavaScript
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>Archive Shelf Bookmark Organizer</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: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:26px;border:1px solid var(--line);border-radius:2px;background:var(--paper)}.stack{display:grid;gap:28px}.row{display:flex;gap:20px;flex-wrap:wrap}.action{padding:9px 2px;border:0;border-bottom:2px solid var(--line);background:transparent}.action.primary,.action.is-active{border-color:var(--accent);color:var(--accent)}.muted{font-size:14px;line-height:1.9}.status{min-height:20px;margin-top:28px;font-size:13px}.metric{font-size:clamp(40px,9vw,88px);font-weight:500;letter-spacing:-.06em}.meter{height:2px;background:var(--line)}.meter>i{display:block;height:100%;background:var(--accent)}.chip{font-size:11px;letter-spacing:.12em;text-transform:uppercase}
    .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}
    .bookmark-studio{display:grid;grid-template-columns:220px 1fr;min-height:400px;border:1px solid var(--line);border-radius:18px;overflow:hidden;background:var(--paper)}.bookmark-studio aside{padding:20px;background:var(--ink);color:var(--paper)}.bookmark-studio aside h2{margin:.3em 0}.bookmark-studio nav{display:grid;gap:5px;margin-top:20px}.bookmark-studio nav button{display:flex;justify-content:space-between;padding:11px;border:0;border-radius:9px;color:inherit;background:transparent}.bookmark-studio nav button[aria-current="true"]{color:var(--ink);background:var(--secondary)}.bookmark-studio>section{display:grid;align-content:start;gap:14px;padding:22px}.bookmark-studio>section>header,.bookmark-studio>section>footer{display:flex;justify-content:space-between;gap:10px;align-items:center}.bookmark-studio select{padding:8px;border:1px solid var(--line);border-radius:8px;background:var(--paper)}#bookmarkList{display:grid;gap:8px}#bookmarkList>label{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center;padding:12px;border:1px solid var(--line);border-radius:11px}#bookmarkList>label>span{display:grid;gap:4px}#bookmarkList i{font-style:normal;color:var(--accent);font-family:ui-monospace,monospace}@media(max-width:620px){.bookmark-studio{grid-template-columns:1fr}.bookmark-studio nav{grid-auto-flow:column;overflow:auto}.bookmark-studio>section>header,.bookmark-studio>section>footer{align-items:stretch;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="organic" data-composition="control-deck">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">organic / bookmark organizer / BEGINNER</span><h1>Archive Shelf Bookmark Organizer</h1><p class="intro">Complete the bookmark organizer in an archive-shelf scenario: include real content, actionable controls, clear state feedback, and responsive layouts across sizes.</p></div><span class="scenario">Archive Shelf</span></header>
    <div class="composition-deck"><div class="deck-bar"><span>CONTROL DECK · 04</span><span>Bookmark Organizer</span><span class="deck-lights" aria-hidden="true"><i></i><i></i><i></i></span></div><section class="demo" aria-label="Archive Shelf Bookmark Organizer Interactive Area"><div class="workflow-dispatch"><aside class="dispatch-console"><span class="eyebrow">Archive Shelf DISPATCH</span><h2>Archive Shelf Dispatch Desk</h2><form id="workflowDispatchForm"><label>Task Type<select id="workflowDispatchKind"><option>Archive shelf collection list</option><option>Archive shelf sorting and grouping</option><option>Archive Shelf Published</option></select></label><label>Content Count<input id="workflowDispatchAmount" type="number" min="1" max="9999" value="42"><span>Item</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">Save Arrangement</button></form><label>Current task<select id="workflowDispatchActive" aria-label="Switch current task"><option value="1">Archive shelf collection list</option><option value="2">Archive shelf sorting and grouping</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:cards-lists-content-bookmark-organizer --><div class="bookmark-studio"><aside><span class="eyebrow">BOOKMARKS</span><h2>Archive Shelf Filing Board</h2><nav aria-label="Bookmark Folder"><button type="button" data-folder="0" aria-current="true">Read later<span>0</span></button><button type="button" data-folder="1">Work references<span>0</span></button><button type="button" data-folder="2">Inspiration bookmarks<span>0</span></button></nav></aside><section><header><label>Move selected bookmarks to <select id="bookmarkTarget" data-core-bridge="cards-lists-content-bookmark-organizer"><option value="0">Read later</option><option value="1">Work references</option><option value="2">Inspiration bookmarks</option></select></label><output id="bookmarkTargetSummary">Goal: read later</output></header><div id="bookmarkList"><label data-bookmark-folder="0"><input type="checkbox"><span><b>Archive Shelf Progress</b><small>Included tags</small></span><i>01</i></label><label data-bookmark-folder="1"><input type="checkbox"><span><b>Archive Shelf Reminder</b><small>To be Organized Label</small></span><i>02</i></label><label data-bookmark-folder="2"><input type="checkbox"><span><b>Archive shelf favorites</b><small>Included tags</small></span><i>03</i></label><label data-bookmark-folder="0"><input type="checkbox"><span><b>Archive Shelf Overview</b><small>To be Organized Label</small></span><i>04</i></label><label data-bookmark-folder="1"><input type="checkbox"><span><b>Archive Shelf Plan</b><small>Included tags</small></span><i>05</i></label><label data-bookmark-folder="2"><input type="checkbox"><span><b>Archive Shelf Inspiration</b><small>To be Organized Label</small></span><i>06</i></label><label data-bookmark-folder="0"><input type="checkbox"><span><b>Archive Shelf Records</b><small>Included tags</small></span><i>07</i></label></div><footer><output id="bookmarkSelection">0 selected</output><button id="moveBookmarks" class="action primary" type="button">Move selected</button></footer></section></div><!-- 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:cards-lists-content-bookmark-organizer */
let activeFolder=0;const folderButtons=[...document.querySelectorAll('[data-folder]')];const bookmarks=[...document.querySelectorAll('[data-bookmark-folder]')];const bookmarkTarget=document.querySelector('#bookmarkTarget');function updateBookmarkSelection(){const selected=bookmarks.filter(bookmark=>bookmark.querySelector('input').checked&&!bookmark.hidden).length;document.querySelector('#bookmarkSelection').textContent='Selected '+selected+' item';}function renderBookmarkTarget(){const folder=folderButtons[Number(bookmarkTarget.value)].childNodes[0].textContent;document.querySelector('#bookmarkTargetSummary').textContent='Goal:'+folder;announce('The moving target has switched to '+folder);}function renderBookmarks(){bookmarks.forEach(bookmark=>{bookmark.hidden=Number(bookmark.dataset.bookmarkFolder)!==activeFolder;bookmark.querySelector('input').checked=false;});folderButtons.forEach(button=>{button.querySelector('span').textContent=bookmarks.filter(bookmark=>Number(bookmark.dataset.bookmarkFolder)===Number(button.dataset.folder)).length;});updateBookmarkSelection();announce('Current folder has '+bookmarks.filter(bookmark=>!bookmark.hidden).length+' bookmarks');}folderButtons.forEach(button=>button.addEventListener('click',()=>{activeFolder=Number(button.dataset.folder);folderButtons.forEach(item=>item.removeAttribute('aria-current'));button.setAttribute('aria-current','true');renderBookmarks();}));bookmarkTarget.addEventListener('change',renderBookmarkTarget);bookmarks.forEach(bookmark=>bookmark.querySelector('input').addEventListener('change',updateBookmarkSelection));document.querySelector('#moveBookmarks').addEventListener('click',()=>{const target=Number(bookmarkTarget.value);const selected=bookmarks.filter(bookmark=>bookmark.querySelector('input').checked);selected.forEach(bookmark=>{bookmark.dataset.bookmarkFolder=target;bookmark.querySelector('input').checked=false;});renderBookmarks();announce('Moved '+selected.length+' Bookmark to-do '+folderButtons[target].childNodes[0].textContent);});renderBookmarks();renderBookmarkTarget();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"cards-lists-content-bookmark-organizer","selector":"[data-core-bridge=\"cards-lists-content-bookmark-organizer\"]","mode":"select","key":"ArrowRight"};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);workflowBridgeControl.addEventListener('keydown',event=>{if(event.key!==workflowBridgeSpec.key)return;event.preventDefault();workflowBridgeControl.selectedIndex=(workflowBridgeControl.selectedIndex+1)%workflowBridgeControl.options.length;workflowBridgeControl.dispatchEvent(new Event('input',{bubbles:true}));workflowBridgeControl.dispatchEvent(new Event('change',{bubbles:true}));});workflowBridgeControl.addEventListener("keydown",workflowBridgeScheduleCommit);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();workflowBridgeControl.selectedIndex=(workflowBridgeControl.selectedIndex+1)%workflowBridgeControl.options.length;workflowBridgeControl.dispatchEvent(new Event('change',{bubbles:true}));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":"Archive shelf collection list","amount":12,"priority":"normal","touches":0}],["2",{"label":"Archive shelf sorting and grouping","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+' Item · '+bridge.summary;announce('Archive Shelf Current Tasks:'+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+' Item · '+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