Capacités des médias et des appareils du navigateur

Panneau d’informations de la zone d’affichage du laboratoire d’appareils

Dans le contexte d’un laboratoire d’appareils, réalisez le panneau d’informations sur la fenêtre d’affichage : il comprend du contenu réel, des contrôles interactifs, un retour d’état clair et une mise en page adaptative à toutes les tailles.

Capacités des médias et des appareils du navigateurPanneau d’informations sur la zone d’affichageHTMLCSSBrowser API
Après activation de JavaScript, ce cas peut être modifié, exécuté et enregistré. Code source fixe ci-dessous :
<!doctype html>
<html lang="fr" dir="ltr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Panneau d’informations de la zone d’affichage du laboratoire d’appareils</title>
  <style>
    :root { --ink:#ecf7f3; --paper:#071310; --accent:#ff6b5e; --secondary:#71c9b5; --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:ui-monospace,"SFMono-Regular",Consolas,monospace; background:linear-gradient(color-mix(in srgb,var(--secondary) 5%,transparent) 1px,transparent 1px),linear-gradient(90deg,color-mix(in srgb,var(--secondary) 5%,transparent) 1px,transparent 1px),var(--paper);background-size:24px 24px; }
    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(1080px,calc(100% - 30px));margin:auto;padding:48px 0}.eyebrow{color:var(--secondary);font:700 12px/1.3 ui-monospace,monospace}.eyebrow::before{content:"> ";color:var(--accent)}.mast{display:grid;grid-template-columns:1fr auto;border:1px solid var(--secondary);padding:18px;gap:24px;align-items:center;margin-bottom:16px}.mast h1{font-family:ui-monospace,"SFMono-Regular",monospace;font-weight:700;font-size:clamp(34px,7vw,72px);letter-spacing:-.055em;margin:12px 0;line-height:1.05}.intro{margin:0;color:color-mix(in srgb,var(--ink) 72%,transparent);font:400 14px/1.7 ui-monospace,monospace}.scenario{padding:7px 10px;border:1px dashed var(--secondary);font:700 11px/1 ui-monospace,monospace}.demo{border-color:var(--secondary);border-radius:8px;box-shadow:0 0 50px color-mix(in srgb,var(--secondary) 15%,transparent);position:relative;min-height:390px;padding:26px;background:color-mix(in srgb,var(--paper) 94%,#000)}@media(max-width:700px){.page{width:calc(100% - 18px);padding:20px 0}.mast{grid-template-columns:1fr}.demo{padding:14px}}
    .panel{padding:22px;border:1px solid var(--line);background:color-mix(in srgb,#fff 58%,transparent)}.stack{display:grid;gap:15px}.row{display:flex;flex-wrap:wrap;gap:10px;align-items:center}.action{min-height:44px;padding:10px 17px;border:1px solid var(--ink);border-radius:999px;background:transparent}.action.primary,.action.is-active{color:var(--paper);background:var(--accent)}.muted{opacity:.68}.status{min-height:24px;margin-top:15px;color:var(--accent);font-weight:800}.metric{font-size:clamp(30px,6vw,58px);font-weight:900}.meter{height:9px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--ink) 12%,transparent)}.meter>i{display:block;height:100%;background:var(--accent)}.chip{padding:6px 9px;border:1px solid var(--line);border-radius:999px;font-size:12px}
    .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}
    .viewport-lab{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(180px,.65fr);gap:16px}.viewport-lab>header{grid-column:1/-1;display:grid;grid-template-columns:1fr auto;gap:8px 18px;align-items:end;padding-bottom:16px;border-bottom:5px solid var(--ink)}.viewport-lab h2{margin:.2em 0}.viewport-lab header output{grid-column:2;grid-row:1/3;font:900 clamp(32px,7vw,66px)/1 ui-monospace,monospace}.viewport-board{position:relative;min-height:300px;padding:28px;border:1px solid var(--line);background:repeating-linear-gradient(90deg,transparent 0 39px,color-mix(in srgb,var(--line) 35%,transparent) 40px)}.viewport-board>i{position:absolute;background:var(--accent);transition:width .2s,height .2s}.viewport-board>i:first-child{left:0;top:0;height:8px}.viewport-board>i:nth-child(2){right:0;top:0;width:8px}.viewport-board dl{display:grid;grid-template-columns:1fr 1fr;gap:12px}.viewport-board dl div{padding:16px;background:var(--paper);border:1px solid var(--line)}.viewport-board dt{font-size:12px}.viewport-board dd{margin:7px 0 0;font-weight:900}.viewport-lab>aside{padding:20px;border:1px solid var(--line)}.viewport-lab ol{display:grid;gap:8px;padding-left:22px}@media(max-width:680px){.viewport-lab{grid-template-columns:1fr}.viewport-lab>header{grid-template-columns:1fr}.viewport-lab header output{grid-area:auto}.viewport-board dl{grid-template-columns:1fr}}.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="terminal" data-composition="gallery-frame">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">terminal / panneau d’informations sur le viewport / INTERMEDIATE</span><h1>Panneau d’informations de la zone d’affichage du laboratoire d’appareils</h1><p class="intro">Dans le contexte d’un laboratoire d’appareils, réalisez le panneau d’informations sur la fenêtre d’affichage : il comprend du contenu réel, des contrôles interactifs, un retour d’état clair et une mise en page adaptative à toutes les tailles.</p></div><span class="scenario">Laboratoire d’appareils</span></header>
    <figure class="composition-gallery"><section class="demo" aria-label="Zone interactive du panneau d’informations sur la vue de la plateforme de laboratoire d’équipements"><div class="workflow-dispatch"><aside class="dispatch-console"><span class="eyebrow">Laboratoire d’appareils DISPATCH</span><h2>Console de contrôle des appareils</h2><form id="workflowDispatchForm"><label>Type de tâche<select id="workflowDispatchKind"><option>capacité de l’écran</option><option>Capacité de saisie</option><option>Capacité de stockage</option></select></label><label>éléments à vérifier<input id="workflowDispatchAmount" type="number" min="1" max="9999" value="18"><span>élément</span></label><fieldset><legend>Priorité de traitement</legend><label><input type="radio" name="workflowPriority" value="normal" checked>Standard</label><label><input type="radio" name="workflowPriority" value="urgent">Urgent</label></fieldset><button class="action primary" type="submit">Commencer la vérification</button></form><label>Tâche en cours<select id="workflowDispatchActive" aria-label="Basculer la tâche en cours"><option value="1">capacité de l’écran</option><option value="2">Capacité de saisie</option></select></label><output id="workflowDispatchSummary">En attente de planification</output></aside><section id="workflowCore" class="workflow-core dispatch-workbench" data-dispatch-priority="normal"><!-- 11DZ_CORE_START:browser-media-device-viewport-inspector --><div class="viewport-lab"><header><span class="eyebrow">VIEWPORT RULER</span><h2>Poste de mesure du viewport du laboratoire d’appareils</h2><output id="viewportReading">—</output><button id="viewportCapture" class="action primary" type="button" data-core-bridge="browser-media-device-viewport-inspector">Enregistrer les dimensions actuelles</button></header><section class="viewport-board" aria-label="Schéma des dimensions de la fenêtre d’affichage"><i id="viewportWidthBar"></i><i id="viewportHeightBar"></i><dl><div><dt>Zone de contenu</dt><dd id="viewportInner">—</dd></div><div><dt>Zone utilisable de l’écran</dt><dd id="viewportScreen">—</dd></div><div><dt>Densité de pixels</dt><dd id="viewportDpr">—</dd></div><div><dt>Orientation de l’écran</dt><dd id="viewportOrientation">—</dd></div></dl></section><aside><h3>Instantané de taille</h3><ol id="viewportHistory"><li>Enregistrez la comparaison après redimensionnement de la fenêtre</li></ol></aside></div><!-- 11DZ_CORE_END --></section></div><p id="status" class="status" role="status" aria-live="polite"></p></section><figcaption class="gallery-caption"><strong>Laboratoire d’appareils / GALLERY 03</strong></figcaption></figure>
  </main>
  <script>
    'use strict';
    const statusOutput = document.querySelector('#status');
    const announce = message => { statusOutput.textContent = message; };
    /* 11DZ_CORE_SCRIPT_START:browser-media-device-viewport-inspector */
const viewportHistory=[];const viewportReading=document.querySelector('#viewportReading');function measureViewport(){const width=innerWidth;const height=innerHeight;const orientation=width>=height?'horizontal':'vertical';viewportReading.textContent=width+' × '+height;document.querySelector('#viewportInner').textContent=document.documentElement.clientWidth+' × '+document.documentElement.clientHeight;document.querySelector('#viewportScreen').textContent=screen.availWidth+' × '+screen.availHeight;document.querySelector('#viewportDpr').textContent=(devicePixelRatio||1).toFixed(2)+' dppx';document.querySelector('#viewportOrientation').textContent=orientation;document.querySelector('#viewportWidthBar').style.width=Math.min(100,width/16)+'%';document.querySelector('#viewportHeightBar').style.height=Math.min(100,height/10)+'%';}function captureViewport(){viewportHistory.unshift({width:innerWidth,height:innerHeight,dpr:devicePixelRatio||1,at:new Date()});viewportHistory.splice(5);document.querySelector('#viewportHistory').replaceChildren(...viewportHistory.map(entry=>{const item=document.createElement('li');item.textContent=entry.width+' × '+entry.height+' · '+entry.dpr.toFixed(1)+'x';return item;}));announce('Enregistré n° '+viewportHistory.length+' instantanés de viewport');}addEventListener('resize',measureViewport,{passive:true});document.querySelector('#viewportCapture').addEventListener('click',captureViewport);measureViewport();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"browser-media-device-viewport-inspector","selector":"[data-core-bridge=\"browser-media-device-viewport-inspector\"]","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+' · Version de base '+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 workflowDispatchCore=document.querySelector('#workflowCore');const workflowDispatchForm=document.querySelector('#workflowDispatchForm');const workflowDispatchSelect=document.querySelector('#workflowDispatchActive');const workflowDispatchJobs=new Map([["1",{"label":"capacité de l’écran","amount":12,"priority":"normal","touches":0}],["2",{"label":"Capacité de saisie","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+' élément · '+bridge.summary;announce('Tâche actuelle de vérification de l’appareil :'+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+' élément · '+workflowBridgeSummary();});workflowDispatchRender('1',false);
workflowBridgeReset();
  </script>
</body>
</html>
Commentaires sur la pageVous avez découvert un problème ou avez une suggestion d’amélioration ?
Les fonctions de retour nécessitent l’utilisation de la version en ligne

Veuillez activer JavaScript dans la version en ligne avant de soumettre ; les fonctionnalités locales de l’outil ou du cas ne sont pas affectées.

Aller vers la version en ligne pour envoyer des commentaires