Git Diff Panel
A copy-paste code & terminal component in pure HTML & CSS. Zero dependencies, framework-agnostic, MIT-licensed.
Code & TerminalHTMLCSSany framework
utils.ts+2 -1
@@ -12,4 +12,5 @@
1212 function sum(a, b) {13 - return a + b 13+ return Number(a) 14+ + Number(b)1415}Copy into your project
HTML
<!-- Git Diff Panel — file header, hunk marker, dual line-number gutter, +/- rows stagger in -->
<div class="nuda-ct2-git-diff">
<div class="nuda-ct2-git-diff__head">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M14 3 L14 8 L19 8" />
<path d="M6 3 L14 3 L19 8 L19 21 L6 21 Z" />
</svg>
<span>utils.ts</span>
<i class="nuda-ct2-git-diff__badge">+2 -1</i>
</div>
<div class="nuda-ct2-git-diff__hunk">@@ -12,4 +12,5 @@</div>
<pre class="nuda-ct2-git-diff__body">
<code>
<span class="nuda-ct2-git-diff__row"><i class="nuda-ct2-git-diff__ln">12</i><i class="nuda-ct2-git-diff__ln">12</i><span class="nuda-ct2-git-diff__txt"> function sum(a, b) {</span></span>
<span class="nuda-ct2-git-diff__row is-rem"><i class="nuda-ct2-git-diff__ln">13</i><i class="nuda-ct2-git-diff__ln"> </i><span class="nuda-ct2-git-diff__txt">- return a + b</span></span>
<span class="nuda-ct2-git-diff__row is-add"><i class="nuda-ct2-git-diff__ln"> </i><i class="nuda-ct2-git-diff__ln">13</i><span class="nuda-ct2-git-diff__txt">+ return Number(a)</span></span>
<span class="nuda-ct2-git-diff__row is-add"><i class="nuda-ct2-git-diff__ln"> </i><i class="nuda-ct2-git-diff__ln">14</i><span class="nuda-ct2-git-diff__txt">+ + Number(b)</span></span>
<span class="nuda-ct2-git-diff__row"><i class="nuda-ct2-git-diff__ln">14</i><i class="nuda-ct2-git-diff__ln">15</i><span class="nuda-ct2-git-diff__txt">}</span></span>
</code>
</pre>
</div>CSS
.nuda-ct2-git-diff {
width: 300px;
background: #09090b;
border: 1px solid rgba(255,255,255,.08);
border-radius: 8px;
overflow: hidden;
font: 500 11px ui-monospace,SFMono-Regular,Menlo,monospace;
}
.nuda-ct2-git-diff__head {
display: flex;
align-items: center;
gap: 6px;
padding: 7px 10px;
background: #161616;
border-bottom: 1px solid rgba(255,255,255,.08);
color: #cfcfcf;
}
.nuda-ct2-git-diff__head svg {
width: 12px;
height: 12px;
color: #777;
flex-shrink: 0;
}
.nuda-ct2-git-diff__badge {
margin-left: auto;
font-style: normal;
color: #e4ff54;
font-size: 9px;
letter-spacing: .02em;
}
.nuda-ct2-git-diff__hunk {
padding: 4px 10px;
color: #38bdf8;
background: rgba(56,189,248,.06);
font-size: 10px;
}
.nuda-ct2-git-diff__body {
margin: 0;
padding: 4px 0;
overflow: hidden;
}
.nuda-ct2-git-diff__body code {
display: flex;
flex-direction: column;
}
.nuda-ct2-git-diff__row {
display: flex;
align-items: center;
gap: 0;
padding: 1px 10px;
color: #9a9aa2;
opacity: 0;
transform: translateX(-4px);
animation: _nuda-ct2gitdiffin .35s cubic-bezier(.4,0,.2,1) forwards;
}
.nuda-ct2-git-diff__row:nth-child(1) {
animation-delay: 0s;
}
.nuda-ct2-git-diff__row:nth-child(2) {
animation-delay: .08s;
}
.nuda-ct2-git-diff__row:nth-child(3) {
animation-delay: .16s;
}
.nuda-ct2-git-diff__row:nth-child(4) {
animation-delay: .24s;
}
.nuda-ct2-git-diff__row:nth-child(5) {
animation-delay: .32s;
}
.nuda-ct2-git-diff__ln {
display: inline-flex;
justify-content: flex-end;
width: 16px;
color: #4b4b52;
font-style: normal;
font-size: 9px;
flex-shrink: 0;
padding-right: 6px;
}
.nuda-ct2-git-diff__txt {
white-space: pre;
}
.nuda-ct2-git-diff__row.is-add {
background: rgba(228,255,84,.08);
color: #fafafa;
}
.nuda-ct2-git-diff__row.is-add .nuda-ct2-git-diff__txt {
color: #e4ff54;
}
.nuda-ct2-git-diff__row.is-rem {
background: rgba(255,99,99,.08);
color: #fafafa;
}
.nuda-ct2-git-diff__row.is-rem .nuda-ct2-git-diff__txt {
color: #ff8383;
text-decoration: line-through;
text-decoration-color: rgba(255,99,99,.4);
}
@keyframes _nuda-ct2gitdiffin {
to {
opacity: 1;
transform: translateX(0);
}
}
@media (prefers-reduced-motion:reduce) {
.nuda-ct2-git-diff__row {
animation: none;
opacity: 1;
transform: none;
}
}
How to use Git Diff Panel
Paste the HTML where you need it and the CSS into a global stylesheet (or a <style> tag). Every class is prefixed nuda- so it never collides with Tailwind or your own styles. Tweak the CSS custom properties to match your design system.
Works in React, Vue, Svelte, Astro, Next.js, Nuxt, Laravel Blade, Django, Rails — or a single .html file. No npm install, no build step.