# Feedback and voting board

> A warm cream feedback board: an idea collects votes, rises past the leader and takes the top spot.

- Category: Developer tools
- Version: 1.0
- Source: https://ownlyplans.com/bhaskar/feedback-and-voting-board/

## Overview

Five feature requests with vote boxes and status pills. The second idea gains votes, highlights and swaps places with the first. 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 board with the five ideas.

Prompt:

```text
Build a single-file HTML feedback and voting board, 1280x720, warm cream background #fbf7f0, ink #241d12, accent amber #c58a1d. System fonts, no libraries.
Header: H1 "Feedback board", muted "Vote for what we build next" and a dark "+ New idea" button top right.
Five absolutely positioned white cards (96px tall, 20px radius, soft shadow, 114px apart). Each has a 66px vote box (small up arrow, a count, the word "votes"), a title with a muted "Requested by N teams" line and a status pill on the right (Planned amber, Open blue, Shipped green): Dark mode for the dashboard 142, Export reports to CSV 138, Slack notifications 121, Two-factor sign in 97, Custom domains 64.
Motion (8 second loop): cards rise in with a stagger. The count of Export reports to CSV ticks up 139, 140, 145 (CSS @property integer), its vote box turns amber and the card moves to the top slot while Dark mode moves down. Reset at the end.
Respect prefers-reduced-motion. Return only the complete HTML.
```

### 2. Check the count

The second card should tick up to 145.

### 3. Check the swap

It should move above the first card smoothly.

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

### 4. Make it real

Store votes per user and sort by votes.

## Assets

### prompt.md — The full prompt.

~~~~
# Feedback and voting board

Copy this prompt into Claude, Cursor or Lovable.

```text
Build a single-file HTML feedback and voting board, 1280x720, warm cream background #fbf7f0, ink #241d12, accent amber #c58a1d. System fonts, no libraries.
Header: H1 "Feedback board", muted "Vote for what we build next" and a dark "+ New idea" button top right.
Five absolutely positioned white cards (96px tall, 20px radius, soft shadow, 114px apart). Each has a 66px vote box (small up arrow, a count, the word "votes"), a title with a muted "Requested by N teams" line and a status pill on the right (Planned amber, Open blue, Shipped green): Dark mode for the dashboard 142, Export reports to CSV 138, Slack notifications 121, Two-factor sign in 97, Custom domains 64.
Motion (8 second loop): cards rise in with a stagger. The count of Export reports to CSV ticks up 139, 140, 145 (CSS @property integer), its vote box turns amber and the card moves to the top slot while Dark mode moves down. Reset at the end.
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>Feedback and voting board</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:#fbf7f0;color:#241d12}
.w{position:absolute;left:150px;right:150px;top:30px}
h1{font-size:30px;letter-spacing:-.03em}.sub{color:#8a7b61;font-size:14px;margin:6px 0 22px}
.l{position:relative;height:540px}
.i{position:absolute;left:0;right:0;height:96px;background:#fff;border-radius:20px;box-shadow:0 14px 30px -22px #7a5a1d;display:flex;align-items:center;gap:22px;padding:0 26px;opacity:0;animation:in 8s infinite both}
@keyframes in{0%,4%{opacity:0;transform:translateY(12px)}12%,100%{opacity:1;transform:none}}
.i:nth-child(1){top:0;animation:in 8s infinite both,d1 8s infinite both}
.i:nth-child(2){top:114px;animation:in 8s .08s infinite both,up 8s infinite both}
.i:nth-child(3){top:228px;animation:in 8s .16s infinite both}
.i:nth-child(4){top:342px;animation:in 8s .24s infinite both}
.i:nth-child(5){top:456px;animation:in 8s .32s infinite both}
@keyframes up{0%,48%{top:114px}60%,100%{top:0}}
@keyframes d1{0%,48%{top:0}60%,100%{top:114px}}
.v{width:66px;height:64px;border-radius:16px;background:#f3ecde;display:grid;place-items:center;text-align:center;line-height:1.1;font-size:12px;color:#8a7b61}
.v b{display:block;font-size:22px;color:#241d12}
.v::before{content:"▲";display:block;font-size:11px;color:#c58a1d}
.t b{font-size:17px;display:block}.t span{font-size:13px;color:#8a7b61}
.tg{margin-left:auto;font-size:12px;font-weight:700;padding:5px 11px;border-radius:99px;background:#fdebc8;color:#8a5a00}.tg.g{background:#d9f3e4;color:#17794a}.tg.b{background:#dce8ff;color:#2457d6}
.v1{animation:vv1 8s infinite both}@keyframes vv1{0%,100%{--n:142}}
.v2{animation:vv2 8s infinite both}@keyframes vv2{0%,24%{--n:138}28%,36%{--n:139}40%,48%{--n:140}52%,100%{--n:145}}
.i:nth-child(2) .v{animation:hl 8s infinite both}@keyframes hl{0%,22%{background:#f3ecde}28%,70%{background:#fdebc8}}
.add{position:absolute;right:150px;top:36px;background:#241d12;color:#fff;border-radius:14px;padding:12px 20px;font-weight:700;font-size:14px}
.v b.cnt{counter-reset:n var(--n)}.v b.cnt::after{content:counter(n)}</style></head><body><div class="stage"><div class="w"><h1>Feedback board</h1><div class="sub">Vote for what we build next</div><div class="l"><div class="i"><div class="v"><b class="cnt v1" style=""></b>votes</div><div class="t"><b>Dark mode for the dashboard</b><span>Requested by 38 teams</span></div><div class="tg ">Planned</div></div><div class="i"><div class="v"><b class="cnt v2" style=""></b>votes</div><div class="t"><b>Export reports to CSV</b><span>Requested by 31 teams</span></div><div class="tg b">Open</div></div><div class="i"><div class="v"><b class="cnt " style="counter-reset:n 121"></b>votes</div><div class="t"><b>Slack notifications</b><span>Requested by 27 teams</span></div><div class="tg b">Open</div></div><div class="i"><div class="v"><b class="cnt " style="counter-reset:n 97"></b>votes</div><div class="t"><b>Two-factor sign in</b><span>Requested by 19 teams</span></div><div class="tg g">Shipped</div></div><div class="i"><div class="v"><b class="cnt " style="counter-reset:n 64"></b>votes</div><div class="t"><b>Custom domains</b><span>Requested by 12 teams</span></div><div class="tg b">Open</div></div></div></div><div class="add">+ New idea</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 "Feedback and voting board" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/feedback-and-voting-board/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the count → Check the swap → 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 "Feedback and voting board" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/feedback-and-voting-board/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the count → Check the swap → 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 "Feedback and voting board" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/feedback-and-voting-board/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the count → Check the swap → 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.
