Skip to content

Commit 22cdbfb

Browse files
cevhericlaude
andcommitted
design: declutter the studio shell — quiet chrome, one accent moment
Multi-agent UX audit (6 dimensions + adversarial critique) measured ~70 interactive chrome elements before any content, the same datum repeated 2-4x across strips, and 5-6 accent hues competing per viewport. Shell: - TopBar 12 items -> 6: cut dead glyphs, PRODUCTION/ONLINE dup, Monitoring (gag re-homed in the command palette), version tag - QueryChrome 5 strips -> 4 bands, 29 interactive -> 8 visible: single RUN toolbar, README tab and Query/Copy/SANDBOX/AI controls removed, results row trimmed to Results/Explain/History/Autopilot + a real overflow menu holding the remaining feature-tease gags, duplicate meta strips deleted - StatusBar 15 items -> 9: one animated Connected pulse (the only one left on the page), real links promoted, single faint identity cluster - Explorer: count de-pilled, badges quieted, carets dim at rest, footer with conflicting v1.2.5 removed, CONNECTIONS label and search placeholder dropped Hero: subtitle rewritten with DB names as green SQL string literals (one hue instead of five), stats deduped (MIT/OSS merged, AI keeps purple), family cards neutralized, studio self-link now a div, footnotes trimmed. A11y bundle: skip-to-content link, :focus-visible ring, aria-labels on explorer asides, 40px mobile hit areas, honest "Live Demo" mobile CTA, fake buttons demoted to spans (~66 -> 33 tab stops before the hero CTA), toast glyph cleanup + keyboard focus pauses auto-dismiss. Section pages: Features kickers single-hue (AI keeps purple), TechStack/ Reliability stat rainbows flattened, Redis off the error-red token. Design doc: docs/designs/2026-07-15-declutter-shell-design.md Before/after: docs/designs/_ref/shots/declutter-*.png Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent b499a7b commit 22cdbfb

17 files changed

