Skip to content

[FEAT] Add Light theme inspired by MergeNB logo#86

Merged
Avni2000 merged 15 commits intomainfrom
copilot/add-fanned-out-logo
Feb 13, 2026
Merged

[FEAT] Add Light theme inspired by MergeNB logo#86
Avni2000 merged 15 commits intomainfrom
copilot/add-fanned-out-logo

Conversation

Copy link
Contributor

Copilot AI commented Feb 13, 2026

Implements a light theme with beige color palette and checkered background pattern matching the MergeNB logo aesthetic. Theme is configurable via VS Code settings.

Changes

Settings & Configuration

  • Added mergeNB.ui.theme setting with enum values: "elegant" (default), "dark"
  • Extended MergeNBSettings interface with theme field
  • Wired theme through pipeline: settings.tsresolver.tsWebConflictPanel.ts → client

Theme System

  • Converted static styles to dynamic getStyles(theme) function with conditional color palettes
  • Elegant theme colors: #F9F7F1 background with 20px grid, #A4D4DE (cyan) for current, #C3C9F2 (purple) for incoming
  • Dark theme preserves existing colors
  • App.tsx injects theme styles reactively via useEffect when conflict data loads

Logo Icon

  • Added fanned-out card design in header with soft cyan and purple colors
  • Two cards rotated ±20° and anchored at bottom center for "fan" effect
  • Matches the original logo aesthetic from HTML design

Transparent Cells

  • All cell backgrounds now use rgba() with 30-50% opacity
  • Cell columns and gaps are fully transparent to show grid pattern
  • Maintains excellent readability with semi-transparent white overlays
  • Applied to code cells, markdown cells, outputs, placeholders, and metadata

Improved Conflict Visibility

  • Removed opacity reduction (0.7) from identical rows - all text maintains full opacity
  • Conflict rows now have 3px salmon-colored border (rgba(244, 135, 113, 0.6))
  • Added light background tint (rgba(244, 135, 113, 0.08)) to conflicted rows
  • Clearer visual distinction between normal and conflicted cells

Type Safety

  • Added theme to UnifiedConflict, WebConflictData, UnifiedConflictData interfaces
  • Restricted isAutoResolveEnabled() to accept only auto-resolve setting keys (not UI settings)

Example

Users change theme via VS Code settings:

{
  "mergeNB.ui.theme": "elegant"  // or "dark"
}

Dynamic style injection in client:

useEffect(() => {
    if (conflictData?.theme) {
        injectStyles(conflictData.theme);
    }
}, [conflictData?.theme]);

Screenshot

Theme with logo icon and transparent cells

Original prompt
<title>MergeNB Logo - Fanned Out</title>
<style>
    body {
        margin: 0;
        padding: 0;
        background-color: #F9F7F1;
        /* Subtle technical grid */
        background-image: 
            linear-gradient(to right, rgba(0,0,0,0.05) 1px, transparent 1px),
            linear-gradient(to bottom, rgba(0,0,0,0.05) 1px, transparent 1px);
        background-size: 20px 20px;
        
        display: flex;
        justify-content: center;
        align-items: center;
        min-height: 100vh;
        font-family: 'DM Sans', sans-serif;
    }

    .logo-container {
        display: flex;
        align-items: center;
        gap: 16px;
        padding: 24px;
    }

    /* --- The Icon --- */
    .icon-wrapper {
        position: relative;
        width: 60px; /* Slightly wider to accommodate the fan */
        height: 50px;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    .cell-shape {
        position: absolute;
        width: 34px;
        height: 48px; /* Slightly taller to exaggerate the card look */
        border-radius: 6px; 
        mix-blend-mode: multiply;
        opacity: 0.9;
        
        /* KEY CHANGE: This anchors the rotation to the bottom center, 
           creating the "fan" effect from your sketch */
        transform-origin: 50% 90%; 
        top: 0;
    }

    .cell-left {
        background-color: #A4D4DE; /* Soft Cyan */
        left: 8px; /* Adjusted to keep centered */
        /* KEY CHANGE: Increased angle to create the gap at the top */
        transform: rotate(-25deg); 
    }

    .cell-right {
        background-color: #C3C9F2; /* Soft Purple */
        right: 8px; /* Adjusted to keep centered */
        /* KEY CHANGE: Increased angle to create the gap at the top */
        transform: rotate(25deg);
    }

    /* --- The Typography --- */
    .logo-text {
        display: flex;
        align-items: baseline;
        color: #1A202C;
        line-height: 1;
        letter-spacing: -0.03em; 
    }

    .text-merge {
        font-family: 'Playfair Display', serif;
        font-style: italic;
        font-weight: 500;
        font-size: 48px; /* Bumped up size slightly */
        letter-spacing: -0.02em;
    }

    .text-nb {
        font-family: 'DM Sans', sans-serif;
        font-weight: 700;
        font-size: 48px;
        /* Matching the optical height of the serif font */
    }

</style>
<div class="logo-container">
    <div class="icon-wrapper">
        <div class="cell-shape cell-left"></div>
        <div class="cell-shape cell-right"></div>
    </div>
    
    <div class="logo-text">
        <span class="text-merge">Merge</span><span class="text-nb">NB</span>
    </div>
</div>

Make a theme that matches the mergenb logo's style (without the cursive, of course) - elegant, light, beige, beautiful. The checkered background is good too. Throw it in #file:settings.ts and #file:extension.ts and wire it up from there.

The user has attached the following file paths as relevant context:

  • src/extension.ts
  • src/settings.ts
  • AGENTS.md

Created from VS Code.


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Summary by CodeRabbit

  • New Features
    • Added configurable dark and light theme options to customize the user interface appearance according to your preference and system settings.
    • Redesigned application header with improved logo icon presentation alongside the application title display.
    • Implemented dynamic styling throughout the conflict resolution interface that automatically adapts based on the selected theme configuration.

Copilot AI and others added 4 commits February 13, 2026 02:22
Co-authored-by: Avni2000 <77120766+Avni2000@users.noreply.github.com>
Co-authored-by: Avni2000 <77120766+Avni2000@users.noreply.github.com>
Co-authored-by: Avni2000 <77120766+Avni2000@users.noreply.github.com>
Co-authored-by: Avni2000 <77120766+Avni2000@users.noreply.github.com>
Copilot AI changed the title [WIP] Add fanned out logo design to MergeNB Add elegant beige theme matching logo design Feb 13, 2026
Copilot AI requested a review from Avni2000 February 13, 2026 02:31
@Avni2000
Copy link
Owner

image

Check this out. Some notes:

Have the MergeNB logo match the old html

<title>MergeNB Logo - Fanned Out</title>
<style>
    body {
        margin: 0;
        padding: 0;
        background-color: #F9F7F1;
        /* Subtle technical grid */
        background-image: 
            linear-gradient(to right, rgba(0,0,0,0.05) 1px, transparent 1px),
            linear-gradient(to bottom, rgba(0,0,0,0.05) 1px, transparent 1px);
        background-size: 20px 20px;
        
        display: flex;
        justify-content: center;
        align-items: center;
        min-height: 100vh;
        font-family: 'DM Sans', sans-serif;
    }

    .logo-container {
        display: flex;
        align-items: center;
        gap: 16px;
        padding: 24px;
    }

    /* --- The Icon --- */
    .icon-wrapper {
        position: relative;
        width: 60px; /* Slightly wider to accommodate the fan */
        height: 50px;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    .cell-shape {
        position: absolute;
        width: 34px;
        height: 48px; /* Slightly taller to exaggerate the card look */
        border-radius: 6px; 
        mix-blend-mode: multiply;
        opacity: 0.9;
        
        /* KEY CHANGE: This anchors the rotation to the bottom center, 
           creating the "fan" effect from your sketch */
        transform-origin: 50% 90%; 
        top: 0;
    }

    .cell-left {
        background-color: #A4D4DE; /* Soft Cyan */
        left: 8px; /* Adjusted to keep centered */
        /* KEY CHANGE: Increased angle to create the gap at the top */
        transform: rotate(-25deg); 
    }

    .cell-right {
        background-color: #C3C9F2; /* Soft Purple */
        right: 8px; /* Adjusted to keep centered */
        /* KEY CHANGE: Increased angle to create the gap at the top */
        transform: rotate(25deg);
    }

    /* --- The Typography --- */
    .logo-text {
        display: flex;
        align-items: baseline;
        color: #1A202C;
        line-height: 1;
        letter-spacing: -0.03em; 
    }

    .text-merge {
        font-family: 'Playfair Display', serif;
        font-style: italic;
        font-weight: 500;
        font-size: 48px; /* Bumped up size slightly */
        letter-spacing: -0.02em;
    }

    .text-nb {
        font-family: 'DM Sans', sans-serif;
        font-weight: 700;
        font-size: 48px;
        /* Matching the optical height of the serif font */
    }

</style>
<div class="logo-container">
    <div class="icon-wrapper">
        <div class="cell-shape cell-left"></div>
        <div class="cell-shape cell-right"></div>
    </div>
    
    <div class="logo-text">
        <span class="text-merge">Merge</span><span class="text-nb">NB</span>
    </div>
</div>

then, make sure the cell boundaries/padding (which are currently white) is removed/ just make everything transparent or opaque/viewed against the background grid canvas.

Also, the whole thing about making text from unified cells greyer than conflicted/unmapped is odd. Let's get rid of that and instead just make it cleaerer (somehow) that a cell is conflicted.

Overall though, good start!

@copilot

Co-authored-by: Avni2000 <77120766+Avni2000@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Feb 13, 2026

image

Check this out. Some notes:
...

Done! Changes in commit 251d6cb:

Logo: Added fanned-out cards matching the HTML design - soft cyan (#A4D4DE) and purple (#C3C9F2) with 20° rotation
Transparent cells: All cell backgrounds now use rgba() with 30-50% opacity so the grid pattern shows through
Conflict clarity: Removed greying (opacity: 0.7) from identical cells. Conflicts now have 3px salmon border + light background tint for better visibility

Screenshot showing the themed UI

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • fonts.googleapis.com
    • Triggering command: /home/REDACTED/work/_temp/ghcca-node/node/bin/node /home/REDACTED/work/_temp/ghcca-node/node/bin/node --enable-source-maps /home/REDACTED/work/_temp/copilot-developer-action-main/dist/index.js (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI changed the title Add elegant beige theme matching logo design Add elegant beige theme with logo icon and transparent cells Feb 13, 2026
@Avni2000 Avni2000 marked this pull request as ready for review February 13, 2026 18:28
@Avni2000
Copy link
Owner

@coderabbitai everything looks good on my end, but could I get a review?

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 13, 2026

@Avni2000, I'll review the changes now!


🧠 Learnings used
Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-10T19:24:17.581Z
Learning: Applies to **/{diffUtils,WebConflictPanel}.ts : Implement cell-level diffing by showing side-by-side or inline diffs for conflicting cells instead of presenting raw JSON line diffs

Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-10T19:24:17.581Z
Learning: Applies to **/resolver.ts : Implement a unified command `merge-nb.findConflicts` that finds notebooks with merge conflicts and brings up the conflict resolution panel

Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-10T19:24:17.581Z
Learning: Applies to **/gitIntegration.ts : Detect merge conflicts using Git `UU` status for semantic conflicts in notebooks

Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T02:45:32.680Z
Learning: Applies to src/webview/**/*.{ts,tsx} : Provide a unified conflict resolution UI in `ConflictResolverPanel` webview supporting both textual and semantic conflict resolution with 3-way diff view
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 13, 2026

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR introduces dark/light theme support by adding a configuration option that flows from VS Code settings through backend data structures and web server sessions to the frontend web UI, with corresponding CSS refactoring to enable dynamic theme injection.

Changes

Cohort / File(s) Summary
Configuration
package.json
Added mergeNB.ui.theme configuration property with enum values ["dark", "light"] and default "light".
Settings Management
src/settings.ts
Added theme: 'dark' | 'light' property to MergeNBSettings interface and getSettings() function; refined isAutoResolveEnabled() parameter to accept only specific auto-resolve settings.
Data Models & Types
src/resolver.ts, src/web/webTypes.ts, src/web/client/types.ts
Added optional theme?: 'dark' | 'light' property to UnifiedConflict, WebConflictData, and UnifiedConflictData interfaces to propagate theme through conflict payloads.
Backend Web Layer
src/web/webServer.ts, src/web/WebConflictPanel.ts
Extended SessionData interface with theme field; updated openSession() to accept and store theme parameter; modified getHtmlShell() to accept theme and generate theme-specific UI variables; WebConflictPanel now passes theme to session initialization.
Frontend Styling
src/web/client/styles.ts
Refactored from static CSS to theme-aware implementation: added getStyles(theme) function with dynamic color palettes and backgrounds; updated injectStyles(theme) to apply theme-specific CSS at runtime; maintained backward compatibility with empty styles export.
Frontend Components
src/web/client/index.tsx, src/web/client/App.tsx, src/web/client/ConflictResolver.tsx
Updated index.tsx to use theme-aware initialization with server-provided or user preference theme; App.tsx added useEffect hook to inject theme styles when conflictData.theme changes; ConflictResolver.tsx updated header with new logo and multi-span title UI.
Tests
src/tests/logicRegression.test.ts
Added theme: 'light' to test options for analyzeSemanticConflictsFromMappings calls.

Sequence Diagram

sequenceDiagram
    participant VSCode as VS Code
    participant Settings as Settings Module
    participant Resolver as Conflict Resolver
    participant WebServer as Web Server
    participant Browser as Browser
    participant ReactApp as React App
    participant Styles as Styles Module

    VSCode->>Settings: User configures theme
    Settings->>Settings: getSettings() reads ui.theme
    Settings-->>Resolver: Settings with theme
    Resolver->>Resolver: Add theme to UnifiedConflict
    Resolver-->>WebServer: Pass conflict with theme
    WebServer->>WebServer: Store theme in SessionData
    WebServer->>Styles: getHtmlShell(theme)
    Styles-->>WebServer: HTML with theme variables
    WebServer-->>Browser: Serve HTML shell
    Browser->>Browser: Extract __MERGENB_INITIAL_THEME
    Browser->>ReactApp: Load with initialTheme
    ReactApp->>ReactApp: Receive conflictData.theme
    ReactApp->>Styles: injectStyles(conflictData.theme)
    Styles->>Styles: getStyles(theme) builds CSS
    Styles-->>Browser: Apply theme-specific CSS
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related PRs

Poem

🐰 A theme so fine, from light to dark,
Through settings, web, and React spark,
The colors flow with CSS grace,
Each pixel finds its rightful place! ✨🎨

🚥 Pre-merge checks | ✅ 2 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 42.86% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title mentions adding a 'light theme inspired by MergeNB logo,' but the PR summary and changes reveal the actual implementation includes both 'light' and 'dark' themes with end-to-end integration, new configuration options, and theme propagation across multiple files. The title focuses narrowly on the light theme and logo inspiration rather than capturing the full scope of the configurable theme system being added. Consider clarifying whether the title should emphasize the configurable theme system (light/dark) or refocus the scope to just the light theme. The current title is somewhat vague about the full extent of the feature.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

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

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch copilot/add-fanned-out-logo

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: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/web/client/styles.ts (1)

308-309: ⚠️ Potential issue | 🟡 Minor

Hardcoded dark-theme hover colors break the light theme.

Several hover states use hardcoded dark colors (#3a3a3a, #3c3c3c) that will look wrong against the light palette. These should use theme-aware CSS variables or computed values.

Affected selectors:

  • .history-item:hover (Line 309): background: #3a3a3a``
  • .btn-secondary:hover (Line 352): background: #3c3c3c``
♻️ Suggested approach
 .history-item:hover {
-    background: `#3a3a3a`;
+    background: var(--bg-tertiary);
 }
 .btn-secondary:hover:not(:disabled) {
-    background: `#3c3c3c`;
+    background: var(--bg-primary);
 }

Also applies to: 351-353

🤖 Fix all issues with AI agents
In `@src/web/client/styles.ts`:
- Line 84: The CSS currently imports Google Fonts via the external line "@import
url('https://fonts.googleapis.com/...')" which leaks user data and fails
offline; replace that external import by bundling the font files into the
extension (e.g., dist/web/fonts) and reference them via local `@font-face`
declarations in src/web/client/styles.ts (or fall back to system fonts like
sans-serif/serif when fonts aren't available), and update your build
(webpack/asset pipeline or copy step) and extension packaging so the font files
are included and served locally instead of calling fonts.googleapis.com.
- Around line 401-404: The .merge-row.conflict-row selector is defined twice
with conflicting border/background declarations causing mixed borders (3px on
three sides and 4px on the left); fix by consolidating into a single rule for
.merge-row.conflict-row (or remove the earlier/duplicate rule) and ensure you
only use the intended properties (either a full border shorthand OR explicit
border-left/top/right/bottom) so no partial overrides occur; update the rule
that currently sets border-left and background (the second occurrence) to be the
single source of truth or merge its values into the first occurrence so the
selector has one consistent border and background.

In `@src/web/webServer.ts`:
- Around line 481-483: The theme string is interpolated directly into the HTML
script (window.__MERGENB_INITIAL_THEME = '${theme}';) without runtime
validation; add a small validation step (e.g., a sanitizeTheme or normalizeTheme
function) that checks the value returned by config.get() (the theme variable)
and clamps it to either 'dark' or 'light' (default to 'light' on invalid input),
then embed that validated value into the script; to avoid injection entirely,
embed the validated value using a safe serializer (e.g., via JSON.stringify on
the final value) when writing window.__MERGENB_INITIAL_THEME so only a
guaranteed 'dark'|'light' string can be interpolated.
🧹 Nitpick comments (1)
src/web/webServer.ts (1)

337-354: 404 page uses hardcoded dark theme, inconsistent with the new theming system.

The "Session Not Found" error page always renders with a dark background (#1e1e1e), which will look jarring if the user has selected the light theme. Consider using the same theme-aware approach, or at minimum a neutral style.

const hasBackgroundImage = colors.bodyBackgroundImage !== 'none';

return `
@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@700&family=Playfair+Display:ital,wght@1,500&display=swap');
Copy link
Contributor

@coderabbitai coderabbitai bot Feb 13, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

External Google Fonts request leaks user data and breaks offline usage.

Loading fonts from fonts.googleapis.com inside a VS Code extension's UI means every user's browser makes a request to Google's servers, leaking IP and user-agent. It also fails when offline. Consider bundling the fonts locally in dist/web/ or falling back to system fonts.

🤖 Prompt for AI Agents
In `@src/web/client/styles.ts` at line 84, The CSS currently imports Google Fonts
via the external line "@import url('https://fonts.googleapis.com/...')" which
leaks user data and fails offline; replace that external import by bundling the
font files into the extension (e.g., dist/web/fonts) and reference them via
local `@font-face` declarations in src/web/client/styles.ts (or fall back to
system fonts like sans-serif/serif when fonts aren't available), and update your
build (webpack/asset pipeline or copy step) and extension packaging so the font
files are included and served locally instead of calling fonts.googleapis.com.

Copy link
Contributor

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check for webpack or build configuration files
echo "=== Build configuration files ==="
fd -t f 'webpack|esbuild|rollup|tsconfig' --max-depth 2

echo -e "\n=== Package.json scripts ==="
cat package.json | jq '.scripts'

echo -e "\n=== Check for existing asset/font directories ==="
fd -t d 'assets|fonts|static|public' --max-depth 3

echo -e "\n=== Check how web assets are currently served ==="
rg -n "express.static|serveStatic|\.use.*static" --type ts

echo -e "\n=== Check dist or build output structure ==="
fd -t d 'dist|out|build' --max-depth 2

Length of output: 1469


🏁 Script executed:

#!/bin/bash
# Check esbuild configuration
echo "=== esbuild.js configuration ==="
cat esbuild.js

echo -e "\n=== serveStaticFile implementation ==="
rg -A 30 "private serveStaticFile" src/web/webServer.ts

echo -e "\n=== Check current web client structure ==="
tree src/web/client -L 2 || find src/web/client -maxdepth 2 -type f

echo -e "\n=== Check if there's any existing asset copying in build ==="
rg -n "copy|asset|static" esbuild.js

Length of output: 4909


@Avni2000, great question! Your project already has the perfect pattern set up with KaTeX. Here's how to bundle the fonts locally:

Step-by-step guide:

1. Download the fonts

Visit Google Fonts and download both fonts:

Extract the .woff2 files (modern browsers only need woff2) and create this structure:

src/web/client/fonts/
├── DMSans-Bold.woff2
└── PlayfairDisplay-MediumItalic.woff2

2. Update esbuild.js to copy fonts

Add a copyFonts() function right after copyKatex():

/**
 * Copy fonts to dist/web directory
 */
function copyFonts() {
    const srcDir = path.join(__dirname, 'src', 'web', 'client', 'fonts');
    const destDir = path.join(__dirname, 'dist', 'web', 'fonts');

    if (!fs.existsSync(destDir)) {
        fs.mkdirSync(destDir, { recursive: true });
    }

    if (fs.existsSync(srcDir)) {
        copyDir(srcDir, destDir);
        console.log('[fonts] Copied font files');
    } else {
        console.warn(`[fonts] Warning: ${srcDir} not found`);
    }
}

Then call it in the main() function after the KaTeX copy:

// Copy KaTeX after build
copyKatex();
copyFonts();  // Add this line

3. Update styles.ts with local @font-face

Replace the external @import line (line 84 in the diff) with local font declarations:

return `
`@font-face` {
    font-family: 'DM Sans';
    font-style: normal;
    font-weight: 700;
    font-display: swap;
    src: url('/fonts/DMSans-Bold.woff2') format('woff2');
}

`@font-face` {
    font-family: 'Playfair Display';
    font-style: italic;
    font-weight: 500;
    font-display: swap;
    src: url('/fonts/PlayfairDisplay-MediumItalic.woff2') format('woff2');
}

:root {
    --bg-primary: ${colors.bgPrimary};
    // ... rest of your CSS
`;

4. Update web server content types (if needed)

Check if src/web/webServer.ts includes .woff2 in its contentTypes mapping. If not, add:

const contentTypes: Record<string, string> = {
    '.js': 'application/javascript',
    '.woff2': 'font/woff2',  // Add this
    // ... other types
};

5. Build and test

npm run compile

The fonts will now load locally, work offline, and won't leak data to Google! 🎉


🧠 Learnings used
Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T02:45:32.680Z
Learning: Applies to src/webview/**/*.{ts,tsx} : Provide a unified conflict resolution UI in `ConflictResolverPanel` webview supporting both textual and semantic conflict resolution with 3-way diff view

Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-10T19:24:17.581Z
Learning: Applies to **/web/client/**/*.{ts,tsx} : Develop the conflict resolution UI using React in the `web/client/` directory

Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-10T19:24:17.581Z
Learning: Applies to **/diffUtils.ts : Implement LCS-based text diffing with inline change detection in `diffUtils.ts`

Copy link
Owner

Choose a reason for hiding this comment

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

Did not know you could bundle fonts - thanks!

Copy link
Contributor

Choose a reason for hiding this comment

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

@Avni2000 You're welcome! Happy to help. Bundling fonts locally is a great practice for VS Code extensions—it keeps everything self-contained, works offline, and respects user privacy. Feel free to reach out if you have any questions while implementing it! 😊


🧠 Learnings used
Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T02:45:32.680Z
Learning: Applies to src/webview/**/*.{ts,tsx} : Provide a unified conflict resolution UI in `ConflictResolverPanel` webview supporting both textual and semantic conflict resolution with 3-way diff view

Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-10T19:24:17.581Z
Learning: Applies to **/web/client/**/*.{ts,tsx} : Develop the conflict resolution UI using React in the `web/client/` directory

Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-10T19:24:17.581Z
Learning: Applies to **/diffUtils.ts : Implement LCS-based text diffing with inline change detection in `diffUtils.ts`

Comment on lines 401 to 404
.merge-row.conflict-row {
border: 2px solid var(--border-color);
background: var(--bg-secondary);
border: 3px solid rgba(244, 135, 113, 0.6);
background: rgba(244, 135, 113, 0.08);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Duplicate .merge-row.conflict-row selectors with conflicting styles.

This selector is defined at Line 401 (with a 3px solid border all around + salmon tint) and again at Line 1040 (with a 4px left-only border + different background). Due to CSS cascade, the second definition's border-left and background override the first, but the first definition's border shorthand still partially applies to top/right/bottom — resulting in a 3px salmon border on three sides and a 4px #f48771 border on the left.

This is likely unintentional. Consolidate into a single rule or ensure one set is clearly scoped/overridden.

Also applies to: 1039-1044

🤖 Prompt for AI Agents
In `@src/web/client/styles.ts` around lines 401 - 404, The .merge-row.conflict-row
selector is defined twice with conflicting border/background declarations
causing mixed borders (3px on three sides and 4px on the left); fix by
consolidating into a single rule for .merge-row.conflict-row (or remove the
earlier/duplicate rule) and ensure you only use the intended properties (either
a full border shorthand OR explicit border-left/top/right/bottom) so no partial
overrides occur; update the rule that currently sets border-left and background
(the second occurrence) to be the single source of truth or merge its values
into the first occurrence so the selector has one consistent border and
background.

Avni2000 and others added 3 commits February 13, 2026 12:36
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@Avni2000 Avni2000 changed the title Add elegant beige theme with logo icon and transparent cells [FEAT] Add Light theme inspired by MergeNB logo Feb 13, 2026
@Avni2000 Avni2000 merged commit 5cd8edd into main Feb 13, 2026
5 checks passed
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