# Learning progress dashboard

> A dark indigo course dashboard: three progress rings fill to 72, 45 and 90 percent while a weekly study chart grows.

- Category: Developer tools
- Version: 1.0
- Source: https://ownlyplans.com/bhaskar/learning-progress-dashboard/

## Overview

A learner overview with a day-streak badge. Three coloured rings fill and count up, then seven study-time bars grow for the week. Topic inspired by OpenDesign's public dashboard prompt list; this prompt and design are written from scratch.

## Tech stack

- CSS
- Dashboard
- HTML

## Build steps

### 1. Paste the prompt

The AI builds the rings and the bar chart.

Prompt:

```text
Create a single-file HTML learning progress dashboard, 1280x720, deep indigo background #120f2a, cards #1b1640 with 1px #2b2461 border and 22px radius, accent violet #a78bfa, green #34d399, amber #fbbf24, text #ece9ff. System fonts, no libraries.
Header: H1 "Learning progress", muted "Your three active courses this week" and a right aligned card "Day streak 12".
Row of three course cards, each with a 150px ring made with conic-gradient (hole 118px) whose percentage is a CSS @property integer counter shown in the centre: UX Foundations 72% (violet, 18 of 25 lessons), Intro to SQL 45% (green, 9 of 20), Brand Writing 90% (amber, 27 of 30).
Below: a wide card "Minutes studied this week" with seven gradient bars (Mon to Sun) of different heights.
Motion (8 second loop): cards rise in with a stagger, rings fill from 0 and the numbers count up, then the bars grow from 6px to their heights. Everything fades and restarts.
Respect prefers-reduced-motion. Return only the complete HTML.
```

### 2. Check the rings

Rings and numbers should fill together.

### 3. Check the bars

Bars should grow after the rings.

**Done when:** You can see it working in the browser.

### 4. Make it real

Load progress from your course platform.

## Assets

### prompt.md — The full prompt.

~~~~
# Learning progress dashboard

Copy this prompt into Claude, Cursor or Lovable.

```text
Create a single-file HTML learning progress dashboard, 1280x720, deep indigo background #120f2a, cards #1b1640 with 1px #2b2461 border and 22px radius, accent violet #a78bfa, green #34d399, amber #fbbf24, text #ece9ff. System fonts, no libraries.
Header: H1 "Learning progress", muted "Your three active courses this week" and a right aligned card "Day streak 12".
Row of three course cards, each with a 150px ring made with conic-gradient (hole 118px) whose percentage is a CSS @property integer counter shown in the centre: UX Foundations 72% (violet, 18 of 25 lessons), Intro to SQL 45% (green, 9 of 20), Brand Writing 90% (amber, 27 of 30).
Below: a wide card "Minutes studied this week" with seven gradient bars (Mon to Sun) of different heights.
Motion (8 second loop): cards rise in with a stagger, rings fill from 0 and the numbers count up, then the bars grow from 6px to their heights. Everything fades and restarts.
Respect prefers-reduced-motion. Return only the complete HTML.
```
~~~~

### index.html.md — Complete code of the result in the video.

~~~~
# index.html

The finished result as one file. Save it as index.html and open it.