Lines changed: 327 additions & 309 deletions
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# Declutter the studio shell — design
2+
3+
**Date:** 2026-07-15 · **Branch:** `design/declutter-shell`
4+
5+
## Problem
6+
7+
The IDE-shell concept is loved, but the page is overloaded. Measured on the
8+
desktop homepage (multi-agent audit, 6 dimensions + adversarial critique):
9+
10+
- ~70 interactive chrome elements render before any marketing content
11+
(~66 tab stops before the first CTA for keyboard users).
12+
- 19 buttons are `data-action="notice"` no-ops occupying tab order.
13+
- The same datum repeats: row count ×3, exec time ×2, `home.sql` ×3,
14+
Connected/Online ×4, version ×3 (`v0.9.29` twice + a conflicting `v1.2.5`),
15+
GitHub reachable from 4 chrome slots, open-source/MIT stated 4×.
16+
- 5–6 accent hues compete in one viewport (rainbow DB names, 4-color stats,
17+
multi-color badges); no single accent moment.
18+
- QueryChrome stacks 5 horizontal strips above the H1 (~y=395px).
19+
20+
## Principles
21+
22+
1. **One strip, one job.** No datum appears twice in the shell.
23+
2. **Semantic color budget.** Blue = interactive/CTA (filled blue on exactly
24+
two elements: Live Demo + RUN). Green = connection state, one animated
25+
pulse total (StatusBar). Amber = warning/pre-alpha only. Purple = AI only.
26+
Red = errors only. Everything else zinc.
27+
3. **Progressive disclosure, not deletion.** The console-notice gags are demo
28+
funnels — they survive one click deeper (Query menu, `⋯` overflow, ⌘K
29+
palette) or become non-focusable spans. The IDE fiction stays.
30+
4. **Chrome type scale:** 11 / 12 / 13 / 15 px only (no half-pixel steps).
31+
5. Mono stays everywhere (spec: mono-first). Body copy gets reading
32+
ergonomics (measure/leading), not a sans face.
33+
34+
## Changes
35+
36+
### TopBar (12 items → 7)
37+
Cut: `▤ +` dead glyphs, `PRODUCTION • ONLINE` caps, separate Online pill,
38+
Monitoring button, `v0.9.29`. Connection chip gets one static green dot.
39+
Monitoring gag re-homed as a ⌘K palette entry. Keep: brand, connection chip,
40+
★ GitHub, Playground, ⌘K, Live Demo (filled).
41+
42+
### QueryChrome (5 strips → 4 bands, 29 interactive → 8 visible)
43+
Owner-directed final form (tightened beyond the audit consensus):
44+
- Tab bar: `{table}.sql` + ✕ (kept gag), `+` demoted to span. README.md tab
45+
removed — GitHub lives in TopBar + StatusBar.
46+
- Toolbar strips 2+3 replaced by ONE strip holding only **RUN** + ⌘+Enter
47+
chip. Query/Save/Copy/BEGIN/SANDBOX/EDIT/IMPORT/Format/Clear/Lines/AI all
48+
removed from chrome (Copy/Export/AI remain reachable via ⌘K palette).
49+
- Results row: Results, ✦ Explain (single trigger), History (span),
50+
Autopilot, and a `⋯` overflow with Saved/Charts/NL2SQL/Pivot/Diff/Dashboard
51+
(notices intact). Docs tab and the `{rows} · {cols} · {ms}` + Export meta
52+
removed — RUN's console toast still reports rows/ms in-fiction.
53+
- Result-meta strip (strip 5) deleted — it was 100 % duplicate data.
54+
55+
### StatusBar (15 items → 9)
56+
Keep: Connected (the one animated pulse), 5 real links (promoted to
57+
`text-muted`), one faint identity cluster `Ln 1, Col 1 · UTF-8 · SQL · ◆ v0.9.29`.
58+
Cut: `LibreDB:latest`, `public`, `{table}.sql`, `{rows} rows`, duplicate brand.
59+
60+
### Explorer
61+
Count pill de-pilled (plain faint text). Schema badges quieted to lowercase
62+
`text-dim`, no border/accent. Row counts stay (core "table = page" loop) but
63+
carets dim at rest and brighten on hover/active. Rows default `text-muted`,
64+
active bright (Railway dim pattern). Column `◆` icons → `text-dim`.
65+
Sidebar footer deleted (duplicate Connected + conflicting `v1.2.5`).
66+
Toggles: `tabindex="-1"`, ≥24 px hit area (36 px in drawer).
67+
68+
### HomeSection
69+
- Badge pill kept (fastest open-source signal), dot static.
70+
- Subtitle rewritten (~20 words, "IDE" matches H1, no adjective stack); the
71+
7 DB names render as **quoted green SQL string literals** — one hue,
72+
in-fiction, replacing the 5-hue rainbow.
73+
- Stats: `7+ Databases`/`100% Open Source`/`MIT License` dedup →
74+
`1-click Deploy anywhere · MIT Open source & free · AI Native Copilot ·
75+
SSO Enterprise sign-on`; numerals `text-bright`, AI tile keeps `text-ai`.
76+
- Tip comments 2 → 1 line; family heading → "one core, three products";
77+
studio card no longer a self-link (div, keeps ring + "you are here");
78+
footnote 3 lines → 1, sponsor line dropped (StatusBar link covers it).
79+
80+
### Accessibility bundle
81+
Skip-to-content link (in-character), `aria-label="Explorer"` on asides,
82+
global `:focus-visible` ring in primary, mobile drawer ✕ and Explain ≥40 px
83+
hit areas, mobile CTA relabeled `▶ Live Demo` (was a dishonest `RUN`),
84+
toast NOTICES lose leading glyphs (SR noise) and pause on keyboard focus,
85+
~15 fake buttons demoted to spans (delegated handler works on any Element).
86+
87+
### Section-page color discipline (cheap, systemic)
88+
Features kickers: 7-color map → `text-dim` (AI keeps `text-ai`; SECURITY no
89+
longer error-red). TechStack layer headers + Reliability stat numbers →
90+
`text-bright`. Providers keeps its syntax-mimicry colors, but Redis moves off
91+
the `text-bad` error token.
92+
93+
## Out of scope (follow-ups)
94+
- Deploy page: collapse 26 "planned" targets into chips; one-color summary.
95+
- Docker-compose page: `<details>` per env-var group; nest under deploy in tree.
96+
- Hero "one live moment" (query types itself once, VT-safe).
97+
- Trust row under stats (GitHub stars / quote as SQL comment).
98+
- Tokenized type scale in `@theme` + CI guard against new `text-[..px]` in chrome.

