Skip to content

Conversation

@FraCata00
Copy link

@FraCata00 FraCata00 commented Jan 6, 2026

Description

Add Gruvbox Dark and Light themes

Adds two new color themes based on the official Gruvbox palette:

  • Gruvbox Dark: Warm dark theme with earth-toned colors
  • Gruvbox Light: Warm light theme with cream backgrounds

Both themes feature:

  • Authentic Gruvbox color palette
  • Consistent syntax highlighting
  • Full coverage of all UI components (sidebar, modals, cards, etc.)

Ref #287

Contribution Checklist:

  • I've used AI significantly to create this pull request (just lb but not for everything)
  • The pull request only addresses one issue or adds one feature.
  • The pull request does not introduce any breaking changes
  • I have added screenshots or gifs to help explain the change if applicable.
  • I have read the contribution guidelines.
  • Create an issue and link to the pull request.

Note: Keeping the PR small and focused helps make it easier to review and merge. If you have multiple changes you want to make, please consider submitting them as separate pull requests.

Publishing to New Package Managers

Please see here for more information.

Screenshots

Theme selection

Screenshot 2026-01-06 at 22 45 19

Request page

Gruvbox Dark

Screenshot 2026-01-06 at 22 58 44

Gruvbox Light

Screenshot 2026-01-06 at 23 01 28

Summary by CodeRabbit

  • New Features
    • Added Gruvbox Dark and Gruvbox Light themes, selectable in app preferences.
    • Introduces a centralized color palette and extensive UI tokens for consistent styling across editors, sidebars, modals, toolbars, buttons, tables, and the code editor.
    • Enhances syntax highlighting, status/intent colors, inputs/overlays, and overall visual consistency throughout the app.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 6, 2026

Walkthrough

Adds full Gruvbox Dark and Light theme modules (exporting palette and default gruvbox*Theme) and registers gruvbox-dark and gruvbox-light in the central theme index for application availability.

Changes

Cohort / File(s) Summary
Gruvbox Theme Definitions
packages/bruno-app/src/themes/dark/gruvbox.js, packages/bruno-app/src/themes/light/gruvbox.js
New theme modules. Export named palette and default gruvbox*Theme. Introduce centralized palette (primary, hues, system, background, text, overlay, border, utility), intent & syntax mappings, and extensive UI tokens (accents, backgrounds, status, overlays, typography, shadows, borders, inputs, sidebar, dropdown, workspace, requests, codemirror, tables, grids, scrollbars, dragAndDrop, statusBar, console, grpc, deprecation warnings, app tokens).
Theme Registry
packages/bruno-app/src/themes/index.js
Imports new themes and registers gruvbox-dark and gruvbox-light in themes and themeRegistry (adds id, name, mode entries).

Sequence Diagram(s)

(omitted — theme additions do not introduce multi-component control flow requiring sequence visualization)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

  • More Themes 🎨 #287 — Request for additional themes; this PR adds Gruvbox light/dark themes and updates the registry to address that request.

Possibly related PRs

Suggested reviewers

  • helloanoop
  • lohit-bruno

Poem

🍂 Gruvbox lands in amber, ink, and coal,
Panels find their shadow, editors hum low,
Tokens stitch the canvas, light and dark in scroll,
Colors hold the context, subtle as they flow. ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: adding both Gruvbox Dark and Light theme implementations.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between abd6430 and f1258ca.

📒 Files selected for processing (3)
  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/index.js
  • packages/bruno-app/src/themes/light/gruvbox.js
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/bruno-app/src/themes/light/gruvbox.js
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (CODING_STANDARDS.md)

**/*.{js,jsx,ts,tsx}: Use 2 spaces for indentation. No tabs, just spaces
Stick to single quotes for strings. For JSX/TSX attributes, use double quotes (e.g., )
Always add semicolons at the end of statements
No trailing commas
Always use parentheses around parameters in arrow functions, even for single params
For multiline constructs, put opening braces on the same line, and ensure consistency. Minimum 2 elements for multiline
No newlines inside function parentheses
Space before and after the arrow in arrow functions. () => {} is good
No space between function name and parentheses. func() not func ()
Semicolons go at the end of the line, not on a new line
Names for functions need to be concise and descriptive
Add in JSDoc comments to add more details to the abstractions if needed
Add in meaningful comments instead of obvious ones where complex code flow is explained properly

Files:

  • packages/bruno-app/src/themes/index.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
🧠 Learnings (3)
📚 Learning: 2025-12-17T21:41:24.730Z
Learnt from: naman-bruno
Repo: usebruno/bruno PR: 6407
File: packages/bruno-app/src/components/Environments/ConfirmCloseEnvironment/index.js:5-41
Timestamp: 2025-12-17T21:41:24.730Z
Learning: Do not suggest PropTypes validation for React components in the Bruno codebase. The project does not use PropTypes, so reviews should avoid proposing PropTypes and rely on the existing typing/validation approach (e.g., TypeScript or alternative runtime checks) if applicable. This guideline applies broadly to all JavaScript/JSX components in the repo.

Applied to files:

  • packages/bruno-app/src/themes/index.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
📚 Learning: 2025-12-05T20:31:33.005Z
Learnt from: CR
Repo: usebruno/bruno PR: 0
File: CODING_STANDARDS.md:0-0
Timestamp: 2025-12-05T20:31:33.005Z
Learning: Applies to **/*.{jsx,tsx} : Use styled component's theme prop to manage CSS colors and not CSS variables when in the context of a styled component or any React component using the styled component

Applied to files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
📚 Learning: 2025-12-05T20:31:33.005Z
Learnt from: CR
Repo: usebruno/bruno PR: 0
File: CODING_STANDARDS.md:0-0
Timestamp: 2025-12-05T20:31:33.005Z
Learning: Applies to **/*.{js,jsx,ts,tsx} : Add in meaningful comments instead of obvious ones where complex code flow is explained properly

Applied to files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
🧬 Code graph analysis (1)
packages/bruno-app/src/themes/dark/gruvbox.js (1)
packages/bruno-app/src/themes/light/gruvbox.js (2)
  • palette (4-61)
  • palette (4-61)
🔇 Additional comments (11)
packages/bruno-app/src/themes/index.js (3)

13-14: LGTM! Theme imports follow established conventions.

The imports are properly structured and consistent with existing theme imports in the file.


28-29: LGTM! Theme registration is consistent.

The themes are properly added to the themes object with appropriate naming.


87-96: Theme registry entries are well-structured.

The metadata follows the established pattern and will display correctly in the UI. As noted in the PR discussion, the soft/medium/hard variants can be added in a future update if needed.

packages/bruno-app/src/themes/dark/gruvbox.js (8)

4-61: Well-structured palette with helpful documentation.

The color tokens are organized logically and the inline comments mapping to official Gruvbox colors aid maintainability. The dark theme appropriately uses brighter color variants compared to the light theme.


63-91: Intent and syntax mappings are well-defined.

The color selections provide good contrast for dark backgrounds, and the syntax highlighting covers all necessary token types with appropriate color differentiation.


93-207: Core theme properties are properly configured.

The theme object correctly references palette tokens throughout, maintaining consistency and making future updates easier. The use of rgba() for status backgrounds and shadows provides appropriate visual hierarchy.


274-301: Verify response pane color consistency.

The request tab panel uses green/red/blue for response states. The PR discussion mentions the light theme's response pane should use yellow to match the rest of the theme. Confirm whether the dark theme's current response colors are intentional or if they should also align with the primary yellow palette.

Based on PR discussion about response pane colors in the light theme.


430-461: CodeMirror configuration is comprehensive.

The syntax highlighting tokens are properly mapped from the palette, and the search highlighting colors provide good visibility on the dark background.


527-687: Comprehensive component coverage with consistent design tokens.

The remaining sections cover all necessary UI components including GRPC configuration, deprecation warnings, examples, and app-level elements. The sandbox mode indicators use appropriate colors (green for safe mode, yellow for developer mode) that align with the Gruvbox palette.


689-689: Export structure is correct.

The default export provides the complete theme object for use in the application, while the palette is also available as a named export for reference if needed.


1-2: No action needed – polished dependency is available.

The polished library (v4.3.1) is properly listed in packages/bruno-app/package.json and is consistently used across all theme files. The import is valid.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
packages/bruno-app/src/themes/dark/gruvbox.js (1)

3-3: Minor: Non-English comment.

The comment "ufficiale" is Italian. For consistency with the rest of the codebase, consider using English: "official".

Suggested fix
-// Gruvbox Dark palette ufficiale
+// Official Gruvbox Dark palette
packages/bruno-app/src/themes/light/gruvbox.js (1)

3-3: Minor: Non-English comment.

Same as the dark theme file—consider using English for consistency.

Suggested fix
-// Gruvbox Light palette ufficiale
+// Official Gruvbox Light palette
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7918431 and 81144b0.

📒 Files selected for processing (3)
  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/index.js
  • packages/bruno-app/src/themes/light/gruvbox.js
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (CODING_STANDARDS.md)

**/*.{js,jsx,ts,tsx}: Use 2 spaces for indentation. No tabs, just spaces
Stick to single quotes for strings. For JSX/TSX attributes, use double quotes (e.g., )
Always add semicolons at the end of statements
No trailing commas
Always use parentheses around parameters in arrow functions, even for single params
For multiline constructs, put opening braces on the same line, and ensure consistency. Minimum 2 elements for multiline
No newlines inside function parentheses
Space before and after the arrow in arrow functions. () => {} is good
No space between function name and parentheses. func() not func ()
Semicolons go at the end of the line, not on a new line
Names for functions need to be concise and descriptive
Add in JSDoc comments to add more details to the abstractions if needed
Add in meaningful comments instead of obvious ones where complex code flow is explained properly

Files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/index.js
  • packages/bruno-app/src/themes/light/gruvbox.js
🧠 Learnings (2)
📚 Learning: 2025-12-05T20:31:33.005Z
Learnt from: CR
Repo: usebruno/bruno PR: 0
File: CODING_STANDARDS.md:0-0
Timestamp: 2025-12-05T20:31:33.005Z
Learning: Applies to **/*.{jsx,tsx} : Use styled component's theme prop to manage CSS colors and not CSS variables when in the context of a styled component or any React component using the styled component

Applied to files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/light/gruvbox.js
📚 Learning: 2025-12-17T21:41:24.730Z
Learnt from: naman-bruno
Repo: usebruno/bruno PR: 6407
File: packages/bruno-app/src/components/Environments/ConfirmCloseEnvironment/index.js:5-41
Timestamp: 2025-12-17T21:41:24.730Z
Learning: Do not suggest PropTypes validation for React components in the Bruno codebase. The project does not use PropTypes, so reviews should avoid proposing PropTypes and rely on the existing typing/validation approach (e.g., TypeScript or alternative runtime checks) if applicable. This guideline applies broadly to all JavaScript/JSX components in the repo.

Applied to files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/index.js
  • packages/bruno-app/src/themes/light/gruvbox.js
🔇 Additional comments (9)
packages/bruno-app/src/themes/dark/gruvbox.js (3)

1-2: LGTM on polished imports.

Correct usage of rgba and lighten for color derivation.


4-91: Well-structured palette definition.

The palette cleanly separates concerns (primary, hues, system, background, text, overlay, border, utility) and appropriately extends with intent and syntax after initial definition. Color values align with the official Gruvbox palette.


93-687: Comprehensive theme object with consistent token coverage.

The theme correctly maps palette values to all required UI component tokens (status, input, sidebar, dropdown, modal, buttons, tabs, codemirror, grpc, etc.). The structure mirrors other existing themes, ensuring compatibility.

packages/bruno-app/src/themes/light/gruvbox.js (3)

1-2: Appropriate polished imports for light theme.

Using darken instead of lighten is the correct approach for hover states on a light background.


4-91: Light palette correctly adapted.

The light variant properly uses the Gruvbox light palette values (e.g., #fbf1c7 for bg0, darker hue variants for text contrast). The intent and syntax mappings use appropriate darker shades for readability on light backgrounds.


93-687: Theme object mirrors dark variant with appropriate light adjustments.

Key differences are correctly applied:

  • mode: 'light' (line 94)
  • Lower alpha values for status backgrounds (0.1 vs 0.15)
  • Lighter shadow opacity values
  • input.bg uses MANTLE instead of transparent

Implementation is consistent and complete.

packages/bruno-app/src/themes/index.js (3)

13-14: Imports correctly placed.

Theme imports follow the existing pattern. Minor note: the import order places gruvboxLightTheme between dark imports and vscodeDark, which slightly breaks the dark/light grouping pattern. Not a functional issue.


28-29: Themes correctly registered.

Keys follow the existing naming convention (gruvbox-dark, gruvbox-light).


87-96: Registry metadata complete and correct.

Both entries include proper id, name, and mode properties, matching the established pattern for other themes.

sid-bruno
sid-bruno previously approved these changes Jan 9, 2026
@sid-bruno
Copy link
Collaborator

Thanks @FraCata00, I approve of this, will wait on the other members to check a few things and we should be good to go.

Mostly need to confirm if we plan custom themes anytime soon, if not then we will merge this in as a standard offering, thanks for this!

@helloanoop
Copy link
Contributor

helloanoop commented Jan 9, 2026

I think this would need some work.

Just checked out GruvBox on VSCode. It has 3 variants soft, medium and hard for both Dark and Light Themes.
I'd say we should support all of them. We do this for Catppuccin themes already.

Mostly need to confirm if we plan custom themes anytime soon, if not then we will merge this in as a standard offering, thanks for this!

@sid-bruno We can go with Gruvbox as a standard offering for now. From what I know, we'd want to take Q1 2026 to finalise the theme schema and openup custom themes in Q2 2026

Also, we wouldn't want to have the response pane to have a separate shade of yellow
image

Here is Gruvbox light on vscode
image

@FraCata00
Copy link
Author

I think this would need some work.

Just checked out GruvBox on VSCode. It has 3 variants soft, medium and hard for both Dark and Light Themes.

Also, we wouldn't want to have the response pane to have a separate shade of yellow image

Here is Gruvbox light on vscode image

Okay, so i have to make the response pane with the same shade of yellow.
Also do you think will be a good idea to make different version of Gruvbox? Soft, Medium and Hard?
Anyway, now i will make the response pane with the same color as the rest

@sid-bruno
Copy link
Collaborator

Also do you think will be a good idea to make different version of Gruvbox? Soft, Medium and Hard?

If you have the time, sure

If not, we'll adopt the PR and add it in later in the month

@FraCata00
Copy link
Author

Also do you think will be a good idea to make different version of Gruvbox? Soft, Medium and Hard?

If you have the time, sure

If not, we'll adopt the PR and add it in later in the month

Yes, now i will fix the response pane with light theme

@FraCata00 FraCata00 force-pushed the feature/gruvbox-theme branch from 81144b0 to 67bd0de Compare January 9, 2026 10:37
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @packages/bruno-app/src/themes/dark/gruvbox.js:
- Around line 337-360: The button.close.hoverBorder currently uses an empty
string which can produce invalid CSS; update the button.close.hoverBorder value
to a safe token (e.g., 'transparent' or reuse button.close.border) so consumers
always receive a valid CSS value; update the hoverBorder for the close variant
in the button object (button.close.hoverBorder) accordingly.
🧹 Nitpick comments (3)
packages/bruno-app/src/themes/dark/gruvbox.js (2)

3-91: Avoid mutating the exported palette (make it immutable in one construction).

Right now palette.intent / palette.syntax are assigned after export const palette = ... (Line 63, Line 70). It works, but it’s a footgun for maintainability and static analysis.

Proposed refactor (single construction, no mutation)
-// Gruvbox Dark palette ufficiale
-export const palette = {
+// Official Gruvbox Dark palette
+const primary = {
+  SOLID: '#d79921', // yellow
+  TEXT: '#fabd2f', // bright yellow
+  STRONG: '#fabd2f',
+  SUBTLE: '#b57614' // yellow dark
+};
+
+const hues = {
+  RED: '#cc241d', // red
+  RED_BRIGHT: '#fb4934', // bright red
+  ROSE: '#fb4934',
+  BROWN: '#d65d0e', // orange
+  ORANGE: '#fe8019', // bright orange
+  YELLOW: '#fabd2f', // bright yellow
+  GREEN: '#98971a', // green
+  GREEN_BRIGHT: '#b8bb26', // bright green
+  GREEN_DARK: '#79740e',
+  TEAL: '#689d6a', // aqua
+  CYAN: '#8ec07c', // bright aqua
+  BLUE: '#458588', // blue
+  BLUE_BRIGHT: '#83a598', // bright blue
+  INDIGO: '#83a598',
+  VIOLET: '#b16286', // purple
+  PURPLE: '#d3869b', // bright purple
+  PINK: '#d3869b'
+};
+
+const system = {
+  CONTROL_ACCENT: primary.SOLID
+};
+
+const background = {
+  BASE: '#282828', // bg0
+  MANTLE: '#1d2021', // bg0_h (hard contrast)
+  CRUST: '#1d2021',
+  SURFACE0: '#32302f', // bg1
+  SURFACE1: '#3c3836', // bg2
+  SURFACE2: '#504945' // bg3
+};
+
+const text = {
+  BASE: '#ebdbb2', // fg
+  SUBTEXT2: '#d5c4a1', // fg1
+  SUBTEXT1: '#bdae93', // fg2
+  SUBTEXT0: '#a89984' // fg3
+};
+
+const overlay = {
+  OVERLAY2: '#7c6f64', // gray
+  OVERLAY1: '#665c54', // gray dark
+  OVERLAY0: '#504945' // bg3
+};
+
+const border = {
+  BORDER2: '#504945', // bg3
+  BORDER1: '#3c3836', // bg2
+  BORDER0: '#32302f' // bg1
+};
+
+const utility = {
+  WHITE: '#fbf1c7', // fg0
+  BLACK: '#1d2021' // bg0_h
+};
+
+const intent = {
+  INFO: hues.BLUE_BRIGHT,
+  SUCCESS: hues.GREEN_BRIGHT,
+  WARNING: hues.ORANGE,
+  DANGER: hues.RED_BRIGHT
+};
+
+const syntax = {
+  // Core language structure
+  KEYWORD: '#fb4934', // bright red
+  TAG: '#fb4934',
+
+  // Identifiers & properties
+  VARIABLE: '#ebdbb2', // fg
+  PROPERTY: '#83a598', // bright blue
+  DEFINITION: '#fabd2f', // bright yellow
+
+  // Literals
+  STRING: '#b8bb26', // bright green
+  NUMBER: '#d3869b', // bright purple
+  ATOM: '#d3869b',
+
+  // Operators & punctuation
+  OPERATOR: '#fe8019', // bright orange
+  TAG_BRACKET: '#a89984', // fg3
+
+  // Comments
+  COMMENT: '#928374' // gray
+};
+
+export const palette = {
+  primary,
+  hues,
+  system,
+  background,
+  text,
+  overlay,
+  border,
+  utility,
+  intent,
+  syntax
 };
-
-palette.intent = {
-  INFO: palette.hues.BLUE_BRIGHT,
-  SUCCESS: palette.hues.GREEN_BRIGHT,
-  WARNING: palette.hues.ORANGE,
-  DANGER: palette.hues.RED_BRIGHT
-};
-
-palette.syntax = {
-  // Core language structure
-  KEYWORD: '#fb4934', // bright red
-  TAG: '#fb4934',
-  ...
-};

93-256: Deduplicate hard-coded theme colors by reusing palette tokens.

draftColor (Line 98) and workspace.accent (Line 251) repeat #d79921. Prefer palette.primary.SOLID (or palette.system.CONTROL_ACCENT) to avoid drift.

Proposed change
 const gruvboxDarkTheme = {
   mode: 'dark',
   brand: palette.primary.SOLID,
   text: palette.text.BASE,
   textLink: palette.hues.BLUE_BRIGHT,
-  draftColor: '#d79921',
+  draftColor: palette.primary.SOLID,
   bg: palette.background.BASE,
@@
   workspace: {
-    accent: '#d79921',
+    accent: palette.primary.SOLID,
     border: palette.border.BORDER2,
     button: {
       bg: palette.background.SURFACE0
     }
   },
packages/bruno-app/src/themes/index.js (1)

35-112: Optional: consider a naming convention now if soft/medium/hard variants are likely soon.

If you plan to add Gruvbox variants, deciding early between e.g. gruvbox-dark-soft vs { id: 'gruvbox-dark', variant: 'soft' } avoids later UI migration churn.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 81144b0 and 67bd0de.

📒 Files selected for processing (3)
  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/index.js
  • packages/bruno-app/src/themes/light/gruvbox.js
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/bruno-app/src/themes/light/gruvbox.js
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (CODING_STANDARDS.md)

**/*.{js,jsx,ts,tsx}: Use 2 spaces for indentation. No tabs, just spaces
Stick to single quotes for strings. For JSX/TSX attributes, use double quotes (e.g., )
Always add semicolons at the end of statements
No trailing commas
Always use parentheses around parameters in arrow functions, even for single params
For multiline constructs, put opening braces on the same line, and ensure consistency. Minimum 2 elements for multiline
No newlines inside function parentheses
Space before and after the arrow in arrow functions. () => {} is good
No space between function name and parentheses. func() not func ()
Semicolons go at the end of the line, not on a new line
Names for functions need to be concise and descriptive
Add in JSDoc comments to add more details to the abstractions if needed
Add in meaningful comments instead of obvious ones where complex code flow is explained properly

Files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/index.js
🧠 Learnings (2)
📚 Learning: 2025-12-05T20:31:33.005Z
Learnt from: CR
Repo: usebruno/bruno PR: 0
File: CODING_STANDARDS.md:0-0
Timestamp: 2025-12-05T20:31:33.005Z
Learning: Applies to **/*.{jsx,tsx} : Use styled component's theme prop to manage CSS colors and not CSS variables when in the context of a styled component or any React component using the styled component

Applied to files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
📚 Learning: 2025-12-17T21:41:24.730Z
Learnt from: naman-bruno
Repo: usebruno/bruno PR: 6407
File: packages/bruno-app/src/components/Environments/ConfirmCloseEnvironment/index.js:5-41
Timestamp: 2025-12-17T21:41:24.730Z
Learning: Do not suggest PropTypes validation for React components in the Bruno codebase. The project does not use PropTypes, so reviews should avoid proposing PropTypes and rely on the existing typing/validation approach (e.g., TypeScript or alternative runtime checks) if applicable. This guideline applies broadly to all JavaScript/JSX components in the repo.

Applied to files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/index.js
🧬 Code graph analysis (1)
packages/bruno-app/src/themes/index.js (2)
packages/bruno-app/src/themes/dark/gruvbox.js (1)
  • gruvboxDarkTheme (93-687)
packages/bruno-app/src/themes/light/gruvbox.js (1)
  • gruvboxLightTheme (93-687)
🔇 Additional comments (3)
packages/bruno-app/src/themes/dark/gruvbox.js (2)

93-689: Theme token coverage and structure look consistent with the existing theme schema.

The object shape is comprehensive (sidebar/modal/console/grpc/etc.) and uses palette-driven tokens throughout, which should make future variant work (soft/medium/hard) feasible without reshaping consumers.


274-301: The review comment premise appears incorrect. There are no separate "response pane" yellow tokens in the theme. The requestTabPanel response-related tokens (responseOk, responseError, responsePending, responseOverlayBg) use only GREEN_BRIGHT, RED_BRIGHT, BLUE_BRIGHT, and background colors—never YELLOW. The YELLOW tokens that do exist are used for HTTP method coding (patch), search highlighting, and developer mode styling, and they're already consistent across dark and light gruvbox variants. There is no mismatch to address here.

Likely an incorrect or invalid review comment.

packages/bruno-app/src/themes/index.js (1)

13-15: Theme registration looks correct (themes map + themeRegistry metadata are aligned).

themes['gruvbox-dark'|'gruvbox-light'] and themeRegistry entries match on id, name, and mode, so getLightThemes / getDarkThemes should pick them up as expected.

Also applies to: 28-33, 87-96

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @packages/bruno-app/src/themes/dark/gruvbox.js:
- Line 98: Replace the hardcoded '#d79921' usages with the palette reference:
update the draftColor property (draftColor) and the other occurrence at line 251
to use palette.primary.SOLID instead of the literal string; ensure you reference
the existing palette object in this module (or import it if missing) so both
draftColor and the second color setting consistently use palette.primary.SOLID.
🧹 Nitpick comments (1)
packages/bruno-app/src/themes/dark/gruvbox.js (1)

3-3: Use English for code comments.

The comment contains Italian text ("ufficiale"). For consistency across the codebase, please use English.

📝 Suggested fix
-// Gruvbox Dark palette ufficiale
+// Official Gruvbox Dark palette
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 67bd0de and 4d5c4fb.

📒 Files selected for processing (1)
  • packages/bruno-app/src/themes/dark/gruvbox.js
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (CODING_STANDARDS.md)

**/*.{js,jsx,ts,tsx}: Use 2 spaces for indentation. No tabs, just spaces
Stick to single quotes for strings. For JSX/TSX attributes, use double quotes (e.g., )
Always add semicolons at the end of statements
No trailing commas
Always use parentheses around parameters in arrow functions, even for single params
For multiline constructs, put opening braces on the same line, and ensure consistency. Minimum 2 elements for multiline
No newlines inside function parentheses
Space before and after the arrow in arrow functions. () => {} is good
No space between function name and parentheses. func() not func ()
Semicolons go at the end of the line, not on a new line
Names for functions need to be concise and descriptive
Add in JSDoc comments to add more details to the abstractions if needed
Add in meaningful comments instead of obvious ones where complex code flow is explained properly

Files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
🧠 Learnings (2)
📚 Learning: 2025-12-05T20:31:33.005Z
Learnt from: CR
Repo: usebruno/bruno PR: 0
File: CODING_STANDARDS.md:0-0
Timestamp: 2025-12-05T20:31:33.005Z
Learning: Applies to **/*.{jsx,tsx} : Use styled component's theme prop to manage CSS colors and not CSS variables when in the context of a styled component or any React component using the styled component

Applied to files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
📚 Learning: 2025-12-17T21:41:24.730Z
Learnt from: naman-bruno
Repo: usebruno/bruno PR: 6407
File: packages/bruno-app/src/components/Environments/ConfirmCloseEnvironment/index.js:5-41
Timestamp: 2025-12-17T21:41:24.730Z
Learning: Do not suggest PropTypes validation for React components in the Bruno codebase. The project does not use PropTypes, so reviews should avoid proposing PropTypes and rely on the existing typing/validation approach (e.g., TypeScript or alternative runtime checks) if applicable. This guideline applies broadly to all JavaScript/JSX components in the repo.

Applied to files:

  • packages/bruno-app/src/themes/dark/gruvbox.js
🔇 Additional comments (1)
packages/bruno-app/src/themes/dark/gruvbox.js (1)

93-687: Well-structured and comprehensive theme implementation.

The Gruvbox Dark theme is thorough and well-organized, with comprehensive coverage of all UI components. The palette-based approach ensures consistency, and the integration with the polished library for color manipulation is appropriate.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In @packages/bruno-app/src/themes/dark/gruvbox.js:
- Line 3: Replace the Italian comment string "Gruvbox Dark palette ufficiale"
with an English comment such as "Official Gruvbox Dark palette" so comments in
the gruvbox.js theme use English; locate the existing top-of-file comment text
and update it accordingly.

In @packages/bruno-app/src/themes/light/gruvbox.js:
- Line 3: The comment above the Gruvbox Light palette is in Italian ("Gruvbox
Light palette ufficiale"); update it to English for consistency by replacing it
with "Official Gruvbox Light palette" in the comments in the gruvbox.js file
(look for the existing comment line that contains "Gruvbox Light palette
ufficiale"). Ensure no other Italian wording remains in that comment.
🧹 Nitpick comments (2)
packages/bruno-app/src/themes/light/gruvbox.js (1)

63-91: Consider defining complete palette object upfront.

Adding intent and syntax properties to the palette via mutation after export works but is less declarative. For clarity, consider defining them within the initial palette object declaration.

♻️ Optional refactor

Move the intent and syntax definitions inside the main palette object:

 export const palette = {
   primary: { /* ... */ },
   hues: { /* ... */ },
   system: { /* ... */ },
   background: { /* ... */ },
   text: { /* ... */ },
   overlay: { /* ... */ },
   border: { /* ... */ },
-  utility: { /* ... */ }
+  utility: { /* ... */ },
+  intent: {
+    INFO: '#076678', // blue dark
+    SUCCESS: '#79740e', // green dark
+    WARNING: '#af3a03', // orange dark
+    DANGER: '#9d0006' // red dark
+  },
+  syntax: {
+    KEYWORD: '#9d0006',
+    TAG: '#9d0006',
+    VARIABLE: '#3c3836',
+    PROPERTY: '#076678',
+    DEFINITION: '#b57614',
+    STRING: '#79740e',
+    NUMBER: '#8f3f71',
+    ATOM: '#8f3f71',
+    OPERATOR: '#af3a03',
+    TAG_BRACKET: '#7c6f64',
+    COMMENT: '#928374'
+  }
 };
-
-palette.intent = {
-  INFO: palette.hues.BLUE_BRIGHT,
-  SUCCESS: palette.hues.GREEN_BRIGHT,
-  WARNING: palette.hues.ORANGE,
-  DANGER: palette.hues.RED_BRIGHT
-};
-
-palette.syntax = {
-  // Core language structure
-  KEYWORD: '#9d0006', // red dark
-  TAG: '#9d0006',
-
-  // Identifiers & properties
-  VARIABLE: '#3c3836', // fg
-  PROPERTY: '#076678', // blue dark
-  DEFINITION: '#b57614', // yellow dark
-
-  // Literals
-  STRING: '#79740e', // green dark
-  NUMBER: '#8f3f71', // purple dark
-  ATOM: '#8f3f71',
-
-  // Operators & punctuation
-  OPERATOR: '#af3a03', // orange dark
-  TAG_BRACKET: '#7c6f64', // fg3
-
-  // Comments
-  COMMENT: '#928374' // gray dark
-};

Note: You'd need to update the references to use the direct color values since self-referencing within object initialization requires the split approach.

packages/bruno-app/src/themes/dark/gruvbox.js (1)

63-91: Consider defining complete palette object upfront.

Same pattern as the light theme: adding intent and syntax properties via mutation works but is less declarative. Consider defining them within the initial palette object declaration for consistency.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4d5c4fb and 477f398.

📒 Files selected for processing (2)
  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/light/gruvbox.js
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (CODING_STANDARDS.md)

**/*.{js,jsx,ts,tsx}: Use 2 spaces for indentation. No tabs, just spaces
Stick to single quotes for strings. For JSX/TSX attributes, use double quotes (e.g., )
Always add semicolons at the end of statements
No trailing commas
Always use parentheses around parameters in arrow functions, even for single params
For multiline constructs, put opening braces on the same line, and ensure consistency. Minimum 2 elements for multiline
No newlines inside function parentheses
Space before and after the arrow in arrow functions. () => {} is good
No space between function name and parentheses. func() not func ()
Semicolons go at the end of the line, not on a new line
Names for functions need to be concise and descriptive
Add in JSDoc comments to add more details to the abstractions if needed
Add in meaningful comments instead of obvious ones where complex code flow is explained properly

Files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
🧠 Learnings (2)
📚 Learning: 2025-12-05T20:31:33.005Z
Learnt from: CR
Repo: usebruno/bruno PR: 0
File: CODING_STANDARDS.md:0-0
Timestamp: 2025-12-05T20:31:33.005Z
Learning: Applies to **/*.{jsx,tsx} : Use styled component's theme prop to manage CSS colors and not CSS variables when in the context of a styled component or any React component using the styled component

Applied to files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
📚 Learning: 2025-12-17T21:41:24.730Z
Learnt from: naman-bruno
Repo: usebruno/bruno PR: 6407
File: packages/bruno-app/src/components/Environments/ConfirmCloseEnvironment/index.js:5-41
Timestamp: 2025-12-17T21:41:24.730Z
Learning: Do not suggest PropTypes validation for React components in the Bruno codebase. The project does not use PropTypes, so reviews should avoid proposing PropTypes and rely on the existing typing/validation approach (e.g., TypeScript or alternative runtime checks) if applicable. This guideline applies broadly to all JavaScript/JSX components in the repo.

Applied to files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
🧬 Code graph analysis (1)
packages/bruno-app/src/themes/light/gruvbox.js (1)
packages/bruno-app/src/themes/dark/gruvbox.js (2)
  • palette (4-61)
  • palette (4-61)
🔇 Additional comments (2)
packages/bruno-app/src/themes/light/gruvbox.js (1)

93-687: LGTM! Comprehensive theme implementation.

The theme object is well-structured with excellent coverage of UI components, consistent palette usage, and proper semantic color tokens. The nested organization makes it maintainable and easy to understand.

packages/bruno-app/src/themes/dark/gruvbox.js (1)

93-687: LGTM! Excellent consistency with light theme.

The dark theme implementation mirrors the light theme structure perfectly while using semantically appropriate darker colors. The use of lighten (vs darken in light theme) is correct for dark mode hover states. Comprehensive and maintainable.

@FraCata00 FraCata00 force-pushed the feature/gruvbox-theme branch from 477f398 to 6415c84 Compare January 9, 2026 13:50
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In @packages/bruno-app/src/themes/dark/gruvbox.js:
- Line 3: Update the Italian comment at the top of the dark theme file to
English: change the line "Gruvbox Dark palette ufficiale" to "Gruvbox Dark
official palette" (the top-of-file comment in
packages/bruno-app/src/themes/dark/gruvbox.js).

In @packages/bruno-app/src/themes/light/gruvbox.js:
- Line 3: Replace the Italian comment "Gruvbox Light palette ufficiale" with an
English equivalent (e.g., "Official Gruvbox Light palette" or "Gruvbox Light
official palette") so all code comments are in English; update the single-line
top comment in gruvbox.js that currently contains "Gruvbox Light palette
ufficiale" accordingly.
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 477f398 and 6415c84.

📒 Files selected for processing (3)
  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/index.js
  • packages/bruno-app/src/themes/light/gruvbox.js
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/bruno-app/src/themes/index.js
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (CODING_STANDARDS.md)

**/*.{js,jsx,ts,tsx}: Use 2 spaces for indentation. No tabs, just spaces
Stick to single quotes for strings. For JSX/TSX attributes, use double quotes (e.g., )
Always add semicolons at the end of statements
No trailing commas
Always use parentheses around parameters in arrow functions, even for single params
For multiline constructs, put opening braces on the same line, and ensure consistency. Minimum 2 elements for multiline
No newlines inside function parentheses
Space before and after the arrow in arrow functions. () => {} is good
No space between function name and parentheses. func() not func ()
Semicolons go at the end of the line, not on a new line
Names for functions need to be concise and descriptive
Add in JSDoc comments to add more details to the abstractions if needed
Add in meaningful comments instead of obvious ones where complex code flow is explained properly

Files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
🧠 Learnings (3)
📚 Learning: 2025-12-05T20:31:33.005Z
Learnt from: CR
Repo: usebruno/bruno PR: 0
File: CODING_STANDARDS.md:0-0
Timestamp: 2025-12-05T20:31:33.005Z
Learning: Applies to **/*.{js,jsx,ts,tsx} : Add in meaningful comments instead of obvious ones where complex code flow is explained properly

Applied to files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
📚 Learning: 2025-12-05T20:31:33.005Z
Learnt from: CR
Repo: usebruno/bruno PR: 0
File: CODING_STANDARDS.md:0-0
Timestamp: 2025-12-05T20:31:33.005Z
Learning: Applies to **/*.{jsx,tsx} : Use styled component's theme prop to manage CSS colors and not CSS variables when in the context of a styled component or any React component using the styled component

Applied to files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
📚 Learning: 2025-12-17T21:41:24.730Z
Learnt from: naman-bruno
Repo: usebruno/bruno PR: 6407
File: packages/bruno-app/src/components/Environments/ConfirmCloseEnvironment/index.js:5-41
Timestamp: 2025-12-17T21:41:24.730Z
Learning: Do not suggest PropTypes validation for React components in the Bruno codebase. The project does not use PropTypes, so reviews should avoid proposing PropTypes and rely on the existing typing/validation approach (e.g., TypeScript or alternative runtime checks) if applicable. This guideline applies broadly to all JavaScript/JSX components in the repo.

Applied to files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
🧬 Code graph analysis (1)
packages/bruno-app/src/themes/light/gruvbox.js (1)
packages/bruno-app/src/themes/dark/gruvbox.js (2)
  • palette (4-61)
  • palette (4-61)
🔇 Additional comments (4)
packages/bruno-app/src/themes/light/gruvbox.js (2)

63-91: Palette extensions look good.

The pattern of extending the palette object with intent and syntax mappings after initial definition works well and keeps the theme tokens organized by semantic purpose.


93-687: Comprehensive theme implementation.

The theme object provides thorough coverage of all UI components (sidebar, modals, buttons, codemirror, grpc, etc.) with consistent use of palette references. Good use of rgba for transparency effects.

packages/bruno-app/src/themes/dark/gruvbox.js (2)

1-1: Correct polished import for dark theme.

Using lighten for the dark theme (vs darken in light theme) is the right approach for hover state adjustments in each theme mode.


93-687: Well-structured dark theme with excellent consistency.

The dark theme implementation mirrors the light theme structure perfectly, making maintenance easier. All components are covered with appropriate dark-mode colors from the Gruvbox palette.

@FraCata00 FraCata00 force-pushed the feature/gruvbox-theme branch from 6415c84 to abd6430 Compare January 9, 2026 13:53
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @packages/bruno-app/src/themes/light/gruvbox.js:
- Around line 344-349: The light theme's button.close.hoverBorder is set to an
empty string instead of 'transparent'; update the hoverBorder value in the close
object (button.close.hoverBorder) within gruvbox.js from '' to 'transparent' so
it matches the dark theme and maintains consistency.
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6415c84 and abd6430.

📒 Files selected for processing (3)
  • packages/bruno-app/src/themes/dark/gruvbox.js
  • packages/bruno-app/src/themes/index.js
  • packages/bruno-app/src/themes/light/gruvbox.js
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/bruno-app/src/themes/index.js
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (CODING_STANDARDS.md)

**/*.{js,jsx,ts,tsx}: Use 2 spaces for indentation. No tabs, just spaces
Stick to single quotes for strings. For JSX/TSX attributes, use double quotes (e.g., )
Always add semicolons at the end of statements
No trailing commas
Always use parentheses around parameters in arrow functions, even for single params
For multiline constructs, put opening braces on the same line, and ensure consistency. Minimum 2 elements for multiline
No newlines inside function parentheses
Space before and after the arrow in arrow functions. () => {} is good
No space between function name and parentheses. func() not func ()
Semicolons go at the end of the line, not on a new line
Names for functions need to be concise and descriptive
Add in JSDoc comments to add more details to the abstractions if needed
Add in meaningful comments instead of obvious ones where complex code flow is explained properly

Files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
🧠 Learnings (3)
📚 Learning: 2025-12-05T20:31:33.005Z
Learnt from: CR
Repo: usebruno/bruno PR: 0
File: CODING_STANDARDS.md:0-0
Timestamp: 2025-12-05T20:31:33.005Z
Learning: Applies to **/*.{js,jsx,ts,tsx} : Add in meaningful comments instead of obvious ones where complex code flow is explained properly

Applied to files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
📚 Learning: 2025-12-05T20:31:33.005Z
Learnt from: CR
Repo: usebruno/bruno PR: 0
File: CODING_STANDARDS.md:0-0
Timestamp: 2025-12-05T20:31:33.005Z
Learning: Applies to **/*.{jsx,tsx} : Use styled component's theme prop to manage CSS colors and not CSS variables when in the context of a styled component or any React component using the styled component

Applied to files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
📚 Learning: 2025-12-17T21:41:24.730Z
Learnt from: naman-bruno
Repo: usebruno/bruno PR: 6407
File: packages/bruno-app/src/components/Environments/ConfirmCloseEnvironment/index.js:5-41
Timestamp: 2025-12-17T21:41:24.730Z
Learning: Do not suggest PropTypes validation for React components in the Bruno codebase. The project does not use PropTypes, so reviews should avoid proposing PropTypes and rely on the existing typing/validation approach (e.g., TypeScript or alternative runtime checks) if applicable. This guideline applies broadly to all JavaScript/JSX components in the repo.

Applied to files:

  • packages/bruno-app/src/themes/light/gruvbox.js
  • packages/bruno-app/src/themes/dark/gruvbox.js
🔇 Additional comments (6)
packages/bruno-app/src/themes/light/gruvbox.js (3)

1-91: LGTM!

Palette definition is well-structured with proper Gruvbox Light colors and helpful inline comments mapping to official palette names.


93-687: Well-structured theme object.

Comprehensive coverage of all UI components with consistent use of palette references. The structure aligns with the dark theme counterpart.


274-301: Response pane color alignment pending.

Per reviewer feedback, verify the response pane colors match the rest of the theme's yellow shade once the fix is applied.

packages/bruno-app/src/themes/dark/gruvbox.js (3)

1-91: LGTM!

Palette correctly implements official Gruvbox Dark colors with appropriate bright variants for dark mode readability.


93-687: Solid dark theme implementation.

Appropriate use of lighten for hover states and adjusted opacity values for dark mode visibility. Structure is consistent with the light variant.


430-461: CodeMirror styling looks intentional.

Using palette.background.BASE for both bg and border creates a seamless editor appearance in dark mode, which aligns with typical dark theme conventions.

@FraCata00 FraCata00 force-pushed the feature/gruvbox-theme branch from abd6430 to f1258ca Compare January 9, 2026 13:59
@FraCata00 FraCata00 requested a review from sid-bruno January 9, 2026 13:59
@FraCata00
Copy link
Author

Request page

Gruvbox Light (new)

image

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants