Skip to content

UI style: restyle theme with new fonts and color palette#1028

Open
liviolanda wants to merge 3 commits into
mainfrom
restyle-theme-fonts-colors
Open

UI style: restyle theme with new fonts and color palette#1028
liviolanda wants to merge 3 commits into
mainfrom
restyle-theme-fonts-colors

Conversation

@liviolanda

@liviolanda liviolanda commented Jun 27, 2026

Copy link
Copy Markdown
Collaborator
  • add self-hosted fonts: Mona Sans (body), Mozilla Text (headings), Space Mono (code)
  • introduce full light and dark color palette with a cohesive slate dark theme
  • fix dark-mode border visibility across form controls (input, select, switch, toggle, etc.)
  • make chat-input font size responsive and match its background/outline to slate
  • darken the user message bubble slightly in light mode
  • remove sidebar section dividers

Note

High Risk
Unresolved merge conflicts in chat-prompt-input.tsx and message-bubbles.tsx will break the build and may drop attachment UI if the wrong side is kept.

Overview
Visual refresh replaces the oklch-based theme with a cohesive hex palette for light and dark (slate dark), remaps Tailwind white/black to off-white and slate, and wires Mona Sans (UI), EB Garamond (headings via base layer), and Space Mono (code) through @fontsource imports in index.tsx. theme-provider and provider SVG fills now use the same off-white/dark background colors instead of #fff / #0a0a0a.

Form and shell polish: shared controls (input, select, textarea, combobox, toggle outline, switch in dark) switch default borders from border-input to border-border for clearer edges; the chat prompt overlay/textarea use var(--font-size-body) instead of text-base. Sidebars drop separators and several top/bottom borders (header, footer).

Chat-specific: user text bubbles move from bg-muted to bg-accent with text-[14px] in light/dark.

Blocker: the diff still contains unresolved <<<<<<< / ======= / >>>>>>> markers in chat-prompt-input.tsx (prompt container classes: bg-card + dark oklch vs bg-sidebar) and message-bubbles.tsx (HEAD attachment/FileCard flow vs a stripped text-only branch)—the PR cannot build until those are resolved.

Reviewed by Cursor Bugbot for commit fd56588. Bugbot is set up for automated code reviews on this repo. Configure here.

@github-actions

Copy link
Copy Markdown

Semgrep Security Scan

No security issues found.

@liviolanda liviolanda requested review from cjroth and ital0 and removed request for ital0 June 27, 2026 14:28

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔭 thunder-deep-review (advisory)

Reviewed the diff — no issues to report. ✅ Never approves, never requests changes, never gates merge.
head: 2a33ea40ad42 · mode: single · deferred 1 item(s) already reported by other bots (best-effort dedup)

@github-actions

Copy link
Copy Markdown

Preview environment deployed 🚀

Service URL
Marketing / blog / docs https://thunderbolt-pr-1028.preview.thunderbolt.io
App https://app-pr-1028.preview.thunderbolt.io
API https://api-pr-1028.preview.thunderbolt.io
Keycloak https://auth-pr-1028.preview.thunderbolt.io
PowerSync https://powersync-pr-1028.preview.thunderbolt.io

Stack: preview-pr-1028 · Commit: 2a33ea40ad42ab78b5827475897b646f0b9aa0f5

Auto-destroys on PR close/merge. Login via the bundled Keycloak realm — demo@thunderbolt.io / demo by default.

@github-actions

github-actions Bot commented Jun 27, 2026

Copy link
Copy Markdown

PR Metrics

Metric Value
Lines changed (prod code) +142 / -104
JS bundle size (gzipped) Build failed
Test coverage 🟢 77.02% → 78.21% (+1.2%)
Performance (preview) Preview not ready — Render deploy may have timed out
Accessibility
Best Practices
SEO

Updated Mon, 06 Jul 2026 14:21:06 GMT · run #2189

