Skip to content

Commit 3664111

Browse files
Kasper Jungeclaude
authored andcommitted
feat: redesign empty state with brand mark, guided onboarding, and favicon
Replace the generic emoji empty state with a polished first-time experience: - Add gradient "R" brand mark to sidebar header for visual identity - Redesign empty state with SVG loop icon, welcoming copy, and prominent CTA - Add three workflow step cards (Configure, Launch, Monitor) to orient new users - Add inline SVG favicon matching the brand mark to eliminate 404 error Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent a733dca commit 3664111

3 files changed

Lines changed: 129 additions & 10 deletions

File tree

src/ralphify/ui/static/dashboard.css

Lines changed: 89 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,23 @@ body {
703703
margin-left: auto;
704704
}
705705

706+
/* ── Logo mark ──────────────────────────────────────────────────── */
707+
708+
.logo-mark {
709+
width: 28px;
710+
height: 28px;
711+
border-radius: 7px;
712+
background: linear-gradient(135deg, #8B6CF0, #E87B4A);
713+
color: white;
714+
font-weight: 700;
715+
font-size: 15px;
716+
display: flex;
717+
align-items: center;
718+
justify-content: center;
719+
flex-shrink: 0;
720+
letter-spacing: -0.5px;
721+
}
722+
706723
/* ── Empty state ─────────────────────────────────────────────────── */
707724

708725
.empty-state {
@@ -711,28 +728,93 @@ body {
711728
align-items: center;
712729
justify-content: center;
713730
height: 100%;
714-
gap: 16px;
731+
gap: 12px;
715732
text-align: center;
733+
padding: 40px 24px;
716734
}
717735

718-
.empty-state-icon {
719-
font-size: 56px;
720-
opacity: 0.15;
736+
.empty-illustration {
737+
width: 72px;
738+
height: 72px;
739+
border-radius: 50%;
740+
background: linear-gradient(135deg, rgba(139, 108, 240, 0.08), rgba(232, 123, 74, 0.08));
741+
display: flex;
742+
align-items: center;
743+
justify-content: center;
744+
margin-bottom: 4px;
721745
}
722746

723747
.empty-state-text {
724-
font-size: 16px;
725-
font-weight: 600;
748+
font-size: 20px;
749+
font-weight: 700;
726750
color: var(--text);
727751
}
728752

729753
.empty-state-hint {
730754
font-size: 14px;
731755
color: var(--text-secondary);
732-
max-width: 300px;
756+
max-width: 380px;
733757
line-height: 1.6;
734758
}
735759

760+
.btn-lg {
761+
padding: 12px 28px;
762+
font-size: 15px;
763+
font-weight: 600;
764+
border-radius: 10px;
765+
}
766+
767+
.empty-state-steps {
768+
display: flex;
769+
gap: 16px;
770+
margin-top: 24px;
771+
max-width: 540px;
772+
}
773+
774+
.step-card {
775+
flex: 1;
776+
background: var(--surface);
777+
border: 1px solid var(--border);
778+
border-radius: var(--radius-lg);
779+
padding: 20px 16px;
780+
text-align: center;
781+
box-shadow: var(--shadow-sm);
782+
transition: all 0.15s ease;
783+
}
784+
785+
.step-card:hover {
786+
box-shadow: var(--shadow);
787+
border-color: var(--border-hover);
788+
}
789+
790+
.step-number {
791+
width: 28px;
792+
height: 28px;
793+
border-radius: 50%;
794+
background: var(--primary-light);
795+
color: var(--primary);
796+
font-weight: 700;
797+
font-size: 13px;
798+
display: flex;
799+
align-items: center;
800+
justify-content: center;
801+
margin: 0 auto 10px;
802+
font-family: var(--font-mono);
803+
}
804+
805+
.step-title {
806+
font-size: 14px;
807+
font-weight: 600;
808+
color: var(--text);
809+
margin-bottom: 4px;
810+
}
811+
812+
.step-desc {
813+
font-size: 12px;
814+
color: var(--text-secondary);
815+
line-height: 1.5;
816+
}
817+
736818
/* ── Modal ───────────────────────────────────────────────────────── */
737819

738820
.modal-overlay {

src/ralphify/ui/static/dashboard.js

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ function Sidebar() {
206206
return html`
207207
<div class="sidebar">
208208
<div class="sidebar-header">
209+
<div class="logo-mark">R</div>
209210
<h1>Ralphify</h1>
210211
<span class="version">UI</span>
211212
</div>
@@ -277,9 +278,44 @@ function Main() {
277278
function EmptyState() {
278279
return html`
279280
<div class="empty-state">
280-
<div class="empty-state-icon">\u{1F680}</div>
281-
<div class="empty-state-text">Ready to run</div>
282-
<div class="empty-state-hint">Start a new autonomous coding loop to see your agent in action</div>
281+
<div class="empty-illustration">
282+
<svg width="32" height="32" viewBox="0 0 24 24" fill="none">
283+
<g stroke="url(#eig)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
284+
<path d="M21 2v6h-6"/>
285+
<path d="M21 13a9 9 0 1 1-3-7.7L21 8"/>
286+
</g>
287+
<defs>
288+
<linearGradient id="eig" x1="0" y1="0" x2="24" y2="24">
289+
<stop stop-color="#8B6CF0"/>
290+
<stop offset="1" stop-color="#E87B4A"/>
291+
</linearGradient>
292+
</defs>
293+
</svg>
294+
</div>
295+
<div class="empty-state-text">Ready when you are</div>
296+
<div class="empty-state-hint">
297+
Launch an autonomous coding loop and watch your AI agent iterate, test, and improve.
298+
</div>
299+
<button class="btn btn-primary btn-lg" onClick=${() => showNewRunModal.value = true}>
300+
+ New Run
301+
</button>
302+
<div class="empty-state-steps">
303+
<div class="step-card">
304+
<div class="step-number">1</div>
305+
<div class="step-title">Configure</div>
306+
<div class="step-desc">Set up checks and a prompt in your project</div>
307+
</div>
308+
<div class="step-card">
309+
<div class="step-number">2</div>
310+
<div class="step-title">Launch</div>
311+
<div class="step-desc">Start a new run from the dashboard</div>
312+
</div>
313+
<div class="step-card">
314+
<div class="step-number">3</div>
315+
<div class="step-title">Monitor</div>
316+
<div class="step-desc">Watch iterations and checks in real time</div>
317+
</div>
318+
</div>
283319
</div>
284320
`;
285321
}

src/ralphify/ui/static/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0">
66
<title>Ralphify Dashboard</title>
7+
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 28 28'><defs><linearGradient id='g' x1='0' y1='0' x2='28' y2='28'><stop stop-color='%238B6CF0'/><stop offset='1' stop-color='%23E87B4A'/></linearGradient></defs><rect width='28' height='28' rx='7' fill='url(%23g)'/><text x='14' y='19.5' text-anchor='middle' fill='white' font-size='16' font-weight='700' font-family='system-ui'>R</text></svg>">
78
<link rel="stylesheet" href="/dashboard.css">
89
</head>
910
<body>

0 commit comments

Comments
 (0)