umanggarg Claude Sonnet 4.6 commited on
Commit
22232b0
·
1 Parent(s): 48b0262

feat(ui): cool-dark base theme — warm cream/sienna now pops on Linear-style bg

Browse files

Switch all background tokens from warm graphite (#1A1916) to cool near-black
(#0E0F14) while keeping every foreground value identical (cream text, sienna
accent, Anthropic fonts). Temperature contrast principle: the same warm palette
appears more luminous against a cool base — like Linear/Raycast.

- :root --bg → #0E0F14, surfaces → cool slate stack
- Borders → rgba(255,255,255,…) for crisper edges on cool base
- Shadows → rgba(0,0,8,…) for deeper cool shadows
- Glass headers/bars → rgba(10,11,16,…)
- Body bloom opacity +20% (warm glow punches harder against cool bg)
- Mermaid diagram colours updated to match cool base
- All hardcoded #141210 / rgba(20,18,14,…) values swept across JSX files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

ui/src/components/MermaidBlock.jsx CHANGED
@@ -17,18 +17,17 @@ mermaid.initialize({
17
  startOnLoad: false,
18
  theme: "dark",
19
  themeVariables: {
20
- background: "#1a1714",
21
- primaryColor: "#2a2420",
22
- /* Stronger border and text contrast the previous violet theme had
23
- readability issues here; warm cream at higher opacity fixes it */
24
  primaryBorderColor: "rgba(237,228,206,0.28)",
25
- primaryTextColor: "#f0ead8", /* brighter than #ede8ce for legibility */
26
  lineColor: "rgba(237,228,206,0.55)", /* edges clearly visible */
27
- secondaryColor: "#221e1a",
28
- tertiaryColor: "#1e1b17",
29
- edgeLabelBackground: "#1a1714", /* prevents label bleed-through on edges */
30
- clusterBkg: "#211e1a",
31
- clusterBorder: "rgba(237,228,206,0.18)",
32
  titleColor: "#ede8ce",
33
  nodeTextColor: "#f0ead8",
34
  },
@@ -95,8 +94,8 @@ function Diagram({ mermaid: rawText }) {
95
  </div>
96
  <pre style={{
97
  fontSize: 12, opacity: 0.5, margin: 0, padding: "8px 10px",
98
- background: "#141210", borderRadius: 6,
99
- border: "1px solid rgba(237,228,206,0.06)", overflow: "auto",
100
  }}>
101
  {text}
102
  </pre>
@@ -171,7 +170,7 @@ function DiagramModal({ text, onClose }) {
171
  ref={containerRef}
172
  style={{
173
  width: "92vw", height: "88vh",
174
- background: "#1a1714",
175
  border: "1px solid var(--border)",
176
  borderRadius: "var(--radius-lg)",
177
  overflow: "hidden",
@@ -222,7 +221,7 @@ function DiagramModal({ text, onClose }) {
222
  }
223
 
224
  const btnStyle = {
225
- background: "rgba(20,18,16,0.9)",
226
  border: "1px solid var(--border)",
227
  borderRadius: "var(--radius-sm)",
228
  color: "var(--text-2)",
@@ -243,7 +242,7 @@ export default function MermaidBlock({ mermaid: text }) {
243
  <div style={{
244
  border: "1px solid var(--border)",
245
  borderRadius: "var(--radius)",
246
- background: "#1a1714",
247
  overflow: "auto",
248
  minHeight: 120,
249
  maxHeight: 480,
 
17
  startOnLoad: false,
18
  theme: "dark",
19
  themeVariables: {
20
+ background: "#0e0f14", /* matches cool --bg */
21
+ primaryColor: "#1a1b24", /* matches cool --surface-2 */
22
+ /* Warm cream borders/text pop more against the cool base */
 
23
  primaryBorderColor: "rgba(237,228,206,0.28)",
24
+ primaryTextColor: "#f0ead8", /* brighter than #ede8ce for legibility */
25
  lineColor: "rgba(237,228,206,0.55)", /* edges clearly visible */
26
+ secondaryColor: "#13141c", /* matches cool --surface */
27
+ tertiaryColor: "#21222e", /* matches cool --surface-3 */
28
+ edgeLabelBackground: "#0e0f14", /* prevents label bleed-through on edges */
29
+ clusterBkg: "#21222e", /* matches cool --surface-3 */
30
+ clusterBorder: "rgba(255,255,255,0.10)",
31
  titleColor: "#ede8ce",
32
  nodeTextColor: "#f0ead8",
33
  },
 
94
  </div>
95
  <pre style={{
96
  fontSize: 12, opacity: 0.5, margin: 0, padding: "8px 10px",
97
+ background: "#090A0F", borderRadius: 6,
98
+ border: "1px solid rgba(255,255,255,0.06)", overflow: "auto",
99
  }}>
100
  {text}
101
  </pre>
 
170
  ref={containerRef}
171
  style={{
172
  width: "92vw", height: "88vh",
173
+ background: "#0e0f14",
174
  border: "1px solid var(--border)",
175
  borderRadius: "var(--radius-lg)",
176
  overflow: "hidden",
 
221
  }
222
 
223
  const btnStyle = {
224
+ background: "rgba(10,11,16,0.9)",
225
  border: "1px solid var(--border)",
226
  borderRadius: "var(--radius-sm)",
227
  color: "var(--text-2)",
 
242
  <div style={{
243
  border: "1px solid var(--border)",
244
  borderRadius: "var(--radius)",
245
+ background: "#0e0f14",
246
  overflow: "auto",
247
  minHeight: 120,
248
  maxHeight: 480,
ui/src/components/Message.jsx CHANGED
@@ -48,7 +48,7 @@ const mdComponents = {
48
  <SyntaxHighlighter
49
  language={lang}
50
  style={oneDark}
51
- customStyle={{ fontSize: 13, background: '#141210', borderRadius: 8, border: '1px solid rgba(237,228,206,0.08)', borderLeft: '2px solid rgba(212,132,90,0.45)', margin: '10px 0' }}
52
  >
53
  {String(children).replace(/\n$/, "")}
54
  </SyntaxHighlighter>
 
48
  <SyntaxHighlighter
49
  language={lang}
50
  style={oneDark}
51
+ customStyle={{ fontSize: 13, background: '#090A0F', borderRadius: 8, border: '1px solid rgba(255,255,255,0.07)', borderLeft: '2px solid rgba(212,132,90,0.45)', margin: '10px 0' }}
52
  >
53
  {String(children).replace(/\n$/, "")}
54
  </SyntaxHighlighter>
ui/src/components/SourceCard.jsx CHANGED
@@ -134,8 +134,8 @@ export default function SourceCard({ source, index, showRepo = false }) {
134
  <SyntaxHighlighter
135
  language={lang}
136
  style={oneDark}
137
- customStyle={{ fontSize: 12, margin: 0, background: '#141210', borderRadius: 0 }}
138
- lineNumberStyle={{ color: 'rgba(237,228,206,0.22)', fontSize: 11, minWidth: 36, paddingRight: 12 }}
139
  showLineNumbers
140
  startingLineNumber={source.start_line} /* start_line = class range when expanded */
141
  >
 
134
  <SyntaxHighlighter
135
  language={lang}
136
  style={oneDark}
137
+ customStyle={{ fontSize: 12, margin: 0, background: '#090A0F', borderRadius: 0 }}
138
+ lineNumberStyle={{ color: 'rgba(255,255,255,0.18)', fontSize: 11, minWidth: 36, paddingRight: 12 }}
139
  showLineNumbers
140
  startingLineNumber={source.start_line} /* start_line = class range when expanded */
141
  >
ui/src/index.css CHANGED
@@ -1,12 +1,11 @@
1
  /* ═══════════════════════════════════════════════════════════════════════
2
- SKETCHBOOK DARK
3
- Palette: dark charcoal paper + burnt sienna ink.
4
- The classic artist's sketchbook opened in dim light.
5
- Background: warm graphite (#1A1916) — Moleskine at night, not cold tech.
6
- Text: warm parchment (#EDE4CE) — aged paper, not sterile white.
7
- Accent: burnt sienna (#D4845A) THE classic illustration pigment.
8
- Warmer and earthier than amber, more "drawn" than digital.
9
- Every surface is slightly warm — no cold values anywhere.
10
  ════════════════════════════════════════════════════════════════════════ */
11
  @font-face {
12
  font-family: "Anthropic Sans";
@@ -45,22 +44,22 @@
45
  }
46
 
47
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
48
- html { height: 100dvh; background: #1A1916; overflow: hidden; }
49
 
50
  :root {
51
- /* ── Dark charcoal backgrounds — artist's sketchbook at night ──
52
- Every bg value is warm brown-charcoal, never cold.
53
- Like graphite pencil on dark paper the warmth is in the grain. */
54
- --bg: #1A1916; /* canvas — dark charcoal sketchbook */
55
- --surface: #211E1A; /* sidebar, panels — first elevation */
56
- --surface-2: #2A2620; /* cards, source items — second elevation */
57
- --surface-3: #332E27; /* modals, active items — third elevation */
58
- --surface-4: #3D3830; /* hover states, tooltips — highest elevation */
59
-
60
- /* Borders — warm cream rgba, not cold white */
61
- --border: rgba(237, 228, 206, 0.08);
62
- --border-subtle: rgba(237, 228, 206, 0.04);
63
- --border-strong: rgba(237, 228, 206, 0.14);
64
 
65
  /* Text — warm parchment, not cold white.
66
  Like ink on aged paper — every tier is warm brown-cream. */
@@ -115,15 +114,15 @@ html { height: 100dvh; background: #1A1916; overflow: hidden; }
115
  --transition: 200ms ease;
116
  --transition-slow: 300ms ease;
117
 
118
- /* Shadows — slightly warm tint in deep shadows */
119
- --shadow-sm: 0 1px 3px rgba(10,6,4,0.60), 0 1px 2px rgba(10,6,4,0.40);
120
- --shadow: 0 4px 16px rgba(10,6,4,0.70), 0 2px 8px rgba(10,6,4,0.50);
121
- --shadow-lg: 0 12px 40px rgba(10,6,4,0.80), 0 4px 16px rgba(10,6,4,0.60);
122
- --shadow-accent: 0 0 20px rgba(212, 132, 90, 0.22);
123
 
124
  /* Glass */
125
- --glass-bg: rgba(26, 25, 22, 0.82);
126
- --glass-border: rgba(237, 228, 206, 0.07);
127
  --blur: 16px;
128
  }
129
 
@@ -135,17 +134,18 @@ body {
135
  font-family: var(--sans);
136
  font-size: 15px;
137
  line-height: 1.65;
138
- background: #1A1916;
139
  color: var(--text);
140
  height: 100%;
141
  overflow: hidden;
142
  -webkit-font-smoothing: antialiased;
143
  -moz-osx-font-smoothing: grayscale;
144
- /* Deep atmospheric bloom — LiteLLM style: bold primary bloom, counter-bloom, center warmth */
 
145
  background-image:
146
- radial-gradient(ellipse 70% 55% at -5% 0%, rgba(180, 80, 40, 0.32) 0%, transparent 65%),
147
- radial-gradient(ellipse 50% 40% at 105% 100%, rgba(160, 100, 60, 0.18) 0%, transparent 60%),
148
- radial-gradient(ellipse 80% 30% at 50% 50%, rgba(212, 132, 90, 0.05) 0%, transparent 70%);
149
  animation: page-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) both;
150
  }
151
 
@@ -215,8 +215,8 @@ textarea:focus-visible {
215
  background:
216
  /* Top-left violet bloom — the brand "light source" */
217
  radial-gradient(ellipse 180% 40% at 0% 0%, rgba(212, 132, 90, 0.10) 0%, transparent 55%),
218
- /* Sidebar: warm charcoal, one step darker than canvas */
219
- #141210;
220
  border-right: 1px solid rgba(237, 228, 206, 0.06);
221
  display: flex;
222
  flex-direction: column;
@@ -323,7 +323,7 @@ textarea:focus-visible {
323
 
324
  /* ── Ingest card — wraps the form + try-these to give primary action visual weight ── */
325
  .ingest-card {
326
- /* surface-3 on #141210 sidebar = 18% vs 7% lightness — clearly elevated */
327
  background: var(--surface-3);
328
  border: 1px solid var(--border-strong);
329
  border-radius: 16px;
@@ -596,8 +596,8 @@ textarea:focus-visible {
596
  display: flex;
597
  align-items: center;
598
  gap: 12px;
599
- /* Frosted glass header — warm charcoal, not cold black */
600
- background: rgba(20, 18, 14, 0.82);
601
  backdrop-filter: blur(16px) saturate(160%);
602
  -webkit-backdrop-filter: blur(16px) saturate(160%);
603
  min-height: 52px;
@@ -840,7 +840,7 @@ textarea:focus-visible {
840
 
841
  .bubble pre {
842
  /* Better code block — darker, more contrast */
843
- background: #141210 !important;
844
  border: 1px solid var(--border) !important;
845
  border-radius: var(--radius) !important;
846
  margin: 12px 0 !important;
@@ -1125,7 +1125,7 @@ textarea:focus-visible {
1125
  padding: 10px 20px 14px;
1126
  border-top: none;
1127
  /* Very faint bg gradient to separate input zone from messages */
1128
- background: linear-gradient(to top, rgba(20,18,16,0.85) 0%, transparent 100%);
1129
  display: flex;
1130
  flex-direction: column;
1131
  position: relative;
@@ -1219,7 +1219,9 @@ textarea:focus-visible {
1219
  Sitting content in the upper ~40% feels more intentional and mirrors
1220
  how Linear / Raycast handle their empty states. */
1221
  justify-content: flex-start;
1222
- padding: max(8vh, 56px) 24px 40px;
 
 
1223
  overflow-y: auto;
1224
  position: relative;
1225
  }
@@ -1789,7 +1791,7 @@ textarea:focus-visible {
1789
  border: 1px solid var(--border);
1790
  border-radius: var(--radius);
1791
  box-shadow:
1792
- 0 -4px 24px rgba(10,6,4,0.55),
1793
  0 0 0 1px rgba(237,228,206,0.06);
1794
  z-index: 200;
1795
  overflow: hidden;
@@ -1952,7 +1954,7 @@ textarea:focus-visible {
1952
  padding: 11px 24px;
1953
  border-bottom: 1px solid var(--border);
1954
  flex-shrink: 0;
1955
- background: rgba(20, 18, 14, 0.85);
1956
  backdrop-filter: blur(8px);
1957
  }
1958
 
@@ -1977,7 +1979,7 @@ textarea:focus-visible {
1977
  padding: 8px 24px;
1978
  border-bottom: 1px solid var(--border-subtle);
1979
  flex-shrink: 0;
1980
- background: rgba(20, 18, 14, 0.55);
1981
  }
1982
 
1983
  .legend-item {
@@ -2137,7 +2139,7 @@ textarea:focus-visible {
2137
  padding: 14px 24px;
2138
  border-bottom: 1px solid var(--border-subtle);
2139
  flex-shrink: 0;
2140
- background: rgba(20, 18, 14, 0.70);
2141
  }
2142
 
2143
  .diagram-type-btn {
@@ -2420,7 +2422,7 @@ textarea:focus-visible {
2420
  .agent-step-body {
2421
  flex: 1;
2422
  min-width: 0;
2423
- background: rgba(20,18,16,0.75);
2424
  border: 1px solid var(--border);
2425
  border-radius: var(--radius);
2426
  padding: 7px 11px;
 
1
  /* ═══════════════════════════════════════════════════════════════════════
2
+ COOL DARK (Linear / Raycast base + warm Anthropic foreground)
3
+ Palette: cool near-black base + burnt sienna ink + warm cream text.
4
+ Background: cool graphite (#0E0F14) temperature contrast base.
5
+ Text: warm parchment (#EDE4CE) — glows MORE against cool, not warm.
6
+ Accent: burnt sienna (#D4845A) — the classic illustration pigment.
7
+ Principle: cool foil for warm jewels same cream/sienna palette
8
+ appears MORE luminous on a cool base (like candlelight in a dark room).
 
9
  ════════════════════════════════════════════════════════════════════════ */
10
  @font-face {
11
  font-family: "Anthropic Sans";
 
44
  }
45
 
46
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
47
+ html { height: 100dvh; background: #0E0F14; overflow: hidden; }
48
 
49
  :root {
50
+ /* ── Cool near-black backgrounds — temperature-contrast base ──
51
+ Cool base makes the warm foreground (cream text, sienna accent) pop.
52
+ Same principle as Linear/Raycast: neutral stage, warm performers. */
53
+ --bg: #0E0F14; /* canvas — cool near-black */
54
+ --surface: #13141C; /* sidebar, panels — first elevation */
55
+ --surface-2: #1A1B24; /* cards, source items — second elevation */
56
+ --surface-3: #21222E; /* modals, active items — third elevation */
57
+ --surface-4: #292A38; /* hover states, tooltips — highest elevation */
58
+
59
+ /* Borders — pure white rgba (not warm) for crisper edges on cool base */
60
+ --border: rgba(255, 255, 255, 0.07);
61
+ --border-subtle: rgba(255, 255, 255, 0.04);
62
+ --border-strong: rgba(255, 255, 255, 0.10);
63
 
64
  /* Text — warm parchment, not cold white.
65
  Like ink on aged paper — every tier is warm brown-cream. */
 
114
  --transition: 200ms ease;
115
  --transition-slow: 300ms ease;
116
 
117
+ /* Shadows — cool-tinted deep shadows (no warm brown) */
118
+ --shadow-sm: 0 1px 3px rgba(0,0,8,0.65), 0 1px 2px rgba(0,0,8,0.45);
119
+ --shadow: 0 4px 16px rgba(0,0,8,0.75), 0 2px 8px rgba(0,0,8,0.55);
120
+ --shadow-lg: 0 12px 40px rgba(0,0,8,0.85), 0 4px 16px rgba(0,0,8,0.65);
121
+ --shadow-accent: 0 0 20px rgba(212, 132, 90, 0.25);
122
 
123
  /* Glass */
124
+ --glass-bg: rgba(14, 15, 20, 0.82);
125
+ --glass-border: rgba(255, 255, 255, 0.06);
126
  --blur: 16px;
127
  }
128
 
 
134
  font-family: var(--sans);
135
  font-size: 15px;
136
  line-height: 1.65;
137
+ background: #0E0F14;
138
  color: var(--text);
139
  height: 100%;
140
  overflow: hidden;
141
  -webkit-font-smoothing: antialiased;
142
  -moz-osx-font-smoothing: grayscale;
143
+ /* Atmospheric bloom — warm sienna punches harder against cool base.
144
+ Increased opacity vs warm-bg version because cool contrast amplifies it. */
145
  background-image:
146
+ radial-gradient(ellipse 70% 55% at -5% 0%, rgba(180, 80, 40, 0.40) 0%, transparent 65%),
147
+ radial-gradient(ellipse 50% 40% at 105% 100%, rgba(160, 100, 60, 0.22) 0%, transparent 60%),
148
+ radial-gradient(ellipse 80% 30% at 50% 50%, rgba(212, 132, 90, 0.06) 0%, transparent 70%);
149
  animation: page-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) both;
150
  }
151
 
 
215
  background:
216
  /* Top-left violet bloom — the brand "light source" */
217
  radial-gradient(ellipse 180% 40% at 0% 0%, rgba(212, 132, 90, 0.10) 0%, transparent 55%),
218
+ /* Sidebar: cool charcoal, one step darker than canvas */
219
+ #0A0B10;
220
  border-right: 1px solid rgba(237, 228, 206, 0.06);
221
  display: flex;
222
  flex-direction: column;
 
323
 
324
  /* ── Ingest card — wraps the form + try-these to give primary action visual weight ── */
325
  .ingest-card {
326
+ /* surface-3 on #0A0B10 sidebar = clearly elevated */
327
  background: var(--surface-3);
328
  border: 1px solid var(--border-strong);
329
  border-radius: 16px;
 
596
  display: flex;
597
  align-items: center;
598
  gap: 12px;
599
+ /* Frosted glass header — cool near-black with warm text overlay */
600
+ background: rgba(10, 11, 16, 0.82);
601
  backdrop-filter: blur(16px) saturate(160%);
602
  -webkit-backdrop-filter: blur(16px) saturate(160%);
603
  min-height: 52px;
 
840
 
841
  .bubble pre {
842
  /* Better code block — darker, more contrast */
843
+ background: #090A0F !important;
844
  border: 1px solid var(--border) !important;
845
  border-radius: var(--radius) !important;
846
  margin: 12px 0 !important;
 
1125
  padding: 10px 20px 14px;
1126
  border-top: none;
1127
  /* Very faint bg gradient to separate input zone from messages */
1128
+ background: linear-gradient(to top, rgba(10,11,16,0.85) 0%, transparent 100%);
1129
  display: flex;
1130
  flex-direction: column;
1131
  position: relative;
 
1219
  Sitting content in the upper ~40% feels more intentional and mirrors
1220
  how Linear / Raycast handle their empty states. */
1221
  justify-content: flex-start;
1222
+ /* Bottom padding scales with viewport height — ensures step 3 never
1223
+ crowds the chat bar on compact viewports */
1224
+ padding: max(6vh, 48px) 24px max(80px, 10vh);
1225
  overflow-y: auto;
1226
  position: relative;
1227
  }
 
1791
  border: 1px solid var(--border);
1792
  border-radius: var(--radius);
1793
  box-shadow:
1794
+ 0 -4px 24px rgba(0,0,8,0.55),
1795
  0 0 0 1px rgba(237,228,206,0.06);
1796
  z-index: 200;
1797
  overflow: hidden;
 
1954
  padding: 11px 24px;
1955
  border-bottom: 1px solid var(--border);
1956
  flex-shrink: 0;
1957
+ background: rgba(10, 11, 16, 0.85);
1958
  backdrop-filter: blur(8px);
1959
  }
1960
 
 
1979
  padding: 8px 24px;
1980
  border-bottom: 1px solid var(--border-subtle);
1981
  flex-shrink: 0;
1982
+ background: rgba(10, 11, 16, 0.55);
1983
  }
1984
 
1985
  .legend-item {
 
2139
  padding: 14px 24px;
2140
  border-bottom: 1px solid var(--border-subtle);
2141
  flex-shrink: 0;
2142
+ background: rgba(10, 11, 16, 0.70);
2143
  }
2144
 
2145
  .diagram-type-btn {
 
2422
  .agent-step-body {
2423
  flex: 1;
2424
  min-width: 0;
2425
+ background: rgba(10,11,16,0.75);
2426
  border: 1px solid var(--border);
2427
  border-radius: var(--radius);
2428
  padding: 7px 11px;