|
| 1 | +<!doctype html> |
| 2 | +<html lang="en"> |
| 3 | + <head> |
| 4 | + <meta charset="utf-8"> |
| 5 | + <meta name="viewport" content="width=device-width, initial-scale=1"> |
| 6 | + <meta name="color-scheme" content="dark"> |
| 7 | + <meta name="theme-color" content="#0b0d14"> |
| 8 | + <meta name="referrer" content="no-referrer"> |
| 9 | + <meta |
| 10 | + http-equiv="Content-Security-Policy" |
| 11 | + content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'none'; object-src 'none'; base-uri 'none'; form-action 'none'" |
| 12 | + > |
| 13 | + <meta |
| 14 | + name="description" |
| 15 | + content="A modular dashboard with pointer-driven reordering, FLIP animations, keyboard controls, and locally saved layouts." |
| 16 | + > |
| 17 | + <title>AERIS — Drag-to-Reorder Dashboard</title> |
| 18 | + <link rel="stylesheet" href="styles.css"> |
| 19 | + <script src="script.js" defer></script> |
| 20 | + </head> |
1 | 21 |
|
| 22 | + <body> |
| 23 | + <a class="skip-link" href="#dashboard-grid">Skip to dashboard cards</a> |
| 24 | + |
| 25 | + <!-- Decorative gradients are intentionally hidden from assistive technology. --> |
| 26 | + <div class="ambient ambient--lime" aria-hidden="true"></div> |
| 27 | + <div class="ambient ambient--violet" aria-hidden="true"></div> |
| 28 | + |
| 29 | + <div class="app-shell"> |
| 30 | + <header class="topbar"> |
| 31 | + <a class="brand" href="#main-content" aria-label="AERIS dashboard home"> |
| 32 | + <span class="brand__mark" aria-hidden="true"> |
| 33 | + <svg viewBox="0 0 32 32" focusable="false"> |
| 34 | + <path d="M7 22.5 16 5l9 17.5-9-4.25L7 22.5Z"></path> |
| 35 | + <circle cx="16" cy="24.5" r="2.5"></circle> |
| 36 | + </svg> |
| 37 | + </span> |
| 38 | + <span class="brand__word">AERIS</span> |
| 39 | + </a> |
| 40 | + |
| 41 | + <div class="workspace-pill" aria-label="Current workspace"> |
| 42 | + <span class="workspace-pill__dot" aria-hidden="true"></span> |
| 43 | + Creative workspace |
| 44 | + </div> |
| 45 | + |
| 46 | + <div class="topbar__actions"> |
| 47 | + <time class="live-time" id="live-time" aria-label="Current time"></time> |
| 48 | + <button class="icon-button" id="reset-layout" type="button" aria-label="Restore the default card order"> |
| 49 | + <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> |
| 50 | + <path d="M4 4v5h5"></path> |
| 51 | + <path d="M5.6 15.3A7.5 7.5 0 1 0 6 8.1L4 9"></path> |
| 52 | + </svg> |
| 53 | + </button> |
| 54 | + <div class="avatar" role="img" aria-label="Profile placeholder">A</div> |
| 55 | + </div> |
| 56 | + </header> |
| 57 | + |
| 58 | + <main id="main-content"> |
| 59 | + <section class="intro" aria-labelledby="dashboard-title"> |
| 60 | + <div> |
| 61 | + <p class="eyebrow" id="today-label">Your workspace</p> |
| 62 | + <h1 id="dashboard-title"><span id="greeting">Good morning</span>.</h1> |
| 63 | + <p class="intro__copy">Shape the week, then move what matters.</p> |
| 64 | + </div> |
| 65 | + |
| 66 | + <div class="layout-hint"> |
| 67 | + <span class="layout-hint__icon" aria-hidden="true"> |
| 68 | + <svg viewBox="0 0 24 24" focusable="false"> |
| 69 | + <circle cx="9" cy="7" r="1.25"></circle> |
| 70 | + <circle cx="15" cy="7" r="1.25"></circle> |
| 71 | + <circle cx="9" cy="12" r="1.25"></circle> |
| 72 | + <circle cx="15" cy="12" r="1.25"></circle> |
| 73 | + <circle cx="9" cy="17" r="1.25"></circle> |
| 74 | + <circle cx="15" cy="17" r="1.25"></circle> |
| 75 | + </svg> |
| 76 | + </span> |
| 77 | + <span><strong>Make it yours.</strong> Press and drag any card to place it anywhere.</span> |
| 78 | + </div> |
| 79 | + </section> |
| 80 | + |
| 81 | + <p class="sr-only" id="drag-instructions"> |
| 82 | + With a mouse, press and drag any non-interactive area of a card. On touch, drag from its handle. With a keyboard, press Enter or Space on a handle, use the arrow keys to move the card, then press Enter or Space again to save. Press Escape to cancel. |
| 83 | + </p> |
| 84 | + |
| 85 | + <!-- The DOM order of these cards is the layout source of truth. --> |
| 86 | + <section class="dashboard-grid" id="dashboard-grid" aria-label="Reorderable dashboard cards"> |
| 87 | + <article class="dashboard-card card--focus" data-card-id="deep-work" data-card-title="Deep work"> |
| 88 | + <header class="card-header"> |
| 89 | + <div> |
| 90 | + <p class="card-kicker">Focus</p> |
| 91 | + <h2>Deep work</h2> |
| 92 | + </div> |
| 93 | + <button class="drag-handle" type="button" aria-label="Reorder Deep work" aria-describedby="drag-instructions" aria-pressed="false"> |
| 94 | + <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> |
| 95 | + <circle cx="9" cy="7" r="1.25"></circle><circle cx="15" cy="7" r="1.25"></circle> |
| 96 | + <circle cx="9" cy="12" r="1.25"></circle><circle cx="15" cy="12" r="1.25"></circle> |
| 97 | + <circle cx="9" cy="17" r="1.25"></circle><circle cx="15" cy="17" r="1.25"></circle> |
| 98 | + </svg> |
| 99 | + </button> |
| 100 | + </header> |
| 101 | + <div class="focus-layout"> |
| 102 | + <div> |
| 103 | + <p class="metric metric--large">18<span>h</span> 42<span>m</span></p> |
| 104 | + <p class="metric-note"><span class="trend trend--up">↗ 12%</span> from last week</p> |
| 105 | + </div> |
| 106 | + <div class="focus-ring" role="img" aria-label="Seventy-eight percent of weekly focus target completed"> |
| 107 | + <svg viewBox="0 0 100 100" aria-hidden="true" focusable="false"> |
| 108 | + <circle class="focus-ring__track" cx="50" cy="50" r="42"></circle> |
| 109 | + <circle class="focus-ring__value" cx="50" cy="50" r="42"></circle> |
| 110 | + </svg> |
| 111 | + <span>78<small>%</small></span> |
| 112 | + </div> |
| 113 | + </div> |
| 114 | + <div class="card-footer"> |
| 115 | + <span>Weekly target</span><strong>24 hours</strong> |
| 116 | + </div> |
| 117 | + </article> |
| 118 | + |
| 119 | + <article class="dashboard-card card--momentum" data-card-id="momentum" data-card-title="Momentum"> |
| 120 | + <header class="card-header"> |
| 121 | + <div> |
| 122 | + <p class="card-kicker">Flow score</p> |
| 123 | + <h2>Momentum</h2> |
| 124 | + </div> |
| 125 | + <button class="drag-handle" type="button" aria-label="Reorder Momentum" aria-describedby="drag-instructions" aria-pressed="false"> |
| 126 | + <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> |
| 127 | + <circle cx="9" cy="7" r="1.25"></circle><circle cx="15" cy="7" r="1.25"></circle> |
| 128 | + <circle cx="9" cy="12" r="1.25"></circle><circle cx="15" cy="12" r="1.25"></circle> |
| 129 | + <circle cx="9" cy="17" r="1.25"></circle><circle cx="15" cy="17" r="1.25"></circle> |
| 130 | + </svg> |
| 131 | + </button> |
| 132 | + </header> |
| 133 | + <div class="score-row"> |
| 134 | + <p class="metric metric--score">86</p> |
| 135 | + <span class="score-row__unit">/ 100</span> |
| 136 | + </div> |
| 137 | + <div class="mini-bars" aria-label="Momentum over the last seven days" role="img"> |
| 138 | + <span></span><span></span><span></span><span></span><span></span><span></span><span></span> |
| 139 | + </div> |
| 140 | + <p class="insight"><span aria-hidden="true">✦</span> Your strongest streak this month.</p> |
| 141 | + </article> |
| 142 | + |
| 143 | + <article class="dashboard-card card--agenda" data-card-id="agenda" data-card-title="Today's agenda"> |
| 144 | + <header class="card-header"> |
| 145 | + <div> |
| 146 | + <p class="card-kicker" id="agenda-day-label">Today</p> |
| 147 | + <h2>Today's agenda</h2> |
| 148 | + </div> |
| 149 | + <button class="drag-handle" type="button" aria-label="Reorder Today's agenda" aria-describedby="drag-instructions" aria-pressed="false"> |
| 150 | + <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> |
| 151 | + <circle cx="9" cy="7" r="1.25"></circle><circle cx="15" cy="7" r="1.25"></circle> |
| 152 | + <circle cx="9" cy="12" r="1.25"></circle><circle cx="15" cy="12" r="1.25"></circle> |
| 153 | + <circle cx="9" cy="17" r="1.25"></circle><circle cx="15" cy="17" r="1.25"></circle> |
| 154 | + </svg> |
| 155 | + </button> |
| 156 | + </header> |
| 157 | + <ol class="agenda-list"> |
| 158 | + <li><time datetime="09:30">09:30</time><span><strong>Creative sprint</strong><small>Brand system</small></span></li> |
| 159 | + <li><time datetime="11:00">11:00</time><span><strong>Client review</strong><small>30 min · Video</small></span></li> |
| 160 | + <li><time datetime="15:00">15:00</time><span><strong>3D asset pass</strong><small>Production</small></span></li> |
| 161 | + </ol> |
| 162 | + </article> |
| 163 | + |
| 164 | + <article class="dashboard-card card--rhythm" data-card-id="weekly-rhythm" data-card-title="Weekly rhythm"> |
| 165 | + <header class="card-header"> |
| 166 | + <div> |
| 167 | + <p class="card-kicker">Activity</p> |
| 168 | + <h2>Weekly rhythm</h2> |
| 169 | + </div> |
| 170 | + <button class="drag-handle" type="button" aria-label="Reorder Weekly rhythm" aria-describedby="drag-instructions" aria-pressed="false"> |
| 171 | + <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> |
| 172 | + <circle cx="9" cy="7" r="1.25"></circle><circle cx="15" cy="7" r="1.25"></circle> |
| 173 | + <circle cx="9" cy="12" r="1.25"></circle><circle cx="15" cy="12" r="1.25"></circle> |
| 174 | + <circle cx="9" cy="17" r="1.25"></circle><circle cx="15" cy="17" r="1.25"></circle> |
| 175 | + </svg> |
| 176 | + </button> |
| 177 | + </header> |
| 178 | + <div class="chart-summary"> |
| 179 | + <p class="metric">32.5<span>h</span></p> |
| 180 | + <span class="trend trend--up">+8.4%</span> |
| 181 | + </div> |
| 182 | + <div class="line-chart" role="img" aria-label="Weekly activity rose from Monday to Sunday with a peak on Saturday"> |
| 183 | + <svg viewBox="0 0 320 118" preserveAspectRatio="none" aria-hidden="true" focusable="false"> |
| 184 | + <path class="line-chart__grid" d="M0 22.5h320M0 58.5h320M0 94.5h320"></path> |
| 185 | + <path class="line-chart__area" d="M0 92 C35 88 47 64 82 70 S130 91 165 58 S209 49 238 34 S279 15 320 25 V118 H0 Z"></path> |
| 186 | + <path class="line-chart__line" d="M0 92 C35 88 47 64 82 70 S130 91 165 58 S209 49 238 34 S279 15 320 25"></path> |
| 187 | + </svg> |
| 188 | + <div class="chart-days" aria-hidden="true"><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span><span>S</span></div> |
| 189 | + </div> |
| 190 | + </article> |
| 191 | + |
| 192 | + <article class="dashboard-card card--tasks" data-card-id="priority-queue" data-card-title="Priority queue"> |
| 193 | + <header class="card-header"> |
| 194 | + <div> |
| 195 | + <p class="card-kicker">Three of five</p> |
| 196 | + <h2>Priority queue</h2> |
| 197 | + </div> |
| 198 | + <button class="drag-handle" type="button" aria-label="Reorder Priority queue" aria-describedby="drag-instructions" aria-pressed="false"> |
| 199 | + <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> |
| 200 | + <circle cx="9" cy="7" r="1.25"></circle><circle cx="15" cy="7" r="1.25"></circle> |
| 201 | + <circle cx="9" cy="12" r="1.25"></circle><circle cx="15" cy="12" r="1.25"></circle> |
| 202 | + <circle cx="9" cy="17" r="1.25"></circle><circle cx="15" cy="17" r="1.25"></circle> |
| 203 | + </svg> |
| 204 | + </button> |
| 205 | + </header> |
| 206 | + <ul class="task-list"> |
| 207 | + <li><label><input type="checkbox" checked><span>Finalize visual directions</span></label><small>09:00</small></li> |
| 208 | + <li><label><input type="checkbox" checked><span>Package responsive assets</span></label><small>10:30</small></li> |
| 209 | + <li><label><input type="checkbox" checked><span>Publish project notes</span></label><small>12:00</small></li> |
| 210 | + <li><label><input type="checkbox"><span>Record process walkthrough</span></label><small>Tomorrow</small></li> |
| 211 | + </ul> |
| 212 | + </article> |
| 213 | + |
| 214 | + <article class="dashboard-card card--ideas" data-card-id="ideas" data-card-title="Ideas captured"> |
| 215 | + <header class="card-header"> |
| 216 | + <div> |
| 217 | + <p class="card-kicker">Library</p> |
| 218 | + <h2>Ideas captured</h2> |
| 219 | + </div> |
| 220 | + <button class="drag-handle" type="button" aria-label="Reorder Ideas captured" aria-describedby="drag-instructions" aria-pressed="false"> |
| 221 | + <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> |
| 222 | + <circle cx="9" cy="7" r="1.25"></circle><circle cx="15" cy="7" r="1.25"></circle> |
| 223 | + <circle cx="9" cy="12" r="1.25"></circle><circle cx="15" cy="12" r="1.25"></circle> |
| 224 | + <circle cx="9" cy="17" r="1.25"></circle><circle cx="15" cy="17" r="1.25"></circle> |
| 225 | + </svg> |
| 226 | + </button> |
| 227 | + </header> |
| 228 | + <p class="metric metric--large">47</p> |
| 229 | + <p class="metric-note">Seven new notes this week</p> |
| 230 | + <div class="tag-cloud" aria-label="Popular idea categories"> |
| 231 | + <span>Interaction</span><span>3D</span><span>Editorial</span><span>Motion</span> |
| 232 | + </div> |
| 233 | + </article> |
| 234 | + |
| 235 | + <article class="dashboard-card card--pulse" data-card-id="creative-pulse" data-card-title="Creative pulse"> |
| 236 | + <header class="card-header"> |
| 237 | + <div> |
| 238 | + <p class="card-kicker">Last 28 days</p> |
| 239 | + <h2>Creative pulse</h2> |
| 240 | + </div> |
| 241 | + <button class="drag-handle" type="button" aria-label="Reorder Creative pulse" aria-describedby="drag-instructions" aria-pressed="false"> |
| 242 | + <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> |
| 243 | + <circle cx="9" cy="7" r="1.25"></circle><circle cx="15" cy="7" r="1.25"></circle> |
| 244 | + <circle cx="9" cy="12" r="1.25"></circle><circle cx="15" cy="12" r="1.25"></circle> |
| 245 | + <circle cx="9" cy="17" r="1.25"></circle><circle cx="15" cy="17" r="1.25"></circle> |
| 246 | + </svg> |
| 247 | + </button> |
| 248 | + </header> |
| 249 | + <div class="heatmap" role="img" aria-label="Creative activity heatmap showing consistent activity over the last four weeks"> |
| 250 | + <span></span><span></span><span></span><span></span><span></span><span></span><span></span> |
| 251 | + <span></span><span></span><span></span><span></span><span></span><span></span><span></span> |
| 252 | + <span></span><span></span><span></span><span></span><span></span><span></span><span></span> |
| 253 | + <span></span><span></span><span></span><span></span><span></span><span></span><span></span> |
| 254 | + </div> |
| 255 | + <div class="pulse-caption"><span><i></i> Less</span><span><i></i><i></i><i></i> More</span></div> |
| 256 | + <p class="insight"><span aria-hidden="true">●</span> 11-day creation streak</p> |
| 257 | + </article> |
| 258 | + |
| 259 | + <article class="dashboard-card card--milestone" data-card-id="milestone" data-card-title="Next milestone"> |
| 260 | + <header class="card-header"> |
| 261 | + <div> |
| 262 | + <p class="card-kicker">Launch plan</p> |
| 263 | + <h2>Next milestone</h2> |
| 264 | + </div> |
| 265 | + <button class="drag-handle" type="button" aria-label="Reorder Next milestone" aria-describedby="drag-instructions" aria-pressed="false"> |
| 266 | + <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> |
| 267 | + <circle cx="9" cy="7" r="1.25"></circle><circle cx="15" cy="7" r="1.25"></circle> |
| 268 | + <circle cx="9" cy="12" r="1.25"></circle><circle cx="15" cy="12" r="1.25"></circle> |
| 269 | + <circle cx="9" cy="17" r="1.25"></circle><circle cx="15" cy="17" r="1.25"></circle> |
| 270 | + </svg> |
| 271 | + </button> |
| 272 | + </header> |
| 273 | + <div class="milestone-date"><span>Portfolio refresh</span><time datetime="2026-09-02">02 Sep</time></div> |
| 274 | + <div class="progress-track" role="progressbar" aria-label="Portfolio refresh progress" aria-valuemin="0" aria-valuemax="100" aria-valuenow="68"><span></span></div> |
| 275 | + <div class="milestone-meta"><strong>68% complete</strong><span>4 tasks left</span></div> |
| 276 | + <div class="collaborators" aria-label="Three collaborators"> |
| 277 | + <span>JD</span><span>AM</span><span>LC</span><i>+2</i> |
| 278 | + </div> |
| 279 | + </article> |
| 280 | + |
| 281 | + <article class="dashboard-card card--resources" data-card-id="resource-mix" data-card-title="Resource mix"> |
| 282 | + <header class="card-header"> |
| 283 | + <div> |
| 284 | + <p class="card-kicker">This week</p> |
| 285 | + <h2>Resource mix</h2> |
| 286 | + </div> |
| 287 | + <button class="drag-handle" type="button" aria-label="Reorder Resource mix" aria-describedby="drag-instructions" aria-pressed="false"> |
| 288 | + <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> |
| 289 | + <circle cx="9" cy="7" r="1.25"></circle><circle cx="15" cy="7" r="1.25"></circle> |
| 290 | + <circle cx="9" cy="12" r="1.25"></circle><circle cx="15" cy="12" r="1.25"></circle> |
| 291 | + <circle cx="9" cy="17" r="1.25"></circle><circle cx="15" cy="17" r="1.25"></circle> |
| 292 | + </svg> |
| 293 | + </button> |
| 294 | + </header> |
| 295 | + <div class="resource-donut" role="img" aria-label="Resource mix: 46 percent design, 31 percent production, and 23 percent admin"> |
| 296 | + <div class="resource-donut__shape"><span>32.5<small>h</small></span></div> |
| 297 | + <ul> |
| 298 | + <li><i class="legend-dot legend-dot--lime"></i><span>Design</span><strong>46%</strong></li> |
| 299 | + <li><i class="legend-dot legend-dot--violet"></i><span>Production</span><strong>31%</strong></li> |
| 300 | + <li><i class="legend-dot legend-dot--blue"></i><span>Admin</span><strong>23%</strong></li> |
| 301 | + </ul> |
| 302 | + </div> |
| 303 | + </article> |
| 304 | + </section> |
| 305 | + </main> |
| 306 | + |
| 307 | + <footer class="app-footer"> |
| 308 | + <p><span class="save-dot" aria-hidden="true"></span> Layout saved on this device</p> |
| 309 | + <p>AERIS / 2026</p> |
| 310 | + </footer> |
| 311 | + </div> |
| 312 | + |
| 313 | + <div class="toast" id="toast" role="status" aria-live="polite" aria-atomic="true"></div> |
| 314 | + <div class="sr-only" id="drag-status" role="status" aria-live="assertive" aria-atomic="true"></div> |
| 315 | + </body> |
| 316 | +</html> |
0 commit comments