# Bulk edit review table

> A light product table: three rows are ticked, a bar appears, 10% is applied and the new prices replace the old ones.

- Category: Developer tools
- Version: 1.0
- Source: https://ownlyplans.com/bhaskar/bulk-edit-review-table/

## Overview

A bulk-edit screen. Three checkboxes tick one after another, a dark action bar slides up, Apply is pressed, old prices are struck through and green new prices appear with a success chip. 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 table, the action bar and the chip.

Prompt:

```text
Build a single-file HTML bulk edit review screen, 1280x720, pale background #f4f6fb, ink #1b2540, accent blue #4f7cff, success green #12875a. System fonts, no libraries.
Header: H1 "Bulk edit" and a muted line "Select products, change a field once, review before you apply".
A white rounded table (20px radius, soft shadow) with columns Product (name + SKU), Stock, Price, Group and five rows: Linen shirt $48.00, Canvas tote $29.00, Wool beanie $22.00, Leather belt $64.00, Cotton socks $12.00. Each row starts with a 22px checkbox.
Bottom centre: a dark navy action bar (600px wide) saying "3 selected", "Price: increase by 10%" and a blue "Apply changes" button.
Motion (8 second loop): rows rise in with a stagger. The first three checkboxes fill blue with a white tick one after another. The action bar slides up. The Apply button presses (scale .9). The three old prices get a strike-through and fade, and new prices $52.80, $31.90 and $24.20 fade in beside them in green. A green chip "3 products updated" appears top right, then everything fades and restarts.
Respect prefers-reduced-motion. Return only the complete HTML.
```

### 2. Check the ticks

Three checkboxes should tick one after another.

### 3. Check the prices

Old prices should be struck through and new ones appear.

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

### 4. Make it real

Apply the change to your products and add an undo.

## Assets

### prompt.md — The full prompt.

~~~~
# Bulk edit review table

Copy this prompt into Claude, Cursor or Lovable.

```text
Build a single-file HTML bulk edit review screen, 1280x720, pale background #f4f6fb, ink #1b2540, accent blue #4f7cff, success green #12875a. System fonts, no libraries.
Header: H1 "Bulk edit" and a muted line "Select products, change a field once, review before you apply".
A white rounded table (20px radius, soft shadow) with columns Product (name + SKU), Stock, Price, Group and five rows: Linen shirt $48.00, Canvas tote $29.00, Wool beanie $22.00, Leather belt $64.00, Cotton socks $12.00. Each row starts with a 22px checkbox.
Bottom centre: a dark navy action bar (600px wide) saying "3 selected", "Price: increase by 10%" and a blue "Apply changes" button.
Motion (8 second loop): rows rise in with a stagger. The first three checkboxes fill blue with a white tick one after another. The action bar slides up. The Apply button presses (scale .9). The three old prices get a strike-through and fade, and new prices $52.80, $31.90 and $24.20 fade in beside them in green. A green chip "3 products updated" appears top right, then 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>Bulk edit review</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:#f4f6fb;color:#1b2540}
.w{position:absolute;left:48px;right:48px;top:32px}
h1{font-size:28px;letter-spacing:-.03em}.sub{color:#6b7898;font-size:14px;margin:6px 0 20px}
.tb{background:#fff;border-radius:20px;box-shadow:0 18px 36px -28px #20357a;overflow:hidden}
.hr,.r{display:grid;grid-template-columns:56px 1fr 130px 150px 120px;align-items:center;padding:0 22px;height:66px;border-top:1px solid #eef1f8}
.hr{height:52px;border:0;background:#f8f9fd;font-size:12px;letter-spacing:.09em;text-transform:uppercase;color:#7684a6}
.r{opacity:0;animation:ri 8s infinite both}.r:nth-child(2){animation-delay:.07s}.r:nth-child(3){animation-delay:.14s}.r:nth-child(4){animation-delay:.21s}.r:nth-child(5){animation-delay:.28s}.r:nth-child(6){animation-delay:.35s}
@keyframes ri{0%,4%{opacity:0;transform:translateY(10px)}12%,100%{opacity:1;transform:none}}
.cb{width:22px;height:22px;border-radius:7px;border:2px solid #c6cee3;position:relative}
.cb::after{content:"";position:absolute;left:5px;top:1px;width:6px;height:11px;border:solid #fff;border-width:0 3px 3px 0;transform:rotate(45deg) scale(0)}


.n b{display:block;font-size:15px}.n span{font-size:12px;color:#8592b2}
.pc{font-weight:700}.pc s{color:#9aa6c4;font-weight:500;margin-right:8px}.pc .nw{color:#12875a}
.bar{position:absolute;left:50%;bottom:40px;margin-left:-300px;width:600px;background:#1b2540;color:#fff;border-radius:18px;padding:16px 22px;display:flex;align-items:center;gap:18px;box-shadow:0 22px 40px -18px #0b1330;opacity:0;animation:bar 8s infinite both}
@keyframes bar{0%,34%{opacity:0;transform:translateY(24px)}40%,86%{opacity:1;transform:none}94%,100%{opacity:0;transform:translateY(24px)}}
.bar b{font-size:15px}.bar span{color:#aab6d8;font-size:14px;flex:1}
.ap{background:#4f7cff;border-radius:12px;padding:11px 20px;font-weight:700;animation:ap 8s infinite both}
@keyframes ap{0%,62%{transform:none}66%{transform:scale(.9)}70%,100%{transform:none}}
.ok{position:absolute;right:48px;top:38px;background:#d9f6e8;color:#12875a;font-weight:700;border-radius:99px;padding:9px 16px;opacity:0;animation:ok 8s infinite both}
@keyframes ok{0%,72%{opacity:0;transform:translateY(-8px)}78%,92%{opacity:1;transform:none}100%{opacity:0}}
.k1 .cb{animation:kb1 8s infinite both}.k1 .cb::after{animation:kt1 8s infinite both}@keyframes kb1{0%,20%{background:#fff;border-color:#c6cee3}24%,100%{background:#4f7cff;border-color:#4f7cff}}@keyframes kt1{0%,20%{transform:rotate(45deg) scale(0)}24%,100%{transform:rotate(45deg) scale(1)}}.k1 .pc s,.k1 .pc .nw{animation:pr1 8s infinite both}.k1 .pc .nw{opacity:0}@keyframes pr1{0%,70%{opacity:1}76%,100%{opacity:1}}.k2 .cb{animation:kb2 8s infinite both}.k2 .cb::after{animation:kt2 8s infinite both}@keyframes kb2{0%,27%{background:#fff;border-color:#c6cee3}31%,100%{background:#4f7cff;border-color:#4f7cff}}@keyframes kt2{0%,27%{transform:rotate(45deg) scale(0)}31%,100%{transform:rotate(45deg) scale(1)}}.k2 .pc s,.k2 .pc .nw{animation:pr2 8s infinite both}.k2 .pc .nw{opacity:0}@keyframes pr2{0%,70%{opacity:1}76%,100%{opacity:1}}.k3 .cb{animation:kb3 8s infinite both}.k3 .cb::after{animation:kt3 8s infinite both}@keyframes kb3{0%,34%{background:#fff;border-color:#c6cee3}38%,100%{background:#4f7cff;border-color:#4f7cff}}@keyframes kt3{0%,34%{transform:rotate(45deg) scale(0)}38%,100%{transform:rotate(45deg) scale(1)}}.k3 .pc s,.k3 .pc .nw{animation:pr3 8s infinite both}.k3 .pc .nw{opacity:0}@keyframes pr3{0%,70%{opacity:1}76%,100%{opacity:1}}
.k1 .pc .nw,.k2 .pc .nw,.k3 .pc .nw{animation:nw 8s infinite both}
@keyframes nw{0%,70%{opacity:0;transform:translateY(6px)}76%,100%{opacity:1;transform:none}}
.k1 .pc s,.k2 .pc s,.k3 .pc s{animation:od 8s infinite both}
@keyframes od{0%,70%{opacity:1}76%,100%{opacity:.4;text-decoration:line-through}}
</style></head><body><div class="stage"><div class="w"><h1>Bulk edit</h1><div class="sub">Select products, change a field once, review before you apply</div>
<div class="ok">3 products updated</div>
<div class="tb"><div class="hr"><div></div><div>Product</div><div>Stock</div><div>Price</div><div>Group</div></div><div class="r k1"><div class="cb"></div><div class="n"><b>Linen shirt</b><span>SKU LS-204</span></div><div>In stock</div><div><span class="pc"><s>$48.00</s><span class="nw">$52.80</span></span></div><div>Apparel</div></div><div class="r k2"><div class="cb"></div><div class="n"><b>Canvas tote</b><span>SKU CT-118</span></div><div>In stock</div><div><span class="pc"><s>$29.00</s><span class="nw">$31.90</span></span></div><div>Apparel</div></div><div class="r k3"><div class="cb"></div><div class="n"><b>Wool beanie</b><span>SKU WB-077</span></div><div>Low stock</div><div><span class="pc"><s>$22.00</s><span class="nw">$24.20</span></span></div><div>Apparel</div></div><div class="r "><div class="cb"></div><div class="n"><b>Leather belt</b><span>SKU LB-310</span></div><div>In stock</div><div><span class="pc">$64.00</span></div><div>Apparel</div></div><div class="r "><div class="cb"></div><div class="n"><b>Cotton socks</b><span>SKU CS-045</span></div><div>In stock</div><div><span class="pc">$12.00</span></div><div>Apparel</div></div></div></div>
<div class="bar"><b>3 selected</b><span>Price: increase by 10%</span><div class="ap">Apply changes</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 "Bulk edit review table" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/bulk-edit-review-table/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the ticks → Check the prices → 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 "Bulk edit review table" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/bulk-edit-review-table/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the ticks → Check the prices → 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 "Bulk edit review table" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/bulk-edit-review-table/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the ticks → Check the prices → 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.
