# Customer support inbox

> A two-pane support inbox: a ticket opens, an AI suggested reply appears, gets sent and the ticket flips to Solved while the open count drops.

- Category: Developer tools
- Version: 1.0
- Source: https://ownlyplans.com/bhaskar/customer-support-inbox/

## Overview

A helpdesk screen with the ticket list left and the conversation right. A typing indicator pulses, an "AI suggested reply" tag shows, the reply is sent, the status pill changes from Open to Solved and the counter goes from 12 to 11. 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 inbox and the conversation pane.

Prompt:

```text
Create a single-file HTML customer support inbox, 1280x720, light grey background #f4f5f8, ink #1a1d29, accent blue #4f6bff. White rounded panels (22px) with soft shadows. System fonts, no libraries.
Left panel: heading "Inbox" with an open ticket counter, then five ticket rows (subject, customer and time, blue unread dot on the first three). The second ticket "Can't export invoices to CSV" is selected with a pale blue background.
Right panel: the ticket title with a yellow "Open" status pill, the customer message in a grey bubble, then a reply bubble in blue aligned right, and a dark "Send reply" button bottom right.
Motion (8 second loop): the customer bubble fades up, a three dot typing indicator bounces, a small "AI suggested reply" tag appears, then the blue reply bubble rises in. The Send button presses (scale .92). Then the status pill cross-fades from yellow Open to green Solved and the inbox counter changes from 12 to 11 (CSS @property integer). Fade everything out at the end and restart.
Respect prefers-reduced-motion. Return only the complete HTML.
```

### 2. Check the reply flow

Typing dots, the AI tag, then the blue reply should appear.

### 3. Check the status

The pill should flip to Solved and the count should drop to 11.

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

### 4. Make it real

Wire the reply box and status to your helpdesk data.

## Assets

### prompt.md — The full prompt.

~~~~
# Customer support inbox

Copy this prompt into Claude, Cursor or Lovable.

