Floating layers and status feedback

Task Center Notification Center

Complete a notification center for a task center scenario: includes real content, actionable controls, clear status feedback, and responsive layouts.

Floating layers and status feedbackNotification CenterHTMLCSSJavaScript
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>Task Center Notification Center</title>
  <style>
    :root { --ink:#102c44; --paper:#eef6f8; --accent:#e05263; --secondary:#79b7c7; --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:16px;border:3px double var(--accent);background:var(--paper)}.stack{display:grid;gap:14px}.row{display:grid;grid-auto-flow:column;grid-auto-columns:max-content;gap:10px;overflow:auto}.action{padding:10px 15px;border:1px solid var(--accent);background:transparent;font-family:Didot,serif;letter-spacing:.06em}.action.primary,.action.is-active{color:var(--paper);background:var(--ink)}.metric{font-family:Didot,serif;font-size:clamp(36px,8vw,74px);letter-spacing:.04em}.status{min-height:24px;padding:9px;border-inline:1px solid var(--accent);text-align:center}.muted{line-height:1.8}.chip{padding:5px 14px;border-inline:1px solid var(--accent);letter-spacing:.1em}.meter{height:5px;background:var(--line)}.meter>i{display:block;height:100%;background:linear-gradient(90deg,var(--accent),var(--secondary))}
    .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}
    .notification-home{display:grid;place-content:center;justify-items:start;min-height:390px;padding:clamp(28px,7vw,78px);border-radius:32px;color:var(--paper);background:radial-gradient(circle at 80% 10%,var(--accent),transparent 35%),var(--ink)}.notification-home h2{margin:.2em 0;font-size:clamp(38px,8vw,86px)}.notification-home>button{display:flex;gap:12px;align-items:center;padding:13px 18px;border:1px solid var(--paper);border-radius:999px;color:var(--paper);background:transparent}.notification-home>button span{display:grid;min-width:25px;height:25px;place-items:center;border-radius:50%;color:var(--ink);background:var(--secondary);font-weight:900}.notification-center-demo dialog{width:min(500px,calc(100% - 20px));height:min(680px,calc(100dvh - 20px));max-height:none;margin:10px 10px 10px auto;padding:0;border:0;border-radius:24px;color:var(--ink);background:var(--paper);box-shadow:-20px 0 70px #0005}.notification-center-demo dialog::backdrop{background:#10101099}.notification-center-demo dialog>header,.notification-center-demo dialog>footer{display:flex;justify-content:space-between;gap:15px;align-items:center;padding:18px 20px;border-bottom:1px solid var(--line)}.notification-center-demo dialog h2{margin:.2em 0}.notification-center-demo dialog header>button{width:42px;height:42px;border:0;border-radius:50%;background:var(--line);font-size:22px}.notification-filters{display:flex;gap:8px;padding:12px 20px}.notification-filters button,.notification-center-demo dialog footer button{padding:9px 13px;border:1px solid var(--line);border-radius:999px;background:transparent}.notification-filters button[aria-pressed="true"]{color:var(--paper);background:var(--ink)}.notification-list{display:grid;align-content:start;max-height:470px;overflow:auto;border-block:1px solid var(--line)}.notification-list article+article{border-top:1px solid var(--line)}.notification-list article>button{display:grid;grid-template-columns:1fr;width:100%;padding:0;border:0;background:transparent;text-align:left}.notification-list article>button>i{display:none}.notification-list article button>span{display:grid;gap:5px}.notification-list article>button{grid-template-columns:auto 1fr auto;gap:12px;align-items:center;padding:16px 20px}.notification-list i{width:10px;height:10px;border-radius:50%;background:var(--accent)}.notification-list article[data-read="true"]{opacity:.58}.notification-list article[data-read="true"] i{background:transparent}.notification-list em{font-size:12px;font-style:normal}.notification-center-demo dialog>footer{border-top:1px solid var(--line);border-bottom:0;font-weight:900}.workflow-session{display:grid;gap:14px}.session-command{display:grid;grid-template-columns:1fr auto minmax(170px,.45fr) auto;gap:16px;align-items:end;padding:18px;border-block:4px double var(--ink)}.session-command h2{margin:.2em 0}.session-command output{font:900 clamp(28px,5vw,54px)/1 ui-monospace,monospace}.session-command label{display:grid;grid-template-columns:1fr auto;gap:7px;font-size:12px}.session-command input{grid-column:1/-1;width:100%}#workflowSessionProgress{height:12px;overflow:hidden;border-radius:2px;background:var(--line)}#workflowSessionProgress i{display:block;width:0;height:100%;background:var(--accent)}.session-stage{min-width:0;transition:filter .25s,transform .25s}.session-stage[data-session-phase="running"]{transform:translateY(-3px)}.session-stage[data-session-phase="paused"]{filter:grayscale(.65)}.session-stage[data-session-phase="complete"]{filter:contrast(.78);opacity:.72}.session-log{display:grid;grid-template-columns:auto 1fr;gap:18px;align-items:start}.session-log ol{display:flex;flex-wrap:wrap;gap:7px;padding:0;margin:0;list-style:none}.session-log li{padding:5px 8px;border:1px solid var(--line);font-size:12px}@media(max-width:900px){.session-stage{order:-1}.session-command{grid-template-columns:1fr auto}.session-command label{grid-column:1/-1}.session-log{grid-template-columns:1fr}}
  </style>
</head>
<body data-aesthetic="minimal" data-composition="gallery-frame">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">minimal / Notification Center / ADVANCED</span><h1>Task Center Notification Center</h1><p class="intro">Complete a notification center for a task center scenario: includes real content, actionable controls, clear status feedback, and responsive layouts.</p></div><span class="scenario">Task Center</span></header>
    <figure class="composition-gallery"><section class="demo" aria-label="Task Center notification center interaction area"><div class="workflow-session"><header class="session-command"><div><span class="eyebrow">Task Center SESSION</span><h2>Task time slot timer</h2></div><output id="workflowSessionClock">00:45</output><label>Round Duration<input id="workflowSessionLength" type="range" min="15" max="90" step="15" value="45"><span>sec</span></label><button id="workflowSessionToggle" class="action primary" type="button">Start task</button></header><div id="workflowSessionProgress" role="progressbar" aria-label="Task Time Progress" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><i></i></div><section id="workflowCore" class="workflow-core session-stage" data-session-phase="ready" tabindex="-1"><!-- 11DZ_CORE_START:overlays-feedback-notification-center --><section class="notification-center-demo"><div class="notification-home"><span class="eyebrow">NOTIFICATION CENTER</span><h2>Task Center Notification Center</h2><button id="notificationOpen" type="button" aria-haspopup="dialog" aria-controls="notificationCenter" data-core-bridge="overlays-feedback-notification-center">Open notifications <span id="notificationBadge">3</span></button></div><dialog id="notificationCenter" aria-labelledby="notificationTitle"><header><div><span class="eyebrow">INBOX</span><h2 id="notificationTitle">All notifications</h2></div><button id="notificationClose" type="button" aria-label="Close notification center">×</button></header><div class="notification-filters" role="group" aria-label="Notification filter"><button type="button" data-notification-filter="all" aria-pressed="true">All</button><button type="button" data-notification-filter="unread" aria-pressed="false">Unread</button></div><div id="notificationList" class="notification-list"><article data-notification data-read="false"><button type="button"><i aria-hidden="true"></i><span><strong>Task Center Inspiration</strong><small>1 hours ago</small></span><em>Unread</em></button></article><article data-notification data-read="false"><button type="button"><i aria-hidden="true"></i><span><strong>Task Center Records</strong><small>2 hours ago</small></span><em>Unread</em></button></article><article data-notification data-read="false"><button type="button"><i aria-hidden="true"></i><span><strong>Task Center Collaboration</strong><small>3 hours ago</small></span><em>Unread</em></button></article><article data-notification data-read="true"><button type="button"><i aria-hidden="true"></i><span><strong>Task Center Progress</strong><small>4 hours ago</small></span><em>Read</em></button></article><article data-notification data-read="true"><button type="button"><i aria-hidden="true"></i><span><strong>Task Center Reminder</strong><small>5 hours ago</small></span><em>Read</em></button></article></div><footer><output id="notificationCount">3 unread items</output><button id="notificationReadAll" type="button">Mark All as Read</button></footer></dialog></section><!-- 11DZ_CORE_END --></section><footer class="session-log"><strong id="workflowSessionScore">0 interaction checkpoints</strong><ol id="workflowSessionLaps" aria-label="Round Log"></ol></footer></div><p id="status" class="status" role="status" aria-live="polite"></p></section><figcaption class="gallery-caption"><strong>Task Center / GALLERY 03</strong></figcaption></figure>
  </main>
  <script>
    'use strict';
    const statusOutput = document.querySelector('#status');
    const announce = message => { statusOutput.textContent = message; };
    /* 11DZ_CORE_SCRIPT_START:overlays-feedback-notification-center */
const notificationCenter=document.querySelector('#notificationCenter');const notifications=[...document.querySelectorAll('[data-notification]')];let notificationFilter='all';function renderNotifications(){let unread=0;notifications.forEach(item=>{const read=item.dataset.read==='true';if(!read)unread+=1;item.hidden=notificationFilter==='unread'&&read;item.querySelector('em').textContent=read?'Read':'Unread';});document.querySelector('#notificationBadge').textContent=unread;document.querySelector('#notificationCount').textContent=unread+' unread items';announce('Current there are '+unread+' Unread notifications');}document.querySelector('#notificationOpen').addEventListener('click',()=>notificationCenter.showModal());document.querySelector('#notificationClose').addEventListener('click',()=>notificationCenter.close());document.querySelectorAll('[data-notification-filter]').forEach(button=>button.addEventListener('click',()=>{notificationFilter=button.dataset.notificationFilter;document.querySelectorAll('[data-notification-filter]').forEach(item=>item.setAttribute('aria-pressed',String(item===button)));renderNotifications();}));notifications.forEach(item=>item.querySelector('button').addEventListener('click',()=>{item.dataset.read='true';renderNotifications();}));document.querySelector('#notificationReadAll').addEventListener('click',()=>{notifications.forEach(item=>{item.dataset.read='true';});renderNotifications();});renderNotifications();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"overlays-feedback-notification-center","selector":"[data-core-bridge=\"overlays-feedback-notification-center\"]","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 workflowSessionCore=document.querySelector('#workflowCore');const workflowSessionToggle=document.querySelector('#workflowSessionToggle');const workflowSessionLength=document.querySelector('#workflowSessionLength');const workflowSessionState={phase:'ready',elapsed:0,limit:Number(workflowSessionLength.value),checkpoints:[],timer:null};function workflowSessionFormat(seconds){return String(Math.floor(seconds/60)).padStart(2,'0')+':'+String(seconds%60).padStart(2,'0');}function workflowSessionDrive(){const percent=Math.min(100,Math.round(workflowSessionState.elapsed/workflowSessionState.limit*100));document.querySelector('#workflowSessionClock').textContent=workflowSessionFormat(Math.max(0,workflowSessionState.limit-workflowSessionState.elapsed));const progress=document.querySelector('#workflowSessionProgress');progress.setAttribute('aria-valuenow',String(percent));progress.querySelector('i').style.width=percent+'%';workflowSessionCore.dataset.sessionPhase=workflowSessionState.phase;document.querySelector('#workflowSessionScore').textContent=workflowSessionState.checkpoints.length+' interactive checkpoints';}function workflowSessionLap(label){workflowSessionState.checkpoints.push({label,at:workflowSessionState.elapsed});const item=document.createElement('li');item.textContent=label+' · '+workflowSessionFormat(workflowSessionState.elapsed);document.querySelector('#workflowSessionLaps').append(item);workflowSessionDrive();}function workflowSessionStop(complete=false){clearInterval(workflowSessionState.timer);workflowSessionState.timer=null;workflowSessionState.phase=complete?'complete':'paused';workflowSessionToggle.textContent=complete?'Restart':'Continue round';workflowSessionToggle.setAttribute('aria-pressed','false');workflowSessionDrive();announce(complete?'Task Shift Complete':'Round paused');}function workflowSessionStart(){if(workflowSessionState.phase==='complete'){workflowSessionState.elapsed=0;workflowSessionState.checkpoints=[];document.querySelector('#workflowSessionLaps').replaceChildren();}workflowSessionState.phase='running';workflowSessionToggle.textContent='Pause round';workflowSessionToggle.setAttribute('aria-pressed','true');const bridge=workflowBridgeActivate();workflowSessionLap(bridge.summary);clearInterval(workflowSessionState.timer);workflowSessionState.timer=setInterval(()=>{workflowSessionState.elapsed+=1;if(workflowSessionState.elapsed>=workflowSessionState.limit){workflowSessionStop(true);return;}workflowSessionDrive();},1000);workflowSessionDrive();announce('The task period round has started · '+bridge.summary);}workflowSessionToggle.addEventListener('click',()=>workflowSessionState.phase==='running'?workflowSessionStop():workflowSessionStart());workflowSessionLength.addEventListener('input',()=>{workflowSessionState.limit=Number(workflowSessionLength.value);workflowSessionState.elapsed=Math.min(workflowSessionState.elapsed,workflowSessionState.limit);workflowSessionDrive();});workflowSessionCore.addEventListener('keydown',event=>{if(event.key==='Enter'||event.key===' '){workflowSessionLap('Keyboard Interaction');}});workflowSessionCore.addEventListener('click',event=>{if(event.target.closest('[data-core-bridge]'))workflowSessionLap('Core action · '+workflowBridgeSummary());});document.addEventListener('visibilitychange',()=>{if(document.hidden&&workflowSessionState.phase==='running')workflowSessionStop();});workflowSessionDrive();
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