‎src/components/sections/DatabaseReliabilitySection.astro‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import SectionHeader from './SectionHeader.astro';
33
import DatabaseCtaFooter from './DatabaseCtaFooter.astro';
44
55
const numbers = [
6-
{ n: '~712', l: 'lines of shipped code', cls: 'text-primary' },
7-
{ n: '0', l: 'runtime dependencies', cls: 'text-ok' },
8-
{ n: '2.83 kB', l: 'bundled (min+brotli)', cls: 'text-ai' },
9-
{ n: '100%', l: 'core line coverage', cls: 'text-warn' },
6+
{ n: '~712', l: 'lines of shipped code', cls: 'text-bright' },
7+
{ n: '0', l: 'runtime dependencies', cls: 'text-bright' },
8+
{ n: '2.83 kB', l: 'bundled (min+brotli)', cls: 'text-bright' },
9+
{ n: '100%', l: 'core line coverage', cls: 'text-bright' },
1010
];
1111
1212
const notForYet = [

‎src/components/sections/FeaturesSection.astro‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ import SectionHeader from './SectionHeader.astro';
33
44
type Cat = 'EDITOR' | 'AI' | 'CORE' | 'DATA' | 'SCHEMA' | 'SECURITY' | 'TOOLING';
55
6+
// Color budget: purple marks the AI differentiator; every other category stays quiet.
67
const catColor: Record<Cat, string> = {
78
AI: 'text-ai',
8-
EDITOR: 'text-primary',
9-
CORE: 'text-ok',
10-
DATA: 'text-warn',
11-
SCHEMA: 'text-primary',
12-
SECURITY: 'text-bad',
13-
TOOLING: 'text-muted',
9+
EDITOR: 'text-dim',
10+
CORE: 'text-dim',
11+
DATA: 'text-dim',
12+
SCHEMA: 'text-dim',
13+
SECURITY: 'text-dim',
14+
TOOLING: 'text-dim',
1415
};
1516
1617
interface Feature {

‎src/components/sections/HomeSection.astro‎

Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@
22
const DEMO = 'https://app.libredb.org';
33
44
const stats = [
5-
{ n: '7+', l: 'Databases', cls: 'text-primary' },
6-
{ n: '100%', l: 'Open Source', cls: 'text-ok' },
7-
{ n: 'AI', l: 'Native', cls: 'text-ai' },
8-
{ n: 'MIT', l: 'License', cls: 'text-warn' },
5+
{ n: '1-click', l: 'Deploy anywhere', cls: 'text-bright' },
6+
{ n: 'MIT', l: 'Open source & free', cls: 'text-bright' },
7+
{ n: 'AI', l: 'Native Copilot', cls: 'text-ai' },
8+
{ n: 'SSO', l: 'Enterprise sign-on', cls: 'text-bright' },
99
];
10+
11+
const databases = ['PostgreSQL', 'MySQL', 'Oracle', 'SQL Server', 'SQLite', 'MongoDB', 'Redis'];
1012
---
1113

1214
<div class="mx-auto max-w-5xl px-1">
1315
<!-- Badge -->
1416
<span
15-
class="inline-flex items-center gap-2 rounded-full border border-ok/30 bg-ok-tint px-3 py-1 text-[12.5px] text-ok"
17+
class="inline-flex items-center gap-2 rounded-full border border-ok/30 bg-ok-tint px-3 py-1 text-[12px] text-ok"
1618
>
17-
<span class="h-1.5 w-1.5 animate-pulse-dot rounded-full bg-ok" aria-hidden="true"></span>
19+
<span class="h-1.5 w-1.5 rounded-full bg-ok" aria-hidden="true"></span>
1820
Open Source &amp; Free Forever · MIT
1921
</span>
2022

@@ -23,15 +25,18 @@ const stats = [
2325
The Modern, <span class="text-primary">AI-Powered</span><br class="hidden sm:block" /> SQL IDE
2426
</h1>
2527

26-
<!-- Subtitle -->
28+
<!-- Subtitle: the seven engines read as SQL string literals — one hue, in-fiction -->
2729
<p class="mt-6 max-w-2xl text-[15px] leading-relaxed text-muted sm:text-base">
28-
A lightweight, high-performance, and enterprise-secure web-based SQL editor with SSO for cloud-native teams. Connect
29-
to <strong class="font-semibold text-primary">PostgreSQL</strong>,
30-
<strong class="font-semibold text-ok">MySQL</strong>, <strong class="font-semibold text-warn">Oracle</strong>,
31-
<strong class="font-semibold text-primary">SQL Server</strong>, <strong class="font-semibold text-ai">SQLite</strong
32-
>,
33-
<strong class="font-semibold text-ok">MongoDB</strong>, or <strong class="font-semibold text-bad">Redis</strong>
34-
&mdash; from anywhere.
30+
The open-source SQL IDE for the web — speaks{' '}
31+
{
32+
databases.map((db, i) => (
33+
<>
34+
<span class="sql-str">'{db}'</span>
35+
{i < databases.length - 1 ? ', ' : '. '}
36+
</>
37+
))
38+
}
39+
SSO built in, runs anywhere.
3540
</p>
3641

3742
<!-- CTAs -->
@@ -74,54 +79,43 @@ const stats = [
7479

7580
<!-- Hint (only meaningful on desktop where the explorer drives navigation) -->
7681
<p class="mt-8 hidden text-[13px] leading-relaxed text-faint lg:block">
77-
<span class="sql-com">-- tip: pick a page from the explorer on the left.</span><br />
78-
<span class="sql-com">-- each menu item runs a query and returns its content below.</span>
82+
<span class="sql-com">-- tip: every item in the explorer runs a query. pick one.</span>
7983
</p>
8084

8185
<!-- The LibreDB family / open-core (secondary; Studio stays the hero above) -->
8286
<div class="mt-12 border-t border-edge pt-8">
83-
<p class="text-[11px] tracking-wider text-faint uppercase">The LibreDB family — one spine, three faces</p>
87+
<p class="text-[11px] tracking-wider text-faint uppercase">The LibreDB family — one core, three products</p>
8488
<div class="mt-4 grid grid-cols-1 gap-px overflow-hidden border border-edge bg-edge sm:grid-cols-3">
8589
<a href="/database" class="flex flex-col bg-panel p-5 transition-colors hover:bg-raised">
8690
<div class="flex items-baseline justify-between gap-2">
87-
<h3 class="text-[15px] font-bold text-fg">database</h3>
88-
<span class="text-[10.5px] text-warn">OSS · pre-alpha</span>
91+
<h3 class="text-[15px] font-bold text-bright">database</h3>
92+
<span class="text-[11px] text-dim">OSS · pre-alpha</span>
8993
</div>
90-
<p class="mt-2 text-[12.5px] leading-relaxed text-dim">
94+
<p class="mt-2 text-[12px] leading-relaxed text-dim">
9195
The plain core — an embedded, multimodal engine you can read in one sitting.
9296
</p>
9397
</a>
94-
<a href="/" class="flex flex-col bg-raised p-5 ring-1 ring-primary/40 ring-inset">
98+
<div class="flex flex-col bg-raised p-5 ring-1 ring-primary/40 ring-inset">
9599
<div class="flex items-baseline justify-between gap-2">
96-
<h3 class="text-[15px] font-bold text-primary">studio</h3>
97-
<span class="text-[10.5px] text-ok">OSS · stable</span>
100+
<h3 class="text-[15px] font-bold text-bright">studio</h3>
101+
<span class="text-[11px] text-ok">OSS · stable</span>
98102
</div>
99-
<p class="mt-2 text-[12.5px] leading-relaxed text-dim">
100-
The readable face — the AI-powered SQL IDE for every database. <span class="text-primary">← you are here</span
101-
>
103+
<p class="mt-2 text-[12px] leading-relaxed text-dim">
104+
The readable face — the AI-powered SQL IDE for every database. <span class="text-dim">← you are here</span>
102105
</p>
103-
</a>
106+
</div>
104107
<a href="/platform" class="flex flex-col bg-panel p-5 transition-colors hover:bg-raised">
105108
<div class="flex items-baseline justify-between gap-2">
106-
<h3 class="text-[15px] font-bold text-ai">platform</h3>
107-
<span class="text-[10.5px] text-ai">beta</span>
109+
<h3 class="text-[15px] font-bold text-bright">platform</h3>
110+
<span class="text-[11px] text-dim">beta</span>
108111
</div>
109-
<p class="mt-2 text-[12.5px] leading-relaxed text-dim">
112+
<p class="mt-2 text-[12px] leading-relaxed text-dim">
110113
Managed for teams — Database Access Governance: authorized, audited, multi-tenant.
111114
</p>
112115
</a>
113116
</div>
114117
<p class="mt-4 text-[13px] leading-relaxed text-dim">
115-
<span class="sql-com">-- open core: Studio is free &amp; open; Platform funds the open-source work.</span><br />
116-
<span class="sql-com"
117-
>-- Studio opens live with a ready-to-use LibreDB sample across all three lenses, zero setup.</span
118-
><br />
119-
<span class="sql-com">-- love the open-source work? </span><a
120-
href="https://github.com/sponsors/libredb"
121-
target="_blank"
122-
rel="noopener noreferrer"
123-
class="text-ok hover:underline">sponsor us ♥</a
124-
>
118+
<span class="sql-com">-- open core: Studio is free &amp; open; Platform funds the work.</span>
125119
</p>
126120
</div>
127121
</div>

‎src/components/sections/ProvidersSection.astro‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const databases: DB[] = [
5858
name: 'Redis',
5959
type: 'key-value',
6060
driver: 'redis',
61-
color: 'text-bad',
61+
color: 'text-keyword',
6262
summary: 'Key-value store support with key browser, TTL management, and memory monitoring.',
6363
},
6464
{

‎src/components/sections/TechStackSection.astro‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ interface Layer {
1010
const layers: Layer[] = [
1111
{
1212
layer: 'FRONTEND',
13-
color: 'text-primary',
13+
color: 'text-bright',
1414
tools: [
1515
{ name: 'Next.js 16', role: 'App Router' },
1616
{ name: 'React 19', role: 'Server Components' },
@@ -20,7 +20,7 @@ const layers: Layer[] = [
2020
},
2121
{
2222
layer: 'EDITOR & DATA',
23-
color: 'text-ok',
23+
color: 'text-bright',
2424
tools: [
2525
{ name: 'Monaco Editor', role: 'VS Code Engine' },
2626
{ name: 'TanStack Table', role: 'Data Grid' },
@@ -30,7 +30,7 @@ const layers: Layer[] = [
3030
},
3131
{
3232
layer: 'AI & AUTH',
33-
color: 'text-ai',
33+
color: 'text-bright',
3434
tools: [
3535
{ name: 'Gemini 2.5', role: 'Default LLM' },
3636
{ name: 'OpenAI / Claude', role: 'Alternatives' },
@@ -40,7 +40,7 @@ const layers: Layer[] = [
4040
},
4141
{
4242
layer: 'DEVOPS',
43-
color: 'text-warn',
43+
color: 'text-bright',
4444
tools: [
4545
{ name: 'Docker', role: 'Container' },
4646
{ name: 'Kubernetes', role: 'Orchestration' },

0 commit comments

Comments
 (0)