```html
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Learning progress</title><style>*{box-sizing:border-box;margin:0;padding:0}
html,body{width:1280px;height:720px;overflow:hidden}
body{font-family:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;-webkit-font-smoothing:antialiased}
@property --n{syntax:'<integer>';inherits:false;initial-value:0}
.stage{position:absolute;inset:0;animation:cyc 8s linear infinite both}
@keyframes cyc{0%{opacity:0}4%{opacity:1}94%{opacity:1}100%{opacity:0}}
body:not(.go) *,body:not(.go) *::before,body:not(.go) *::after{animation-play-state:paused!important}
.cnt::after{content:counter(n)}.cnt{counter-reset:n var(--n)}
@media (prefers-reduced-motion:reduce){*{animation:none!important}}


body{background:#120f2a;color:#ece9ff}
.w{position:absolute;left:48px;right:48px;top:32px}
.hd{display:flex;align-items:flex-end}h1{font-size:28px;letter-spacing:-.03em}.sub{color:#9f98d4;font-size:14px;margin-top:6px}
.st{margin-left:auto;background:#1d1744;border:1px solid #2f2766;border-radius:16px;padding:12px 18px;text-align:center;animation:rs 8s infinite both}
.st small{display:block;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#a79ee0}.st b{font-size:26px}
@keyframes rs{0%,3%{opacity:0;transform:translateY(12px)}10%,100%{opacity:1;transform:none}}
.g{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:26px}
.c{background:#1b1640;border:1px solid #2b2461;border-radius:22px;padding:22px;text-align:center;opacity:0;animation:ci 8s infinite both}
.c:nth-child(2){animation-delay:.12s}.c:nth-child(3){animation-delay:.24s}
@keyframes ci{0%,5%{opacity:0;transform:translateY(16px)}13%,100%{opacity:1;transform:none}}
.ring{width:150px;height:150px;border-radius:50%;margin:0 auto 14px;display:grid;place-items:center;background:conic-gradient(var(--cl) calc(var(--n)*1%),#2b2461 0)}
.ring::before{content:"";grid-area:1/1;width:118px;height:118px;border-radius:50%;background:#1b1640}
.ring{counter-reset:n var(--n)}.ring span{grid-area:1/1;z-index:1;font-size:30px;font-weight:800}.ring span::after{content:counter(n)"%"}
.r1{--cl:#a78bfa;animation:p1 8s infinite both}.r2{--cl:#34d399;animation:p2 8s infinite both}.r3{--cl:#fbbf24;animation:p3 8s infinite both}
@keyframes p1{0%,10%{--n:0}42%,100%{--n:72}}@keyframes p2{0%,10%{--n:0}42%,100%{--n:45}}@keyframes p3{0%,10%{--n:0}42%,100%{--n:90}}
.c h3{font-size:17px}.c p{font-size:13px;color:#9f98d4;margin-top:4px}
.wk{margin-top:22px;background:#1b1640;border:1px solid #2b2461;border-radius:22px;padding:20px 26px;height:190px;display:flex;align-items:flex-end;gap:30px;position:relative;opacity:0;animation:ci 8s .36s infinite both}
.wk h4{position:absolute;left:26px;top:18px;font-size:14px;color:#a79ee0}
.bc{flex:1;display:flex;flex-direction:column;align-items:center;gap:8px}.bc i{display:block;width:100%;border-radius:8px 8px 3px 3px;background:linear-gradient(#a78bfa,#6d4fe0);height:var(--h);animation:gh 8s infinite both}.bc span{font-size:12px;color:#9f98d4}
@keyframes gh{0%,40%{height:6px}68%,100%{height:var(--h)}}
</style></head><body><div class="stage"><div class="w"><div class="hd"><div><h1>Learning progress</h1><div class="sub">Your three active courses this week</div></div><div class="st"><small>Day streak</small><b>12</b></div></div>
<div class="g"><div class="c"><div class="ring r1"><span></span></div><h3>UX Foundations</h3><p>18 of 25 lessons</p></div><div class="c"><div class="ring r2"><span></span></div><h3>Intro to SQL</h3><p>9 of 20 lessons</p></div><div class="c"><div class="ring r3"><span></span></div><h3>Brand Writing</h3><p>27 of 30 lessons</p></div></div>
<div class="wk"><h4>Minutes studied this week</h4><div class="bc"><i style="--h:60px"></i><span>Mon</span></div><div class="bc"><i style="--h:95px"></i><span>Tue</span></div><div class="bc"><i style="--h:45px"></i><span>Wed</span></div><div class="bc"><i style="--h:110px"></i><span>Thu</span></div><div class="bc"><i style="--h:80px"></i><span>Fri</span></div><div class="bc"><i style="--h:35px"></i><span>Sat</span></div><div class="bc"><i style="--h:70px"></i><span>Sun</span></div></div></div></div><script>window.start=function(){document.body.classList.add("go")};if(!/[?&]rec/.test(location.search))start();</script></body></html>
```
~~~~


## Build instructions by tool

### Claude Code

Open a terminal in an empty folder, run `claude`, then paste the prompt.

```text
Build the "Learning progress dashboard" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/learning-progress-dashboard/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the rings → Check the bars → Make it real.
Download the full plan (Markdown) from the link above and keep it in the project root as PLAN.md.
Ask me before adding anything not in the plan. (Prepared for Claude Code.)
```

### Cursor

Open an empty folder in Cursor, start an Agent chat, then paste the prompt.

```text
Build the "Learning progress dashboard" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/learning-progress-dashboard/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the rings → Check the bars → Make it real.
Download the full plan (Markdown) from the link above and keep it in the project root as PLAN.md.
Ask me before adding anything not in the plan. (Prepared for Cursor.)
```

### Lovable

Start a new Lovable project and paste the prompt as your first message.

```text
Build the "Learning progress dashboard" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/learning-progress-dashboard/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the rings → Check the bars → Make it real.
Download the full plan (Markdown) from the link above and keep it in the project root as PLAN.md.
Ask me before adding anything not in the plan. (Prepared for Lovable.)
```

## Definition of done

- Every build step is complete and the app runs locally.
- The main user flow works end to end.
- Share your build on OwnlyPlans with a demo link, build time and tool.