```text
Create a single-file HTML customer support inbox, 1280x720, light grey background #f4f5f8, ink #1a1d29, accent blue #4f6bff. White rounded panels (22px) with soft shadows. System fonts, no libraries.
Left panel: heading "Inbox" with an open ticket counter, then five ticket rows (subject, customer and time, blue unread dot on the first three). The second ticket "Can't export invoices to CSV" is selected with a pale blue background.
Right panel: the ticket title with a yellow "Open" status pill, the customer message in a grey bubble, then a reply bubble in blue aligned right, and a dark "Send reply" button bottom right.
Motion (8 second loop): the customer bubble fades up, a three dot typing indicator bounces, a small "AI suggested reply" tag appears, then the blue reply bubble rises in. The Send button presses (scale .92). Then the status pill cross-fades from yellow Open to green Solved and the inbox counter changes from 12 to 11 (CSS @property integer). Fade everything out at the end and restart.
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>Customer support inbox</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:#f4f5f8;color:#1a1d29}
.l{position:absolute;left:36px;top:36px;bottom:36px;width:380px;background:#fff;border-radius:22px;padding:20px;box-shadow:0 18px 40px -30px #1b2250}
.l h2{font-size:18px;letter-spacing:-.02em;display:flex;justify-content:space-between;margin-bottom:14px}
.cn{animation:cn 8s infinite both}@keyframes cn{0%,62%{--n:12}70%,100%{--n:11}}
.tk{padding:14px;border-radius:14px;margin-bottom:6px;font-size:14px;position:relative}.tk small{display:block;color:#7a8099;font-size:12px;margin-top:3px}
.tk.on{background:#eef2ff;animation:on 8s infinite both}@keyframes on{0%,6%{background:#fff}12%,100%{background:#e6ecff}}
.tk u{position:absolute;right:14px;top:16px;width:9px;height:9px;border-radius:50%;background:#4f6bff}
.r{position:absolute;left:448px;top:36px;right:36px;bottom:36px;background:#fff;border-radius:22px;padding:28px 32px;box-shadow:0 18px 40px -30px #1b2250}
.r h1{font-size:22px;letter-spacing:-.02em}.st{display:inline-block;margin-left:10px;font-size:12px;padding:5px 11px;border-radius:99px;font-weight:700;position:relative;vertical-align:middle}
.stw{position:relative;display:inline-block;vertical-align:middle;margin-left:10px}.stw .st{margin-left:0}.so{background:#fff3cd;color:#8a6100;animation:so 8s infinite both}.sd{position:absolute;left:0;top:0;background:#d8f5e4;color:#127a45;opacity:0;animation:sd 8s infinite both}
@keyframes so{0%,66%{opacity:1}70%,100%{opacity:0}}@keyframes sd{0%,66%{opacity:0}70%,100%{opacity:1}}
.msg{margin-top:22px;max-width:520px;background:#f1f3f9;border-radius:18px 18px 18px 4px;padding:16px 18px;font-size:15px;line-height:1.5;animation:m1 8s infinite both}
@keyframes m1{0%,10%{opacity:0;transform:translateY(12px)}18%,100%{opacity:1;transform:none}}
.typing{margin-top:14px;display:flex;gap:5px;margin-left:6px;opacity:0;animation:ty 8s infinite both}.typing i{width:8px;height:8px;border-radius:50%;background:#9aa3c4;animation:bn 1s infinite}.typing i:nth-child(2){animation-delay:.15s}.typing i:nth-child(3){animation-delay:.3s}
@keyframes ty{0%,22%{opacity:0}26%,36%{opacity:1}40%,100%{opacity:0}}@keyframes bn{50%{transform:translateY(-5px)}}
.rep{margin:18px 0 0 auto;max-width:520px;background:#4f6bff;color:#fff;border-radius:18px 18px 4px 18px;padding:16px 18px;font-size:15px;line-height:1.5;opacity:0;animation:rp 8s infinite both}
@keyframes rp{0%,40%{opacity:0;transform:translateY(12px)}48%,100%{opacity:1;transform:none}}
.ai{display:inline-block;margin-top:16px;font-size:12px;font-weight:700;color:#4f6bff;background:#eef2ff;padding:5px 10px;border-radius:99px;opacity:0;animation:ai 8s infinite both}
@keyframes ai{0%,30%{opacity:0}36%,52%{opacity:1}58%,100%{opacity:0}}
.send{position:absolute;right:32px;bottom:28px;background:#1a1d29;color:#fff;border-radius:14px;padding:14px 24px;font-weight:700;animation:sn 8s infinite both}
@keyframes sn{0%,56%{transform:none}60%{transform:scale(.92)}64%,100%{transform:none}}
</style></head><body><div class="stage">
<div class="l"><h2>Inbox <span class="cnt cn"></span> open</h2>
<div class="tk"><u></u>Refund for duplicate charge<small>Dana W. - 4 min ago</small></div>
<div class="tk on"><u></u>Can't export invoices to CSV<small>Priya S. - 12 min ago</small></div>
<div class="tk"><u></u>How do I add a teammate?<small>Marco B. - 20 min ago</small></div>
<div class="tk">Feature request: dark mode<small>Lena O. - 1 h ago</small></div>
<div class="tk">Login code not arriving<small>Tom R. - 2 h ago</small></div></div>
<div class="r"><h1>Can't export invoices to CSV <span class="stw"><span class="st so">Open</span><span class="st sd">Solved</span></span></h1>
<div class="msg">Hi team, the Export CSV button on the invoices page just spins and nothing downloads. I need this for my accountant today. Thanks!</div>
<div class="typing"><i></i><i></i><i></i></div><div class="ai">AI suggested reply</div>
<div class="rep">Thanks Priya, sorry about that. We found a bug with very large date ranges and shipped a fix just now. Please refresh and try again, and your export will download in a few seconds.</div>
<div class="send">Send reply</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 "Customer support inbox" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/customer-support-inbox/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the reply flow → Check the status → 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 "Customer support inbox" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/customer-support-inbox/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the reply flow → Check the status → 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 "Customer support inbox" app from the OwnlyPlans blueprint at https://ownlyplans.com/bhaskar/customer-support-inbox/.
Stack: CSS, Dashboard, HTML.
Follow the plan's steps in order: Paste the prompt → Check the reply flow → Check the status → 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.