Comment thread src/components/chat/message-bubbles.tsx Outdated
.filter((part) => part.type === 'text')
.map((part, j) => (
<div key={j} className="px-4 rounded-2xl max-w-3/4 bg-muted dark:bg-secondary/60 ml-auto mt-6">
<div key={j} className="px-4 rounded-2xl max-w-3/4 bg-[#e8e8e8] dark:bg-secondary/60 ml-auto mt-6">

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this hardcodes a raw hex (#e8e8e8) for the light-mode bubble. Looks like we have a bg-accent token that's #e7e7e7. Would it make sense to use it or create a new token for this value?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

create a new token!

Comment thread src/index.tsx
import './polyfills'

// Self-hosted fonts (offline-capable). Variable fonts ship all weights in one file.
import '@fontsource-variable/mona-sans'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The bare @fontsource-variable/* import pulls every unicode subset (latin, latin-ext, cyrillic, greek, vietnamese, …) plus the full weight axis into the entry bundle, which loads on the landing path. If we only need latin, importing the scoped subset CSS (e.g. the latin/weight-axis file) would ship a lot fewer bytes. Was loading all subsets intended?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no, don't know how to fix it. would you help me?

Comment thread src/index.tsx Outdated

// Self-hosted fonts (offline-capable). Variable fonts ship all weights in one file.
import '@fontsource-variable/mona-sans'
import '@fontsource-variable/dm-sans'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DM Sans is listed only as a fallback after Mona Sans in --font-sans, but both are self-hosted. So Mona Sans always loads and DM Sans never actually renders, while still being downloaded. Would it makese to drop the DM Sans import and let ui-sans-serif / system-ui be the real fallback?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes!

root.classList.add(systemTheme)

const bgColor = systemTheme === 'dark' ? '#0a0a0a' : '#fff'
const bgColor = systemTheme === 'dark' ? '#1a2329' : '#fafafa'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pre-paint theme colors stale

Medium Severity

This PR updates theme-provider surface colors to #fafafa / #1a2329, but the inline pre-hydration script in index.html still sets #fff / #0a0a0a on documentElement and meta theme-color. Users see the old palette on first paint and in browser chrome until React mounts, then colors jump to the new slate theme.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 53c3984. Configure here.

root.classList.add(theme)

const bgColor = theme === 'dark' ? '#0a0a0a' : '#fff'
const bgColor = theme === 'dark' ? '#1a2329' : '#fafafa'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Chrome background mismatches page

Low Severity

In light mode, theme-provider sets documentElement and meta theme-color to #fafafa, while index.css sets body background to #f5f5f5 via --color-background. Overscroll, safe areas, and any gap around the body can show a lighter band than the main app surface after load.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 53c3984. Configure here.

Comment thread src/index.css
.filter((part) => part.type === 'text')
.map((part, j) => (
<div key={j} className="px-4 rounded-2xl max-w-3/4 bg-muted dark:bg-secondary/60 ml-auto mt-6">
<div key={j} className="px-4 rounded-2xl max-w-3/4 bg-accent dark:bg-secondary/60 ml-auto mt-6 text-[14px]">

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

User bubble ignores responsive font

Medium Severity

User message bubbles use a fixed text-[14px] while the same PR switches the chat prompt and --font-size-body to scale (16px on mobile, 14px from the md breakpoint), so user text can render smaller than the composer on narrow viewports.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit fae3d2c. Configure here.

Livia Holanda added 3 commits July 6, 2026 11:14
- add self-hosted fonts: Mona Sans (body), Mozilla Text (headings), Space Mono (code)
- introduce full light and dark color palette with a cohesive slate dark theme
- fix dark-mode border visibility across form controls (input, select, switch, toggle, etc.)
- make chat-input font size responsive and match its background/outline to slate
- darken the user message bubble slightly in light mode
- remove sidebar section dividers
- Remap Tailwind --color-white to #fafafa and --color-black to #1a2329
  so nothing renders as #ffffff/#000000; apply the same in provider-icon
  SVG fills and theme-provider hardcoded colors
- Swap heading font from Mozilla Text to EB Garamond and drop DM Sans
  from the body stack
- Set explicit 14px on chat message bubbles
- Restyle skill-form Description/Instructions labels (responsive 14px,
  new foreground colors)
@liviolanda liviolanda force-pushed the restyle-theme-fonts-colors branch from fae3d2c to fd56588 Compare July 6, 2026 14:14

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

There are 5 total unresolved issues (including 3 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit fd56588. Configure here.

className="relative z-10 flex flex-col w-full gap-0 rounded-2xl border bg-card p-2 dark:border-input dark:bg-[oklch(0.182_0_0)]"
=======
className="flex flex-col w-full gap-0 rounded-2xl border bg-sidebar p-2"
>>>>>>> 2a33ea40 (style: restyle theme with new fonts and color palette)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unmerged conflict markers remain

High Severity

The chat prompt className prop still contains Git conflict markers (<<<<<<<, =======, >>>>>>>) with two competing values. That invalid JSX prevents the file from parsing and blocks the app from building until the merge is resolved.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit fd56588. Configure here.

.filter((part) => part.type === 'text')
.map((part, j) => (
<div key={j} className="px-4 rounded-2xl max-w-3/4 bg-muted dark:bg-secondary/60 ml-auto mt-6">
<div key={j} className="px-4 rounded-2xl max-w-3/4 bg-accent dark:bg-secondary/60 ml-auto mt-6 text-[14px]">

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unmerged conflict breaks MessageBubbles

High Severity

message-bubbles.tsx still has Git conflict markers and two conflicting MessageBubbles implementations stitched together. The result is invalid JSX (mismatched tags), duplicate text-bubble rendering, and a reference to hasTransformer without an import in the kept HEAD block.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit fd56588. Configure here.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔭 thunder-deep-review (advisory)

Complements the other bots — surfaces only what they did not flag. Never approves, never requests changes, never gates merge.
head: fd5658805564 · mode: single · deferred 7 item(s) already reported by other bots (best-effort dedup)

Comment thread src/skills/skill-form.tsx
<label htmlFor="skill-description" className="flex items-center gap-1.5 text-base text-foreground">
<label
htmlFor="skill-description"
className="flex items-center gap-1.5 text-[length:var(--font-size-body)] text-[#393333] dark:text-[#f5f5f5]"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Convention — Hardcoded hex label colors instead of a theme token

This PR's whole thesis is "no pure white/black anywhere — use theme tokens," so it caught my eye that these two labels swap the old text-foreground for hardcoded text-[#393333] dark:text-[#f5f5f5]. Neither hex is in the new palette (light foreground is #211d1d, dark is #f2f7fc, and #f5f5f5 is actually the light background color being reused as dark text), and hardcoding them means these labels won't follow any future theme tweak. The same pattern repeats on line 201. Could we keep text-foreground here so they stay on-palette and theme-aware?

Comment thread src/index.css
--color-muted-foreground: #797979;
--color-accent: #e7e7e7;
--color-accent-foreground: #211d1d;
--color-destructive: #ff5f5f;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Convention — New destructive red may be too light for error text on light backgrounds

I wonder if the lighter --color-destructive: #ff5f5f hurts readability when used as text-destructive on the light surfaces. Against the new #f5f5f5 background it lands around 2.7:1 contrast, which is under the 4.5:1 WCAG AA bar for normal text (the previous saturated red was noticeably darker). It's fine as a button background with the dark destructive-foreground, but inline error/validation text could get hard to read. Might be worth a slightly darker red for the light theme, or verifying the AA contrast where destructive text appears.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants