
Security News
ECMAScript 2025 Finalized with Iterator Helpers, Set Methods, RegExp.escape, and More
ECMAScript 2025 introduces Iterator Helpers, Set methods, JSON modules, and more in its latest spec update approved by Ecma in June 2025.
@getjoystick/mismerge-core
Advanced tools
Mismerge is a modern two-way and one-way merge editor for the web, built with Svelte. You can visit the demo and start merging now, or use it as a component for you project.
npm i @getjoystick/mismerge-core
<script>
import { MisMerge3 } from '@getjoystick/mismerge-core';
// Core styles, required for the editor to work properly
import '@getjoystick/mismerge-core/styles.css';
import '@getjoystick/mismerge-core/light.css';
// Or '@getjoystick/mismerge-core/dark.css';
let lhs = 'foo';
let ctr = 'bar';
let rhs = 'baz';
</script>
<!-- Left-hand side and right-hand side constant text -->
<MisMerge3 {lhs} {rhs} bind:ctr />
<!-- All sides editable -->
<MisMerge3 bind:lhs bind:ctr bind:rhs lhsEditable rhsEditable >
<style>
:global(.mismerge) {
font-family: monospace;
min-height: 600px;
}
</style>
You need to provide your own syntax highlighter. Example and demo using Shiki-JS. The highlighter can be either sync or async.
<script>
import { codeToHtml } from 'shiki';
// ...
const highlight = async (text: string) =>
await codeToHtml(text, {
lang: 'js',
theme: 'min-dark'
});
</script>
<MisMerge3 ... {highlight} />
<script>
import { DefaultDarkColors } from '@getjoystick/mismerge-core';
// ...
</script>
<MisMerge3 ... colors={DefaultDarkColors} />
If you want to customize the editor styles, you can copy the default light or dark theme and adapt it to your need.
Here is a basic explanation of how the the rendered html looks like:
<div class="mismerge">
<div>
<!-- Main -->
<div class="msm__main">
<!-- View -->
<div class="msm__view">
<!-- Content -->
<div class="msm__view-content">
<!-- Blocks wrapper -->
<div class="msm__wrapper">
<!-- Blocks -->
<div data-component-id="abcdefgh" class="msm__block block-type">
<!-- Lines -->
<div class="msm__line">
<!-- ... -->
</div>
<!-- ... -->
</div>
<!-- ... -->
</div>
<!-- Highlight overlay -->
<div class="msm__highlight-overlay">
<!-- ... -->
</div>
<!-- Input -->
<textarea />
</div>
<!-- Side panel -->
<div class="msm__side-panel">
<!-- ... -->
</div>
</div>
</div>
</div>
<!-- Footer -->
<div class="msm__footer">
<!-- ... -->
</div>
</div>
A list of properties for <MisMerge2>
(2), <MisMerge3>
(3), or both.
Property | Type | Default | Description | Component |
---|---|---|---|---|
lhs | string | "" | Left-hand side text | Both |
ctr | string | "" | Center text | 3 |
rhs | string | "" | Right-hand side text | Both |
colors | EditorColors | DefaultLightColors | Connections colors | Both |
highlight | (text: string) => string | Promise<string> | undefined | Syntax highlighter | Both |
lhsEditable | boolean | true (2), false (3) | Can edit left panel | Both |
ctrEditable | boolean | true | Can edit center panel | 3 |
rhsEditable | boolean | true (2), false (3) | Can edit right panel | Both |
lineDiffAlgorithm | 'characters' | 'words' | 'words_with_space' | words_with_space | Diff algorithm for same line side by side diff | Both |
disableMerging | boolean | false | Disables merging | Both |
wrapLines | boolean | false | Enables lines wrapping | Both |
disableWordsCounter | boolean | false | Disables words counter | Both |
disableCharsCounter | boolean | false | Disables chars counter | Both |
disableBlocksCounters | boolean | false | Disables blocks counter | Both |
disableFooter | boolean | false | Disables footer | Both |
ignoreWhitespace | boolean | false | Ignore whitespace in diff | Both |
ignoreCase | boolean | false | Ignore case in diff | Both |
conflictsResolved | boolean | - | Binding for when all conflicts have been resolved | 3 |
Events:
Name | Description |
---|---|
on:merge | Fired when a block is merged from one side to an adjacent one |
on:resolve | Fired when a conflict has its resolved status toggled |
on:delete | Fired when a block is deleted in the center side |
on:input | Default textarea event |
on:keydown | Default textarea event |
on:keypress | Default textarea event |
on:keyup | Default textarea event |
Clone the repo:
git clone https://github.com/getjoystick/mismerge.git
cd mismerge
Download dependencies for all packages in the monorepo:
npm install
The core package is inside packages/core
. You can run the associated sveltekit app using npm run core
or cd packages/core
& npm run dev
.
The demo is inside the demo
root folder. You can run it from root using npm run demo
or cd demo
& npm run dev
.
It is automatically deployed to Github Pages with every push to master.
This repository uses commitizen to enforce similar commit messages. Commit using:
npm run commit
# or
git cz
FAQs
A modern merge editor for the Web
The npm package @getjoystick/mismerge-core receives a total of 2 weekly downloads. As such, @getjoystick/mismerge-core popularity was classified as not popular.
We found that @getjoystick/mismerge-core demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
ECMAScript 2025 introduces Iterator Helpers, Set methods, JSON modules, and more in its latest spec update approved by Ecma in June 2025.
Security News
A new Node.js homepage button linking to paid support for EOL versions has sparked a heated discussion among contributors and the wider community.
Research
North Korean threat actors linked to the Contagious Interview campaign return with 35 new malicious npm packages using a stealthy multi-stage malware loader.